//BCHJOB JOB(JLOG) JOBD(NERONI2/NERONI2) OUTQ(QPRINT) + ENDSEV(60) LOG(4 00 *SECLVL) MSGQ(*USRPRF) /* Open source scaricabile da 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: 2015-12-04 18:08 */ /* To File : "JLOG" */ /* To Library : "NERONI2" */ /* To Text : "Archives log. 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 "JLOG.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:\JLOG.txt" "/qsys.lib/NERONI2.lib/stringhe.file/JLOG.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(JLOG) 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/JLOG" */ /* FACENDO ATTENZIONE ALL'ORDINE DI ESECUZIONE INDICATO NEL */ /* MEMBRO FACOLTATIVO "A.LEGGIMI", AD ESEMPIO: */ /* SBMDBJOB FILE(NERONI2/JLOG) MBR(JLOG.) JOBQ(QBATCH) */ /********* FINE ISTRUZIONI *********************************************/ /* Crea la libreria. */ MKDIR DIR('/qsys.lib/NERONI2.lib') CHGLIB LIB(NERONI2) TEXT('Utility di Claudio Neroni') /* Imposta la lista librerie. */ CHGLIBL LIBL(QTEMP NERONI2 QGPL) /* Crea il file sorgente. */ DLTF FILE(NERONI2/JLOG) CRTSRCPF FILE(NERONI2/JLOG) RCDLEN(112) + TEXT('Archives log. Src') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JLOG) TOFILE(NERONI2/JLOG) + TOMBR(JLOG) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JLOG) MBR(JLOG) + SRCTYPE(CMD) + TEXT('Archives Log. Cmd') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JLOG.) TOFILE(NERONI2/JLOG) + TOMBR(JLOG.) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JLOG) MBR(JLOG.) + SRCTYPE(CL) + TEXT('Archives Log. CrtJs') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JLOGC) TOFILE(NERONI2/JLOG) + TOMBR(JLOGC) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JLOG) MBR(JLOGC) + SRCTYPE(CLLE) + TEXT('Archives Log. Cpp') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JLOGD) TOFILE(NERONI2/JLOG) + TOMBR(JLOGD) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JLOG) MBR(JLOGD) + SRCTYPE(RPGLE) + TEXT('Archives Log. PrunesLog') /*---------------------------------------------------------------------*/ //DATA FILE(JLOG) FILETYPE(*SRC) ENDCHAR('//ENDSRC') /* Archives Log. Cmd */ /* Archivia Log. Comando */ /* Claudio Neroni 29-10-2015 Creato. */ /* */ CMD PROMPT('Archives Log') PARM KWD(FROMTAG) TYPE(*CHAR) LEN(10) + DFT(JLOGFROM) PROMPT('From Tag in Log') PARM KWD(RQSID) TYPE(*CHAR) LEN(12) + DFT('Richiesta') PROMPT('Request Ide in + Printed Log') PARM KWD(OUTFILE) TYPE(OUTFILE) PROMPT('Output + File') OUTFILE: QUAL TYPE(*NAME) DFT(JLOGT) QUAL TYPE(*NAME) DFT(QTEMP) PROMPT('in library') PARM KWD(MBROPT) TYPE(*CHAR) LEN(10) RSTD(*YES) + DFT(*ADD) VALUES(*ADD *REPLACE) + PROMPT('Replace or Add Records') PARM KWD(TOPGMQ) TYPE(*CHAR) LEN(10) RSTD(*YES) + DFT(*PRV) VALUES(*PRV *PRVPRV) + PROMPT('RqsMsg To program queue') //ENDSRC /*---------------------------------------------------------------------*/ //DATA FILE(JLOG.) FILETYPE(*SRC) ENDCHAR('//ENDSRC') //BCHJOB JOB(JLOG.) JOBD(NERONI2/NERONI2) OUTQ(QPRINTS) ENDSEV(60) + LOG(4 00 *SECLVL) MSGQ(*USRPRF) /* Claudio Neroni 29-10-2015 Creato. */ /* JLOG. */ /* Archives Log. CrtJs */ /* Prerequisiti: nessuno */ /* Imposta la lista librerie. */ CHGLIBL LIBL(QTEMP QGPL) ADDLIBLE LIB(NERONI2) POSITION(*AFTER QTEMP) /* Cancella il file messaggi preesistente. */ DLTMSGF MSGF(NERONI2/JLOG) /* Cancella gli oggetti preesistenti. */ DLTCMD CMD(NERONI2/JLOG) DLTPNLGRP PNLGRP(NERONI2/JLOGP) DLTPGM PGM(NERONI2/JLOGC) DLTPGM PGM(NERONI2/JLOGD) /* Crea i comandi. */ CRTCMD CMD(NERONI2/JLOG) PGM(JLOGC) SRCFILE(JLOG) + HLPPNLGRP(JLOGP) HLPID(CMD) PRDLIB(NERONI2) /* Duplica i comandi in QGPL. */ DLTCMD CMD(QGPL/JLOG*) CRTDUPOBJ OBJ(JLOG*) FROMLIB(NERONI2) OBJTYPE(*CMD) TOLIB(QGPL) /* Crea i programmi. */ CRTBNDCL PGM(NERONI2/JLOGC) SRCFILE(JLOG) TGTRLS(*CURRENT) + DBGVIEW(*ALL) CRTBNDRPG PGM(NERONI2/JLOGD) SRCFILE(JLOG) DBGVIEW(*ALL) + TGTRLS(*CURRENT) /* Crea i testi d'aiuto. */ CRTPNLGRP PNLGRP(NERONI2/JLOGP) SRCFILE(JLOG) /* Crea il file messaggi. */ CRTMSGF MSGF(NERONI2/JLOG) TEXT('Archives Log. Msgf') ADDMSGD MSGID(JLG0001) MSGF(NERONI2/JLOG) MSG('Nome &1 per file + di output non e'' permesso.') SECLVL('Il nome "&1" + richiesto per il file di output e'' riservato all''uso + interno del tool. Usa un nome diverso.') FMT((*CHAR 10)) ADDMSGD MSGID(JLG0002) MSGF(NERONI2/JLOG) MSG('Archivia il log + dopo l''ultima label &1') FMT((*CHAR 10)) //ENDBCHJOB //ENDSRC /*---------------------------------------------------------------------*/ //DATA FILE(JLOGC) FILETYPE(*SRC) ENDCHAR('//ENDSRC') /* Archives Log. Cpp */ /* Archivia Log. Cpp */ /* Claudio Neroni 29-10-2015 Creato. */ /* Archivia la parte finale della stampa del log del job corrente */ /* in un file fisico. */ /* L'archiviazione parte dalla riga di richiesta che precede la riga ove */ /* giace l'ultima ricorrenza della stringa contenuta in &FROMTAG e */ /* arriva fino al DSPJOBLOG eseguito nel run del corrente comando JLOG. */ /* La costante di identificazione della riga di richiesta e' esplicitata */ /* nel parametro &RQSID al solo scopo di permettere l'uso del comando */ /* anche in altri release e in altre lingue. */ /* */ PGM PARM(&FROMTAG &RQSID &OUTFILEQ &MBROPT &TOPGMQ) /* Riceve From Tag in Log. */ DCL VAR(&FROMTAG) TYPE(*CHAR) LEN(10) /* Riceve Request Identification in Printed Log. */ DCL VAR(&RQSID) TYPE(*CHAR) LEN(12) /* Riceve Nome qualificato del file di emissione. */ DCL VAR(&OUTFILEQ) TYPE(*CHAR) LEN(20) /* Riceve Replace or Add Records. */ DCL VAR(&MBROPT) TYPE(*CHAR) LEN(10) /* Riceve Coda programma destinatario. */ DCL VAR(&TOPGMQ) TYPE(*CHAR) LEN(10) /* File di emissione. */ DCL VAR(&OUTFILE) TYPE(*CHAR) LEN(10) /* Libreria del File di emissione. */ DCL VAR(&OUTLIB) TYPE(*CHAR) LEN(10) /* Nome del work file temporaneo. */ DCL VAR(&WRKF) TYPE(*CHAR) LEN(10) VALUE(JLOG_OUT) /* Prenotazione del CPF0001. */ DCL VAR(&CPF0001) TYPE(*LGL) /* Intercetta gli errori imprevisti. */ MONMSG MSGID(CPF0000 MCH0000 CEE0000) EXEC(GOTO + CMDLBL(ERRORE)) /* Estrae parametri. */ CHGVAR VAR(&OUTFILE) VALUE(%SST(&OUTFILEQ 1 10)) CHGVAR VAR(&OUTLIB) VALUE(%SST(&OUTFILEQ 11 10)) /* Se scelto nome di outfile coincidente con nome riservato, errore. */ IF COND(&OUTFILE *EQ JLOG_OUT) THEN(DO) SNDPGMMSG MSGID(JLG0001) MSGF(JLOG) MSGDTA(&OUTFILE) + MSGTYPE(*DIAG) GOTO CMDLBL(CPF0001) ENDDO /* Messaggia. */ SNDPGMMSG MSGID(JLG0002) MSGF(JLOG) MSGDTA(&FROMTAG) + TOPGMQ(*EXT) MSGTYPE(*STATUS) /* Stampa joblog. */ OVRPRTF FILE(QPJOBLOG) HOLD(*YES) USRDFNDTA(JLOG) DSPJOBLOG OUTPUT(*PRINT) DLTOVR FILE(QPJOBLOG) /* Crea un fisico temporaneo di comodo. */ DLTF FILE(QTEMP/&WRKF) MONMSG MSGID(CPF0000 MCH0000) CRTPF FILE(QTEMP/JLOG_OUT) RCDLEN(133) + TEXT('Archives Log. Temporary Outfile') + SIZE(*NOMAX) /* Copia la stampa nel comodo. */ CPYSPLF FILE(QPJOBLOG) TOFILE(QTEMP/&WRKF) + SPLNBR(*LAST) CTLCHAR(*FCFC) /* Cancella la stampa. */ DLTSPLF FILE(QPJOBLOG) SPLNBR(*LAST) /* Pulisce dal log i record indesiderati. */ OVRDBF FILE(&WRKF) TOFILE(QTEMP/&WRKF) CALL PGM(JLOGD) PARM(&FROMTAG &RQSID) DLTOVR FILE(&WRKF) /* Comprime il log. */ RGZPFM FILE(QTEMP/&WRKF) /* Se richiesta sostituzione, cancella l'outfile. */ IF COND(&MBROPT *EQ *REPLACE) THEN(DO) DLTF FILE(&OUTLIB/&OUTFILE) MONMSG MSGID(CPF0000 MCH0000) ENDDO /* Crea l'outfile. */ CRTPF FILE(&OUTLIB/&OUTFILE) RCDLEN(133) + TEXT('Archives Log. Outfile') SIZE(*NOMAX) MONMSG MSGID(CPF0000 MCH0000) /* Copia il comodo nell'outfile. */ CPYF FROMFILE(QTEMP/&WRKF) + TOFILE(&OUTLIB/&OUTFILE) MBROPT(*ADD) + FMTOPT(*NOCHK) /* Scrive il prototipo di richiesta di esplorazione del risultato. */ JRQS CMD(DSPPFM FILE(&OUTLIB/&OUTFILE)) + TOPGMQ(&TOPGMQ) /* Label di esecuzione delle attivitā finali. */ RCLRSC: /* Dealloca ... */ /* Riacquisisce le risorse. */ RCLRSC MONMSG MSGID(CPF0000 MCH0000) /* Se richiesto, rilascia il CPF0001. */ IF COND(&CPF0001) THEN(DO) SNDPGMMSG MSGID(CPF0001) MSGF(QCPFMSG) MSGDTA(JLOG) + MSGTYPE(*ESCAPE) MONMSG MSGID(CPF0000 MCH0000) ENDDO /* Ritorna. */ RETURN /* Label di errore. */ ERRORE: /* Restituisce i messaggi al chiamante, */ /* trasformando eventuali escape in diagnostici. */ JRSNMSG MONMSG MSGID(CPF0000 MCH0000) /* Label di prenotazione del CPF0001. */ CPF0001: /* Prenota il CPF0001. */ CHGVAR VAR(&CPF0001) VALUE('1') MONMSG MSGID(CPF0000 MCH0000) /* Salta alle attivitā finali. */ GOTO CMDLBL(RCLRSC) ENDPGM //ENDSRC /*---------------------------------------------------------------------*/ //DATA FILE(JLOGD) FILETYPE(*SRC) ENDCHAR('//ENDSRC') * Archives Log. PrunesOutfile * Archivia Log. Pota il File di emissione * Claudio Neroni 30-10-2015 Creato. * Toglie le righe indesiderate dal log scaricato nel fisico. * *--------------------------------------------------------------------------------------------- * Archives Log. Outfile Fjlog_out uf a f 133 disk infds(fids) *--------------------------------------------------------------------------------------------- * File Information Data Structure. D fids ds * Relative Record Number in Data Member. D fidsrr 397 400b 0 * Definisce il numero relativo del record iniziale dell'intervallo * da conservare. D okfrom s like(fidsrr) * Definisce numeri relativi di record estremi dell'intervallo * da cancellare. D dltfrom s like(fidsrr) D dltto s like(fidsrr) * Definisce numero relativo di record in cancellazione. D rrn s like(fidsrr) * Riga da emettere D out ds D outdata 2 133 * Identificazione delle prime quattro righe di ogni pagina di log. D qua s 33 dim(4) *--------------------------------------------------------------------------------------------- * Legge campi dal record. Ijlog_out no 01 * Campo identificativo per individuare le prime quattro righe * di ogni pagina del log. I 1 33 int * Campo in cui puo' giacere il tipo messaggio. I 13 24 typ * Campo in cui puo' giacere il tag cercato. I 59 68 tag *--------------------------------------------------------------------------------------------- C VIA TAG *--------------------------------------------------------------------------------------------- * Prenota chiusura. C seton lr *--------------------------------------------------------------------------------------------- * Accantona i primi 33 caratteri delle prime quattro righe. C 1 do 4 rrn * Cerca senza update il record. C rrn chain(n) jlog_out * Trascrive i caratteri nella schiera. C eval qua(rrn) = int * Accantona i primi 33 caratteri delle prime quattro righe. C enddo *--------------------------------------------------------------------------------------------- * Annota il primo record da cancellare. C eval dltfrom = 5 *--------------------------------------------------------------------------------------------- * Trova il record che porta l'ultimo FromTag. C if 1=1 * Si posiziona a fine log. C *hival setgt jlog_out * Cicla all'infinito. C dow 1=1 * Legge senza update il record precedente. C readp(n) jlog_out * Se non ce ne sono altri, abbandona. C if %eof(jlog_out) C leave C endif * Se il record letto porta il FromTag nella posizione prevista, * abbandona. C if tag = fromtag C leave C endif * Cicla all'infinito. C enddo * Trova il record che porta l'ultimo FromTag. C endif *--------------------------------------------------------------------------------------------- * Trova il record che porta il messaggio di richiesta * precedente a quello che porta l'ultimo FromTag. C if 1=1 * E' gia' posizionato sul record che porta l'ultimo FromTag. C* ... * Cicla all'infinito. C dow 1=1 * Legge senza update il record precedente. C readp(n) jlog_out * Se non ce ne sono altri, abbandona. C if %eof(jlog_out) C leave C endif * Se il record letto porta il tipo messaggio "Richiesta", * abbandona. C if typ = rqsid C leave C endif * Cicla all'infinito. C enddo * Trova il record che porta il messaggio di richiesta * precedente a quello che porta l'ultimo FromTag. C endif * Accantona tale record come primo record da conservare. C eval okfrom = fidsrr * Calcola l'ultimo record da cancellare. C eval dltto = fidsrr - 1 *--------------------------------------------------------------------------------------------- * Se Primo e Ultimo record da cancellare sono congruenti. C if dltto >= dltfrom * Cancella tutti i record tra primo e ultimo. C dltfrom do dltto rrn C rrn delete jlog_out C enddo * Se Primo e Ultimo record da cancellare sono congruenti. C endif *--------------------------------------------------------------------------------------------- * Cancella dai record da conservare le righe di intestazione * di ogni pagina C if 1=1 * Se primo record da conservare č valorizzato. C if okfrom > *zero * Si posiziona prima del primo record da conservare. C okfrom setll jlog_out * Cicla all'infinito. C dow 1=1 * Legge senza update il record successivo. C read(n) jlog_out * Se non ce ne sono altri, abbandona. C if %eof(jlog_out) C leave C endif * Se l'identificazione del record non e' tra quelle accantonate,. * ricicla. C if %lookup(int:qua) = *zero C iter C endif * Cancella il record corrente riconosciuto come * intestazione di pagina di log. C fidsrr delete jlog_out * Cicla all'infinito. C enddo * Se primo record da conservare č valorizzato. C endif * Cancella dai record da conservare le righe di intestazione * di ogni pagina C endif *--------------------------------------------------------------------------------------------- * Scrive una riga di fine log come separazione da log successivi. C clear out C eval outdata = *all'<<<>>> ' C eval %subst(outdata:7:1) = '-' C write jlog_out out *--------------------------------------------------------------------------------------------- * Inizializza. C *inzsr begsr * Scambia parametri. C *entry plist * Riceve il Tag che identifica il record di partenza * della parte da conservare del log. C parm fromtag 10 I From Tag * Riceve la costante che identifica un messaggio di richiesta * sulla stampa del log. C parm rqsid 12 I Request Identif C endsr *--------------------------------------------------------------------------------------------- //ENDSRC //ENDBCHJOB