====== AS400/iSeries CL Notes ====== *CAT (concatenation, symbol ||) \\ *BCAT (concatenation, 1 Blank between strings, symbol |>) \\ *TCAT (concatenation, NO blanks between strings, symbol |<) \\ ? - Use before a command to prompt the user - ?wrkactjob, ?wrkjob, etc. \\ /* + Comment, Line 1 + Line 2 + Line 3 + */ --------------------------------------------------------------------------------------------------------------------- ===== Allocate Object (ALCOBJ) ===== ALCOBJ OBJ((&MYLIB/XYZ *FILE *EXCL)) MONMSG MSGID(CPF1002) EXEC(DO) /* can not allocate */ SNDBRKMSG MSG('Can not exclusivly allocate file XYZ. + Eliminate the locks and restart this job...') TOMSGQ(&JOB) GOTO ENDALL ENDDO --------------------------------------------------------------------------------------------------------------------- ===== Binary Conversion ===== %BIN format can be the same as %SST: %BIN(&field &start &length) --------------------------------------------------------------------------------------------------------------------- ===== Binary in arithmetic operations ===== CHGVAR &VAR1 (%BIN(&bw2) + 4) Process: convert &bw2 to decimal, add 4 to it, put results in &var1 --------------------------------------------------------------------------------------------------------------------- ===== Binary to Decimal ===== DCL &dec *dec (3 0) DCL &bw2 *char 2 VALUE(x'0012') /* A 2-byte binary work field. Must be 2 or 4 bytes. */ CHGVAR &dec %BIN(&bw2) Process: &bw2 (binary 12, defined in hex), is converted to decimal, and put in &dec --------------------------------------------------------------------------------------------------------------------- ===== Date Validation ===== CVTDAT DATE(&date) TOVAR(&date) FROMFMT(*mdy) TOFMT(*mdy) MONMSG CPF0000 DO(error_processing) Since the From & To formats are the same, no conversion is actually done. but an error message is sent if the date is invalid (which will be trapped by the MONMSG comand.) --------------------------------------------------------------------------------------------------------------------- ===== Decimal to Binary ===== CHGVAR %BIN(&bw2) &dec Process: &dec is converted to a 2-byte signed binary number, and placed in &bw2 --------------------------------------------------------------------------------------------------------------------- ===== File I/O ===== DCLF FILE(*LIBL/YOURFILE) READFILE: RCVF MONMSG MSGID(CPF0864) EXEC(GOTO CMDLBL(ENDFILE)) /* End of File */ /* do stuff */ GOTO CMDLBL(READFILE) ENDFILE: --------------------------------------------------------------------------------------------------------------------- ===== IF ... THEN ... ELSE ===== IF COND(&value *EQ 123) THEN(DO) STATEMENT 1 STATEMENT 2 enddo else cmd(DO) STATEMENT 3 STATEMENT 4 enddo IF ( &SFOPT *EQ '2' *AND &SFTYPE *EQ 'J' ) DO commands ENDDO ELSE IF ... --------------------------------------------------------------------------------------------------------------------- ===== Messages, Displaying in Reverse Image ===== DCL &reverse *char 1 VALUE(x'21') DCL &normal *char 1 VALUE(x'20') SNDPGMMSG MSGID() MSGF() MSGDTA(&reverse || &msg || &normal) TOPGMQ(*ext) --------------------------------------------------------------------------------------------------------------------- ===== MISC. ===== Overrides end when CL Ends --------------------------------------------------------------------------------------------------------------------- ===== PRTF, Using the same one Twice (in 2 separate RPG Programs) ===== OVRPRTF FILE(prt1) TOFILE(extprtf) SPLFNAME(prt1) OVRPRTF FILE(prt2) TOFILE(extprtf) SPLFNAME(prt2) Rename the record formats for both PRT1 and PRT2 in the RPG programs. --------------------------------------------------------------------------------------------------------------------- ===== RCVMSG ===== RCVMSG PGMQ(*same) MSGTYPE(*info) SENDER(&sender) RMV(*yes/*no) MSGKEY(&msgkey) * SENDER Format: Job (10), User (10), Job # (6), (All 3 for the Sending Job) Can use this to get the Current Program name: SNDPGMMSG MSG(' ') TOPGMQ(*same) MSGTYPE(*info) KEYVAR(&msgkey) RCVMSG PGMQ(*same) MSGTYPE(*info) SENDER(&sender) RMV(*yes) MSGKEY(&msgkey) CHGVAR VAR(&pgm) VALUE(%SST(&sender 56 10)) --------------------------------------------------------------------------------------------------------------------- ===== Reading Data File ===== dclf FNAME /* Declare file */ LOOP: rcvf /* Get Record */ monmsg CPF0000 goto ELOOP /* Leave loop on EOF */ STATEMENT 1 STATEMENT 2 /* After statements processed */ goto LOOP /* GOTO beginning of loop */ ELOOP: All fields in FNAME are automatically defined (&FIELD) --------------------------------------------------------------------------------------------------------------------- ===== Records, Redefining them (Parsing a large field or Record Format) ===== If a file contains large fields that you need to parse, follow these steps: - Define a new file w/ the same record length with the smaller fields defined. - OVRDBF FILE(New_File) TOFILE(Old_File) LVLCHK(*no) - This Parses the Old file, using the Definition from the New file - By doing a DCLF before the Over-ride and a RCVF after, you can get numeric data (into numeric CL fields) from a large character field --------------------------------------------------------------------------------------------------------------------- ===== Self-Submitting CL ===== To have a CL submit itself to batch, use: RTVJOBA TYPE(&jobtype) IF COND(&jobtype *eq '0') THEN this is Batch IF COND(&jobtype *eq '1') DO(SBMJOB ...) --------------------------------------------------------------------------------------------------------------------- ===== Structure ===== DCL &field1 *CHAR 7 'init value' DCL &fld2 *CHAR 132 CHGVAR &fld2 %SST( &field1 1 10) CALL program1 ( + &sbs /* Subsystem name */ + &sbslib /* Subsystem Library */ + ) IF ( &msgid *NE &blanks ) DO SNDPGMMSG MSGID( &msgid ) + MSGDTA( &msgdta ) + MSGF( qcpfmsg ) + MSGTYPE( *DIAG ) --------------------------------------------------------------------------------------------------------------------- ===== Subroutines ===== CHGVAR &rtnloc 'LOC1' GOTO SUBR1 LOC1: CHGVAR &rtnloc 'LOC2' GOTO SUBR2 LOC2: * Beginning of Subroutine #1 ***** SUBR1: commands commands GOTO NAVIGATE * Beginning of Subroutine #2 ***** SUBR2: commands commands GOTO NAVIGATE * Navigate to Correct Return Point ***** NAVIGATE: IF (&rtnloc *EQ 'LOC1') THEN(GOTO LOC1) IF (&rtnloc *EQ 'LOC2') THEN(GOTO LOC2)