Objectives
Explain general programming concepts Explain CLs strengths and weaknesses as a programming language
Show how to create a CL program
Explain what a compilation report is and how to use it to find program errors
Creating CL Programs
Library
Programmer CL Commands SEU
PF-SRC
CRTMBR *PGM CLP Compile
CRTMBR CLP
3
Program Processing
Programs can execute instructions 3 ways
The default method is sequential, I.e. in statement number order Execution can also be conditional and iterative.
CL Command Syntax
The format for a CL Command is:
COMMAND PARAMETER PARAMETER .
There is at least one space between the:
Command First parameter Each succeeding parameter
Commands are continued from one line to another by placing a plus sign after the command or a parameter
5
CL Command Syntax
The + must be preceded by at least a space if the continuation is between:
a
command and a parameter two parameters
COMMAND + PARAMETER PARAMETER COMMAND+ PARAMETER PARAMETER COMMAND PARAMETER PARAMETER + PARAMETER PARAMETER + PARAMETER
COMMAND PARAMETER PARAMETER+ PARAMETER PARAMETER
6
Continuing a CL Command
The + is not preceded by space(s) if the continuation is in the middle of the:
Command
word Parameter keyword
COMM+ AND PARAMETER PARMETER COMMAND PARAMETER PARA+ METER COMM + AND PARAMETER PARMETER COMMAND PARAMETER PARA + METER
7
Continuing a CL Command
If a parameter value(s) allows spaces, then the + is preceded by space(s)
GRTOBJAUT OBJ(YOURLIBXX/CLSRC) OBJTYPE(*FILE) + USER(INTRO35) AUT(*OBJALTER *OBJEXIST + *OBJMGT *OBJOPR *OBJREF *ADD) SNDMSG MSG('The rain in Spain falls manely on the + lions.') TOUSR(INTRO99)
8
Continuing a CL Command
If the continuation is in the middle of a value, no spaces precede the +
GRTOBJAUT OBJ(YOURLIBXX/CLSRC) OBJTYPE(*FILE) + USER(INTRO35) AUT(*OBJALTER *OB+ JEXIST *OBJMGT *OBJOPR *OBJREF *ADD) GRTOBJAUT OBJ(YOURLIBXX/CLSRC) OBJTYPE(*FILE) + USER(INTRO35) AUT(*OBJALTER *OB + JEXIST *OBJMGT *OBJOPR *OBJREF *ADD)
CL Programs
Begin with a PGM command and end with an ENDPGM command Comments (non-executable text) may precede the PGM statement Comments begin with a forward slash & an asterisk and end with an asterisk & a forward slash
/* This is an example of a comment. */
10
Programs
Programs read and write data Data can come from storage, the OS, or the person who calls the program Programs can write data to storage, a printer or a workstation
Data Program Data Printout
Operating System
Storage
Data
Data
User
11
User Supplied Program Data
You can supply data when calling the program as follows: To receive the data, the program must have a PARM keyword in the PGM statement. The PARM keyword identifies the program variables that will hold the data PARM(&CUSTNAME &ORDAMT)
12
CALL pgm1 (chardata numeric chardata.)
PGM
User Supplied Program Data
The parameters specified on the call must match the parameters specified in the PARM keyword CALL pgm1 (Walmart 275)
PGM
PARM(&CUSTNAME &ORDAMT)
If they dont match: CALL pgm1 (275) The program will not be run and you will get the following message:
Parameters passed on CALL do not match those required.
13
Program Variables
Programs store input and output in program variables Just like a data base field, a program variable has a:
Name Length Data type
Program variables exist for as long as the program is running
14
CL Program Variables
Are defined with a DCL (declare) command A CL program variable name must:
Begin with an ampersand (&) Has a max length of 11 Cannot contain spaces
DCL statements must be at the beginning of the program following the PGM statement
********************** &ORDAMT) TYPE(*CHAR) LEN(15) TYPE(*DEC) LEN(9 2)
15
*************** Beginning of data 0001.00 PGM PARM(&CUSTNAME 0002.00 DCL VAR(&CUSTNAME) 0003.00 DCL VAR(&ORDAMT)
Retrieving Data from OS/400
RTVSYSVAL - retrieves and stores system parameter values in program variables:
Date Time System
Default Printer RTNVAR(&CURTIME)
RTVSYSVAL
SYSVAL(QTIME)
RTVJOBA - retrieves and stores job information in program variables:
Job
name User running job Output queue RTVJOBA USER(&USERID)
16
Sending Data to a User
SNDUSRMSG - sends a message to the person running the program or a specified users message queue
MSG('I''ll be back')
SNDUSRMSG
SNDUSRMSG
MSG(&CUSTNAME) MSGTYPE(*INFO) + TOUSR(INTRO99)
You can build complex messages combining static text and program variables by using string functions
17
String Functions
Concatenation - joins two strings together
*CAT *TCAT *BCAT
- eliminates trailing spaces - one trailing space between strings *CAT &CURTIME) *TCAT &CURTIME) *BCAT &CURTIME)
SNDUSRMSG SNDUSRMSG SNDUSRMSG
MSG('I''ll be back at MSG('I''ll be back at MSG('I''ll be back at
Results in:
I'll be back at 14:09:08 I'll be back at14:09:08 I'll be back at 14:09:08
18
String Functions
Substring - identifies a subset of a string
%SST(string
start-location size)
When used with a CHGVAR command, new strings can be created.
*BCAT &NOSECTIME)
CHGVAR VAR(&NOSECTIME) VALUE(%SST(&CURTIME 1 5)
SNDUSRMSG MSG('I''ll be back at
Results in:
I'll be back at 14:09
19
0001.00 0002.00 0003.00 0004.00 0005.00 0006.00 0007.00 0008.00 0009.00 0010.00 0011.00 0012.00 0013.00 0014.00 0015.00 0016.00 0017.00 0018.00 0019.00 0020.00 0021.00 0022.00
CL Program
START:
DCL DCL DCL DCL
PGM PARM(&LIBNAME &FILENAME &MEMNAME &MEMTYPE)
/* Create info is supplied and the variables defined*/ VAR(&FILENAME) VAR(&MEMNAME) VAR(&LIBNAME) VAR(&MEMTYPE) TYPE(*CHAR) TYPE(*CHAR) TYPE(*CHAR) TYPE(*CHAR) LEN(10) LEN(10) LEN(10) LEN(3) */
/* The member is created
CRTMBR: STRSEU SRCFILE(&LIBNAME/&FILENAME) SRCMBR(&MEMNAME) TYPE(&MEMTYPE)
/* Message to confirm member creation is sent SNDUSRMSG MSG('IT''S DONE, PAPPY!')
+ +
*/
/* The program is ended END: ENDPGM
*/
20
Compilation Reports
Library
PF-SRC
CRTMBR *PGM CLP
MSGQ
Compilation Report
CRTMBR CLP
Compile
21
Compilation Reports
General Information Source Code Listing
Cross reference table
Error message summary
22
General information area
Display Spooled File File . . . . . : COMPILEEX Page/Line 1/1 Control . . . . . ________ Columns 1 - 78 Find . . . . . . ______________________________ *...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+... 5763SS1 V3R2M0 960517 Control Language GRA Program . . . . . . . . . . . . . . . . . . . : COMPILEEX Library . . . . . . . . . . . . . . . . . . : GRADES Source file . . . . . . . . . . . . . . . . . : GRADES Library . . . . . . . . . . . . . . . . . . : GRADES Source member name . . . . . . . . . . . . . : COMPILEEX 10/30/97 17:06: Source printing options . . . . . . . . . . . : *SOURCE *XREF *GEN *NOSE Program generation options . . . . . . . . . : *NOLIST *NOXREF *NOPATCH User profile . . . . . . . . . . . . . . . . : *USER Program logging . . . . . . . . . . . . . . . : *JOB Allow RTVCLSRC command . . . . . . . . . . . : *YES Replace program . . . . . . . . . . . . . . . : *YES Target release . . . . . . . . . . . . . . . : V3R2M0 Authority . . . . . . . . . . . . . . . . . . : *LIBCRTAUT Sort sequence . . . . . . . . . . . . . . . . : *HEX Language identifier . . . . . . . . . . . . . : *JOBRUN
23
Searching the report
Control field commands provide quick movement through the spool file
Move forward 5 pages Move backwards 5 pages Move to page 5 Move forward 5 lines Move backwards 5 lines Move to the right 5 columns Move to the left 5 columns Move to the fifth column Move to the end of the spool file Move to the beginning of the spool file
P+5 P-5 P5 +5 -5 W+5 W-5 W5 B or *BOT T or *TOP
24
Find Area
Allows you to search for a character string within the compilation report Case sensitive To find a string:
Enter
the text in the find area Press F16
To find other occurrences of the string continue to press F16
25
Source Code Listing
Displays source code Error messages placed after incorrect statements
Control Language Source SEQNBR *...+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 100DCL VAR(&JOB) TYPE(*CHAR) LEN(7) * CPD0740 10 PGM command missing. 200DCL VAR(&USR) TYPE(*CHAR) LEN(10) 300RTVJOBA JOB(&JOB) * CPD0784 30 Variable &JOB for parameter JOB must be *CHAR, minimum length 10 400RTVJOBA USER(&USER) * CPD0727 40 Variable '&USER ' is referred to but not declared. 500SNDUSRMSG MSG('The job number is' *cat &job *cat + 600 'and the user is ' *cat &user *cat + 700 '.') TOUSR(&USER) * CPD0727 40 Variable '&USER ' is referred to but not declared. * CPD0727 40 Variable '&USER ' is referred to but not declared. 800GOTO CMDLBL(END) * CPD0725 10 End of source file reached without ENDPGM command. * * * * * E N D O F S O U R C E * * * *
26
Error messages
Comprised of three parts:
Error
code Error message Severity level
CPD0740
10
PGM command missing.
27
Cross Reference table
For every variable and label, the statement numbers that reference each are displayed Errors messages listed here also
Control Language Cross Reference Type *CHAR *CHAR Length References 7 300 500 10 ' declared but not referred to. GRA
5763SS1 V3R2M0 960517 Declared Variables Name Defined &JOB 100 &USR 200 * CPD0726 10 Variable '&USR Defined Labels Label Defined END ****** * CPD0715 30 Label 'END * * * *
References 800 ' does not exist. * E N D O F C R O S S
R E F E R E N C E
28
Error Message Summary
Error message total Subtotals by severity level Successful or not message Max severity
Message Summary
Severity Total 0-9 10-19 20-29 30-39 40-49 50-59 60-69 70-79 80-89 90 8 0 3 0 2 3 0 0 0 0 Program COMPILEEX not created in library GRADES. Maximum error severity 40. * * * * * E N D O F M E S S A G E S U M
Severity 20 errors (and higher) stop the compile
29
Run Time Errors
Source code that compiles can still have errors when run or have incorrect output If there is a run time error, the system will display a short message For more info about the problem:
Move
the cursor to the message Press F1 Additional Message Information will be displayed for the message
30
JOBLOG
Most of the time, Additional Message Information will be enough to understand the problem If not, all messages need to be checked. (Not just the one displayed by the system.) Display the JOBLOG by
Pressing
F10 at the Additional Message Information screen Or issue the DSPJOBLOG command
31
Run Time Errors
Some run time errors are not the result of incorrect programming e.g.
Incorrect
user input Lack of authority No data
The program should not end when these types of errors occur
The program should check for these conditions and provide user friendly messages
32
Monitoring for Messages
MONMSG - allows the program, NOT the OS, to handle specified message(s) The CL command specified in the EXEC keyword is executed when the error occurs If MONMSG placed right after DCLs:
EXEC
performed regardless of the program statement causing the error
If MONMSG follows a command:
EXEC
performed only if the preceding command caused the specified error
33
Monitoring for Messages
CPF9810 - library does not exist CPF9812 - file does not exist This MONMSG results in an error handling routine being executed
MONMSG MSGID(CPF9812)
MONMSG MSGID(CPF9810) EXEC(CRTLIB &LIBNAME)
MONMSG MSGID(CPF9812) EXEC(GOTO CMDLBL(NOFILE))
No EXEC keyword means the error will be ignored
34
Error Handling Routines
Can further investigate the cause of the problem Perform complex functions to solve the problem Allow the user to select a course of action from program defined options
35
Message Replies
Messages can be sent that require a reply The reply can be stored in a program variable The reply value can be the basis for conditional statement execution
36
Message Replies
MSGRPY - Identifies the program variable to hold the reply
VALUES - Defines the valid values that can be entered as a reply
IF condition - if true, the statement(s) following THEN will be performed
MONMSG MSGID(CPF9810) EXEC(SNDUSRMSG MSG('THE LIBRARY + SPECIFIED DOES NOT EXIST. TO CREATE THE LIBRARY, REPLY + WITH A "Y". TO END THE PROGRAM, REPLY WITH A "N".') + MSGRPY(&REPLY) VALUES(Y N)) IF COND(&REPLY *EQ N) THEN(GOTO END) IF COND(&REPLY *EQ Y) THEN(CRTLIB &LIBNAME)
37
Points to Remember
CL commands can be grouped into programs Compilation reports are used to diagnose compile errors
The JOBLOG helps diagnose run time errors
Users can create their own CL commands
38