Hack 15. Steer Clear of System Tables
Avoid incorrect results by leaving system tables out of your table count and definition routines. How many tables are in your database? You might think finding this out is as easy as counting how many tables are listed on the Tables tab of your database window. To that I respond, "Try again!" Access uses a number of system tables to control its own internal workings. Usually, these additional tables are hidden, but they are there nonetheless. Figure 2-8 shows a database with some tables. Figure 2-8. Tallying the tables![]() It looks like this database contains eight tables, doesn't it? Let's try getting a count in a different way. In the VB Editor, activate the Immediate window (Ctrl-G). Then, enter the following code snippet and press the Enter key: ?Application.CurrentData.AllTables.Count Figure 2-9 shows the code and its results in the Immediate window. For the database in Figure 2-8, the result is 15, so Access is telling us the database actually contains 15 tables, although only eight are visible on the Tables tab. Figure 2-9. Counting all the tables![]() The code snippet tells the truth, however: this database does indeed contain 15 tables. The ones you couldn't see before are the system tables. Let's display them! Back in the database proper (not the VB Editor), use the Tools Figure 2-10. Selecting to show system objects![]() Now, looking at the Tables tab in Figure 2-11, you can see the system tables. Note that all the system table names start with MSys. This is actually a useful attribute about these tables because it makes it easy to remove them from a table count. Figure 2-11. Displaying all tables, including system tables![]() 2.4.1. The CodeBut why does any of this matter? One reason is that an application might need to iterate through all the tables in a databaseperhaps to add a property, to look for a field or data, to alter the table structure in some way, and so on. In such circumstances, the system tables must be avoided. Fortunately, a simple code routine easily handles this by purposely avoiding all tables that have names beginning with MSys, as follows: Sub count_tables() 'list tables in database Dim table_num As Integer Dim tbl_count As Integer With Application.CurrentData For tbl_count = 1 To .AllTables.Count If Left(.AllTables(tbl_count - 1).Name, 4) <> "MSys" Then Debug.Print .AllTables(tbl_count - 1).Name End If Next tbl_count End With End Sub This code routine cycles through all the tables in the database and writes the name of each table to the debug (Immediate) window, as long as the table's name doesn't start with MSys. To use this routine, replace the table names with any particular per-table processing you need. 2.4.2. Running the CodeFigure 2-12 shows the output of this routine. The Immediate window is filled with just the pertinent application data tables, and that's exactly what we need. Figure 2-12. Listing just the data tables![]() By isolating the data tables from the system tables in this way, you can work with the data tables how ever you want, without worrying about crashing your application. ![]() |