//BCHJOB JOB(JOPN) JOBD(QBATCH) OUTQ(QPRINT) ENDSEV(60) + LOG(4 00 *SECLVL) MSGQ(*USRPRF) /* Open source scaricabile da www.neroni.it di Claudio Neroni */ /* SE L'USO DELLA JOB DESCRIPTION "QBATCH" TI E' IMPEDITO, */ /* UTILIZZANE UNA DIVERSA. */ /* From System: "IUBICSVI" */ /* From Library: "UTI" */ /* Unload Time: 2008-11-28 15:22 */ /* To File : "JOPN" */ /* To Library : "NERONI2" */ /* To Text : "Open data 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 "JOPN.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:\JOPN.txt" "/qsys.lib/NERONI2.lib/stringhe.file/JOPN.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(JOPN) 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/JOPN" */ /* FACENDO ATTENZIONE ALL'ORDINE DI ESECUZIONE INDICATO NEL */ /* MEMBRO FACOLTATIVO "A.LEGGIMI", AD ESEMPIO: */ /* SBMDBJOB FILE(NERONI2/JOPN) MBR(JOPN.) 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/JOPN) CRTSRCPF FILE(NERONI2/JOPN) RCDLEN(112) + TEXT('Open data files. Src') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JOPN) TOFILE(NERONI2/JOPN) + TOMBR(JOPN) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JOPN) MBR(JOPN) + SRCTYPE(CMD) + TEXT('Open data files. Cmd') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JOPN.) TOFILE(NERONI2/JOPN) + TOMBR(JOPN.) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JOPN) MBR(JOPN.) + SRCTYPE(CL) + TEXT('Open data files. CrtJs') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JOPNC) TOFILE(NERONI2/JOPN) + TOMBR(JOPNC) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JOPN) MBR(JOPNC) + SRCTYPE(CLLE) + TEXT('Open data files. Cpp') /*---------------------------------------------------------------------*/ //DATA FILE(JOPN) FILETYPE(*SRC) ENDCHAR('//ENDSRC') /* Open data files. Cmd */ /* Claudio Neroni 13/07/2006 Creato. */ CMD PROMPT('Open data files') PARM KWD(LIB) TYPE(*NAME) LEN(10) MIN(1) + PROMPT('Data library') PARM KWD(TOPGMQ) TYPE(*CHAR) LEN(5) RSTD(*YES) + DFT(*NONE) VALUES(*NONE *PRV *SAME) + PROMPT('To program queue') //ENDSRC /*---------------------------------------------------------------------*/ //DATA FILE(JOPN.) FILETYPE(*SRC) ENDCHAR('//ENDSRC') //BCHJOB JOB(JOPN.) JOBD(QBATCH) OUTQ(QPRINTS) ENDSEV(60) LOG(4 00 + *SECLVL) MSGQ(*USRPRF) /* Claudio Neroni 13/07/2006 Creato. */ /* JOPN */ /* Open data files. */ /* Prerequisiti: JRSNMSG */ /* Imposta la lista librerie. */ CHGLIBL LIBL(QTEMP QGPL) ADDLIBLE LIB(NERONI2) POSITION(*AFTER QTEMP) /* Cancella gli oggetti preesistenti. */ DLTCMD CMD(NERONI2/JOPN) DLTPGM PGM(NERONI2/JOPNC) /* Crea gli oggetti. */ CRTBNDCL PGM(NERONI2/JOPNC) SRCFILE(JOPN) DBGVIEW(*ALL) CRTCMD CMD(NERONI2/JOPN) PGM(JOPNC) SRCFILE(JOPN) PRDLIB(NERONI2) //ENDBCHJOB //ENDSRC /*---------------------------------------------------------------------*/ //DATA FILE(JOPNC) FILETYPE(*SRC) ENDCHAR('//ENDSRC') /* Open data files. Cpp */ /* Claudio Neroni 13/07/2006 Creato. */ /* Apre nella libreria esaminata i membri di file a manutenzione */ /* immed e delay. */ /* */ PGM PARM(&LIB &TOPGMQ) /* Riceve Libreria da esaminare. */ DCL VAR(&LIB) TYPE(*CHAR) LEN(10) /* Riceve Coda di programma a cui segnalare. */ DCL VAR(&TOPGMQ) TYPE(*CHAR) LEN(5) /* Prenotazione del CPF0001. */ DCL VAR(&CPF0001) TYPE(*LGL) /* Messaggio. */ DCL VAR(&MSG) TYPE(*CHAR) LEN(512) /* Contatore dei membri esaminati. */ DCL VAR(&CN1) TYPE(*DEC) LEN(9 0) DCL VAR(&CN1A) TYPE(*CHAR) LEN(9) /* Contatore dei membri aperti. */ DCL VAR(&CN2) TYPE(*DEC) LEN(9 0) DCL VAR(&CN2A) TYPE(*CHAR) LEN(9) /* Elenco membri. */ DCLF FILE(QAFDMBR) /* Intercetta gli errori. */ MONMSG MSGID(CPF0000 MCH0000 CEE0000) EXEC(GOTO + CMDLBL(ERRORE)) /* Segnala avanzamento. */ SNDPGMMSG MSGID(CPDB19C) MSGF(QCPFMSG) + MSGDTA('Libreria in esame: "' *TCAT &LIB + *TCAT '"') TOPGMQ(*EXT) MSGTYPE(*STATUS) /* Controlla l'esistenza della libreria. */ CHKOBJ OBJ(QSYS/&LIB) OBJTYPE(*LIB) /* Cancella gli eventuali file di lavoro precedenti. */ DLTF FILE(QTEMP/JOPN*) MONMSG MSGID(CPF0000) /* Scarica il Display File Description */ /* di tutti i membri della libreria. */ DSPFD FILE(&LIB/*ALL) TYPE(*MBR) OUTPUT(*OUTFILE) + FILEATR(*PF *LF) OUTFILE(QTEMP/JOPN1) /* In assenza di file, salta le aperture. */ MONMSG MSGID(CPF3000) EXEC(DO) CHGVAR VAR(&MSG) VALUE('Nessun membro nella + libreria' *BCAT &LIB) GOTO CMDLBL(OLTRE1) enddo /* Reindirizza l'elenco dei membri. */ OVRDBF FILE(QAFDMBR) TOFILE(QTEMP/JOPN1) SHARE(*YES) /* Ordina l'elenco dei membri per risolvere prima le aperture */ /* meno impegnative. */ OPNQRYF FILE((QTEMP/JOPN1)) KEYFLD((MBLIB) (MBIXNT + *DESCEND) (MBFILE) (MBNAME)) /* Inizio lettura elenco membri. */ BEG: /* Legge un nome di membro dall'elenco. */ RCVF /* Se non ce ne sono altri, abbandona. */ MONMSG MSGID(CPF0864) EXEC(GOTO CMDLBL(END)) /* Se il file č senza membri, ricicla. */ IF COND(&MBNAME *EQ ' ') THEN(GOTO CMDLBL(BEG)) /* Conta i membri esaminati. */ CHGVAR VAR(&CN1) VALUE(&CN1 +1) /* Se il file non č dati, ricicla. */ IF COND(&MBDTAT *NE 'D') THEN(GOTO CMDLBL(BEG)) /* Se il file non č immed o delay, ricicla. */ IF COND((&MBMANT *NE 'I') *AND (&MBMANT *NE + 'D')) THEN(GOTO CMDLBL(BEG)) /* Se il testo membro č vuoto, lo assume uguale al testo del file. */ IF COND(&MBMTXT *EQ ' ') THEN(CHGVAR + VAR(&MBMTXT) VALUE(&MBTXT)) /* Messaggia l'avanzamento al chiamante. */ IF COND(&TOPGMQ *NE *NONE) THEN(DO) SNDPGMMSG MSGID(CPDB19C) MSGF(QCPFMSG) MSGDTA(&MBLIB + *TCAT '/' *TCAT &MBFILE *BCAT 'mbr' *BCAT + &MBNAME *BCAT &MBMTXT) TOPGMQ(&TOPGMQ) ENDDO /* Messaggia l'avanzamento alla coda esterna. */ SNDPGMMSG MSGID(CPDB19C) MSGF(QCPFMSG) MSGDTA(&MBLIB + *TCAT '/' *TCAT &MBFILE *BCAT 'mbr' *BCAT + &MBNAME *BCAT &MBMTXT) TOPGMQ(*EXT) + MSGTYPE(*STATUS) /* Apre il membro. */ OPNDBF FILE(&MBLIB/&MBFILE) OPTION(*INP) MBR(&MBNAME) MONMSG MSGID(CPF0000 MCH0000) CLOF OPNID(&MBFILE) MONMSG MSGID(CPF0000 MCH0000) /* Conta i membri aperti. */ CHGVAR VAR(&CN2) VALUE(&CN2 +1) /* Ricicla. */ GOTO CMDLBL(BEG) /* Fine lettura elenco membri. */ END: /* Chiude l'elenco dei membri. */ CLOF OPNID(JOPN1) /* Elimina i reindirizzamenti. */ DLTOVR FILE(*ALL) /* Allinea a sinistra il Contatore dei membri esaminati. */ CHGVAR VAR(&CN1A) VALUE(&CN1) ALL1: IF COND((%SST(&CN1A 1 1) *EQ '0') *AND + (%SST(&CN1A 2 1) *NE ' ')) THEN(DO) CHGVAR VAR(&CN1A) VALUE(%SST(&CN1A 2 8)) GOTO CMDLBL(ALL1) ENDDO /* Allinea a sinistra il Contatore dei membri aperti. */ CHGVAR VAR(&CN2A) VALUE(&CN2) ALL2: IF COND((%SST(&CN2A 1 1) *EQ '0') *AND + (%SST(&CN2A 2 1) *NE ' ')) THEN(DO) CHGVAR VAR(&CN2A) VALUE(%SST(&CN2A 2 8)) GOTO CMDLBL(ALL2) ENDDO /* Compone messaggio. */ CHGVAR VAR(&MSG) VALUE('Libreria "' *TCAT &LIB + *TCAT '". Esaminati' *BCAT &CN1A *BCAT + 'membri. Aperti' *BCAT &CN2A *TCAT '.') /* Oltre le aperture. */ OLTRE1: /* Invia un messaggio di completamento. */ SNDPGMMSG MSG(&MSG) MSGTYPE(*COMP) /* Label di esecuzione delle attivitā 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(JOPN) + 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 //ENDBCHJOB