//BCHJOB JOB(JDUPLF) JOBD(NERONI2/NERONI2) OUTQ(QPRINT) + ENDSEV(60) LOG(4 00 *SECLVL) MSGQ(*USRPRF) /* 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-03-14 17:45 */ /* To File : "JDUPLF" */ /* To Library : "NERONI2" */ /* To Text : "Duplicate logical 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 "JDUPLF.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:\JDUPLF.txt" "/qsys.lib/NERONI2.lib/stringhe.file/JDUPLF.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(JDUPLF) 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/JDUPLF" */ /* FACENDO ATTENZIONE ALL'ORDINE DI ESECUZIONE INDICATO NEL */ /* MEMBRO FACOLTATIVO "A.LEGGIMI", AD ESEMPIO: */ /* SBMDBJOB FILE(NERONI2/JDUPLF) MBR(JDUPLF.) 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/JDUPLF) CRTSRCPF FILE(NERONI2/JDUPLF) RCDLEN(112) + TEXT('Duplicate logical files. Src') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JDUPLF) TOFILE(NERONI2/JDUPLF) + TOMBR(JDUPLF) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JDUPLF) MBR(JDUPLF) + SRCTYPE(CMD) + TEXT('Duplicate logical files. Cmd') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JDUPLF.) TOFILE(NERONI2/JDUPLF) + TOMBR(JDUPLF.) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JDUPLF) MBR(JDUPLF.) + SRCTYPE(CL) + TEXT('Duplicate logical files. CrtJs') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JDUPLFC) TOFILE(NERONI2/JDUPLF) + TOMBR(JDUPLFC) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JDUPLF) MBR(JDUPLFC) + SRCTYPE(CLLE) + TEXT('Duplicate logical files. Cpp') /*---------------------------------------------------------------------*/ //DATA FILE(JDUPLF) FILETYPE(*SRC) ENDCHAR('//ENDSRC') CMD PROMPT('Duplicate logical files') PARM KWD(BASPF) TYPE(*NAME) MIN(1) PROMPT('Basic + Physical File') PARM KWD(TOLIB) TYPE(*NAME) LEN(10) MIN(1) + PROMPT('To Library') PARM KWD(FROMLIB) TYPE(*NAME) LEN(10) DFT(*LIBL) + SPCVAL((*LIBL)) PROMPT('From Library') PARM KWD(RPLOLDLF) TYPE(*CHAR) LEN(10) RSTD(*YES) + DFT(*NO) VALUES(*NO *YES) + PROMPT('Replaces Old Logical Files') //ENDSRC /*---------------------------------------------------------------------*/ //DATA FILE(JDUPLF.) FILETYPE(*SRC) ENDCHAR('//ENDSRC') //BCHJOB JOB(JDUPLF.) JOBD(NERONI2/NERONI2) OUTQ(QPRINTS) + ENDSEV(60) LOG(4 00 *SECLVL) MSGQ(*USRPRF) /* Claudio Neroni 02-04-2015 Creato. */ /* JDUPLF */ /* Duplicate logical files. CrtJs */ /* Prerequisiti: JRSNMSG */ jmy /* Imposta la lista librerie. */ CHGLIBL LIBL(QTEMP QGPL) ADDLIBLE LIB(NERONI2) POSITION(*AFTER QTEMP) /* Cancella il file messaggi preesistente. */ DLTMSGF MSGF(NERONI2/JDUPLF) /* Cancella i testi d'aiuto preesistenti. */ DLTPNLGRP PNLGRP(NERONI2/JDUPLFP) /* Cancella i logici preesistenti. */ /* Cancella i fisici preesistenti. */ /* Cancella i comandi preesistenti. */ DLTCMD CMD(NERONI2/JDUPLF) /* Cancella i programmi preesistenti. */ DLTPGM PGM(NERONI2/JDUPLFC) /* Crea i file fisici. */ /* Crea i file logici. */ /* Crea i comandi. */ CRTCMD CMD(NERONI2/JDUPLF) PGM(JDUPLFC) SRCFILE(JDUPLF) + HLPPNLGRP(JDUPLFP) HLPID(CMD) PRDLIB(NERONI2) /* Duplica i comandi in QGPL. */ CRTPRXCMD CMD(QGPL/JDUPLF) TGTCMD(NERONI2/JDUPLF) AUT(*USE) + REPLACE(*YES) /* Crea i programmi. */ CRTBNDCL PGM(NERONI2/JDUPLFC) SRCFILE(JDUPLF) TGTRLS(*CURRENT) + DBGVIEW(*ALL) /* Crea il file messaggi. */ CRTMSGF MSGF(NERONI2/JDUPLF) TEXT('Duplicate logical files. Msgf') /* Fotografia comandi (xxxA001). */ ADDMSGD MSGID(JDLA001) MSGF(NERONI2/JDUPLF) MSG('JDUPLF BASPF(&1) + TOLIB(&2) FROMLIB(&3)') FMT((*CHAR 10) (*CHAR 10) + (*CHAR 10)) /* Messaggi comuni a pgm di comandi diversi (xxx0001). */ /* Messaggi nei pgm del Cmd 1 (xxx0101). */ ADDMSGD MSGID(JDL0101) MSGF(NERONI2/JDUPLF) MSG('Il file di base + e'' &1/&2') FMT((*CHAR 10) (*CHAR 10)) ADDMSGD MSGID(JDL0102) MSGF(NERONI2/JDUPLF) MSG('Il file + richiesto &1/&2 non e'' di tipo PF ma "&3"') + FMT((*CHAR 10) (*CHAR 10) (*CHAR 10)) ADDMSGD MSGID(JDL0103) MSGF(NERONI2/JDUPLF) MSG('Libreria datrice + "&1" e ricevente devono essere diverse') FMT((*CHAR 10)) ADDMSGD MSGID(JDL0104) MSGF(NERONI2/JDUPLF) MSG('Il file fisico + &1/&2 non ha logici dipendenti') FMT((*CHAR 10) (*CHAR + 10)) ADDMSGD MSGID(JDL0105) MSGF(NERONI2/JDUPLF) MSG('Duplicazione in + corso di &1/&2 nella libreria &3') FMT((*CHAR 10) + (*CHAR 10) (*CHAR 10)) ADDMSGD MSGID(JDL0106) MSGF(NERONI2/JDUPLF) MSG('Il file logico + &1/&2 esiste gia''') FMT((*CHAR 10) (*CHAR 10)) ADDMSGD MSGID(JDL0107) MSGF(NERONI2/JDUPLF) MSG('Il file logico + &1/&2 e'' stato creato') FMT((*CHAR 10) (*CHAR 10)) /* Messaggi nei pgm del Cmd 2 (xxx0201). */ /* Messaggi dei Cmd (xxx1001). */ /* Crea i testi d'aiuto. */ CRTPNLGRP PNLGRP(NERONI2/JDUPLFP) SRCFILE(JDUPLF) //ENDBCHJOB //ENDSRC /*---------------------------------------------------------------------*/ //DATA FILE(JDUPLFC) FILETYPE(*SRC) ENDCHAR('//ENDSRC') /* Duplicate logical files. */ /* Claudio Neroni 02-04-2015 Creato. */ /* */ /* Duplica i logici di un fisico da una libreria datrice */ /* a una ricevente. */ /* */ PGM PARM(&BASPF &TOLIB &FROMLIB &RPLOLDLF) /* Riceve File fisico di base. */ DCL VAR(&BASPF) TYPE(*CHAR) LEN(10) /* Riceve Libreria ricevente. */ DCL VAR(&TOLIB) TYPE(*CHAR) LEN(10) /* Riceve Libreria datrice. */ DCL VAR(&FROMLIB) TYPE(*CHAR) LEN(10) /* Riceve Richiesta di sostituzione dei vecchi file logici. */ DCL VAR(&RPLOLDLF) TYPE(*CHAR) LEN(10) /* Messaggio. */ DCL VAR(&MSG) TYPE(*CHAR) LEN(512) /* Contatore file duplicati. */ DCL VAR(&CNT) TYPE(*DEC) LEN(5 0) /* Attributo file fisico di base. */ DCL VAR(&OBJATR) TYPE(*CHAR) LEN(10) /* Prenotazione del CPF0001. */ DCL VAR(&CPF0001) TYPE(*LGL) /* Dichiara Outfile di Display Database Relation. */ DCLF FILE(QADSPDBR) /* Intercetta gli errori. */ MONMSG MSGID(CPF0000 MCH0000 CEE0000) EXEC(GOTO + CMDLBL(ERRORE)) /* Controlla l'esistenza della libreria datrice. */ IF COND(&FROMLIB *NE *LIBL) THEN(DO) CHKOBJ OBJ(QSYS/&FROMLIB) OBJTYPE(*LIB) ENDDO /* Controlla l'esistenza della libreria ricevente. */ CHKOBJ OBJ(QSYS/&TOLIB) OBJTYPE(*LIB) /* Controlla l'esistenza del fisico di base nella libreria datrice. */ CHKOBJ OBJ(&FROMLIB/&BASPF) OBJTYPE(*FILE) /* Recupera l'attributo del file */ /* e, se necessario, la libreria datrice. */ RTVOBJD OBJ(&FROMLIB/&BASPF) OBJTYPE(*FILE) + RTNLIB(&FROMLIB) OBJATR(&OBJATR) /* Fotografa comando. */ SNDPGMMSG MSGID(JDLA001) MSGF(NERONI2/JDUPLF) + MSGDTA(&BASPF *CAT &TOLIB *CAT &FROMLIB) + MSGTYPE(*INFO) /* Segnala avanzamento. */ SNDPGMMSG MSGID(JDLA001) MSGF(NERONI2/JDUPLF) + MSGDTA(&BASPF *CAT &TOLIB *CAT &FROMLIB) + TOPGMQ(*EXT) MSGTYPE(*STATUS) /* Segnala il file fisico di base. */ SNDPGMMSG MSGID(JDL0101) MSGF(NERONI2/JDUPLF) + MSGDTA(&FROMLIB *CAT &BASPF) TOPGMQ(*EXT) + MSGTYPE(*STATUS) /* Se l'attributo del file fisico non e' quello atteso, */ /* segnala e rilascia. */ IF COND(&OBJATR *NE PF) THEN(DO) SNDPGMMSG MSGID(JDL0102) MSGF(NERONI2/JDUPLF) + MSGDTA(&FROMLIB *CAT &BASPF *CAT &OBJATR) + MSGTYPE(*DIAG) GOTO CMDLBL(CPF0001) ENDDO /* Se libreria ricevente e datrice sono uguali, */ /* segnala e rilascia. */ IF COND(&TOLIB *EQ &FROMLIB) THEN(DO) SNDPGMMSG MSGID(JDL0103) MSGF(NERONI2/JDUPLF) + MSGDTA(&FROMLIB) MSGTYPE(*DIAG) GOTO CMDLBL(CPF0001) ENDDO /* Controlla l'esistenza del fisico di base nella libreria ricevente. */ CHKOBJ OBJ(&TOLIB/&BASPF) OBJTYPE(*FILE) /* Cancella gli eventuali file di lavoro precedenti. */ DLTF FILE(QTEMP/JDUPLF*) MONMSG MSGID(CPF0000 MCH0000) /* Scarica il Display Data Base Relations del file fisico. */ DSPDBR FILE(&FROMLIB/&BASPF) OUTPUT(*OUTFILE) + OUTFILE(QTEMP/JDUPLF1) /* Reindirizza l'elenco dei file logici dipendenti dal fisico. */ OVRDBF FILE(QADSPDBR) TOFILE(QTEMP/JDUPLF1) /* Cicla. */ DOWHILE COND('1') /* Legge dall'elenco dei file logici. */ RCVF /* Se non ce ne sono altri, abbandona. */ MONMSG MSGID(CPF0864) EXEC(LEAVE) /* Se non ci sono file logici dipendenti, segnala e abbandona. */ IF COND(&WHNO *EQ 0) THEN(DO) SNDPGMMSG MSGID(JDL0104) MSGF(NERONI2/JDUPLF) + MSGDTA(&WHRLI *CAT &WHRFI) TOPGMQ(*EXT) + MSGTYPE(*INFO) LEAVE ENDDO /* Conta i logici esaminati. */ CHGVAR VAR(&CNT) VALUE(&CNT +1) /* Messaggia avanzamento. */ SNDPGMMSG MSGID(JDL0105) MSGF(NERONI2/JDUPLF) + MSGDTA(&WHRELI *CAT &WHREFI *CAT &TOLIB) + TOPGMQ(*EXT) MSGTYPE(*STATUS) DLYJOB DLY(1) /* Controlla l'esistenza del duplicato nella libreria ricevente. */ CHKOBJ OBJ(&TOLIB/&WHREFI) OBJTYPE(*FILE) /* Se il duplicato non esiste, salta alla duplicazione. */ MONMSG MSGID(CPF0000 MCH0000) EXEC(GOTO CMDLBL(MANCA)) /* Se richiesta la cancellazione dei vecchi logici. */ IF COND(&RPLOLDLF *EQ *YES) THEN(DO) /* Cancella il vecchio logico. */ DLTF FILE(&TOLIB/&WHREFI) MONMSG MSGID(CPF0000 MCH0000) /* Salta alla duplicazione. */ GOTO CMDLBL(MANCA) /* Se richiesta la cancellazione dei vecchi logici. */ ENDDO /* Messaggia avanzamento. */ SNDPGMMSG MSGID(JDL0106) MSGF(NERONI2/JDUPLF) + MSGDTA(&TOLIB *CAT &WHREFI) MSGTYPE(*INFO) /* Ricicla. */ ITERATE /* Label di duplicazione del logico in esame. */ MANCA: /* Duplica il file logico. */ CRTDUPOBJ OBJ(&WHREFI) FROMLIB(&WHRELI) OBJTYPE(*FILE) + TOLIB(&TOLIB) SNDPGMMSG MSGID(JDL0107) MSGF(NERONI2/JDUPLF) + MSGDTA(&TOLIB *CAT &WHREFI) MSGTYPE(*COMP) /* Cicla. */ ENDDO /* Label di esecuzione delle attivita' finali. */ RCLRSC: /* Riacquisisce le risorse. */ RCLRSC MONMSG MSGID(CPF0000 MCH0000) /* Se richiesto, rilascia il CPF0001. */ IF COND(&CPF0001) THEN(DO) SNDPGMMSG MSGID(CPF0001) MSGF(QCPFMSG) MSGDTA(JDUPLF) + 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 attivita' finali. */ GOTO CMDLBL(RCLRSC) ENDPGM //ENDSRC //ENDBCHJOB