On occasion, it is handy to know the number of records in a file to determine how, or if, you will process it. Examples may include processing a file of transactions only when a certain number of records are present; or to determine if a file creation step in a procedure generated expected results.
One option is to use the CPYF (Copy File) command, and determine by the presence or absence of the completion message CPC2955 how many records were copied. This method, however, requires some tedious coding and depending on the size of the file, a considerable amount of time to perform the copy.
The RTVFILSIZ (Retrieve File Size) command implements a general solution to this task. The command processing program RTVFILSIZ (1) performs basic object validation of the library, file and member passed by the command (source in 2), then overrides "ANYFILE" to the actual library, file and member. The RPG program RECCNT (3) is then invoked to retrieve the actual number of records in the file from the file information data structure. "ANYFILE" is program described with the maximum record length entry of 9999, which will accommodate just about everything.
The RTVFILSIZ (Retrieve File Size) command implements a general solution to this task. The command processing program RTVFILSIZ (Figure 1) performs basic object validation of the library, file and member passed by the command (source in Figure 2), then overrides "ANYFILE" to the actual library, file and member. The RPG program RECCNT (Figure 3) is then invoked to retrieve the actual number of records in the file from the file information data structure. "ANYFILE" is program described with the maximum record length entry of 9999, which will accommodate just about everything.
The command syntax is:
RTVFILSIZ FILE(YOURLIB/YOURFILE) + MBR(MEMBER) + NBRRECS(&RECORDS)
The returned variable &RECORDS is defined as *DEC(15 0)
To create the command:
CRTCMD CMD(objlib/RTVFILSIZ) PGM(objlib/RTVFILSIZ) + SRCFILE(srclib/QCMDSRC) ALLOW(*IPGM *BPGM) (Substitute objlib & srclib with your object library and source library.)
The ALLOW (*IPGM *BPGM) parameter is necessary because the command returns a value (the number of records and thus cannot be executed interactively.
David Wilson Big Sandy, Texas
TechTalk: File Size Retriever
Figure 1 CL program RTVFILSIZ
RTVFILSIZ: + PGM PARM(&FILELIBR &MBRNAME &NBRRECS) DCL VAR(&FILELIBR) TYPE(*CHAR) LEN(20) DCL VAR(&FILENAME) TYPE(*CHAR) LEN(10) DCL VAR(&LIBNAME) TYPE(*CHAR) LEN(10) DCL VAR(&MBRNAME) TYPE(*CHAR) LEN(10) DCL VAR(&NBRRECS) TYPE(*DEC) LEN(15) DCL VAR(&MSGDTA) TYPE(*CHAR) LEN(1024) DCL VAR(&LENGTH) TYPE(*DEC) LEN(5 0) DCL VAR(&MSGID) TYPE(*CHAR) LEN(7) DCL VAR(&MSGF) TYPE(*CHAR) LEN(10) DCL VAR(&MSGFLIB) TYPE(*CHAR) LEN(10) MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR)) /* VERIFY THAT THE LIBRARY, FILE & MEMBER EXIST */ CHGVAR VAR(&FILENAME) VALUE(%SST(&FILELIBR 1 10)) CHGVAR VAR(&LIBNAME) VALUE(%SST(&FILELIBR 11 10)) CHKOBJ OBJ(&LIBNAME/&FILENAME) OBJTYPE(*FILE) MBR(&MBRNAME) /* POINT "ANYFILE" TO LIBRARY/FILE/MEMBER & RETRIEVE TOTAL + NUMBER OF RECORDS */ OVRDBF FILE(ANYFILE) TOFILE(&LIBNAME/&FILENAME) MBR(&MBRNAME) + LVLCHK(*NO) CHGVAR VAR(&NBRRECS) VALUE(0) CALL PGM(RECCNT) PARM(&NBRRECS) GOTO CMDLBL(EXIT) /* IF AN EXCEPTION MESSAGE WAS GENERATED, TRAP IT & SEND IT THE + PREVIOUS PROGRAM */ ERROR: + RCVMSG MSGTYPE(*EXCP) MSGDTA(&MSGDTA) MSGDTALEN(&LENGTH) + MSGID(&MSGID) MSGF(&MSGF) MSGFLIB(&MSGFLIB) SNDPGMMSG MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) MSGDTA(&MSGDTA) + TOPGMQ(*PRV) MSGTYPE(*ESCAPE) MONMSG MSGID(CPF0000) EXEC(RMVMSG CLEAR(*ALL)) EXIT: + ENDPGM
TechTalk: File Size Retriever
Figure 2 Command RTVFILSIZ
/* */ /* COMMAND....... RTVFILSIZ */ /* DESCRIPTION... RETRIEVE FILE SIZE IN TOTAL NUMBER */ /* OF RECORDS */ /* */ CMD PROMPT('Retrieve File Size') PARM KWD(FILE) TYPE(QUALNAM) MIN(1) + CHOICE('Name') PROMPT('File') PARM KWD(MBR) TYPE(*NAME) LEN(10) + DFT(*FIRST) SPCVAL((*FIRST)) + PROMPT('Member') CHOICE('Name, *FIRST') PARM KWD(NBRRECS) TYPE(*DEC) LEN(15 0) RTNVAL(*YES) + MIN(1) CHOICE('Number') + PROMPT('CL var for NBRRCDS (15 0 )') QUALNAM: QUAL TYPE(*NAME) LEN(10) QUAL TYPE(*NAME) LEN(10) DFT(*LIBL) SPCVAL((*LIBL) + (*CURLIB)) CHOICE('Name, *LIBL, *CURLIB') + PROMPT('Library name')
TechTalk: File Size Retriever
Figure 3 RPG program RECCNT
F*---------------------------------------------------------------- F* F* PROGRAM....... RECCNT F* DESCRIPTION... RETRIEVE THE TOTAL NUMBER OF RECORDS F* IN A FILE FROM THE FILE INFORMATION F* DATA STRUCTURE F* F*---------------------------------------------------------------- FANYFILE IP F 9999 DISK KINFDS INFO I* IANYFILE NS I* IINFO DS I B 156 1590RECS I* I* DEFINE CONSTANTS I* I '1' C ON I 1 C WK1 I 2.334 C WK2 I 3 C WK3 I 1234567890123456789.1-C WK4 I 23456789 I 'Midrange - C WK24 I 'Computing' C *ENTRY PLIST C PARM NBRREC 150 C MOVE RECS NBRREC C MOVE ON *INLR C ADD WK1 WKA 10 C ADD WK2 WKB 52 C ADD WK3 WKC 30 C MOVELWK24 WKD 25 C MOVE 'X' WKD C ADD WK4 WKE 309 C MOVE 'A' WKE
LATEST COMMENTS
MC Press Online