File Members and the Library List
May 25, 2005 Dominic Lefevre
What happens when an RPG or COBOL program opens a file? For one thing, the system has to find the file. And where does it look for the file? Everyone knows the answer to that question. The system searches the libraries in the library list, beginning with the system library list, proceeding through the product libraries, the current library, and finally the user libraries. The system selects the first file it finds of the desired name, right? Not necessarily.
The exception comes when the system is searching for a certain file member. If the system does not find the desired file member in a file of the desired name, the system will continue to search the libraries in the library list.
Here’s a little test you can run for yourself. Create two files of the same name in different libraries. I suggest you use work libraries. You can use QTEMP for one of them. Give the members different names.
crtpf qtemp/x rcdlen(48) mbr(one) crtpf mylib/x rcdlen(48) mbr(two)
Use a database utility, such as DFU, to load one record into each of the files. I suggest you key ONE in member ONE and TWO in member TWO.
Use the Display Physical File Member (DSPPFM) command to display the files.
dsppfm x one dsppfm x two
You will see that the system will find the right member, no matter the order of the libraries in the library list.
Source physical files also work well for this test. Give it a try with files of the same name, such as QRPGSRC, in different libraries.
This same behavior holds true with RPG (and, I assume, COBOL) programs. RPG normally opens the first member of a file, but if you override a file to a certain member, or you add the EXTFILE and EXTMBR keywords in RPG F specs, the system will continue to scan through the libraries in the library list until it finds a file member of the proper name.
The system is not consistent, however. The Run Query command chokes if it does not find the desired member in the first instance of the desired file.
runqry qry(*none) qryfile((x two)) runqry qry(*none) qryfile((x one))
One of the two commands generates message QRY1612 (Member ONE not in file X in MYLIB).