A Few V5R3 CL Enhancements PDF Print E-mail
Programming - CL
Written by Robert Cozzi   
Tuesday, 05 October 2004 18:00

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(CUSTMAST)
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

&EMAIL

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:

DOFOR   VAR(&counter)  FROM(&start)  TO(&limit)  BY(&increment)

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(&COUNT)  TYPE(*INT)  LEN(2)
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.

 


Robert Cozzi
About the Author:

Bob Cozzi is a programmer/consultant, writer/author, and software developer of the RPG xTools, a popular add-on subprocedure library for RPG IV. His book The Modern RPG Language has been the most widely used RPG programming book for nearly two decades.

 

MC Press books written by Bob Cozzi available now on the MC Press Bookstore.

 

RPG TnT RPG TnT

Jam-packed with an unbelievable number of quick, easy-to-implement RPG tips!

List Price $65.00
Now On Sale
 
The Modern RPG IV Language The Modern RPG IV Language
Cozzi on everything RPG! What more could you want?

List Price $99.95
Now On Sale
 
Read More >>
Last Updated on Thursday, 28 May 2009 23:00
 
MC Press Web Site Staff
** This thread discusses the Content article: A Few V5R3 CL Enhancements0
Guest.Visitor
Subroutines would certainly help a lot towards clean, clear code. If we could write to output files CL would almost be perfect!
R.Cozzi
Yes, I thought they were going to be there too. But so many long-time AS/400 programmers we so surprised that IBM was enhancing CL and their response to the enhancements was somewhat underwhelming, that I think IBM backed off going nuts with enhancements this time around. I mean, I try to avoid CL programs at all/any cost and just have RPG IV code in my applications; I rarely use a CLP today. I do use CL commands, of course, but avoid integrated CL programs with new applications. Rarely, if ever, seem to need it any more.
Guest.Visitor
Good article Bob. Not directly related to your article, I would just add that a new system value is available in V5R3 that CL programs might use, QDATETIME, to get the date/time in one statement. Now we won\'t have to worry about going over midnight between getting QDATE and QTIME. (hey, stuff happens...) Chris
[size="1">Code[/size>
Guest.Visitor
Yes, I agree it is bit bizarre and a tad too late to soup up CL, but they did. My thought was that IBM had these things in development, and as a final, parting shot, decided to put them in on this new release. As an old-timer, I vaguely remember a similar thing happening to RPG II on the System/36. We got all these enhancements to the language late in the game - then whammo: No more System/36; no more support. At least in that case, you could make a case that they were trying to transition RPG II people to RPG III on the Silverlake... er, I mean AS/400. I decided to post here to also say that I do not understand your *not* using Control language. To a guy like you, you have to think of it as a scripting language. There\'s always a need to knock out something fast. Specifically, I use OPNQRYF on every report I do. I can\'t imagine doing that in RPG or SQLRPG. When it comes to calling programs, submitting jobs, issuing overrides or just executing a bunch of CALLs and CL commands in a job stream, I just cannot see doing that in RPG. It\'s just easier in CL my friend. Come on... admit it! What I never understood is why CL - a 2GL second generation language at best - is compiled. It should have been an interpreted language from the start. The ability to compile a CL program adds nothing to the top to bottom CL programs I write; adds nothing to the business of developing applications - it\'s just useless. If they (geniuses in Rochester) were thinking about ILE applications back in 1980 when they were selling System/38s like hotcakes, then OK, make it a compiled language. Hey, if REXX the wonder language had made it, would you still be doing everything in RPG? I think the thing that has always bothered me a bit about the non-support of CL over the years is that as easy to learn as it is, it has always been thisclose to becoming a real, programming language. Yet, IBM never thought so. Pity. Well, we broke the one file limit and now all those technical tests will have to change: Question: How do you handle five files in a CL program? Trick Answer: Call an RPG program! Not any more, bucko.
David Abramowitz
[i>Skontos wrote: What I never understood is why CL - a 2GL second generation language at best - is compiled[/i> I attended a user group meeting where some IBMers who had worked on the future systems group, and the original OS (CPF) on the S/38 addressed this very issue. The concept of an interpreted control language was considered. The arguement of having an object based OS where any *PGM object could call any other *PGM object was seen as more important. Dave
avrahamn@coop.co.il
What is needed is to allow to evoke or call CL Commands directly from RPG, instead fo QCMDEXEC, just use plain CL sintax directly from RPG. In the Free Syntax Rpg if a line starts with a "!" sign it sould be considered as a command. as simple as that. example: !CPYF FILEA QTEMP/FILEB FMTOPT(*MAP *DROP).
Guest.Visitor
Can we pass numeric fields as is without convering to charaters, or to variables 15,5 calling an RPG programs. Thanks Tiki
dacust
Yes, you can pass numerics. From the calling program, you just have to make sure it is the same length and either packed or zoned just like the called program requires. Since CL only does packed, I like to make sure all passed parameters are packed. But zoned works as well between RPGs. The only place it gets tricky is when calling from the command line or from the SBMJOB command. For both those cases it\'s easiest to create a command front-end to properly format the numerics for you. -dan
Guest.Visitor
I think you mean from a command line. Sure, pass hex. Search for the CL forum. Chris
R.Cozzi
At COMMON it was indicated that there will be more CL enhancements in future release. Subroutines, pointers, and data structures were the top three things there were in-plan at the moment. Looks like IBM has realized that people use CL so they should continue to improve it. Other enhancements in V5R3 include... Maximum parameters increased to 99 (from 75) Longer CL variable names Pass by value for CALLPRC
Guest.Visitor
SQL in CL might be fun. CRTSQLCL.....
Please login to make comments.
User Rating: / 0
PoorBest 

   MC-STORE.COM