Many times people will make the mistake of using lookups at table level
instead of using them only at a form level. One of the big problems with
this is that it obscures the way lookups actually work. The idea of a lookup
is that you have a value and you lookup an associated datum that goes
with it. So, for example, I might have a table which stores a client ID of 4.
This ID of 4 refers exclusively (primary key) to a row within the Clients table.
This would let me go look in the ID field to find the associated name that
goes with that ID of 4. So, let’s say that the client that is associated with
an ID of 4 is named “Big Top Tires.” I may want to display “Big Top Tires”
in my form or report but, because of normalization principles, I only store
the ID of 4 (now a foreign key in another table) so that it will always uniquely
identify that record to be associated with that client. But, let’s say that I
actually found out that I had typed in “Big Top Tres” in the client table. That
is not really a problem, IF we have been storing the primary key associated
with that name. However, if we had been storing the text “Big Top Tres” for
each record in our transactions table (for example), we would have to go change
potentially hundreds, if not thousands, of records to correct the error. If, however,
we have been storing the ID associated with this company then we would only
have to change the name in ONE place – the client table. That is one reason
why this type of data storage is used.
So, many people are unfamiliar with queries and the benefits of using them
over using tables in their forms and reports. They think that they need to use
a table as the underlying record source in a form or report. This is definitely
not true. You can and, I would argue, you should use a query as the
underlying record source in a form or report. Queries can be treated just as
tables can.
So, how do you go about using a query as a record source, especially if you
have lookups that you want to show the associated text instead of the ID
number? That is what we will go into right now and we will use a report as
the example.
First, we will create the base of the report. I find that it is quite easy to use the
Wizard to create the base report and then modify it to fit the needs instead of
trying to create it all from scratch. For our example we will use the
Northwind 2007 database. The Northwind database, unfortunately uses
lookups at table level (we’ve tried to get them to stop that practice) so I have
removed those in order to see what you would normally see if you didn’t
use them (which would be correct).
We will start with creating a report from the Order Details table which has
lookups (OrderID, Product, and Status).

We will then start creating a report using the report wizard.

















So, as you can see, you can easily make use of queries to present
what you may have previously though inaccessible. This is a great
way to store the data and present it.