COMBO BOXES
One way to help users quickly find a record is to include combo boxes for lookups. Figure 1 shows three such combo boxes and a sample of their content. Depending on the information the user has about a contact, he or she can use the combo box to find the correct record.
hese boxes are located on a main form that contains contact information as well as two subforms showing addresses and phone numbers. The first column in each combo box is the unique contact ID, an AutoNumber field called “CID.” As you can see in Figure 1, that column is hidden. (This is done by setting its column width to 0 in the ColumnWidths property.) While the user doesn’t need to see this field, it’s important to include because it will be used to find the appropriate record.
FIND BY NAME
The combo box to find a contact by name gets information from the c_Contact table, which is aliased as “C.” Its primary key field is CID. The “Contact” field is calculated in the table using an expression that combines the individual parts of the name, such as last name and first name. Here is the SQL for the combo box to find a contact by name:
SELECT C.CID, C.Contact FROM c_Contact AS C ORDER BY C.Contact;
The ColumnCount property is 2, and the ColumnWidths property is 0";3".
The “c_” table name preface refers to a table from a free, downloadable contact management system. There are two versions available: MyContacts (bit.ly/2m0MeBN) is a simple, easy-to-understand version, while the Contact Template (bit.ly/3aTnXSo) is more complex with more features.
FIND BY ADDRESS
The second combo box shows cities and street addresses from the c_Address table (aliased as “A”) and joins the contact table to show names. The second column, also hidden, is the unique address ID—called “AdrID”—which could be used to also make that address record active once a contact record is found. The ColumnCount property is 4, and the ColumnWidths property is 0";0";2.5";2.5". Here’s the SQL for the combo box to find a contact by address:
SELECT C.CID, A.AdrID, [city] & ", " & [addr1] AS CityAddress, C.Contact FROM c_Contact AS C INNER JOIN c_Address AS A ON C.CID = A.CID WHERE ( A.Addr1 Is Not Null) OR ( A.City Is Not Null) ORDER BY A.City, A.Addr1, C.Contact;
FIND BY PHONE
The third combo box shows phone numbers from the c_Phone table (aliased as “P”) and joins the contact table to show names. The second column, also hidden, is the unique phone number ID, called PhoneID, which could be used to also make that phone record active once a contact record is found. The ColumnCount property is 4 and the ColumnWidths property is 0";0";1.2";2.5". Here is the SQL for the combo box to find a contact by phone number:
SELECT C.CID, P.PhoneID, P.Phone, C.Contact FROM c_Contact AS C INNER JOIN c_Phone AS P ON C.CID = P.CID ORDER BY P.Phone, C.Contact;
VBA CODE
While these three lists appear to be different, the code to find a record is the same for each because they’re all storing the CID field. Figure 2 shows the VBA that all three of the combo boxes run on their AfterUpdate event, which happens after the user chooses something from the list.
Private Sub FindMyContact()
'181012 strive4peace, 200308
'Set up error handler
On Error GoTo Proc_Err
'dimension variable For Where clause
Dim sWhere As String
'construct Where clause for Find
With Me.ActiveControl
If IsNull(.Value) Then Exit Sub
sWhere = "CID=" & .Value
.Value = Null 'reset control
End With
'save record If changes were made
With Me
If .Dirty Then .Dirty = False
End With
'find contact
With Me.RecordsetClone
.FindFirst sWhere
If Not .NoMatch Then
Me.Bookmark = .Bookmark
End If
End With
Proc_Exit:
On Error Resume Next
Exit Sub
Proc_Err:
MsgBox Err.Description _
, , ERROR & Err.Number _
& FindMyContact
Resume Proc_Exit
Resume
End Sub
The procedure declaration declares the name of the function, FindMyContact, and then an error handler is set up. Although this example doesn’t do anything in the form’s BeforeUpdate event that might prevent a record from being saved, an error would occur if it couldn’t be saved or if the form is filtered and the record the user wants to find isn’t in the form’s record set.
A string variable, sWhere, is dimensioned for the Where clause. With the active control, whichever combo box it is, the procedure exits if there is no value. If there is a value, a Where clause is constructed to find CID. Then the combo is cleared.
Before going to another record, any changes made to the current record are saved. The code then searches through a copy of the records for a CID equal to what the user picked. If a match is found, then the bookmark for the form is set to the bookmark for the clone, which shows the chosen contact record.
The code then exits. If there was an error, and execution went to the error handler instead of exiting normally, the user will get an error message before exiting.
Download this month’s database: SF2004_FindRecords.
SF SAYS
Combo boxes for finding records can display information from the table you’re searching as well as from any related table.
April 2020