//BCHJOB JOB(JMRG) 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-28 18:10 */ /* To File : "JMRG" */ /* To Library : "NERONI2" */ /* To Text : "Merge object info. 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 "JMRG.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:\JMRG.txt" "/qsys.lib/NERONI2.lib/stringhe.file/JMRG.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(JMRG) 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/JMRG" */ /* FACENDO ATTENZIONE ALL'ORDINE DI ESECUZIONE INDICATO NEL */ /* MEMBRO FACOLTATIVO "A.LEGGIMI", AD ESEMPIO: */ /* SBMDBJOB FILE(NERONI2/JMRG) MBR(JMRG.) 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/JMRG) CRTSRCPF FILE(NERONI2/JMRG) RCDLEN(112) + TEXT('Merge object info. Src') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JMRG) TOFILE(NERONI2/JMRG) + TOMBR(JMRG) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JMRG) MBR(JMRG) + SRCTYPE(CMD) + TEXT('Merge object info. Cmd') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JMRG.) TOFILE(NERONI2/JMRG) + TOMBR(JMRG.) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JMRG) MBR(JMRG.) + SRCTYPE(CL) + TEXT('Merge object info. CrtJs') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JMRGC) TOFILE(NERONI2/JMRG) + TOMBR(JMRGC) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JMRG) MBR(JMRGC) + SRCTYPE(CLLE) + TEXT('Merge object info. Cpp') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JMRGU) TOFILE(NERONI2/JMRG) + TOMBR(JMRGU) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JMRG) MBR(JMRGU) + SRCTYPE(RPGLE) + TEXT('Merge object info. ChgObjD') /*----------------------------------------------------------------------------*/ //DATA FILE(JMRG) FILETYPE(*SRC) ENDCHAR('//ENDSRC') /* Claudio Neroni 20-11-2008 Creato. */ /* Merge object info. Cmd */ /* Unisce informazioni oggetti. Cmd */ /* */ CMD PROMPT('Merge object info') PARM KWD(OBJFILE) TYPE(OBJFILE) SNGVAL((*NONE)) + MIN(1) PROMPT('Update Object description + file') OBJFILE: QUAL TYPE(*NAME) QUAL TYPE(*NAME) DFT(QTEMP) SPCVAL((QTEMP) + (*LIBL)) MIN(0) PROMPT('in library') PARM KWD(MODFILE) TYPE(MODFILE) SNGVAL((*NONE)) + MIN(1) PROMPT('Read Module description file') MODFILE: QUAL TYPE(*NAME) QUAL TYPE(*NAME) DFT(QTEMP) SPCVAL((QTEMP) + (*LIBL)) MIN(0) PROMPT('in library') PARM KWD(REFPGM) TYPE(*NAME) LEN(10) DFT(*CPP) + SPCVAL((*CPP)) PROMPT('Reference program + for messages') //ENDSRC /*----------------------------------------------------------------------------*/ //DATA FILE(JMRG.) FILETYPE(*SRC) ENDCHAR('//ENDSRC') //BCHJOB JOB(JMRG.) JOBD(NERONI2/NERONI2) OUTQ(QPRINTS) ENDSEV(60) + LOG(4 00 *SECLVL) MSGQ(*USRPRF) CCSID(280) jmy /* Claudio Neroni 20-11-2008 Creato. */ /* JMRG */ /* Merge object info. */ /* Unisce informazioni oggetti. */ /* Prerequisiti: JMOD JRSNMSG JCALLER */ /* Imposta la lista librerie. */ CHGLIBL LIBL(QTEMP QGPL) ADDLIBLE LIB(NERONI2) POSITION(*AFTER QTEMP) /* Cancella il file messaggi preesistente. */ DLTMSGF MSGF(NERONI2/JMRG) /* Cancella i testi d'aiuto preesistenti. */ DLTPNLGRP PNLGRP(NERONI2/JMRGP) /* Cancella i logici preesistenti. */ /* Cancella i fisici preesistenti. */ /* Cancella i comandi preesistenti. */ DLTCMD CMD(NERONI2/JMRG) /* Cancella i programmi preesistenti. */ DLTPGM PGM(NERONI2/JMRGC) DLTPGM PGM(NERONI2/JMRGU) /* Crea i file fisici. */ /* Crea i comandi. */ CRTCMD CMD(NERONI2/JMRG) PGM(JMRGC) SRCFILE(JMRG) + HLPPNLGRP(JMRGP) HLPID(CMD) PRDLIB(NERONI2) /* Duplica i comandi in QGPL. */ CRTPRXCMD CMD(QGPL/JMRG) TGTCMD(NERONI2/JMRG) AUT(*USE) REPLACE(*YES) /* Crea i programmi. */ CRTBNDCL PGM(NERONI2/JMRGC) SRCFILE(JMRG) TGTRLS(*CURRENT) + DBGVIEW(*ALL) CRTBNDRPG PGM(NERONI2/JMRGU) SRCFILE(JMRG) DBGVIEW(*ALL) + TGTRLS(*CURRENT) /* Crea il file messaggi. */ CRTMSGF MSGF(NERONI2/JMRG) TEXT('Merge object info. Msgf') /* Fotografia comandi (xxxA001). */ ADDMSGD MSGID(JMRA001) MSGF(NERONI2/JMRG) MSG('JMRG + OBJFILE(&2/&1) MODFILE(&4/&3) REFPGM(&5)') FMT((*CHAR + 10) (*CHAR 10) (*CHAR 10) (*CHAR 10) (*CHAR 10)) /* Messaggi comuni a pgm di comandi diversi (xxx0001). */ /* Messaggi nei pgm del Cmd 1 (xxx0101). */ ADDMSGD MSGID(JMR0101) MSGF(NERONI2/JMRG) MSG('Il File Object + description &1/&2 deve preesistere.') FMT((*CHAR 10) + (*CHAR 10)) ADDMSGD MSGID(JMR0102) MSGF(NERONI2/JMRG) MSG('Il File Module + description &1/&2 deve preesistere.') FMT((*CHAR 10) + (*CHAR 10)) ADDMSGD MSGID(JMR0111) MSGF(NERONI2/JMRG) MSG('Update elenco + oggetti in corso con info da elenco moduli.') + FMT((*CHAR 10)) ADDMSGD MSGID(JMR0121) MSGF(NERONI2/JMRG) MSG('Modificata + descrizione oggetti &1/&2 con info moduli.') + SECLVL('Modificato il file di descrizione oggetti + &1/&2 con le info sui moduli provenienti dal file + &3/&4.') FMT((*CHAR 10) (*CHAR 10) (*CHAR 10) (*CHAR 10)) /* Messaggi nei pgm del Cmd 2 (xxx0201). */ /* Messaggi dei Cmd (xxx1001). */ /* Crea i testi d'aiuto. */ CRTPNLGRP PNLGRP(NERONI2/JMRGP) SRCFILE(JMRG) //ENDBCHJOB //ENDSRC /*----------------------------------------------------------------------------*/ //DATA FILE(JMRGC) FILETYPE(*SRC) ENDCHAR('//ENDSRC') /* Claudio Neroni 20-11-2008 Creato. */ /* Merge object info. Cpp */ /* Unisce informazioni oggetti. Cpp */ /* */ PGM PARM(&OBJFILE &MODFILE &REFPGM) /* Riceve Nome qualificato del file Object description. */ DCL VAR(&OBJFILE) TYPE(*CHAR) LEN(20) /* File Object description. */ DCL VAR(&OBJFILEF) TYPE(*CHAR) LEN(10) /* Libreria del File Object description. */ DCL VAR(&OBJFILEL) TYPE(*CHAR) LEN(10) /* Riceve Nome qualificato del file Module description. */ DCL VAR(&MODFILE) TYPE(*CHAR) LEN(20) /* File Module description. */ DCL VAR(&MODFILEF) TYPE(*CHAR) LEN(10) /* Libreria del File Module description. */ DCL VAR(&MODFILEL) TYPE(*CHAR) LEN(10) /* Riceve Programma di riferimento per i messaggi. */ DCL VAR(&REFPGM) TYPE(*CHAR) LEN(10) /* Messaggio. */ DCL VAR(&MSG) TYPE(*CHAR) LEN(512) /* Tipo lavoro (0=Batch 1=Interactive). */ DCL VAR(&JOBTYPE) TYPE(*CHAR) LEN(1) /* Prenotazione del CPF0001. */ DCL VAR(&CPF0001) TYPE(*LGL) /* Intercetta tutti gli errori saltando a fine con errore. */ MONMSG MSGID(CPF0000 MCH0000 CEE0000) EXEC(GOTO + CMDLBL(ERRORE)) /* Recupera tipo lavoro. */ RTVJOBA TYPE(&JOBTYPE) /* Estrae parametri. */ CHGVAR VAR(&OBJFILEF) VALUE(%SST(&OBJFILE 1 10)) CHGVAR VAR(&OBJFILEL) VALUE(%SST(&OBJFILE 11 10)) CHGVAR VAR(&MODFILEF) VALUE(%SST(&MODFILE 1 10)) CHGVAR VAR(&MODFILEL) VALUE(%SST(&MODFILE 11 10)) /* Se richiesto *CPP (Command Processing Program) come programma */ /* di riferimento dei messaggi, assume il nome del programma corrente. */ IF COND(&REFPGM *EQ *CPP) THEN(DO) JCALLER CALLER(&REFPGM) KINSHIP(*FATHER) ENDDO /* Fotografa il comando. */ SNDPGMMSG MSGID(JMRA001) MSGF(JMRG) MSGDTA(&OBJFILEL + *CAT &OBJFILEF *CAT &MODFILEL *CAT + &MODFILEF *CAT &REFPGM) TOPGMQ(*PRV + (&REFPGM)) MSGTYPE(*INFO) /* Controla l'esistenza del File Object description. */ CHKOBJ OBJ(&OBJFILEL/&OBJFILEF) OBJTYPE(*FILE) MONMSG MSGID(CPF0000) EXEC(DO) SNDPGMMSG MSGID(JMR0101) MSGF(JMRG) MSGDTA(&OBJFILEL + *CAT &OBJFILEF) TOPGMQ(*PRV (&REFPGM)) + MSGTYPE(*DIAG) GOTO CMDLBL(CPF0001) ENDDO /* Controla l'esistenza del File Module description. */ CHKOBJ OBJ(&MODFILEL/&MODFILEF) OBJTYPE(*FILE) MONMSG MSGID(CPF0000) EXEC(DO) SNDPGMMSG MSGID(JMR0102) MSGF(JMRG) MSGDTA(&MODFILEL + *CAT &MODFILEF) TOPGMQ(*PRV (&REFPGM)) + MSGTYPE(*DIAG) GOTO CMDLBL(CPF0001) ENDDO /* Se interattivo, Messaggia stato. */ /* Update in corso. */ IF COND(&JOBTYPE *EQ '1') THEN(DO) SNDPGMMSG MSGID(JMR0111) MSGF(JMRG) TOPGMQ(*EXT) + MSGTYPE(*STATUS) ENDDO /* Reindirizza i file. */ OVRDBF FILE(QADSPOBJ) TOFILE(&OBJFILEL/&OBJFILEF) OVRDBF FILE(JMOD1) TOFILE(&MODFILEL/&MODFILEF) /* Ricalca il file oggetti con le info dei moduli. */ CALL PGM(JMRGU) /* Segnala buon esito. */ SNDPGMMSG MSGID(JMR0121) MSGF(JMRG) MSGDTA(&OBJFILEL + *CAT &OBJFILEF *CAT &MODFILEL *CAT + &MODFILEF) TOPGMQ(*PRV (&REFPGM)) + MSGTYPE(*COMP) /* Attivitą finali. */ RCLRSC: /* Riacquisisce le risorse. */ RCLRSC MONMSG MSGID(CPF0000 MCH0000) /* Dealloca. */ /* ... */ /* Cancella i file di lavoro. */ /* ... */ /* Se richiesto, rilascia il CPF0001. */ IF COND(&CPF0001) THEN(DO) SNDPGMMSG MSGID(CPF0001) MSGF(QCPFMSG) MSGDTA(JMRG) + MSGTYPE(*ESCAPE) MONMSG MSGID(CPF0000 MCH0000) ENDDO /* Ritorna. */ RETURN /* Errore. */ ERRORE: /* Restituisce i messaggi al chiamante, */ /* trasformando eventuali escape in diagnostici. */ JRSNMSG MONMSG MSGID(CPF0000 MCH0000) /* Prenotazione del CPF0001. */ CPF0001: /* Prenota il CPF0001. */ CHGVAR VAR(&CPF0001) VALUE('1') MONMSG MSGID(CPF0000 MCH0000) /* Salta ad Attivitą finali. */ GOTO CMDLBL(RCLRSC) ENDPGM //ENDSRC /*----------------------------------------------------------------------------*/ //DATA FILE(JMRGU) FILETYPE(*SRC) ENDCHAR('//ENDSRC') * Claudio Neroni 20-11-2008 Creato. * Merge Object Info. ChgObjD * Unisce informazioni oggetti. Modifica descrizione oggetti * Riporta sulla descrizione oggetti * le informazioni dei moduli contenuti. *--------------------------------------------------------------------------------------------- H decedit('0,') datfmt(*dmy/) datedit(*dmy/) *--------------------------------------------------------------------------------------------- * Object info. FQADSPOBJ up a e disk * Module info. Fjmod1 if e k disk *--------------------------------------------------------------------------------------------- * Se il tipo oggetto e' programma o programma di servizio * e il membro sorgente e' vuoto. C if ( odobtp = '*PGM' C or odobtp = '*SRVPGM') C and ( odsrcm = *blank ) * Definisce la chiave per accedere alle informazioni sui moduli. C kmod klist C kfld odlbnm C kfld odobnm * Azzera il contatore dei moduli. C clear cnt 7 0 * Si posiziona all'inizio del gruppo di moduli del programma. C kmod setll jmod1r * Cicla sui record moduli del programma. C do *hival * Legge un modulo. C kmod reade jmod1r 50 * Se non ce ne sono altri, abbandona. C 50 leave * Se il nome membro sorgente e' vuoto, assume interrogativi. C if mosrcm = *blank C eval mosrcm = *all'?' C endif * Incrementa il contatore dei moduli. C add 1 cnt * Trascrive campi dal record modulo al record oggetto. C eval odsrcf = mosrcf SourceFile C eval odsrcl = mosrcl SourceLibrary C eval odsrcm = mosrcm SourceMember C eval odsrcc = %subst(mosrcd:1:1) ChangeSourceCentury C eval odsrcd = %subst(mosrcd:2:6) ChangeSourceDate C eval odsrct = %subst(mosrcd:8:6) ChangeSourceTime * Se l'attributo del modulo differisce dall'attributo * del programma, trascrive l'attributo del modulo * nell'attributo utente. C if moattr <> odobat C eval oduatr = moattr UserAttribute C endif * Se corre il primo modulo, ricalca il record oggetto. C if cnt = 1 C update QLIDOBJD * Se corre un modulo successivo, * aggiunge un nuovo record oggetto duplicando il primo record * del gruppo ma con le informazioni del modulo corrente. C else C write QLIDOBJD C endif * Cicla sui record moduli del programma. C enddo * Se il tipo oggetto e' programma o programma di servizio * e il membro sorgente e' vuoto. C endif *--------------------------------------------------------------------------------------------- //ENDSRC //ENDBCHJOB