Using Built-in Support for Declaring the Same File Multiple Times
It wasn't until at least version 5.1 of IBM i that IBM included a
feature in RPG IV that I designed and suggested to them long
before RPG IV was ever announced; The EXTFILE and EXTMBR keywords allow
the Programmer to specify a runtime file and/or member name. This allows
you to avoid using a performance-hogging OVRDBF. In fact, EXTFILE and
EXTMBR don't use OVRDBF at all, they simply cause RPG to open the
specified file or member directly--no override necessary.
EXTFILE / EXTMBR Overview
I've written about EXTFILE and EXTMBR before so I won't repeat myself
here. To summarize, these File specification keywords accept a literal,
named constant or field name that contains the name of the file and/or
member to be used at runtime. The file name can be a qualified name
using the CL command-style naming convention: library/file
The member name (if the EXTMBR keyword is specified) must the a valid
member name or one of the special values *FIRST, *ALL.
Since these keywords map directly to the internal "record" I/O APIs, the file,
library and member names must be in all upper case or will may receive a
runtime error.
.....H OPTION(*SRCSTMT:*NODEBUGIO)
FglMAST IF E K DISK EXTFILE('APLIB/GLMAST')
F PREFIX('F1.')
F RENAME(GLREC:glRec1)
FglMast2 UF E K DISK EXTFILE('APLIB/GLMAST')
F RENAME(GLMREC:glRec2)
F PREFIX('F2.')
D F1 DS LikeRec(glRec1) Inz
D F2 DS LikeRec(glRec2) Inz
In the example above, I've declared the file GLMAST twice, once as
GLMAST and once as GLMAST2. Both files point at APLIB/GLMAST using the
EXTFILE keyword. I could have just as easily placed that name into a
named constant or a field with an INZ value identifying the file to be
used.
The Problem with EXTFILE
Unfortunately, even though the EXTFILE keyword is very useful for
utility program where you're reading different files specified at
runtime, the problem is the files in positions 7 to 16 of the File
specification must exist at compile-time or the program won't compile.
So this means at the very minimum, a format file must exist at
compile-time, while most programmers tend to create logical files to
accommodate this shortcoming.
EXTDESC Saves the Day
Starting with IBM i v6.1 IBM introduced the EXTDESC keyword to
supplement the EXTFILE keyword. This keyword allows you to specify the
file whose format is used by the compiler. This means we no longer have
to create dummy logical files or format files. In fact, it means we
don't have to worry about any such thing because the file the compiler
uses to pull in the External Description for the file being declared is
specified on the EXTDESC keyword--positions 7 to 16 are ignored.
Let's look at my previous example, but this time I include EXTDESC.
.....H OPTION(*SRCSTMT:*NODEBUGIO)
Fgl1 IF E K DISK EXTDESC('APLIB/GLMAST')
F EXTFILE('APLIB/GLMAST')
F PREFIX('F1.')
F RENAME(GLREC:glRec1)
Fgl2 UF E K DISK EXTDESC('APLIB/GLMAST')
F EXTFILE('APLIB/GLMAST')
F PREFIX('F2.')
F RENAME(GLMREC:glRec2)
D F1 DS LikeRec(glRec1) Inz
D F2 DS LikeRec(glRec2) Inz
By adding the EXTDESC keyword I've identified the file that the
compiler will use at compile-time to pull in the description of the GL1
and GL2 files (position 7 to 16). I no longer have to specify a "real"
file name in positions 7 to 16.
With the introduction of EXTDESC, the EXTFILE keyword was enhanced to
support the *EXTDESC option. When EXTFILE(*EXTDESC) is specified, the
same file is opened as is pointed to by the the EXTDESC keyword.
Unfortunately EXTDESC requires a literal or named constant for its file
name so the compile can determine which file to import. That means that
if EXTFILE(*EXTDESC) is specified you can't change the file name at
runtime. A useful feature if you need it, but except for a few
quick-and-dirty programs I really haven't used it too often.
With the introduction of the EXTDESC in v6.2 to complement EXTFILE,
we can now write programs that access the same file with multiple open
data paths in the same program with very little effort.
Cozzi Tools 2012 - Beta
Cozzi Tools 2012 (which includes the COZTOOLS service
program) is scheduled for beta
release on May 1, 2012. Watch midrangeNews.com for
details, including download links and visit the
COZTOOLS website for more
information.
Call Me
Bob Cozzi is a technical advisor to IBM i clients around the world.
His specialty is solving difficult problems for his clients, training their
programming staffs, and performing system migration/upgrades for small shops. His
consulting rates are available
online. To contact Bob,
send an email to: bob at rpgworld.com
You can subscribe to RPG Report (we call it "follow") by
visiting the RPG Report
page
on midrangeNews.com and then click the FOLLOW link in the table of contents
for that
page. To unsubscribe, simply click that same link. You must be
signed up and signed
in to midrangeNews.com to start following RPG Report.
Follow Bob Cozzi on Twitter