Last week was an interesting time for me. RPG World in Orlando was about to be another big success, echoing last year's record attendance, but then Hurricane Jeanne decided to change course and interfere with RPG World.
Sunday was my first hurricane experience--from long before dawn until early evening. Many RPG World attendees had arrived by the time the storm hit the Kissimmee, Florida, area, and they were treated to a new experience as well.
I won't bore you with the details of the post-storm effects, but many RPG World attendees weathered the storm and made it to RPG World in spite of Jeanne's rage. In all, a little more than 50% of the attendees made it, and the conference went on as planned. Thanks to all of you who attended and helped make RPG World a success.
But now, back to work!
In a previous issue, I illustrated the enhancements to RPG IV in V5R3. But in addition to RPG, IBM also enhanced the CL language, which had been static for nearly 25 years.
Today, we'll look at the CL enhancements in the areas of the number of files you may declare, data types, and structured programming constructs.
Number of Files
The number of files that may be declared in a CL program has been increased from one in V5R2 and earlier to five in V5R3. This gives you the ability to declare a display file and a database file in the same CL program, a major issue in CL for decades. Why did IBM go to five files instead of two? Probably because if people had only two files, they would want three or four files. Five files should take care of 99% of all CL needs for the foreseeable future.
A new parameter has been added to the Declare File (DCLF) command that allows you to give a file an "open identifier." This is similar to what you do with OPNQRYF in that you may declare the same file in CL multiple times and specify a different open ID for each declaration.
CL does not include data structures at this time, so the OPNID parameter also acts as a prefix to the field names in the database. If you've used the PREFIX keyword on the File or Definition specifications in RPG IV, you already know how the OPNID parameter will rename the database field names. For example:
DCLF FILE(CUSTKEY) OPNID(CUST)
In this example, the CUSTMAST file is declared using the normal DCLF command. Then, a second file that is actually a logical view over the CUSTMAST file is declared. Since the database field names would be the same in the CUSTKEY file, I've added the OPNID(CUST) parameter to the declaration. By adding this parameter, the fields in the CUSTKEY file are declared with CUST_ as a prefix. Yes, IBM implicitly adds an underscore character between the open ID and the original field name. So if the files contained fields named CSTNBR, CMPNAME, and EMAIL, they would be declared in the CL program as follows.
In the CUSTMAST file:
&CSTNBR
&CMPNAME
In the CUSTKEY file:
&CUST_CSTNBR
&CUST_CMPNAME
&CUST_EMAIL
Again, the OPNID acts not only as an open identifier, but also as the prefix character string.
In addition to the DCLF command, the RCVF and SNDRCVF commands have been enhanced to support the OPNID parameter. Use this parameter when reading a file that was declared with an OPNID.
All files except the first one declared in a CL program must have an OPNID value specified. Also, while the field names of files that have an OPNID are longer than traditional CL variable names, the DCL command has not been enhanced to support longer variable names.
CL Data Types
CL supports two new data types: integer and unsigned integer. These data types are compatible with the RPG I and U data types. But, unlike RPG IV, CL allows you to declare integer data types intuitively. That is, you specify a length of 4 or 2 for the integer instead of 10 or 5.
In addition to the new data types, one change has been made to an existing data type. Character variables TYPE(*CHAR) may now have a length of up to 32767. The online documentation indicates that the maximum length for a CL variable is 32 bytes, but I believe that should be 32 K bytes.
Structure Constructs
We thought IBM was going to add subprocedures or, at the very least, subroutines to the CL language. Instead, we got six structured programming constructs to help make CL easier to code:
- DOWHILE
- DOUNTIL
- DOFOR
- SELECT/WHEN
- LEAVE
- ITERATE
These CL commands are a welcome addition to the IF/DO commands that we've had for the last 25 years. Their interface is obvious and shouldn't require a bunch of explanation. The DOFOR command, however, may be a bit different to RPG programmers who have avoided using RPG IV's FOR operation code. The syntax of DOFOR is as follows:
The DOFOR command has three required parameters (VAR, FROM, and TO) and one optional parameter (BY):
- VAR--Specify a CL variable whose data type is *INT as the counter for the DOFOR loop. Each iteration through the DOFOR loop automatically increments the CL variable specified on this parameter. The increment value is specified on the BY parameter. If BY is not specified, the default increment value is 1.
- FROM--Specify the starting value to assign to the CL variable on the VAR parameter. The value specified on the FROM parameter is copied into the CL variable specified on the VAR parameter before the DOFOR loop begins.
- TO--Specify the limit (maximum value) that the CL variable specified on the VAR parameter can be before the loop terminates.
- BY--This optional parameter controls what value is added to the CL variable specified on the VAR parameter during each pass through the DOFOR loop.
Here's an example of the DOFOR command:
DCL VAR(&START) TYPE(*INT) LEN(2) VALUE(1)
DCL VAR(&LIMIT) TYPE(*INT) LEN(2) VALUE(50)
:
DOFOR VAR(&COUNT) FROM(&START) TO(&LIMIT)
/* CL commands to run */
ENDDO
In addition to the DOFOR, DOWHILE, and DOUNTIL commands, IBM also introduced the LEAVE and ITERATE commands. These two commands perform the same function as the LEAVE and ITER operation codes in RPG. Use the ITERATE command to cause the process to jump to the top of the do loop and start the next cycle through it. Use the LEAVE command to exit the do loop before the natural termination condition occurs. Likewise, the SELECT/WHEN commands in CL work the same way they do in RPG IV.
CL being enhanced in 2004 seems so strange to me. But the enhancements IBM has provided are more of an incremental "fix-up" than a complete renovation of CL. I think CL is better in V5R3 than it has been before. Perhaps there are more good things to come?
Bob Cozzi is a programmer/consultant, writer/author, and software developer. His popular RPG xTools add-on subprocedure library for RPG IV is fast becoming a standard with RPG developers. His book The Modern RPG Language has been the most widely used RPG programming book for more than a decade. He, along with others, speaks at and produces the highly popular RPG World conference for RPG programmers.
LATEST COMMENTS
MC Press Online