One big drawback to using Query/400 is that it's often difficult to keep track of the files used within your queries. Figuring out what files queries use often involves going into each individual query, which can be a big issue if you update a file definition without being aware that the file is used by a query or queries. Wouldn't it be great if there were a tool like DSPPGMREF that would give you a list of the files referenced in a query or queries? That's where Display Query References (DSPQRYREF) comes in.
DSPQRYREF allows you to generate a listing of files used by a specific query; by all queries in a specified library; or in libraries defined by *ALL, *LIBL, *USRLIBL, or *CURLIB. You have the option of creating a printed report, displaying the output to the screen, or sending the list to a specified physical file. The CL program DSPQRYREFC does most of the work to build the query reference listing. This is accomplished by first retrieving the object descriptions for the specified query or queries into the file QRYF in QTEMP library using the Retrieve Object Description (RTVOBJD) command. The Retrieve Query Management Query (RTVQMQRY) command then uses this information to generate an SQL source that can be read to determine what files the query uses. The RPG program ANZQRYSRC handles this part of the job. This program reads through the generated SQL source and searches for file names by looking for the FROM SQL clause. The library and file names are extracted along with the file identifier (T01, T02, etc.) from the query. These values are written to the physical file QRYFILES in the QTEMP library along with the name and library of the query being analyzed. Once all of the queries have been analyzed, the CL program generates the list using one of two Query Management queries:
- LSTQRYF sends a list of the query and file information to the specified file.
- LSTQRY generates a report containing query and file info for printing or displaying to the screen.
Both of these Query Management queries combine information from QRYFILES with information from SYSTABLES in QSYS2 library. SYSTABLES contains file information for all of the data files on your iSeries. The table type (physical or logical) and table text are retrieved from SYSTABLES. This output is output in order by file library and file name. The command object DSPQRYREF is used to execute the application from the command line.
Building the Utility
Prior to compiling the programs used by this application, you need to create some of the files they'll use. First, create a copy of the file QRYF, which is generated by the DSPOBJD command. At the command line, enter the following command:
In this example, replace anylib/qryname with a valid library and query name from your iSeries. This will generate a "dummy" file so that you can successfully compile your CL program later. Next, create a copy of the source physical file to be used by the RPG program ANZQRYSRC. To do this, enter the following command at the command line:
Finally, create the physical file QRYFILES. After copying the DDS source for this file to a QDDSSRC source physical file, use the following command to create a copy of this file in QTEMP:
Here, lib is the name of the library containing your source file. Now, you're ready to compile your programs. Start with the CL source. You should modify it for this program so that, within the line below, *LIBL is replaced with the name of the library containing the source for this file.
After saving the source, compile this program using the following command:
Here, lib represents the library containing the source and program. When this application has compiled successfully, you're ready to create your RPG program. This is done using the following command:
Again, you need to replace lib with the actual library name.
Now, you need to create the two Query Management queries and one Query Management form used by the application. First, you have to create the source files to contain the Query Management query and form source. Use the Create Source Physical File (CRTSRCPF) command shown here to do this:
Once this file has been created, move the source for LSTQRY, the LSTQRYF Query Management queries, and the LSTQRYFM Query Management form into this file. Next, enter the following three commands to create your Query Management objects:
CRTQMQRY QMQRY(lib/LSTQRY) SRCFILE(lib/QQMQRYSRC)
CRTQMQRY QMQRY(lib/LSTQRYF) SRCFILE(lib/QQMQRYSRC)
The Query Management queries will select the data from your files. The Query Management form formats this data when printing or displaying the listing.
The last piece of the puzzle is the DSPQRYREF command. After moving this object into the QCMDSRC source physical file, create the command using the following command:
Once you've created all of the objects and programs, remember to remove QRYF, QRYFILES, and QQRYSRC from QTEMP library prior to executing the command.
Using the Utility
QRYNAM(query name, *ALL)
OUTTYPE(*, *PRINT, *OUTFILE)
[QRYFLB(output file library)
QRYFNM(output file name)
The first parameter (QRYLIB) is required; it identifies the name of the library containing the query or queries to be analyzed. This value can be specified as a single library name or any one of the special values: *ALL for all libraries, *USRLIBL for the user portion of the library list, *LIBL for the full library list, or *CURLIB for the user's current library. The second parameter (QRYNAM) identifies the name of the query to be analyzed. The special value *ALL can be used to search for all queries in the library or libraries specified. The third parameter (OUTTYPE) is also required; it identifies the type of output to be generated. The special value *PRINT will cause a printed report to be generated. Special value * will display the output to your screen. The special value *OUTFILE can be used to send the output to a physical file. When this value is specified, additional parameters become available that allow the user to define the library (QRYFLB) and file (QRYFNM) to receive the output from the listing. The parameter ADDRPL also becomes available and allows users to define whether or not they want to add records to an existing file or replace any records in an existing file. Below is a sample of the output generated by this utility.
Whether you output the data to the screen, generate a printed report, or send the listing to a physical file for further analysis, DSPQRYREF can help you get a better handle on what files queries use.