CL Import stream files
CLPs can be used to covert ASCII stream files to EBCIDIC files.
Importing stream file data
The Copy From Stream File (CPYFRMIMPF) command copies the data in a stream file to either a database file member or a save file. Optional conversion of the data and reformatting is performed when copying a database file member. Note in the example below the End of Record (EOR) marker is expected to be a single line feed (*LF).
/*********************************************************************/ /* Program Name -ISI070CL */ /* */ /* Function - This program was designed to read a directory and */ /* upload a NCOA file from CSG. */ /* */ /* Programmer - Steve Croy 99/99/9999 */ /*********************************************************************/ PGM DCLPRCOPT DFTACTGRP(*NO) ACTGRP(CSGXMT) + BNDSRVPGM((ISI000SV)) DCL VAR(&IMPFOLDER) TYPE(*CHAR) LEN(200) DCL VAR(&ARCFOLDER) TYPE(*CHAR) LEN(200) DCL VAR(&ERRFOLDER) TYPE(*CHAR) LEN(200) /* sac05 */ DCL VAR(&MSGKEY) TYPE(*CHAR) LEN(4) DCL VAR(&PGMNAME) TYPE(*CHAR) LEN(10) DCL VAR(&FUNCTION) TYPE(*CHAR) LEN(25) DCL VAR(&PROGRAM) TYPE(*CHAR) LEN(15) DCL VAR(&SENDER) TYPE(*CHAR) LEN(80) DCL VAR(&FILEPATH) TYPE(*CHAR) LEN(200) DCL VAR(&FILENAME) TYPE(*CHAR) LEN(25) DCL VAR(&JOBTYPE) TYPE(*CHAR) LEN(1) DCL VAR(&CSGFTP) TYPE(*CHAR) LEN(15) + VALUE('CSGFTP') DCL VAR(&count) TYPE(*DEC ) LEN(5 0) DCL VAR(&SYSNAME) TYPE(*CHAR) LEN(8) DCL VAR(&SUBJECT) TYPE(*CHAR) LEN(50) /* sac05 */ dcl var(&message) type(*char) len(80) /* sac05 */ dcl var(&reason) type(*char) len(80) /* sac05 */ DCL VAR(&ERROR) TYPE(*LGL) LEN(1) /* sac05 */ RTVJOBA TYPE(&JOBTYPE) RTVNETA SYSNAME(&SYSNAME) /*-------------------------------------------------------------------*/ /* Clear the upload file */ /*-------------------------------------------------------------------*/ CLRPFM FILE(PERMGEN) /*-------------------------------------------------------------------*/ /* Get the program name */ /*-------------------------------------------------------------------*/ SNDPGMMSG MSG(' ') TOPGMQ(*SAME) MSGTYPE(*INFO) + KEYVAR(&MSGKEY) RCVMSG PGMQ(*SAME) MSGTYPE(*INFO) RMV(*YES) + SENDER(&SENDER) CHGVAR VAR(&PGMNAME) VALUE(%SST(&SENDER 56 10)) CHGVAR VAR(&PROGRAM) VALUE(&PGMNAME) /*-------------------------------------------------------------------*/ /* Get the folder where the CSG data is to be Archived */ /*-------------------------------------------------------------------*/ CHGVAR VAR(&FUNCTION) VALUE('IMPFOLDER') CALL PGM(ISI005RP) PARM(&PROGRAM &FUNCTION &IMPFOLDER) CHGVAR VAR(&FUNCTION) VALUE('ARCFOLDER') CALL PGM(ISI005RP) PARM(&PROGRAM &FUNCTION &ARCFOLDER) CHGVAR VAR(&FUNCTION) VALUE('ERRFOLDER') /* sac05 */ CALL PGM(ISI005RP) PARM(&PROGRAM &FUNCTION + &ERRFOLDER) /* sac05 */ /*-------------------------------------------------------------------*/ /* Read the files in the folder and move them to archive */ /*-------------------------------------------------------------------*/ DLTF FILE(QTEMP/CSGADRWF) /* sac01 */ MONMSG MSGID(CPF0000) /* sac01 */ CRTPF FILE(QTEMP/CSGADRWF) RCDLEN(553) TEXT('CSG: + Work file for ascii imports') + SIZE(*NOMAX) /* sac01 */ CHGVAR VAR(&COUNT) VALUE(0) CLRPFM FILE(CSGADRPF) LIST: CALL PGM(ISI010RP) PARM(&IMPFOLDER) READ: DOUNTIL COND(&FILEPATH *EQ '*****') CALL PGM(ISI020RP) PARM(&FILEPATH) IF COND(&FILEPATH *NE '*****') THEN(DO) /*-------------------------------------------------------------------*/ /* Copy the current file to the NCOA address file. */ /*-------------------------------------------------------------------*/ CHGATR OBJ(&FILEPATH) ATR(*CCSID) VALUE(1252) /* + sac04 */ CHGVAR VAR(&ERROR) VALUE('0') CPYFRMSTMF FROMSTMF(&FILEPATH) + TOMBR('/QSYS.LIB/QTEMP.LIB/CSGADRWF.FILE/CS+ GADRWF.MBR') MBROPT(*REPLACE) + STMFCCSID(*STMF) ENDLINFMT(*LF) /*-------------------------------------------------------------------*/ /* Move the data files to archive */ /*-------------------------------------------------------------------*/ ARCHIVE: MOVE OBJ(&FILEPATH) TODIR(&ARCFOLDER) + TOCCSID(*CALC) DTAFMT(*TEXT) MONMSG MSGID(CPFA0A0) EXEC(DO) CALLSUBR SUBR(EXCEPTION) CHGVAR VAR(&ERROR) VALUE('1') ENDDO IF COND(&ERROR *NE '1') THEN(DO) CPYFRMIMPF FROMFILE(CSGADRWF) TOFILE(CSGADRPF) + RCDDLM(*LF) STRDLM(*NONE) FLDDLM('|') + RPLNULLVAL(*FLDDFT) CHGVAR VAR(&COUNT) VALUE(&COUNT + 1) ENDDO ENDDO ENDREAD: ENDDO /*-------------------------------------------------------------------*/ /* Once the directory has been cleared, invoke the program to */ /* process the return data. */ /*-------------------------------------------------------------------*/ IF COND(&COUNT *LT 1) THEN(GOTO CMDLBL(TERMINATE)) /*-------------------------------------------------------------------*/ /* Process the return file */ /*-------------------------------------------------------------------*/ CALL PGM(ISI075RP) CALL PGM(PAA2000R) CALL PGM(ISI077RP) TERMINATE: DLTF FILE(QTEMP/CSGADRWF) MONMSG MSGID(CPF0000) CALL PGM(ISI079RP) RETURN /*-----------------------------------------------------------------*/ /* subroutine added to manage file exceptions */ /*-----------------------------------------------------------------*/ ERRFILE: SUBR SUBR(EXCEPTION) CHGVAR VAR(&SUBJECT) VALUE(' ') CHGVAR VAR(&message) VALUE(' ') CHGVAR VAR(&reason) VALUE(' ') CALLSUBR SUBR(ARCHIVESR) CHGVAR VAR(&SUBJECT) VALUE('CSG COA file error') CHGVAR VAR(&MESSAGE) VALUE('Error attempting to + move object to archive COA folder.') CHGVAR VAR(&REASON) VALUE('Check the job log of + CSGSDRCHG for details.') CALL PGM(CSG415CL) PARM(&SUBJECT &MESSAGE &REASON) ENDSUBR /*==================================================================*/ /* move file to archive */ /*==================================================================*/ SUBR SUBR(ARCHIVESR) RETRY: CHGVAR VAR(&ERROR) VALUE('0') MOV OBJ(&FILEPATH) TODIR(&ARCFOLDER) MONMSG MSGID(CPFA0A0) EXEC(DO) CHGVAR VAR(&ERROR) VALUE('1') CALL PGM(CSG305RP) PARM(&FILEPATH &ARCFOLDER) ENDDO IF COND(&ERROR) THEN(GOTO CMDLBL(RETRY)) ENDSUBR ENDPGM
Import using delimited stream files
In the sample below the import statement is directed at inbound data that has a column-delimiter. The CPYFRMIMPT has a parameter that allows a developer to specify the character used as a delimiter. In the case of the stream file below, the columns in the row are delimited by “|”.
/*********************************************************************/ /* Program Name -ISI071CL */ /* */ /* Function - This program was designed to read a directory and */ /* create update mail trace data inbound. */ /* */ /* Programmer - Steve Croy 99/99/9999 */ /*********************************************************************/ /*********************************************************************/ /* Modification log */ /* */ /* Date Programmer Description */ /*********************************************************************/ PGM DCLPRCOPT DFTACTGRP(*NO) ACTGRP(TRACE) + BNDSRVPGM((ISI000SV)) DCL VAR(&IMPFOLDER) TYPE(*CHAR) LEN(200) DCL VAR(&ARCFOLDER) TYPE(*CHAR) LEN(200) DCL VAR(&MSGKEY) TYPE(*CHAR) LEN(4) DCL VAR(&PGMNAME) TYPE(*CHAR) LEN(10) DCL VAR(&FUNCTION) TYPE(*CHAR) LEN(25) DCL VAR(&PROGRAM) TYPE(*CHAR) LEN(15) DCL VAR(&SENDER) TYPE(*CHAR) LEN(80) DCL VAR(&FILEPATH) TYPE(*CHAR) LEN(200) DCL VAR(&FILENAME) TYPE(*CHAR) LEN(25) DCL VAR(&JOBTYPE) TYPE(*CHAR) LEN(1) DCL VAR(&JOBDATE) TYPE(*CHAR) LEN(6) /* sac01 */ DCL VAR(&SYSNAME) TYPE(*CHAR) LEN(8) DCL VAR(&LIBRARY) TYPE(*CHAR) LEN(10) + VALUE('*LIBL') DCL VAR(&EXCEPTION) TYPE(*CHAR) LEN(25) /* sac01 */ DCL VAR(&DOCUMENT) TYPE(*CHAR) LEN(15) /* sac01 */ DCL VAR(&EXPFOLDER) TYPE(*CHAR) LEN(200) /* sac01 */ DCL VAR(&ERRPATH) TYPE(*CHAR) LEN(200) /* sac01 */ DCL VAR(&ERRNAME) TYPE(*CHAR) LEN(17) /* sac01 */ DCL VAR(&ERRFOLDER) TYPE(*CHAR) LEN(200) /* sac02 */ DCL VAR(&SCANREC) TYPE(*DEC) LEN(10 0) DCL VAR(&XREFREC) TYPE(*DEC) LEN(10 0) DCL VAR(&POS) TYPE(*UINT) LEN(2) DCL VAR(&SUBJECT) TYPE(*CHAR) LEN(50) /* sac02 */ dcl var(&message) type(*char) len(80) /* sac02 */ dcl var(&reason) type(*char) len(80) /* sac02 */ dcl var(&ERROR) type(*LGL) len(1) /* sac02 */ RTVJOBA TYPE(&JOBTYPE) DATE(&JOBDATE) RTVNETA SYSNAME(&SYSNAME) /*-------------------------------------------------------------------*/ /* Get the program name */ /*-------------------------------------------------------------------*/ SNDPGMMSG MSG(' ') TOPGMQ(*SAME) MSGTYPE(*INFO) + KEYVAR(&MSGKEY) RCVMSG PGMQ(*SAME) MSGTYPE(*INFO) RMV(*YES) + SENDER(&SENDER) CHGVAR VAR(&PGMNAME) VALUE(%SST(&SENDER 56 10)) CHGVAR VAR(&PROGRAM) VALUE(&PGMNAME) /*-------------------------------------------------------------------*/ /* Get the folder where the CSG mail trace data is located */ /*-------------------------------------------------------------------*/ CHGVAR VAR(&PROGRAM) VALUE(&PGMNAME) CHGVAR VAR(&FUNCTION) VALUE('IMPFOLDER') CALL PGM(ISI005RP) PARM(&PROGRAM &FUNCTION &IMPFOLDER) CHGVAR VAR(&FUNCTION) VALUE('ARCFOLDER') CALL PGM(ISI005RP) PARM(&PROGRAM &FUNCTION &ARCFOLDER) CHGVAR VAR(&FUNCTION) VALUE('ERRFOLDER') /* sac02 */ CALL PGM(ISI005RP) PARM(&PROGRAM &FUNCTION + &ERRFOLDER) /* sac02 */ /*-------------------------------------------------------------------*/ /* Read the files in the folder and move them to archive */ /*-------------------------------------------------------------------*/ LIST: CALL PGM(ISI010RP) PARM(&IMPFOLDER) READ: DOUNTIL COND(&FILEPATH *EQ '*****') CALL PGM(ISI020RP) PARM(&FILEPATH) /*-------------------------------------------------------------------*/ /* Copy the current file to the mail trace file */ /*-------------------------------------------------------------------*/ STRCOPY: IF COND(&FILEPATH *NE '*****') THEN(DO) CLRPFM FILE(CSGIMBWF) DLTF FILE(QTEMP/DUPSCANS) /* sac01 */ MONMSG MSGID(CPF0000) /* sac01 */ DLTF FILE(QTEMP/NOPOXREF) /* sac01 */ MONMSG MSGID(CPF0000) /* sac01 */ CHGVAR VAR(&SCANREC) VALUE(0) /* sac01 */ CHGVAR VAR(&XREFREC) VALUE(0) /* sac01 */ CPYFRMIMPF FROMSTMF(&FILEPATH) TOFILE(CSGIMBWF) + RCDDLM(*LF) STRDLM(*NONE) FLDDLM('|') + RPLNULLVAL(*FLDDFT) EXECSQL STMT('SELECT + count(*),IMZIPP,IMROUT,IMZIPC,imddtm FROM + csgimbwf GROUP BY + imzipp,imrout,imzipc,imddtm HAVING + count(*) > 1') OUTPUT(*OUTFILE) + OUTFILE(QTEMP/DUPSCANS) /* sac01 */ RTVMBRD FILE(DUPSCANS) NBRCURRCD(&SCANREC) /* sac01 */ IF COND(&SCANREC *GT 0) THEN(DO) /* sac01 */ CALLSUBR SUBR(EXCEPTION) /* sac01 */ GOTO CMDLBL(ENDCOPY) /* sac01 */ ENDDO /* sac01 */ EXECSQL STMT('select distinct aa.imdesc, bb.uspcod + from csgimbwf aa left join csgpocpf bb + on aa.imdesc = bb.uspdsc where + bb.uspcod is null') OUTPUT(*OUTFILE) + OUTFILE(QTEMP/NOPOXREF) /* sac01 */ RTVMBRD FILE(NOPOXREF) NBRCURRCD(&XREFREC) /* sac01 */ IF COND(&XREFREC *GT 0) THEN(DO) /* sac01 */ CALLSUBR SUBR(EXCEPTION) /* sac01 */ GOTO CMDLBL(ENDCOPY) /* sac01 */ ENDDO /* sac01 */ MOV OBJ(&FILEPATH) TODIR(&ARCFOLDER) MONMSG MSGID(CPFA0A0) EXEC(DO) CHGVAR VAR(&SUBJECT) VALUE(' ') CHGVAR VAR(&message) VALUE(' ') CHGVAR VAR(&reason) VALUE(' ') CALLSUBR SUBR(ARCHIVESR) ENDDO CALL PGM(ISI071RP) ENDCOPY: ENDDO ENDREAD: ENDDO TERMINATE: RETURN /*-----------------------------------------------------------------*/ /* Exception subroutine added to manage file exceptions */ /*-----------------------------------------------------------------*/ ERRFILE: SUBR SUBR(EXCEPTION) CHGVAR VAR(&DOCUMENT) VALUE('POLICY') CHGVAR VAR(&EXCEPTION) VALUE('EXCEPTION') CALL PGM(ISI005RP) PARM(&DOCUMENT &EXCEPTION + &EXPFOLDER) MOV OBJ(&FILEPATH) TODIR(&EXPFOLDER) CHGVAR VAR(&DOCUMENT) VALUE('CSGFTP') CHGVAR VAR(&EXCEPTION) VALUE('OUTBOUNDFOLDER') CALL PGM(ISI005RP) PARM(&DOCUMENT &EXCEPTION + &ERRFOLDER) CHGVAR VAR(&POS) VALUE(%SCAN('.7640' &FILEPATH)) CHGVAR VAR(&ERRNAME) VALUE(%SST(&FILEPATH &POS 18)) IF COND(&SCANREC *GT 0) THEN(DO) CHGVAR VAR(&ERRFOLDER) VALUE(&ERRFOLDER *TCAT + 'DUPSCANS' *TCAT &ERRNAME *TCAT '.TXT') CPYTOIMPF FROMFILE(DUPSCANS) TOSTMF(&ERRFOLDER) + MBROPT(*REPLACE) STMFCCSID(1252) + RCDDLM(*CRLF) STRDLM(*NONE) FLDDLM('|') ENDDO IF COND(&XREFREC *GT 0) THEN(DO) CHGVAR VAR(&ERRFOLDER) VALUE(&ERRFOLDER *TCAT + 'NOPOXREF' *TCAT &ERRNAME *TCAT '.TXT') CPYTOIMPF FROMFILE(NOPOXREF) TOSTMF(&ERRFOLDER) + MBROPT(*REPLACE) STMFCCSID(1252) + RCDDLM(*CRLF) STRDLM(*NONE) FLDDLM('|') ENDDO ENDSUBR /*==================================================================*/ /* move file to archive */ /*==================================================================*/ SUBR SUBR(ARCHIVESR) RETRY: CHGVAR VAR(&ERROR) VALUE('0') MOV OBJ(&FILEPATH) TODIR(&ARCFOLDER) MONMSG MSGID(CPFA0A0) EXEC(DO) CHGVAR VAR(&ERROR) VALUE('1') CALL PGM(CSG305RP) PARM(&FILEPATH &ARCFOLDER) ENDDO IF COND(&ERROR) THEN(GOTO CMDLBL(RETRY)) CHGVAR VAR(&SUBJECT) VALUE('Return file error + occurred') CHGVAR VAR(&MESSAGE) VALUE('Error occurred when + attempting to move to the archive + folder.') CHGVAR VAR(&REASON) VALUE('Check the job log of + CSGIMBTRC for details.') CALL PGM(CSG415CL) PARM(&SUBJECT &MESSAGE &REASON) ENDSUBR ENDPGM