Storing information in tables in an unsplit database can cause some problems. The main one is that when you issue a new version of your database, the tables will be overwritten with what you have in the new database you are about to distribute. So, now you have to make a copy of their tables prior to giving the user a new version and copying the tables back to the user's copy of the new database. Quite a hastle.
I have a user preference table (library database) that all of my databases link to. It contains, among other things, the name of the database, user name, user's phone number, office location, and which form they want displayed at startup. At startup, my program checks to see if the user has been registered, if not, a form is displayed that asks the user to fill in the required info (some of which I already know (i.e. database name, user name)).
I have not had problems building the RecordSource of a report with a global variable. I always create a form from which the user can select which report he/she wants printed, a dual list box to indicate which fields they want the report ordered by, several list boxes to narrow the filter down, as well as text boxes for date ranges, etc. I then build the SQL statement based on the criteria the user selected. I do this by "unbuilding" the SQL statement assigned to the report and "rebuilding" the SQL statement based on the criteria the user selected. In most cases the SQL statement does not have to be rebuilt. A simple Where clause and/or Order By clause needs to be added. Or the items added to the OpenReport method. However, there are times, based on what the user selected, where I have to add, programmatically, join clauses to the original SQL statement.