//BCHJOB JOB(JDUPDB) 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-26 18:37 */ /* To File : "JDUPDB" */ /* To Library : "NERONI2" */ /* To Text : "Duplicate data base. 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 "JDUPDB.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:\JDUPDB.txt" "/qsys.lib/NERONI2.lib/stringhe.file/JDUPDB.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(JDUPDB) 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/JDUPDB" */ /* FACENDO ATTENZIONE ALL'ORDINE DI ESECUZIONE INDICATO NEL */ /* MEMBRO FACOLTATIVO "A.LEGGIMI", AD ESEMPIO: */ /* SBMDBJOB FILE(NERONI2/JDUPDB) MBR(JDUPDB.) 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/JDUPDB) CRTSRCPF FILE(NERONI2/JDUPDB) RCDLEN(112) + TEXT('Duplicate data base. Src') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JDUPDB) TOFILE(NERONI2/JDUPDB) + TOMBR(JDUPDB) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JDUPDB) MBR(JDUPDB) + SRCTYPE(CMD) + TEXT('Duplicate data base. Cmd') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JDUPDB.) TOFILE(NERONI2/JDUPDB) + TOMBR(JDUPDB.) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JDUPDB) MBR(JDUPDB.) + SRCTYPE(CL) + TEXT('Duplicate data base. CrtJs') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JDUPDBC) TOFILE(NERONI2/JDUPDB) + TOMBR(JDUPDBC) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JDUPDB) MBR(JDUPDBC) + SRCTYPE(CLLE) + TEXT('Duplicate data base. Cpp') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JDUPDBD) TOFILE(NERONI2/JDUPDB) + TOMBR(JDUPDBD) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JDUPDB) MBR(JDUPDBD) + SRCTYPE(RPGLE) + TEXT('Duplicate data base. GenNewName') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JDUPDBP) TOFILE(NERONI2/JDUPDB) + TOMBR(JDUPDBP) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JDUPDB) MBR(JDUPDBP) + SRCTYPE(PNLGRP) + TEXT('Duplicate data base. Help') /*----------------------------------------------------------------------------*/ //DATA FILE(JDUPDB) FILETYPE(*SRC) ENDCHAR('//ENDSRC') /* Duplicate data base. Cmd */ /* Claudio Neroni 06-03-2016 Creato. */ CMD PROMPT('Duplicate data base') PARM KWD(BASPF) TYPE(*NAME) LEN(10) 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(PFXBFR) TYPE(*NAME) LEN(9) DFT(*NONE) + SPCVAL((*NONE)) PROMPT('Prefix before + renaming') PARM KWD(PFXAFT) TYPE(*NAME) LEN(9) DFT(*NONE) + SPCVAL((*NONE)) PROMPT('Prefix after + renaming') //ENDSRC /*----------------------------------------------------------------------------*/ //DATA FILE(JDUPDB.) FILETYPE(*SRC) ENDCHAR('//ENDSRC') //BCHJOB JOB(JDUPDB.) JOBD(NERONI2/NERONI2) OUTQ(QPRINTS) + ENDSEV(60) LOG(4 00 *SECLVL) MSGQ(*USRPRF) CCSID(280) jcmd /* Claudio Neroni 06-03-2016 Creato. */ /* JDUPDB */ /* Duplicate data base. */ /* Prerequisiti: JCALLER JDECCHA JMOVOBJ JRSNMSG */ /* Imposta la lista librerie. */ CHGLIBL LIBL(QTEMP QGPL) ADDLIBLE LIB(NERONI2) POSITION(*AFTER QTEMP) /* Cancella il file messaggi preesistente. */ DLTMSGF MSGF(NERONI2/JDUPDB) /* Cancella i testi d'aiuto preesistenti. */ DLTPNLGRP PNLGRP(NERONI2/JDUPDBP) /* Cancella i logici preesistenti. */ /* Cancella i fisici preesistenti. */ /* Cancella i comandi preesistenti. */ DLTCMD CMD(NERONI2/JDUPDB) /* Cancella i programmi preesistenti. */ DLTPGM PGM(NERONI2/JDUPDBC) DLTPGM PGM(NERONI2/JDUPDBD) /* Crea i file fisici. */ /* Crea i file logici. */ /* Crea i comandi. */ CRTCMD CMD(NERONI2/JDUPDB) PGM(JDUPDBC) SRCFILE(JDUPDB) + HLPPNLGRP(JDUPDBP) HLPID(CMD) PRDLIB(NERONI2) /* Duplica i comandi in QGPL. */ CRTPRXCMD CMD(QGPL/JDUPDB) TGTCMD(NERONI2/JDUPDB) AUT(*USE) + REPLACE(*YES) /* Crea i programmi. */ CRTBNDCL PGM(NERONI2/JDUPDBC) SRCFILE(JDUPDB) TGTRLS(*CURRENT) + DBGVIEW(*ALL) CRTBNDRPG PGM(NERONI2/JDUPDBD) SRCFILE(JDUPDB) DBGVIEW(*ALL) + TGTRLS(*CURRENT) /* Crea il file messaggi. */ CRTMSGF MSGF(NERONI2/JDUPDB) TEXT('Duplicate data base. Msgf') /* Fotografia comandi (xxxA001). */ ADDMSGD MSGID(JDBA001) MSGF(NERONI2/JDUPDB) MSG('JDUPDB BASPF(&1) + TOLIB(&2) FROMLIB(&3) PFXBFR(&4) PFXAFT(&5)') + FMT((*CHAR 10) (*CHAR 10) (*CHAR 10) (*CHAR 9) (*CHAR 9)) /* Messaggi comuni a pgm di comandi diversi (xxx0001). */ /* Messaggi nei pgm del Cmd 1 (xxx0101). */ ADDMSGD MSGID(JDB0101) MSGF(NERONI2/JDUPDB) MSG('Il file di base + e'' &1/&2') FMT((*CHAR 10) (*CHAR 10)) ADDMSGD MSGID(JDB0102) MSGF(NERONI2/JDUPDB) MSG('Il file + richiesto &1/&2 non e'' di tipo PF ma "&3"') + FMT((*CHAR 10) (*CHAR 10) (*CHAR 10)) ADDMSGD MSGID(JDB0103) MSGF(NERONI2/JDUPDB) MSG('Libreria + datrice, ricevente e di lavoro devono essere diverse') + SECLVL('Librerie datrice "&1", ricevente "&2" e di + lavoro "&3" non sono tutte diverse.') FMT((*CHAR 10) + (*CHAR 10) (*CHAR 10)) ADDMSGD MSGID(JDB0104) MSGF(NERONI2/JDUPDB) MSG('Il file fisico + &1/&2 non ha logici dipendenti') FMT((*CHAR 10) (*CHAR + 10)) ADDMSGD MSGID(JDB0105) MSGF(NERONI2/JDUPDB) MSG('Duplicazione in + corso di &1/&2 nella libreria &3') FMT((*CHAR 10) + (*CHAR 10) (*CHAR 10)) ADDMSGD MSGID(JDB0106) MSGF(NERONI2/JDUPDB) MSG('Il file logico + &1/&2 esiste gia''') FMT((*CHAR 10) (*CHAR 10)) ADDMSGD MSGID(JDB0107) MSGF(NERONI2/JDUPDB) MSG('Duplicato logico + &1/&2 in &3/&4 &5') FMT((*CHAR 10) (*CHAR 10) (*CHAR + 10) (*CHAR 10) (*CHAR 10)) ADDMSGD MSGID(JDB0108) MSGF(NERONI2/JDUPDB) MSG('NON duplicato logico + &1/&2 in &3/&4') FMT((*CHAR 10) (*CHAR 10) (*CHAR 10) + (*CHAR 10)) ADDMSGD MSGID(JDB0109) MSGF(NERONI2/JDUPDB) MSG('Richiesta + ridenominazione impossibile su &1 file') FMT((*DEC 5)) ADDMSGD MSGID(JDB0191) MSGF(NERONI2/JDUPDB) MSG('Fisico &1/&2 + duplicato in &3/&4 &8. Duplicati &6 logici su &5. Nome + invariato per &7 file') SECLVL('Duplicato il fisico + "&2" dalla libreria "&1" nel fisico "&4" nella + libreria "&3". Fisico Rnm/NoRnm: "&8". Il file + originale e'' dotato di &5 logici. Ne sono stati + duplicati &6. Non e'' stato possibile rinominare &7 + file.') FMT((*CHAR 10) (*CHAR 10) (*CHAR 10) (*CHAR + 10) (*DEC 5) (*DEC 5) (*DEC 5) (*CHAR 10)) /* Messaggi nei pgm del Cmd 2 (xxx0201). */ /* Messaggi dei Cmd (xxx1001). */ /* Crea i testi d'aiuto. */ CRTPNLGRP PNLGRP(NERONI2/JDUPDBP) SRCFILE(JDUPDB) //ENDBCHJOB //ENDSRC /*----------------------------------------------------------------------------*/ //DATA FILE(JDUPDBC) FILETYPE(*SRC) ENDCHAR('//ENDSRC') /* Duplicate data base. Cpp */ /* Claudio Neroni 06-03-2016 Creato. */ /* */ /* Duplica un fisico monomembro e i logici monomembro che puntano */ /* solo su quel fisico da una libreria datrice a una ricevente */ /* permettendo la modifica della prima parte del nome */ /* di tutti i file duplicati mediante la sostituzione */ /* di un prefisso esistente con un nuovo prefisso, */ /* sia piu' lungo che piu' corto, */ /* purche' il nuovo nome non superi i soliti 10 caratteri. */ /* */ PGM PARM(&BASPF &TOLIB &FROMLIB &PFXBFR &PFXAFT) /* 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 Prefisso prima della ridenominazione. */ DCL VAR(&PFXBFR) TYPE(*CHAR) LEN(9) /* Riceve Prefisso dopo la ridenominazione. */ DCL VAR(&PFXAFT) TYPE(*CHAR) LEN(9) /* Libreria di lavoro e Indirizzario equivalente. */ DCL VAR(&WORKLIB) TYPE(*CHAR) LEN(10) DCL VAR(&WORKLIBDIR) TYPE(*CHAR) LEN(100) /* Libreria di salvataggio e Indirizzario equivalente. */ DCL VAR(&SAVLIB) TYPE(*CHAR) LEN(10) + VALUE(JDUPDBSAV) DCL VAR(&SAVLIBDIR) TYPE(*CHAR) LEN(100) /* Lavoro corrente. */ DCL VAR(&JOBNBR) TYPE(*CHAR) LEN(6) DCL VAR(&JOBUSR) TYPE(*CHAR) LEN(10) DCL VAR(&JOBNAM) TYPE(*CHAR) LEN(10) /* Contatore file logici esaminati. */ DCL VAR(&CNTEXA) TYPE(*DEC) LEN(5 0) DCL VAR(&CNTEXAA) TYPE(*CHAR) LEN(3) /* Contatore file logici duplicati. */ DCL VAR(&CNTDUP) TYPE(*DEC) LEN(5 0) DCL VAR(&CNTDUPA) TYPE(*CHAR) LEN(3) /* Contatore dei file duplicati con nome uguale */ /* in presenza di richiesta di ridenominazione. */ DCL VAR(&CNTEQU) TYPE(*DEC) LEN(5 0) DCL VAR(&CNTEQUA) TYPE(*CHAR) LEN(3) /* Attributo file fisico di base. */ DCL VAR(&OBJATR) TYPE(*CHAR) LEN(10) /* Nuovo nome del file da duplicare. */ DCL VAR(&NEWNAME) TYPE(*CHAR) LEN(10) /* Testo per impossibile ridenominazione del file duplicato */ /* per nuovo nome troppo lungo. */ DCL VAR(&EQUTXTT) TYPE(*CHAR) LEN(10) + VALUE('NoRnm') DCL VAR(&EQUTXT) TYPE(*CHAR) LEN(10) /* Nome del pgm corrente. */ DCL VAR(&MYNAME) 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)) /* Trova il Nome del pgm corrente. */ JCALLER CALLER(&MYNAME) KINSHIP(*FATHER) /* Se il prefisso dopo e' uguale al prefisso prima, */ /* o se un prefisso e' gia' uguale a *NONE, */ /* assume entrambi uguali a *NONE. */ IF COND((&PFXBFR *EQ &PFXAFT) *OR (&PFXBFR *EQ + *NONE) *OR (&PFXAFT *EQ *NONE)) THEN(DO) CHGVAR VAR(&PFXBFR) VALUE(*NONE) CHGVAR VAR(&PFXAFT) VALUE(*NONE) ENDDO /* 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(JDBA001) MSGF(NERONI2/JDUPDB) + MSGDTA(&BASPF *CAT &TOLIB *CAT &FROMLIB + *CAT &PFXBFR *CAT &PFXAFT) MSGTYPE(*INFO) /* Segnala il file fisico di base. */ SNDPGMMSG MSGID(JDB0101) MSGF(NERONI2/JDUPDB) + 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(JDB0102) MSGF(NERONI2/JDUPDB) + MSGDTA(&FROMLIB *CAT &BASPF *CAT &OBJATR) + MSGTYPE(*DIAG) GOTO CMDLBL(CPF0001) ENDDO /* Genera un nome per la libreria di lavoro. */ RTVJOBA JOB(&JOBNAM) USER(&JOBUSR) NBR(&JOBNBR) CHGVAR VAR(&WORKLIB) VALUE(JTMP *CAT &JOBNBR) /* Se libreria ricevente, datrice e lavoro non sono tutte diverse, */ /* segnala e rilascia. */ IF COND((&TOLIB *EQ &FROMLIB) *OR (&TOLIB *EQ + &WORKLIB) *OR (&FROMLIB *EQ &WORKLIB)) + THEN(DO) SNDPGMMSG MSGID(JDB0103) MSGF(NERONI2/JDUPDB) + MSGDTA(&FROMLIB *CAT &TOLIB *CAT + &WORKLIB) MSGTYPE(*DIAG) GOTO CMDLBL(CPF0001) ENDDO /* Controlla l'esistenza della work library. */ CHKOBJ OBJ(&WORKLIB) OBJTYPE(*LIB) /* Se la work library non esiste. */ MONMSG MSGID(CPF0000 MCH0000) EXEC(DO) /* Crea la libreria di lavoro con testo */ /* "....+...10....+...20....+...30....+...40....+...50" */ /* "Job:jjjjjjjjjj User:uuuuuuuuuu " */ /* Numero job colonne 04-09 del nome libreria */ /* Nome job colonne 05-14 del testo libreria */ /* Nome utente colonne 21-30 del testo libreria */ CHGVAR VAR(&WORKLIBDIR) VALUE('/qsys.lib/' *TCAT + &WORKLIB *TCAT '.lib') MKDIR DIR(&WORKLIBDIR) CHGLIB LIB(&WORKLIB) TYPE(*TEST) TEXT('Job:' *CAT + &JOBNAM *CAT ' User:' *CAT &JOBUSR) /* Se la work library non esiste. */ ENDDO /* Pulisce la work library. */ /*********** CLRLIB LIB(&WORKLIB) /**/ /* Pulisce i file della work library. */ DLTOBJ OBJ(&WORKLIB/*ALL) OBJTYPE(*FILE) MONMSG MSGID(CPF0000 MCH0000) /* Cancella gli eventuali file di lavoro precedenti. */ DLTF FILE(QTEMP/JDUPDB*) MONMSG MSGID(CPF0000 MCH0000) /* Duplica il file fisico senza dati. */ /* Il nome resta l'originale fino a quando tutti i logici sono */ /* duplicati per permettere ai logici di trovare il fisico di base. */ CRTDUPOBJ OBJ(&BASPF) FROMLIB(&FROMLIB) OBJTYPE(*FILE) + TOLIB(&WORKLIB) DATA(*NO) CST(*NO) TRG(*NO) /* Scarica il Display Data Base Relations del file fisico datore. */ DSPDBR FILE(&FROMLIB/&BASPF) OUTPUT(*OUTFILE) + OUTFILE(QTEMP/JDUPDB1) /* Reindirizza l'elenco dei file logici dipendenti dal fisico. */ OVRDBF FILE(QADSPDBR) TOFILE(QTEMP/JDUPDB1) /* 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(JDB0104) MSGF(NERONI2/JDUPDB) + MSGDTA(&WHRLI *CAT &WHRFI) MSGTYPE(*INFO) LEAVE ENDDO /* Conta i logici esaminati. */ CHGVAR VAR(&CNTEXA) VALUE(&CNTEXA +1) /* In base all'eventuale richiesta di mutazione del prefisso, */ /* genera il nome del file logico da creare. */ CALL PGM(JDUPDBD) PARM(&PFXBFR &PFXAFT &WHREFI + &NEWNAME) /* Avanzamento. */ SNDPGMMSG MSGID(JDB0105) MSGF(NERONI2/JDUPDB) + MSGDTA(&WHRELI *CAT &WHREFI *CAT &TOLIB) + TOPGMQ(*EXT) MSGTYPE(*STATUS) /* Controlla l'esistenza del duplicato. */ CHKOBJ OBJ(&WORKLIB/&NEWNAME) OBJTYPE(*FILE) MONMSG MSGID(CPF0000 MCH0000) EXEC(GOTO CMDLBL(MANCA)) SNDPGMMSG MSGID(JDB0106) MSGF(NERONI2/JDUPDB) + MSGDTA(&WORKLIB *CAT &WHREFI) MSGTYPE(*INFO) ITERATE MANCA: /* Duplica il file logico. */ CRTDUPOBJ OBJ(&WHREFI) FROMLIB(&WHRELI) OBJTYPE(*FILE) + TOLIB(&WORKLIB) NEWOBJ(&NEWNAME) CST(*NO) + TRG(*NO) MONMSG MSGID(CPF2130) EXEC(DO) SNDPGMMSG MSGID(JDB0108) MSGF(NERONI2/JDUPDB) + MSGDTA(&WHRELI *CAT &WHREFI *CAT &WORKLIB + *CAT &NEWNAME) MSGTYPE(*COMP) ITERATE ENDDO /* Se corre ridenominazione, */ /* rinomina il membro del file logico con il nome del file. */ IF COND(&PFXBFR *NE *NONE) THEN(DO) RNMM FILE(&WORKLIB/&NEWNAME) MBR(&WHREFI) + NEWMBR(&NEWNAME) ENDDO /* Se corre ridenominazione, */ /* conta i file duplicati con nome uguale */ IF COND((&PFXBFR *NE *NONE) *AND (&NEWNAME *EQ + &WHREFI)) THEN(DO) CHGVAR VAR(&CNTEQU) VALUE(&CNTEQU +1) CHGVAR VAR(&EQUTXT) VALUE(&EQUTXTT) ENDDO /* Conta i logici duplicati. */ CHGVAR VAR(&CNTDUP) VALUE(&CNTDUP +1) SNDPGMMSG MSGID(JDB0107) MSGF(NERONI2/JDUPDB) + MSGDTA(&WHRELI *CAT &WHREFI *CAT &WORKLIB + *CAT &NEWNAME *CAT &EQUTXT) MSGTYPE(*COMP) CHGVAR VAR(&EQUTXT) VALUE(' ') /* Cicla. */ ENDDO /* In base all'eventuale richiesta di mutazione del prefisso, */ /* genera il nuovo nome del file fisico. */ CALL PGM(JDUPDBD) PARM(&PFXBFR &PFXAFT &BASPF + &NEWNAME) /* Se il nome nuovo e' diverso da quello del datore. */ IF COND(&NEWNAME *NE &BASPF) THEN(DO) /* Rinomina il file fisico gia' duplicato. */ RNMOBJ OBJ(&WORKLIB/&BASPF) OBJTYPE(*FILE) + NEWOBJ(&NEWNAME) /* Rinomina il membro del file logico con il nome del file. */ RNMM FILE(&WORKLIB/&NEWNAME) MBR(&BASPF) + NEWMBR(&NEWNAME) /* Se il nome nuovo e' diverso da quello del datore. */ ENDDO /* Conta il file fisico duplicato con nome uguale */ /* in presenza di richiesta di ridenominazione. */ IF COND((&PFXBFR *NE *NONE) *AND (&PFXAFT *NE + *NONE) *AND (&NEWNAME *EQ &BASPF)) THEN(DO) CHGVAR VAR(&CNTEQU) VALUE(&CNTEQU +1) CHGVAR VAR(&EQUTXT) VALUE(&EQUTXTT) ENDDO /* Segnala la duplicazione del fisico. */ JDECCHA FROMDEC(&CNTEXA) TOCHAR3(&CNTEXAA) JDECCHA FROMDEC(&CNTDUP) TOCHAR3(&CNTDUPA) JDECCHA FROMDEC(&CNTEQU) TOCHAR3(&CNTEQUA) SNDPGMMSG MSGID(JDB0191) MSGF(NERONI2/JDUPDB) + MSGDTA(&FROMLIB *CAT &BASPF *CAT &WORKLIB + *CAT &NEWNAME *CAT &CNTEXAA *CAT &CNTDUPA + *CAT &CNTEQUA *CAT &EQUTXT) MSGTYPE(*COMP) CHGVAR VAR(&EQUTXT) VALUE(' ') /* Se uno o piu' file duplicati non hanno potuto assumere */ /* il nome nuovo richiesto, segnala e rilascia. */ IF COND(&CNTEQU *GE 1) THEN(DO) SNDPGMMSG MSGID(JDB0109) MSGF(NERONI2/JDUPDB) + MSGDTA(&CNTEQUA) MSGTYPE(*DIAG) GOTO CMDLBL(CPF0001) ENDDO /* Controlla l'esistenza della save library. */ CHKOBJ OBJ(&SAVLIB) OBJTYPE(*LIB) /* Se la save library non esiste. */ MONMSG MSGID(CPF0000 MCH0000) EXEC(DO) /* Crea la save library. */ CHGVAR VAR(&SAVLIBDIR) VALUE('/qsys.lib/' *TCAT + &SAVLIB *TCAT '.lib') MKDIR DIR(&SAVLIBDIR) CHGLIB LIB(&SAVLIB) TYPE(*TEST) TEXT('Save library + for JDUPDB') /* Se la save library non esiste. */ ENDDO /* Muove il data base duplicato nella libreria ricevente. */ JMOVOBJ FROMLIB(&WORKLIB) TOLIB(&TOLIB) + SAVLIB(&SAVLIB) TOPGMQ(*PRV &MYNAME) /* 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(JDUPDB) + 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 /*----------------------------------------------------------------------------*/ //DATA FILE(JDUPDBD) FILETYPE(*SRC) ENDCHAR('//ENDSRC') * Duplicate data base. GenNewName * Claudio Neroni 07-03-2016 Creato. * Se richiesta la mutazione del prefisso, * sostituisce il nome del file da creare. *------------------------------------------------------------------------- * Parametri. D pfxbfr s 9 D pfxaft s 9 D oldnam s 10 D newnam s 10 * Variabili di comodo. D lenbfr s 3 0 D oldnam1 s like(oldnam) D oldnam2 s like(oldnam) D newnam3 s 20 *------------------------------------------------------------------------- * Scambia parametri. C *entry plist C parm pfxbfr I PrefixBefore C parm pfxaft I PrefixAfter C parm oldnam I OldFileName C parm newnam O NewFileNamee * Predispone chiusura. C seton lr * Assume nome nuovo uguale a vecchio. C eval newnam=oldnam * Se i prefissi sono entrambi diversi da *NONE. C if pfxbfr<>'*NONE' C and pfxaft<>'*NONE' * Trova la lunghezza del prefisso before. C eval lenbfr=%len(%trim(pfxbfr)) * Estrae dal vecchio nome la parte iniziale di lunghezza * corrispondente al prefisso before. C eval oldnam1=%subst(oldnam:1:lenbfr) * Estrae dal vecchio nome la parte finale rimanente. C eval oldnam2=%subst(oldnam:lenbfr+1:10-lenbfr) * Se la parte iniziale del vecchio nome e' uguale * al vecchio prefisso. C if oldnam1=pfxbfr * Riunisce il nuovo prefisso con la parte finale * del vecchio nome. C eval newnam3=%trim(pfxaft)+oldnam2 * Se la riunione non supera la lunghezza permessa (10), * assume la riunione come nuovo nome. C if %subst(newnam3:11:10)=*blank C eval newnam=newnam3 C endif * Se la parte iniziale del vecchio nome e' uguale * al vecchio prefisso. C endif * Se i prefissi sono entrambi diversi da *NONE. C endif *------------------------------------------------------------------------- //ENDSRC /*----------------------------------------------------------------------------*/ //DATA FILE(JDUPDBP) FILETYPE(*SRC) ENDCHAR('//ENDSRC') :PNLGRP. .*------------------------------------------------------------------------------ :HELP NAME=CMD. :H3.Comando JDUPDB :H2.Duplicate data base :P.Duplica data base :P.Duplica un file fisico e tutti i logici soprastanti da una libreria datrice ad una ricevente. :P.Se richiesto il cambio di prefisso nei nomi, il cambio di ciascun nome avviene solo se il nome contiene il vecchio prefisso. Altrimenti il nome resta inalterato. :P.Il tool funziona anche su un fisico senza logici. :P.Pur essendo nato per creare database inizialmente vuoti e di servizio per procedure di qualche complessita', per cautela nei confronti di un uso diverso, il tool muove dalla libreria ricevente alla libreria di servizio :HP2.JDUPDBSAV:EHP2. i file eventualmente preesistenti rinominandoli con un progressivo ma scrivendo nel testo data e ora di spostamento e libreria/oggetto originale. :NOTE. Il tool sporca il sistema con una libreria di transito :HP2.JTMPnnnnnn:EHP2., dove :HP2.nnnnnn:EHP2. e' uguale al numero del job esecutore, che perde di validita' alla chiusura del job che l'ha creata. Le librerie di questo tipo possono essere rimosse automaticamente da un job schedulato periodicamente :HP2.JTMPDLT LIB(*ALL):EHP2. :ENOTE. :EHELP. .*------------------------------------------------------------------------------ :HELP name='CMD/baspf'. :H3.Basic Physical File (BASPF) :P.File fisico di base :P.Il valore e' obbligatorio. :P.Nome del file fisico portatore di un grappolo di file logici da duplicare (fisico e logici) da una libreria datrice ad una libreria ricevente cambiando eventualmente il prefisso dei nomi. :P.Valori permessi: :PARML. :PT.Nome file fisico :PD.Nome di un file fisico portatore di file logici. :EPARML. :EHELP. .*------------------------------------------------------------------------------ :HELP name='CMD/tolib'. :H3.To Library (TOLIB) :P.Libreria ricevente :P.Il valore e' obbligatorio. :P.Nome della libreria ricevente della duplicazione. :P.Valori permessi: :PARML. :PT.Nome Libreria :PD.La libreria nella quale duplicare fisico e logici. :EPARML. :EHELP. .*------------------------------------------------------------------------------ :HELP name='CMD/fromlib'. :H3.From Library (FROMLIB) :P.Libreria datrice :P.Il nome di una libreria esistente e contenente il file fisico datore. :P.Valori permessi: :PARML. :PT.Nome Libreria :PD.Nome della libreria datrice della duplicazione. :EPARML. :P.Valori speciali: :PARML. :PT.:PK DEF.*LIBL:EPK. :PD.Lista librerie corrente. :P.Il file fisico datore verra' cercato nella lista librerie corrente. :EPARML. :EHELP. .*------------------------------------------------------------------------------ :HELP name='CMD/pfxbfr'. :H3.Prefix before renaming (PFXBFR) :P.Prefisso prima della ridenominazione :P.Durante la duplicazione del database, tutti i file duplicati che hanno la prima parte del nome originale uguale a questo prefisso vecchio vengono rinominati col prefisso nuovo. :P.Per ottenere il cambio di prefisso occorre specificare sia il prefisso vecchio che quello nuovo. :P.Valori permessi: :PARML. :PT.Nome fino a 9 caratteri :PD.Nome da usare come prefisso vecchio. :EPARML. :P.Valori speciali: :PARML. :PT.:PK DEF.*NONE:EPK. :PD.Nessun prefisso quindi nessuna sostituzione. :P.I file duplicati conservano il nome originale. :EPARML. :EHELP. .*------------------------------------------------------------------------------ :HELP name='CMD/pfxaft'. :H3.Prefix after renaming (PFXAFT) :P.Prefisso dopo la ridenominazione :P.Durante la duplicazione del database, tutti i file duplicati che hanno la prima parte del nome originale uguale al prefisso vecchio vengono rinominati con questo prefisso nuovo. :P.Per ottenere il cambio di prefisso occorre specificare sia il prefisso vecchio che quello nuovo. :P.Valori permessi: :PARML. :PT.Nome fino a 9 caratteri :PD.Nome da usare come prefisso nuovo. :EPARML. :P.Valori speciali: :PARML. :PT.:PK DEF.*NONE:EPK. :PD.Nessun prefisso quindi nessuna sostituzione. :P.I file duplicati conservano il nome originale. :EPARML. :EHELP. .*------------------------------------------------------------------------------ :HELP NAME='CMD/COMMAND/EXAMPLES'. :XH3.Esempi d'uso del comando .*------------------ :P.:HP2.Esempio 1: Duplica il file fisico JCLNPFOD e il suo logico 1 nella libreria DUPLICATI conservando i nomi.:EHP2. :XMP. Con i soli parametri necessari: JDUPDB BASPF(JCLNPFOD) TOLIB(DUPLICATI) Anche con i parametri di default: JDUPDB BASPF(JCLNPFOD) TOLIB(DUPLICATI) FROMLIB(NERONI2) PFXBFR(*NONE) PFXAFT(*NONE) :EXMP. :P.Esegue la duplicazione generando un log di cui si riporta esempio. :XMP. > JDUPDB BASPF(JCLNPFOD) TOLIB(DUPLICATI) JDUPDB BASPF(JCLNPFOD) TOLIB(DUPLICATI) FROMLIB(NERONI2) PFXBFR(*NONE) PFXAFT(*NONE) Duplicato logico NERONI2/JCLNPFOD1 in JTMP387918/JCLNPFOD1 Fisico NERONI2/JCLNPFOD duplicato in JTMP387918/JCLNPFOD . Duplicati 1 logici su 1. Nome invariato per 0 file Mossi 2 oggetti da libreria JTMP387918 a libreria DUPLICATI :EXMP. :P.Si osservino i messaggi informativi a documentazione dell'esito. .*------------------ :P.:HP2.Esempio 2: Duplica il file fisico JCLNPFOD e il suo logico 1 nella libreria DUPLICATI cambiandone i nomi in ZZ.:EHP2. :XMP. Con i soli parametri necessari: JDUPDB BASPF(JCLNPFOD) TOLIB(DUPLICATI) PFXBFR(JCLNPFOD) PFXAFT(ZZ) Anche con i parametri di default: JDUPDB BASPF(JCLNPFOD) TOLIB(DUPLICATI) FROMLIB(NERONI2) PFXBFR(JCLNPFOD) PFXAFT(ZZ) :EXMP. :P.Esegue la duplicazione generando un log di cui si riporta esempio. :XMP. > JDUPDB BASPF(JCLNPFOD) TOLIB(DUPLICATI) PFXBFR(JCLNPFOD) PFXAFT(ZZ) JDUPDB BASPF(JCLNPFOD) TOLIB(DUPLICATI) FROMLIB(NERONI2) PFXBFR(JCLNPFOD) PFXAFT(ZZ) Duplicato logico NERONI2/JCLNPFOD1 in JTMP387919/ZZ1 Fisico NERONI2/JCLNPFOD duplicato in JTMP387919/ZZ . Duplicati 1 logici su 1. Nome invariato per 0 file Mossi 2 oggetti da libreria JTMP387919 a libreria DUPLICATI :EXMP. :P.Si osservino i messaggi informativi a documentazione dell'esito. .*------------------ :EHELP. .*------------------------------------------------------------------------------ :HELP NAME='CMD/ERROR/MESSAGES'. .*------------------ :XH3.Messaggi informativi e di completamento :P.:HP3.Messaggi *INFO e *COMP:EHP3. :DL COMPACT. :DT.JDBA001 :DD.&MSG(JDBA001,JDUPDB,*LIBL,nosub). :DT.JDB0104 :DD.&MSG(JDB0104,JDUPDB,*LIBL,nosub). :DT.JDB0106 :DD.&MSG(JDB0106,JDUPDB,*LIBL,nosub). :DT.JDB0108 :DD.&MSG(JDB0108,JDUPDB,*LIBL,nosub). :DT.JDB0107 :DD.&MSG(JDB0107,JDUPDB,*LIBL,nosub). :DT.JDB0191 :DD.&MSG(JDB0191,JDUPDB,*LIBL,nosub). :EDL. .*--------------------- :XH3.Messaggi di stato :P.:HP3.Messaggi *STATUS:EHP3. :DL COMPACT. :DT.JDB0101 :DD.&MSG(JDB0101,JDUPDB,*LIBL,nosub). :DT.JDB0105 :DD.&MSG(JDB0105,JDUPDB,*LIBL,nosub). :EDL. .*--------------------- :XH3.Messaggi di errore :P.:HP3.Messaggi *DIAG seguiti da *ESCAPE CPF0001:EHP3. :DL COMPACT. :DT.JDB0102 :DD.&MSG(JDB0102,JDUPDB,*LIBL,nosub). :DT.JDB0103 :DD.&MSG(JDB0103,JDUPDB,*LIBL,nosub). :DT.JDB0109 :DD.&MSG(JDB0109,JDUPDB,*LIBL,nosub). :EDL. .*------------------ :EHELP. .*------------------------------------------------------------------------------ :EPNLGRP. //ENDSRC //ENDBCHJOB