//BCHJOB JOB(JSRCBKP) 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: "DEV720" */ /* From Library: "NERONI2" */ /* Unload Time: 2016-01-31 17:51 */ /* To File : "JSRCBKP" */ /* To Library : "NERONI2" */ /* To Text : "Source backup. 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 "JSRCBKP.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:çJSRCBKP.txt" "/qsys.lib/NERONI2.lib/stringhe.file/JSRCBKP.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(JSRCBKP) 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/JSRCBKP" */ /* FACENDO ATTENZIONE ALL'ORDINE DI ESECUZIONE INDICATO NEL */ /* MEMBRO FACOLTATIVO "A.LEGGIMI", AD ESEMPIO: */ /* SBMDBJOB FILE(NERONI2/JSRCBKP) MBR(JSRCBKP.) 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/JSRCBKP) CRTSRCPF FILE(NERONI2/JSRCBKP) RCDLEN(112) + TEXT('Source backup. Src') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JSRCBKP) TOFILE(NERONI2/JSRCBKP) + TOMBR(JSRCBKP) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JSRCBKP) MBR(JSRCBKP) + SRCTYPE(CMD) + TEXT('Source backup. Cmd') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JSRCBKP.) TOFILE(NERONI2/JSRCBKP) + TOMBR(JSRCBKP.) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JSRCBKP) MBR(JSRCBKP.) + SRCTYPE(CL) + TEXT('Source backup. CrtJs') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JSRCBKPC) TOFILE(NERONI2/JSRCBKP) + TOMBR(JSRCBKPC) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JSRCBKP) MBR(JSRCBKPC) + SRCTYPE(CLLE) + TEXT('Source backup. Cpp') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JSRCBKPD) TOFILE(NERONI2/JSRCBKP) + TOMBR(JSRCBKPD) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JSRCBKP) MBR(JSRCBKPD) + SRCTYPE(RPGLE) + TEXT('Source backup. AddHdrToBkpMbr') /*---------------------------------------------------------------------*/ //DATA FILE(JSRCBKP) FILETYPE(*SRC) ENDCHAR('//ENDSRC') /* Source backup. Cmd */ /* Claudio Neroni 09-02-2007 Creato. */ /* */ CMD PROMPT('Source Backup') PARM KWD(SRCFILE) TYPE(SRCFILE) MIN(1) + PROMPT('Source file') SRCFILE: QUAL TYPE(*NAME) QUAL TYPE(*NAME) DFT(*LIBL) SPCVAL((*LIBL)) + PROMPT('library') PARM KWD(SRCMBR) TYPE(*NAME) MIN(1) + PROMPT('Source member') PARM KWD(BKPLIB) TYPE(*NAME) DFT(JSRCBKP) + PROMPT('Backup Library') PARM KWD(TOPGMQ) TYPE(*NAME) DFT(*) SPCVAL((*)) + PROMPT('To program queue') //ENDSRC /*---------------------------------------------------------------------*/ //DATA FILE(JSRCBKP.) FILETYPE(*SRC) ENDCHAR('//ENDSRC') //BCHJOB JOB(JSRCBKP.) JOBD(NERONI2/NERONI2) OUTQ(QPRINTS) + ENDSEV(60) LOG(4 00 *SECLVL) MSGQ(*USRPRF) /* Claudio Neroni 09-02-2007 Creato. */ /* JSRCBKP */ /* Source backup. */ /* Prerequisiti: JRTVFD */ /* Imposta la lista librerie. */ CHGLIBL LIBL(QTEMP QGPL) ADDLIBLE LIB(NERONI2) POSITION(*AFTER QTEMP) /* Cancella il file messaggi preesistente. */ DLTMSGF MSGF(NERONI2/JSRCBKP) /* Cancella i testi d'aiuto preesistenti. */ DLTPNLGRP PNLGRP(NERONI2/JSRCBKPP) /* Cancella i logici preesistenti. */ /* Cancella i fisici preesistenti. */ /* Cancella i comandi preesistenti. */ DLTCMD CMD(NERONI2/JSRCBKP) /* Cancella i programmi preesistenti. */ DLTPGM PGM(NERONI2/JSRCBKPC) DLTPGM PGM(NERONI2/JSRCBKPD) /* Crea i file fisici. */ /* Crea i file logici. */ /* Crea i comandi. */ CRTCMD CMD(NERONI2/JSRCBKP) PGM(JSRCBKPC) SRCFILE(JSRCBKP) + PRDLIB(NERONI2) /* Duplica i comandi in NERONI1. */ DLTCMD CMD(NERONI1/JSRCBKP*) CRTDUPOBJ OBJ(JSRCBKP*) FROMLIB(NERONI2) OBJTYPE(*CMD) TOLIB(NERONI1) /* Crea i programmi. */ CRTBNDCL PGM(NERONI2/JSRCBKPC) SRCFILE(JSRCBKP) TGTRLS(*CURRENT) + DBGVIEW(*ALL) CRTBNDRPG PGM(NERONI2/JSRCBKPD) SRCFILE(JSRCBKP) DBGVIEW(*ALL) + TGTRLS(*CURRENT) /* Crea il file messaggi. */ CRTMSGF MSGF(NERONI2/JSRCBKP) TEXT('Source backup. Msgf') /* Fotografia comandi (xxxA001). */ ADDMSGD MSGID(JSBA001) MSGF(NERONI2/JSRCBKP) MSG('JSRCBKP + SRCFILE(&1/&2) SRCMBR(&3) BKPLIB(&4) TOPGMQ(&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(JSB0101) MSGF(NERONI2/JSRCBKP) MSG('Source library + &1 e Backup library devono essere diverse.') + FMT((*CHAR 10)) ADDMSGD MSGID(JSB0102) MSGF(NERONI2/JSRCBKP) MSG('File backup ha + lunghezza record &3 inferiore al necessario &4') + SECLVL('Il file source di backup &1/&2 ha la lunghezza + record &3 inferiore al necessario &4.') FMT((*CHAR 10) + (*CHAR 10) (*CHAR 5) (*CHAR 5)) ADDMSGD MSGID(JSB0191) MSGF(NERONI2/JSRCBKP) MSG('Backuppato + sorgente &1 dal file &2/&3 a lib &4') FMT((*CHAR 10) + (*CHAR 10) (*CHAR 10) (*CHAR 10)) ADDMSGD MSGID(JSB0192) MSGF(NERONI2/JSRCBKP) MSG('Backup sorgente + &1 fallito dal file &2/&3 a &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/JSRCBKPG) SRCFILE(JSRCBKP) //ENDBCHJOB //ENDSRC /*---------------------------------------------------------------------*/ //DATA FILE(JSRCBKPC) FILETYPE(*SRC) ENDCHAR('//ENDSRC') /* Source backup. Cpp */ /* Claudio Neroni 09-02-2007 Creato. */ /* */ PGM PARM(&SRCFILQ &SRCMBR &BKPLIB &TOPGMQ) /* Riceve File sorgente qualificato. */ DCL VAR(&SRCFILQ) TYPE(*CHAR) LEN(20) /* File sorgente. */ DCL VAR(&SRCFIL) TYPE(*CHAR) LEN(10) /* Librerria sorgente. */ DCL VAR(&SRCLIB) TYPE(*CHAR) LEN(10) /* Riceve Membro sorgente. */ DCL VAR(&SRCMBR) TYPE(*CHAR) LEN(10) /* Riceve Libreria di salvataggio. */ DCL VAR(&BKPLIB) TYPE(*CHAR) LEN(10) /* Riceve Coda messaggi di programma a cui segnalare. */ DCL VAR(&TOPGMQ) TYPE(*CHAR) LEN(10) /* File di backup. */ DCL VAR(&BKPFIL) TYPE(*CHAR) LEN(10) /* Numeratore delle copie di backup. */ DCL VAR(&NBR) TYPE(*DEC) LEN(9) DCL VAR(&NBRA) TYPE(*CHAR) LEN(9) /* Membro di backup. */ DCL VAR(&BKPMBR) TYPE(*CHAR) LEN(10) /* Testo del membro di backup. */ DCL VAR(&BKPTXT) TYPE(*CHAR) LEN(50) /* Utente. */ DCL VAR(&USER) TYPE(*CHAR) LEN(10) /* Anno, mese, giorno, ora, minuto. */ DCL VAR(&Y) TYPE(*CHAR) LEN(2) DCL VAR(&M) TYPE(*CHAR) LEN(2) DCL VAR(&D) TYPE(*CHAR) LEN(2) DCL VAR(&H) TYPE(*CHAR) LEN(2) DCL VAR(&P) TYPE(*CHAR) LEN(2) DCL VAR(&YMD) TYPE(*CHAR) LEN(6) /* Testo del membro datore. */ DCL VAR(&SRCTXT) TYPE(*CHAR) LEN(50) /* Tempo di modifica del membro datore. */ DCL VAR(&SRCCHGDAT) TYPE(*CHAR) LEN(13) /* Tempo di creazione del membro datore. */ DCL VAR(&SRCCRTDAT) TYPE(*CHAR) LEN(13) /* Tipo seu del membro datore. */ DCL VAR(&SRCTYPE) TYPE(*CHAR) LEN(10) /* Nome della libreria in forma IFS. */ DCL VAR(&DIR) TYPE(*CHAR) LEN(50) /* Parametri per il messaggio finale. */ DCL VAR(&MSGID) TYPE(*CHAR) LEN(7) DCL VAR(&MSGDTA) TYPE(*CHAR) LEN(512) DCL VAR(&MSGTYPE) TYPE(*CHAR) LEN(10) /* Flag di mancante. */ DCL VAR(&MANCA) TYPE(*LGL) /* Lunghezza record recuperata del file sorgente. */ DCL VAR(&SRCRL) TYPE(*DEC) LEN(5 0) /* Lunghezza record recuperata del file backup. */ DCL VAR(&BKPRL) TYPE(*DEC) LEN(5 0) DCL VAR(&BKPRLA) TYPE(*CHAR) LEN(5) /* Lunghezza record del File backup da creare. */ DCL VAR(&RCDLEN) TYPE(*DEC) LEN(5 0) VALUE(112) DCL VAR(&RCDLENA) TYPE(*CHAR) LEN(5) VALUE('112') DCL VAR(&RCDLENCNT) TYPE(*DEC) LEN(3) /* Intercetta gli errori imprevisti. */ MONMSG MSGID(CPF0000 MCH0000 CEE0000) EXEC(GOTO + CMDLBL(ERRORE)) /* Estrae parametri. */ CHGVAR VAR(&SRCFIL) VALUE(%SST(&SRCFILQ 1 10)) CHGVAR VAR(&SRCLIB) VALUE(%SST(&SRCFILQ 11 10)) /* Recupera Utente. */ RTVJOBA USER(&USER) /* Recupera Anno, mese, giorno, ora, minuto. */ RTVSYSVAL SYSVAL(QYEAR) RTNVAR(&Y) RTVSYSVAL SYSVAL(QMONTH) RTNVAR(&M) RTVSYSVAL SYSVAL(QDAY) RTNVAR(&D) RTVSYSVAL SYSVAL(QHOUR) RTNVAR(&H) RTVSYSVAL SYSVAL(QMINUTE) RTNVAR(&P) /* Ricompone anno mese giorno. */ CHGVAR VAR(&YMD) VALUE(&Y *CAT &M *CAT &D) /* Se la libreria source e' *LIBL, ne recupera il nome. */ IF COND(&SRCLIB *EQ *LIBL) THEN(DO) RTVOBJD OBJ(&SRCFIL) OBJTYPE(*FILE) RTNLIB(&SRCLIB) ENDDO /* Controlla che le librerie sorgente e di backup siano diverse. */ IF COND(&SRCLIB *EQ &BKPLIB) THEN(DO) CHGVAR VAR(&MSGID) VALUE(JSB0101) CHGVAR VAR(&MSGDTA) VALUE(&SRCLIB) CHGVAR VAR(&MSGTYPE) VALUE(*DIAG) CALLSUBR SUBR(SNDMSG) GOTO CMDLBL(FINE) ENDDO /* Recupera la lunghezza record del file sorgente. */ JRTVFD FILE(&SRCFIL) LIB(&SRCLIB) MAXRCDLEN(&SRCRL) /* Recupera gli attributi del membro datore. */ RTVMBRD FILE(&SRCLIB/&SRCFIL) MBR(&SRCMBR) + SRCTYPE(&SRCTYPE) SRCCHGDATE(&SRCCHGDAT) + CRTDATE(&SRCCRTDAT) TEXT(&SRCTXT) /* Se la libreria di backup non esiste, la crea con un giro del fumo */ /* per cortocircuitare la mancanza di autorità sul cmd Create Library. */ CHKOBJ OBJ(&BKPLIB) OBJTYPE(*LIB) MONMSG MSGID(CPF0000) EXEC(DO) CHGVAR VAR(&DIR) VALUE('/qsys.lib/' *TCAT &BKPLIB + *TCAT '.lib') MKDIR DIR(&DIR) CHGLIB LIB(&BKPLIB) TEXT('Source backup.') ENDDO /* Se nella libreria di backup manca l'area dati del numeratore */ /* delle copie di backup, la crea. */ CHKOBJ OBJ(&BKPLIB/JSRCBKPNBR) OBJTYPE(*DTAARA) MONMSG MSGID(CPF0000) EXEC(DO) CRTDTAARA DTAARA(&BKPLIB/JSRCBKPNBR) TYPE(*DEC) LEN(9 + 0) VALUE(0) TEXT('Numeratore delle copie + di backup.') ENDDO /* Recupera il valore del numeratore, lo incrementa e lo riscrive. */ RTVDTAARA DTAARA(&BKPLIB/JSRCBKPNBR) RTNVAR(&NBR) CHGVAR VAR(&NBR) VALUE(&NBR + 1) CHGDTAARA DTAARA(&BKPLIB/JSRCBKPNBR) VALUE(&NBR) /* Compone il nome del membro di backup. */ CHGVAR VAR(&NBRA) VALUE(&NBR) CHGVAR VAR(&BKPMBR) VALUE(S *CAT &NBRA) /* Compone il testo del membro di backup. */ CHGVAR VAR(&BKPTXT) VALUE(&SRCMBR *CAT &SRCFIL *CAT + &SRCLIB *CAT &USER *CAT &Y *CAT &M *CAT + &D *CAT &H *CAT &P) /* Assume come nome del file backup il tipo seu del membro datore. */ CHGVAR VAR(&BKPFIL) VALUE(&SRCTYPE) /* Se la lunghezza record del datore e' superiore a 112. */ IF COND(&SRCRL *GT &RCDLEN) THEN(DO) /* Assume la lunghezza del datore come lunghezza del backup. */ CHGVAR VAR(&RCDLEN) VALUE(&SRCRL) /* Allinea a sinistra la lunghezza. */ CHGVAR VAR(&RCDLENA) VALUE(&RCDLEN) CHGVAR VAR(&RCDLENCNT) VALUE(5) ALL1: IF COND((%SST(&RCDLENA 1 1) *EQ '0') *AND + (%SST(&RCDLENA 2 1) *NE ' ')) THEN(DO) CHGVAR VAR(&RCDLENA) VALUE(%SST(&RCDLENA 2 4)) CHGVAR VAR(&RCDLENCNT) VALUE(&RCDLENCNT - 1) GOTO CMDLBL(ALL1) ENDDO /* Aggiunge la lunghezza al nome del file backup. */ CHGVAR VAR(&RCDLENCNT) VALUE(11 - &RCDLENCNT) CHGVAR VAR(&BKPFIL) VALUE(%SST(&BKPFIL 1 + &RCDLENCNT) *TCAT &RCDLENA) /* Se la lunghezza record del datore e' superiore a 112. */ ENDDO /* Controlla l'esistenza del file backup. */ CHGVAR VAR(&MANCA) VALUE('0') CHKOBJ OBJ(&BKPLIB/&BKPFIL) OBJTYPE(*FILE) MONMSG MSGID(CPF0000) EXEC(CHGVAR VAR(&MANCA) + VALUE('1')) /* Se il file backup esiste. */ IF COND(*NOT &MANCA) THEN(DO) /* Recupera la lunghezza record del file backup. */ JRTVFD FILE(&BKPFIL) LIB(&BKPLIB) MAXRCDLEN(&BKPRL) /* Controlla che il file backup abbia una lunghezza record capiente. */ IF COND(&BKPRL *LT &RCDLEN) THEN(DO) /* Allinea a sinistra la lunghezza. */ CHGVAR VAR(&BKPRLA) VALUE(&BKPRL) ALL2: IF COND((%SST(&BKPRLA 1 1) *EQ '0') *AND + (%SST(&BKPRLA 2 1) *NE ' ')) THEN(DO) CHGVAR VAR(&BKPRLA) VALUE(%SST(&BKPRLA 2 4)) GOTO CMDLBL(ALL2) ENDDO /* Messaggia. */ CHGVAR VAR(&MSGID) VALUE(JSB0102) CHGVAR VAR(&MSGDTA) VALUE(&BKPLIB *CAT &BKPFIL *CAT + &BKPRLA *CAT &RCDLENA) CHGVAR VAR(&MSGTYPE) VALUE(*DIAG) CALLSUBR SUBR(SNDMSG) GOTO CMDLBL(FINE) /* Controlla che il file backup abbia una lunghezza record capiente. */ ENDDO /* Se il file backup esiste. */ ENDDO /* Se il file backup manca. */ IF COND(&MANCA) THEN(DO) /* Crea il file di backup. */ CRTSRCPF FILE(&BKPLIB/&BKPFIL) RCDLEN(&RCDLEN) + TEXT('Source backup' *BCAT &RCDLENA) + SIZE(*NOMAX) /* Se il file backup manca. */ ENDDO /* Copia il membro nel file di backup, un solo record, */ /* per creare il membro. */ CPYF FROMFILE(&SRCLIB/&SRCFIL) + TOFILE(&BKPLIB/&BKPFIL) FROMMBR(&SRCMBR) + TOMBR(&BKPMBR) MBROPT(*REPLACE) + CRTFILE(*NO) NBRRCDS(1) FMTOPT(*MAP) /* Pulisce il membro nel file di backup. */ CLRPFM FILE(&BKPLIB/&BKPFIL) MBR(&BKPMBR) /* Aggiunge i record di servizio */ /* contenenti il testo del datore ed altre informazioni da ricordare. */ OVRDBF FILE(JSRCBKP3) TOFILE(&BKPLIB/&BKPFIL) + MBR(&BKPMBR) CALL PGM(JSRCBKPD) PARM(&SRCTXT &BKPTXT + &SRCCRTDAT &SRCCHGDAT &BKPFIL &BKPLIB &YMD) DLTOVR FILE(JSRCBKP3) /* Copia il membro nel file di backup. */ CPYF FROMFILE(&SRCLIB/&SRCFIL) + TOFILE(&BKPLIB/&BKPFIL) FROMMBR(&SRCMBR) + TOMBR(&BKPMBR) MBROPT(*ADD) CRTFILE(*YES) + FMTOPT(*MAP) /* Modifica il testo del membro di backup. */ CHGPFM FILE(&BKPLIB/&BKPFIL) MBR(&BKPMBR) + TEXT(&BKPTXT) /* Messaggia il felice esito. */ CHGVAR VAR(&MSGID) VALUE(JSB0191) CHGVAR VAR(&MSGDTA) VALUE(&SRCMBR *CAT &SRCLIB *CAT + &SRCFIL *CAT &BKPLIB) CHGVAR VAR(&MSGTYPE) VALUE(*COMP) CALLSUBR SUBR(SNDMSG) GOTO CMDLBL(FINE) /* Segnalazione errore generico. */ ERRORE: /* Messaggia il fallito esito. */ CHGVAR VAR(&MSGID) VALUE(JSB0192) CHGVAR VAR(&MSGDTA) VALUE(&SRCMBR *CAT &SRCLIB *CAT + &SRCFIL *CAT &BKPLIB) CHGVAR VAR(&MSGTYPE) VALUE(*DIAG) CALLSUBR SUBR(SNDMSG) GOTO CMDLBL(FINE) /* Fine. */ FINE: RETURN /*----------------------------------------------------------------------------*/ /* Manda messaggio al programma richiesto e, se errore, al precedente. */ /* Riceve &MSGID Message Identification */ /* &MSGDTA Message Data */ /* &MSGTYPE Message Type */ /* &TOPGMQ To Program Queue */ SUBR SUBR(SNDMSG) SNDPGMMSG MSGID(&MSGID) MSGF(JSRCBKP) MSGDTA(&MSGDTA) + TOPGMQ(*PRV (&TOPGMQ)) MSGTYPE(&MSGTYPE) MONMSG MSGID(CPF0000 MCH0000) EXEC(DO) SNDPGMMSG MSGID(&MSGID) MSGF(JSRCBKP) MSGDTA(&MSGDTA) + TOPGMQ(*PRV) MSGTYPE(&MSGTYPE) MONMSG MSGID(CPF0000 MCH0000) ENDDO ENDSUBR /*----------------------------------------------------------------------------*/ ENDPGM //ENDSRC /*---------------------------------------------------------------------*/ //DATA FILE(JSRCBKPD) FILETYPE(*SRC) ENDCHAR('//ENDSRC') /TITLE Source backup. AddHdrToBkpMbr *--------------------------------------------------------------------------------------------- * Claudio Neroni 09-02-2007 Creato. * Add header to backup member. * Aggiunge testata informativa al membro salvato. * Claudio Neroni 30-01-2016 Modificato. * Migliorata la leggibilita' della testata. *--------------------------------------------------------------------------------------------- * Membro sorgente. Definito alla lunghezza minima. * Permesse lunghezze superiori. Fjsrcbkp3 o a f 92 disk *--------------------------------------------------------------------------------------------- * Scambia parametri. C *entry plist * Testo del membro originale, C parm txt1 50 * Testo del membro di backup. * Informazioni gia' assemblate nel command processing program. * 10 Source member * 10 Source file * 10 Source library * 10 Performer user * 10 Execution time YYMMDDhhmm C parm txt2 50 * Source member creation time C parm crtdat 13 * Source member change time C parm chgdat 13 * Backup file C parm bkpfil 10 * Backup library C parm bkplib 10 * Execution date. C parm YYMMDD 6 * Predispone chiusura. C seton lr * Trascrive tempi alfa in tempi numerici C move(p) crtdat crtdatx 14 0 C move(p) chgdat chgdatx 14 0 * Pulisce tempi formattati. C clear crtdatz 19 C clear chgdatz 19 * Aggiunge il secolo ai tempi numerici. C if crtdatx<>*zero C eval crtdatx=crtdatx+19000000000000 C endif C if chgdatx<>*zero C eval chgdatx=chgdatx+19000000000000 C endif * Formatta i tempi. C eval crtdatz=%editw(crtdatx: C ' - - & : : ') C eval chgdatz=%editw(chgdatx: C ' - - & : : ') * Emete le intestazioni nel membro di backup. C except hdr *--------------------------------------------------------------------------------------------- * Immagine esemplificativa delle informazioni di testata * scritte come intestazione del membro di backup. /****** *******/ /****** SrcMbr SrcFile SrcLib User YYMMDDhhmm BkpFil/Lib *******/ /****** <........><........><........><........><........> <........> *******/ /****** Crt: yyyy-mm-dd hh:mm:ss Chg: yyyy-mm-dd hh:mm:ss <........> *******/ *--------------------------------------------------------------------------------------------- * Prima riga di testata. Ojsrcbkp3 eadd hdr O '000001' O YYMMDD O '/****** ' O txt1 O ' *******/' * Seconda riga di testata. O eadd hdr O '000002' O YYMMDD O '/****** ' O 'SrcMbr ' O 'SrcFile ' O 'SrcLib ' O 'User ' O 'YYMMDDhhmm' O ' ' O 'BkpFil/Lib' O ' *******/' * Terza riga di testata. O eadd hdr O '000003' O YYMMDD O '/****** ' O txt2 O ' ' O bkpfil O ' *******/' * Quarta riga di testata. O eadd hdr O '000004' O YYMMDD O '/****** ' O 'Crt: ' O crtdatz O ' ' O 'Chg: ' O chgdatz O ' ' O bkplib O ' *******/' *--------------------------------------------------------------------------------------------- //ENDSRC //ENDBCHJOB