This is more relevant when your BE is SQL Server but since it works regardless of what your BE is, I use ONE method always. Less brain strain for me.
Most forms have only one or two search options so I add text boxes or combos to the form's header and if the options can be used in combination, I also add a button to requery the form. Otherwise, if the search fields/combos are independent, I requery the form in the afterUpdate event of the search field.
to make this work, I base ALL forms on a query. The query includes Order By criteria so if multiple records are returned, they are in a logical order rather than random. The query has a WHERE clause that references the search field on the header.
Select ...
From ..
Where MyID = Forms!myform!cboMyID;
When the form initially opens, there is no value in the combo so the form opens to a new record. Then if the user wants to go to a specific record, he picks a value from the combo or types it into the search field and hits tab. The only line of code is:
Me.Requery
So, the process is very simple. A query with criteria, a control on the form to search with, and a single line of code
The reason this is more relevant when your BE is ODBC is because it allows the server to do the heavy lifting. No user is going to need to see thousands of rows in a form so there is no value in binding a form to a table or even to an unfiltered query. Either the user wants to enter a new record or he wants to go to a specific record, my suggestion handles both in the most efficient way. You don't download rows that will never be looked at. The old Access style method where the BE is Jet or ACE, assumes the form is bound to a table and then filtered locally. That's not terrible when the BE is Jet/ACE because they are not server side databases. All processing happens on your PC anyway. But when your data is on a server, you want the server to do the selection and then return to you only ONE record whenever possible.
Occasionally, you have situations where you have complex search criteria, sometimes even for the same form. In this case, I create a separate form with a dozen or more options for selecting data. The user picks what he wants and the code creates a custom where clause. It does a dcount() to determine how many rows will be returned. If the answer is 1, it uses the criteria to open the regular single record edit form. If no records satisfy the criteria, I give the user a message to that effect. Otherwise, I open an intermediate datasheet view form with the most significant columns showing. Then the user double clicks on the record he wants to work with and that form opens the regular single record edit form. So, in all cases, a single form is used to add/edit a record but other forms might be used in the drill down process. It is poor practice and even downright dangerous to create separate forms to update the same table. When requirements change, you have to make the same change, with the same effect to all the "duplicate" data entry forms.
Just FYI, this simple efficiency for all forms means that I can almost always convert applications that I built from Jet/ACE to SQL Server in a few hours and that is mostly because I have to test everything just to make sure I didn't miss something. If you use DAO code, you also have to be cognizant of the differences with SQL Server. Since the SQL Server method also works for Jet/ACE, I always use the SQL Server method. In all the years I've been doing this, I have found very last minute changes that cropped up.