//BCHJOB JOB(JCMPSF) JOBD(NERONI2/NERONI2) OUTQ(QPRINT) + ENDSEV(60) LOG(4 00 *SECLVL) MSGQ(*USRPRF) CCSID(280) /* Open source from www.neroni.it */ /* LA JOB DESCRIPTION "NERONI2/NERONI2" DEVE PREESISTERE. PUO' ESSERE */ /* IDENTICA A QBATCH E PUO' ESSERE SOSTITUITA DA QBATCH O SIMILE. */ /* From System: "S65D69DA" */ /* From Library: "NERONI2" */ /* Unload Time: 2016-07-27 12:13 */ /* To File : "JCMPSF" */ /* To Library : "NERONI2" */ /* To Text : "Compare source files. Src" */ /********* INIZIO ISTRUZIONI **************************************************/ /* LE SUCCESSIVE ISTRUZIONI PERMETTONO DI RICARICARE I SORGENTI. */ /* 1) DA UN VIDEO COMANDI DELL'AS400 RICEVENTE */ /* CREARE UN FILE SORGENTE DI LUNGHEZZA RECORD 112: */ /* CRTSRCPF FILE(NERONI2/STRINGHE) RCDLEN(112) */ /* 2) SPOSTARE IL FILE "JCMPSF.txt" NELL'INDIRIZZARIO */ /* DI UN PC CONNESSO IN RETE CON L'AS400 RICEVENTE */ /* (AD ES.: "c:\"). */ /* 3) DAL VIDEO COMANDI DEL PC CHIAMARE FTP: */ /* ftp nomeas400 */ /* 4) DIGITARE UTENTE E PASSWORD. */ /* 5) ESEGUIRE IL COMANDO DI COPIA DA FILE PC A MEMBRO AS400: */ /* put "c:\JCMPSF.txt" "/qsys.lib/NERONI2.lib/stringhe.file/JCMPSF.mbr" */ /* 6) ABBANDONARE FTP: */ /* quit */ /* 7) DA UN VIDEO COMANDI DELL'AS400 RICEVENTE */ /* ESEGUIRE LA STRINGA COPIATA NEL MEMBRO SORGENTE: */ /* SBMDBJOB FILE(NERONI2/STRINGHE) MBR(JCMPSF) JOBQ(QBATCH) */ /* LE SUCCESSIVE ISTRUZIONI PERMETTONO DI CREARE L'UTILITY. */ /* 8) DA UN VIDEO COMANDI DELL'AS400 RICEVENTE */ /* ESEGUIRE LA STRINGA O LE STRINGHE SORGENTE DI TIPO SEU "CL" */ /* (IL CUI NOME TERMINA SEMPRE CON ".") */ /* PRESENTI NEL FILE RICARICATO "NERONI2/JCMPSF" */ /* FACENDO ATTENZIONE ALL'ORDINE DI ESECUZIONE INDICATO NEL */ /* MEMBRO FACOLTATIVO "A.LEGGIMI", AD ESEMPIO: */ /* SBMDBJOB FILE(NERONI2/JCMPSF) MBR(JCMPSF.) JOBQ(QBATCH) */ /********* FINE ISTRUZIONI ****************************************************/ /* Crea la libreria. */ MKDIR DIR('/qsys.lib/NERONI2.lib') CHGLIB LIB(NERONI2) TEXT('Claudio Neroni Utility') /* Imposta la lista librerie. */ CHGLIBL LIBL(QTEMP NERONI2 QGPL) /* Crea il file sorgente. */ DLTF FILE(NERONI2/JCMPSF) CRTSRCPF FILE(NERONI2/JCMPSF) RCDLEN(112) + TEXT('Compare source files. Src') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JCMPSF) TOFILE(NERONI2/JCMPSF) + TOMBR(JCMPSF) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JCMPSF) MBR(JCMPSF) + SRCTYPE(CMD) + TEXT('Compare source files. Cmd') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JCMPSF.) TOFILE(NERONI2/JCMPSF) + TOMBR(JCMPSF.) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JCMPSF) MBR(JCMPSF.) + SRCTYPE(CL) + TEXT('Compare source files. CrtJs') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JCMPSFC) TOFILE(NERONI2/JCMPSF) + TOMBR(JCMPSFC) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JCMPSF) MBR(JCMPSFC) + SRCTYPE(CLLE) + TEXT('Compare source files. Cpp') /*----------------------------------------------------------------------------*/ //DATA FILE(JCMPSF) FILETYPE(*SRC) ENDCHAR('//ENDSRC') CMD PROMPT('Compare Source Files') PARM KWD(FILE) TYPE(*NAME) MIN(1) PROMPT('Source + Files Name') PARM KWD(UPDLIB) TYPE(*NAME) MIN(1) + PROMPT('Update File Library') PARM KWD(CMPLIB) TYPE(*NAME) MIN(1) + PROMPT('Compare File Library') PARM KWD(MODE) TYPE(*CHAR) LEN(10) RSTD(*YES) + DFT(*CMPPFM) VALUES(*CMPPFM *CHKMBR) + PROMPT('Compare Mode') PARM KWD(CHAR) TYPE(*CHAR) LEN(1) RSTD(*YES) + DFT(£) VALUES(£ $ § A B C D E F G H I J K + I L M N O P Q R S T U V W X Y Z) + PROMPT('Char add to SeuType of equal') //ENDSRC /*----------------------------------------------------------------------------*/ //DATA FILE(JCMPSF.) FILETYPE(*SRC) ENDCHAR('//ENDSRC') //BCHJOB JOB(JCMPSF.) JOBD(NERONI2/NERONI2) OUTQ(QPRINTS) + ENDSEV(60) LOG(4 00 *SECLVL) MSGQ(*USRPRF) CCSID(280) /* Claudio Neroni 14-02-2007 Creato. */ /* JCMPSF */ /* Compare source files. */ /* Prerequisiti: nessuno */ /* Imposta la lista librerie. */ CHGLIBL LIBL(QTEMP QGPL) ADDLIBLE LIB(NERONI2) POSITION(*AFTER QTEMP) /* Cancella gli oggetti preesistenti. */ DLTCMD CMD(NERONI2/JCMPSF) DLTPGM PGM(NERONI2/JCMPSFC) /* Crea gli oggetti. */ CRTBNDCL PGM(NERONI2/JCMPSFC) SRCFILE(JCMPSF) DBGVIEW(*ALL) CRTCMD CMD(NERONI2/JCMPSF) PGM(JCMPSFC) SRCFILE(JCMPSF) + PRDLIB(NERONI2) CRTPRXCMD CMD(QGPL/JCMPSF) TGTCMD(NERONI2/JCMPSF) AUT(*USE) + REPLACE(*YES) //ENDBCHJOB //ENDSRC /*----------------------------------------------------------------------------*/ //DATA FILE(JCMPSFC) FILETYPE(*SRC) ENDCHAR('//ENDSRC') /* Compare source files. */ /* Dati due file sorgenti omonimi, modifica il tipo seu dei membri */ /* del primo file aggiungendo "£" ai membri: */ /* 1) se MODE = *CMPPFM */ /* con contenuto uguale ai corrispondenti del secondo file; */ /* 2) se MODE = *CHKMBR */ /* che esistono anche nel secondo file. */ /* 22-03-2007 Generalizzato carattere finale tipo seu. */ /* 09-05-2014 Introdotto MODE = *CHKMBR. */ PGM PARM(&FILE &UPDLIB &CMPLIB &MODE &CHAR) /* Riceve il nome comune dei due file sorgenti. */ DCL VAR(&FILE) TYPE(*CHAR) LEN(10) /* Riceve la libreria del primo file sorgente da segnare. */ DCL VAR(&UPDLIB) TYPE(*CHAR) LEN(10) /* Riceve la libreria del secondo file sorgente da non segnare. */ DCL VAR(&CMPLIB) TYPE(*CHAR) LEN(10) /* Riceve il modo della comparazione. */ /* *CMPPFM Segna sul primo file i membri con contenuto uguale */ /* a quelli del secondo. */ /* *CHKMBR Segna sul primo file i membri esistenti anche nel secondo. */ DCL VAR(&MODE) TYPE(*CHAR) LEN(10) /* Riceve il carattere da aggiungere in coda al tipo seu. */ DCL VAR(&CHAR) TYPE(*CHAR) LEN(1) DCL VAR(&NOME) TYPE(*CHAR) LEN(10) DCL VAR(&TYPE) TYPE(*CHAR) LEN(10) DCL VAR(&SRCTYPENEW) TYPE(*CHAR) LEN(10) DCL VAR(&NOMEW) TYPE(*CHAR) LEN(10) DCL VAR(&MSGID) TYPE(*CHAR) LEN(7) DCL VAR(&MRK) TYPE(*CHAR) LEN(4) DCL VAR(&STS) TYPE(*CHAR) LEN(512) DCL VAR(&TEXT) TYPE(*CHAR) LEN(50) MONMSG MSGID(CPF0000 MCH0000) EXEC(GOTO + CMDLBL(ERRORE)) /* Controlla ricevimento parametri file e librerie. */ IF COND(&FILE *EQ ' ' *OR &UPDLIB *EQ ' ' *OR + &CMPLIB *EQ ' ') THEN(DO) SNDPGMMSG MSG('File e librerie sono obbligatori.') GOTO CMDLBL(ERRORE) ENDDO /* Controlla parametro modo. */ IF COND(&MODE *NE *CMPPFM *AND &MODE *NE + *CHKMBR) THEN(DO) SNDPGMMSG MSG('Modo non previsto.') GOTO CMDLBL(ERRORE) ENDDO /* Controlla che le librerie siano diverse. */ IF COND(&UPDLIB *EQ &CMPLIB) THEN(DO) SNDPGMMSG MSG('Librerie uguali.') GOTO CMDLBL(ERRORE) ENDDO /* Controlla l'esistenza del primo file. */ CHKOBJ OBJ(&UPDLIB/&FILE) OBJTYPE(*FILE) MONMSG MSGID(CPF0000 MCH0000) EXEC(DO) SNDPGMMSG MSG('Non esiste il primo file da segnare.') GOTO CMDLBL(ERRORE) ENDDO /* Controlla l'esistenza del secondo file. */ CHKOBJ OBJ(&CMPLIB/&FILE) OBJTYPE(*FILE) MONMSG MSGID(CPF0000 MCH0000) EXEC(DO) SNDPGMMSG MSG('Non esiste il secondo file.') GOTO CMDLBL(ERRORE) ENDDO /* Recupera il nome e le caratteristiche del primo membro. */ RTVMBRD FILE(&UPDLIB/&FILE) MBR(*FIRSTMBR) + RTNMBR(&NOME) SRCTYPE(&TYPE) TEXT(&TEXT) /* Label Elaborazione. */ ITER: /* Messaggia. */ CHGVAR VAR(&STS) VALUE('Compara sorgente' *BCAT + &NOME *CAT ' ' *CAT &TEXT) SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&STS) + TOPGMQ(*EXT) MSGTYPE(*STATUS) /*********** SNDPGMMSG MSG(&STS) /* */ /* Se corre modo comparazione contenuto. */ IF COND(&MODE *EQ *CMPPFM) THEN(DO) /* Compara il contenuto dei due membri. */ CMPPFM NEWFILE(&UPDLIB/&FILE) NEWMBR(&NOME) + OLDFILE(&CMPLIB/*NEWFILE) OUTPUT(*OUTFILE) + OUTFILE(QTEMP/JCMPSFX1) /* Se comparazione fallita, salta a Nuovo membro. */ MONMSG MSGID(SPC5010) EXEC(GOTO CMDLBL(NUOVO)) /* Label Ricevimento messaggi. */ RCVMSG: RCVMSG RMV(*NO) KEYVAR(&MRK) MSGID(&MSGID) /* Se non ci sono messaggi, salta a Nuovo membro. */ IF COND(&MRK *EQ ' ') THEN(GOTO CMDLBL(NUOVO)) /* Se i membri sono uguali. */ IF COND(&MSGID *EQ SPC6001 *OR &MSGID *EQ + SPC6004) THEN(DO) /* Se la comparazione è vuota, aggiunge zero al tipo seu. */ IF COND(&MSGID *EQ SPC6004) THEN(CHGVAR + VAR(&SRCTYPENEW) VALUE(&TYPE *TCAT '0')) /* Se la comparazione non è vuota, aggiunge char al tipo seu. */ ELSE CMD(CHGVAR VAR(&SRCTYPENEW) VALUE(&TYPE + *TCAT &CHAR)) /* Modifica il tipo seu sul membro del primo file. */ CHGPFM FILE(&UPDLIB/&FILE) MBR(&NOME) + SRCTYPE(&SRCTYPENEW) /* Se i membri sono uguali. */ ENDDO /* Salta a Ricevimento messaggi. */ GOTO CMDLBL(RCVMSG) /* Se corre modo comparazione contenuto. */ ENDDO /* Se corre modo controllo esistenza membro. */ IF COND(&MODE *EQ *CHKMBR) THEN(DO) /* Controlla l'esistenza del membro nel secondo file. */ CHKOBJ OBJ(&CMPLIB/&FILE) OBJTYPE(*FILE) MBR(&NOME) /* Se non esiste, salta a nuovo membro. */ MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(NUOVO)) /* Aggiunge char al tipo seu. */ CHGVAR VAR(&SRCTYPENEW) VALUE(&TYPE *TCAT &CHAR) /* Modifica il tipo seu sul membro del primo file. */ CHGPFM FILE(&UPDLIB/&FILE) MBR(&NOME) + SRCTYPE(&SRCTYPENEW) /* Se corre modo controllo esistenza membro. */ ENDDO /* Label Nuovo membro. */ NUOVO: /* Accantona il nome del membro elaborato. */ CHGVAR VAR(&NOMEW) VALUE(&NOME) /* Recupera il nome e le caratteristiche del membro successivo. */ RTVMBRD FILE(&UPDLIB/&FILE) MBR(&NOMEW *NEXT) + RTNMBR(&NOME) SRCTYPE(&TYPE) TEXT(&TEXT) /* Se non ce ne sono altri, abbandona. */ MONMSG MSGID(CPF3049) EXEC(GOTO CMDLBL(FINE)) /* Salta a Elaborazione. */ GOTO CMDLBL(ITER) /* Label Errore. */ ERRORE: /* Rilascia con errore. */ SNDPGMMSG MSGID(CPF0001) MSGF(QCPFMSG) MSGDTA(JCMPSF) + MSGTYPE(*ESCAPE) /* Label Fine. */ FINE: ENDPGM //ENDSRC //ENDBCHJOB