//BCHJOB JOB(JFROMTXT) 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: "DEV720" */ /* From Library: "NERONI2" */ /* Unload Time: 2016-05-31 14:40 */ /* To File : "JFROMTXT" */ /* To Library : "NERONI2" */ /* To Text : "Load TXT to database. 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 "JFROMTXT.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:\JFROMTXT.txt" "/qsys.lib/NERONI2.lib/stringhe.file/JFROMTXT.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(JFROMTXT) 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/JFROMTXT" */ /* FACENDO ATTENZIONE ALL'ORDINE DI ESECUZIONE INDICATO NEL */ /* MEMBRO FACOLTATIVO "A.LEGGIMI", AD ESEMPIO: */ /* SBMDBJOB FILE(NERONI2/JFROMTXT) MBR(JFROMTXT.) 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/JFROMTXT) CRTSRCPF FILE(NERONI2/JFROMTXT) RCDLEN(112) + TEXT('Load TXT to database. Src') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JFROMTXT) TOFILE(NERONI2/JFROMTXT) + TOMBR(JFROMTXT) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JFROMTXT) MBR(JFROMTXT) + SRCTYPE(CMD) + TEXT('Load TXT to database. Cmd') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JFROMTXT.) TOFILE(NERONI2/JFROMTXT) + TOMBR(JFROMTXT.) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JFROMTXT) MBR(JFROMTXT.) + SRCTYPE(CL) + TEXT('Load TXT to database. CrtJs') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JFROMTXTC) TOFILE(NERONI2/JFROMTXT) + TOMBR(JFROMTXTC) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JFROMTXT) MBR(JFROMTXTC) + SRCTYPE(CLLE) + TEXT('Load TXT to database. Cpp') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JFROMTXTP) TOFILE(NERONI2/JFROMTXT) + TOMBR(JFROMTXTP) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JFROMTXT) MBR(JFROMTXTP) + SRCTYPE(PNLGRP) + TEXT('Load TXT to database. Help') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JFROMTXT1) TOFILE(NERONI2/JFROMTXT) + TOMBR(JFROMTXT1) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JFROMTXT) MBR(JFROMTXT1) + SRCTYPE(PF) + TEXT('Load TXT to database. Generic 1000') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JFROMTXT2) TOFILE(NERONI2/JFROMTXT) + TOMBR(JFROMTXT2) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JFROMTXT) MBR(JFROMTXT2) + SRCTYPE(PF) + TEXT('Load TXT to database. Generic 2000') /*----------------------------------------------------------------------------*/ //DATA FILE(JFROMTXT) FILETYPE(*SRC) ENDCHAR('//ENDSRC') /* Claudio Neroni 12-01-2009 Creato. */ /* Load TXT to Database. Cmd */ /* Carica TXT in Database. Cmd */ CMD PROMPT('Load TXT to Database') PARM KWD(PROTOFILE) TYPE(PROTOFILE) MIN(1) + PROMPT('Prototype File') PROTOFILE: QUAL TYPE(*NAME) SPCVAL((JFROMTXT1) (JFROMTXT2)) QUAL TYPE(*NAME) DFT(*LIBL) SPCVAL((*LIBL)) MIN(0) + PROMPT('in library') PARM KWD(TOFILE) TYPE(TOFILE) SNGVAL((*PROTOFILE)) + MIN(1) PROMPT('To Database File') TOFILE: QUAL TYPE(*NAME) QUAL TYPE(*NAME) DFT(QTEMP) SPCVAL((QTEMP) + (*LIBL) (*PROTOLIB)) MIN(0) PROMPT('in + library') PARM KWD(FROMFILE) TYPE(*PNAME) LEN(256) + SPCVAL((*PROTOFILE) (*TOFILE)) MIN(1) + PROMPT('From TXT File (no extension)') PARM KWD(FROMEXT) TYPE(*CHAR) LEN(256) + DFT('.txt') EXPR(*YES) PROMPT('From TXT + File (extension)') PARM KWD(FROMDIR) TYPE(*PNAME) LEN(256) DFT(*USR) + SPCVAL((*USR) ('/home/mydir') (*UF) + (*XX)) PROMPT('From directory') PARM KWD(FILEOPT) TYPE(*CHAR) LEN(8) RSTD(*YES) + DFT(*REPLACE) VALUES(*REPLACE *ADD) + PROMPT('Replace file or add records') PARM KWD(REFPGM) TYPE(*NAME) LEN(10) DFT(*CPP) + SPCVAL((*CPP)) PROMPT('Reference program + for messages') //ENDSRC /*----------------------------------------------------------------------------*/ //DATA FILE(JFROMTXT.) FILETYPE(*SRC) ENDCHAR('//ENDSRC') //BCHJOB JOB(JFROMTXT.) JOBD(NERONI2/NERONI2) OUTQ(QPRINTS) + ENDSEV(60) LOG(4 00 *SECLVL) MSGQ(*USRPRF) CCSID(280) jmy /* Claudio Neroni 07-06-2007 Creato. */ /* JFROMTXT */ /* Load TXT to Database. */ /* Carica TXT in Database. */ /* Prerequisiti: JRSNMSG JCALLER JRQT JPNL */ /* Imposta la lista librerie. */ CHGLIBL LIBL(QTEMP QGPL) ADDLIBLE LIB(NERONI2) POSITION(*AFTER QTEMP) /* Cancella il file messaggi preesistente. */ DLTMSGF MSGF(NERONI2/JFROMTXT) /* Cancella i testi d'aiuto preesistenti. */ DLTPNLGRP PNLGRP(NERONI2/JFROMTXTP) /* Cancella i logici preesistenti. */ /* Cancella i fisici preesistenti. */ DLTF FILE(NERONI2/JFROMTXT1) DLTF FILE(NERONI2/JFROMTXT2) /* Cancella i comandi preesistenti. */ DLTCMD CMD(NERONI2/JFROMTXT) /* Cancella i programmi preesistenti. */ DLTPGM PGM(NERONI2/JFROMTXTC) /* Crea i file fisici. */ CRTPF FILE(NERONI2/JFROMTXT1) SRCFILE(JFROMTXT) SIZE(*NOMAX) CRTPF FILE(NERONI2/JFROMTXT2) SRCFILE(JFROMTXT) SIZE(*NOMAX) /* Crea i file logici. */ /* Crea i comandi. */ CRTCMD CMD(NERONI2/JFROMTXT) PGM(JFROMTXTC) SRCFILE(JFROMTXT) + HLPPNLGRP(JFROMTXTP) HLPID(CMD) PRDLIB(NERONI2) /* Duplica i comandi in QGPL. */ CRTPRXCMD CMD(QGPL/JFROMTXT) TGTCMD(NERONI2/JFROMTXT) AUT(*USE) + REPLACE(*YES) /* Crea i programmi. */ CRTBNDCL PGM(NERONI2/JFROMTXTC) SRCFILE(JFROMTXT) TGTRLS(*CURRENT) + DBGVIEW(*ALL) /* Crea il file messaggi. */ CRTMSGF MSGF(NERONI2/JFROMTXT) TEXT('Load TXT to database. Msgf') /* Fotografia comandi (xxxA001). */ /* Messaggi comuni a pgm di comandi diversi (xxx0001). */ /* Messaggi nei pgm del Cmd 1 (xxx0101). */ ADDMSGD MSGID(JFT0101) MSGF(NERONI2/JFROMTXT) MSG('La libreria + prototipo &1 non esiste') FMT((*CHAR 10)) ADDMSGD MSGID(JFT0102) MSGF(NERONI2/JFROMTXT) MSG('Il file + prototipo &1/&2 non esiste') FMT((*CHAR 10) (*CHAR 10)) ADDMSGD MSGID(JFT0103) MSGF(NERONI2/JFROMTXT) MSG('Non trovato + file ricevente &1 in lista librerie') FMT((*CHAR 10)) ADDMSGD MSGID(JFT0104) MSGF(NERONI2/JFROMTXT) + MSG('L''indirizzario datore IFS &1 non esiste') + FMT((*CHAR 256)) ADDMSGD MSGID(JFT0105) MSGF(NERONI2/JFROMTXT) MSG('Il file IFS da + caricare &1 non esiste') FMT((*CHAR 600)) ADDMSGD MSGID(JFT0106) MSGF(NERONI2/JFROMTXT) MSG('La libreria + ricevente &1 non esiste') FMT((*CHAR 10)) ADDMSGD MSGID(JFT0191) MSGF(NERONI2/JFROMTXT) MSG('Copiato il + file TXT &3 nel file di database &1/&2') FMT((*CHAR + 10) (*CHAR 10) (*CHAR 600)) ADDMSGD MSGID(JFT0192) MSGF(NERONI2/JFROMTXT) MSG('Copiato il + file TXT &5 nel file di database &1/&2 Prototipo: + &3/&4') FMT((*CHAR 10) (*CHAR 10) (*CHAR 10) (*CHAR + 10) (*CHAR 600)) /* Messaggi nei pgm del Cmd 2 (xxx0201). */ /* Messaggi dei Cmd (xxx1001). */ /* Crea i testi d'aiuto. */ CRTPNLGRP PNLGRP(NERONI2/JFROMTXTP) SRCFILE(JFROMTXT) //ENDBCHJOB //ENDSRC /*----------------------------------------------------------------------------*/ //DATA FILE(JFROMTXTC) FILETYPE(*SRC) ENDCHAR('//ENDSRC') /* Claudio Neroni 12-01-2009 Creato. */ /* Load TXT to Database. Cpp */ /* Carica TXT in Database. */ /* Claudio Neroni 04-11-2013 Modificato. */ /* Rimediato errore su presunti valori nulli */ /* interponendo un transito senza tracciato */ /* e utilizzando CCSID in copy from import file. */ /* */ PGM PARM(&PROTOFILEQ &TOFILEQ &FROMFILE &FROMEXT + &FROMDIR &FILEOPT &REFPGM) /* Riceve Nome qualificato del file prototipo. */ DCL VAR(&PROTOFILEQ) TYPE(*CHAR) LEN(20) /* Riceve Nome qualificato del file ricevente. */ DCL VAR(&TOFILEQ) TYPE(*CHAR) LEN(20) /* Riceve Nome TXT di provenienza. */ DCL VAR(&FROMFILE) TYPE(*CHAR) LEN(256) /* Riceve Estensione del file PC. */ DCL VAR(&FROMEXT) TYPE(*CHAR) LEN(256) /* Riceve Nome indirizzario di provenienza. */ DCL VAR(&FROMDIR) TYPE(*CHAR) LEN(256) /* Riceve Opzione di creazione file o aggiunta record. */ DCL VAR(&FILEOPT) TYPE(*CHAR) LEN(8) /* Riceve Programma di riferimento per i messaggi. */ DCL VAR(&REFPGM) TYPE(*CHAR) LEN(10) /* File prototipo. */ DCL VAR(&PROTOFILE) TYPE(*CHAR) LEN(10) /* Libreria del File prototipo. */ DCL VAR(&PROTOLIB) TYPE(*CHAR) LEN(10) /* File ricevente. */ DCL VAR(&TOFILE) TYPE(*CHAR) LEN(10) /* Libreria del File ricevente. */ DCL VAR(&TOLIB) TYPE(*CHAR) LEN(10) /* Indirizzo e Nome del file TXT da caricare. */ DCL VAR(&FROMSTMF) TYPE(*CHAR) LEN(600) /* Messaggio. */ DCL VAR(&MSG) TYPE(*CHAR) LEN(1000) /* Prototipo e ricevente sono uguali. */ DCL VAR(&EQ) TYPE(*LGL) VALUE('0') /* Utente corrente. */ DCL VAR(&CURUSER) TYPE(*CHAR) LEN(10) /* Prenotazione del CPF0001. */ DCL VAR(&CPF0001) TYPE(*LGL) /* Outfile del dspfd type(*rcdfmt) */ DCLF FILE(QAFDRFMT) /* Intercetta tutti gli errori imprevisti. */ MONMSG MSGID(CPF0000 MCH0000 CEE0000) EXEC(GOTO + CMDLBL(ERRORE)) /* Elimina il file di lavoro. */ DLTF FILE(QTEMP/JFROMTXTWK) MONMSG MSGID(CPF0000) /* Estrae parametri. */ CHGVAR VAR(&PROTOFILE) VALUE(%SST(&PROTOFILEQ 1 10)) CHGVAR VAR(&PROTOLIB) VALUE(%SST(&PROTOFILEQ 11 10)) CHGVAR VAR(&TOFILE) VALUE(%SST(&TOFILEQ 1 10)) CHGVAR VAR(&TOLIB) VALUE(%SST(&TOFILEQ 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 /* Recupera Utente corrente. */ RTVJOBA CURUSER(&CURUSER) /* Se la libreria prototipo non e' *LIBL, */ /* controlla l'esistenza della libreria prototipo. */ IF COND(&PROTOLIB *NE *LIBL) THEN(DO) RTVLIBD LIB(&PROTOLIB) MONMSG MSGID(CPF0000 MCH0000) EXEC(DO) SNDPGMMSG MSGID(JFT0101) MSGF(JFROMTXT) + MSGDTA(&PROTOLIB) TOPGMQ(*PRV (&REFPGM)) + MSGTYPE(*DIAG) GOTO CMDLBL(CPF0001) ENDDO ENDDO /* Controlla l'esistenza del file prototipo. */ CHKOBJ OBJ(&PROTOLIB/&PROTOFILE) OBJTYPE(*FILE) MONMSG MSGID(CPF0000 MCH0000) EXEC(DO) SNDPGMMSG MSGID(JFT0102) MSGF(JFROMTXT) + MSGDTA(&PROTOLIB *CAT &PROTOFILE) + TOPGMQ(*PRV (&REFPGM)) MSGTYPE(*DIAG) GOTO CMDLBL(CPF0001) ENDDO /* Se la libreria del file prototipo e' *LIBL, */ /* trasforma *LIBL in un nome di libreria. */ IF COND(&PROTOLIB *EQ *LIBL) THEN(DO) RTVOBJD OBJ(&PROTOFILE) OBJTYPE(*FILE) + RTNLIB(&PROTOLIB) ENDDO /* Se come nome ricevente e' richiesto il prototipo, lo assume. */ IF COND(&TOFILE *EQ *PROTOFILE) THEN(DO) CHGVAR VAR(&TOFILE) VALUE(&PROTOFILE) CHGVAR VAR(&TOLIB) VALUE(&PROTOLIB) ENDDO /* Se come libreria ricevente e' richiesta la lista librerie, */ /* cerca il file in lista e assume la libreria trovata. */ IF COND(&TOLIB *EQ *LIBL) THEN(DO) RTVOBJD OBJ(*LIBL/&TOFILE) OBJTYPE(*FILE) + RTNLIB(&TOLIB) MONMSG MSGID(CPF0000 MCH0000) EXEC(DO) SNDPGMMSG MSGID(JFT0103) MSGF(JFROMTXT) + MSGDTA(&TOFILE) TOPGMQ(*PRV (&REFPGM)) + MSGTYPE(*DIAG) GOTO CMDLBL(CPF0001) ENDDO ENDDO /* Se come libreria ricevente e' richiesta la libreria */ /* del prototipo, la assume. */ IF COND(&TOLIB *EQ *PROTOLIB) THEN(DO) CHGVAR VAR(&TOLIB) VALUE(&PROTOLIB) ENDDO /* Se prototipo e ricevente sono uguali, lo annota. */ IF COND((&TOFILE *EQ &PROTOFILE) *AND (&TOLIB + *EQ &PROTOLIB)) THEN(CHGVAR VAR(&EQ) + VALUE('1')) /* Se come nome del file datore e' richiesto il prototipo, lo assume. */ IF COND(&FROMFILE *EQ *PROTOFILE) THEN(DO) CHGVAR VAR(&FROMFILE) VALUE(&PROTOFILE) ENDDO /* Se come nome del file datore e' richiesto il ricevente, lo assume. */ IF COND(&FROMFILE *EQ *TOFILE) THEN(DO) CHGVAR VAR(&FROMFILE) VALUE(&TOFILE) ENDDO /* Se richiesto il valore speciale "*USR" dell'indizzario di carico, */ /* costruisce un percorso. */ IF COND(&FROMDIR *EQ *USR) THEN(CHGVAR + VAR(&FROMDIR) VALUE('/home/' *CAT &CURUSER)) /* Se richiesto il valore speciale "*UF" dell'indizzario di scarico, */ /* costruisce un percorso. */ IF COND(&FROMDIR *EQ *UF) THEN(CHGVAR VAR(&FROMDIR) + VALUE('/webufhtml/' *CAT &CURUSER)) /* Se richiesto il valore speciale "*XX" dell'indizzario di scarico, */ /* costruisce un percorso. */ IF COND(&FROMDIR *EQ *XX) THEN(CHGVAR VAR(&FROMDIR) + VALUE('/webufhtml/' *CAT &CURUSER *TCAT + '/XX')) /* Controlla l'esistenza dell'indirizzario di scarico. */ CHKIN OBJ(&FROMDIR) MONMSG MSGID(CPFA0DA) MONMSG MSGID(CPF0000 MCH0000) EXEC(DO) SNDPGMMSG MSGID(JFT0104) MSGF(JFROMtxt) + MSGDTA(&FROMDIR) TOPGMQ(*PRV (&REFPGM)) + MSGTYPE(*DIAG) GOTO CMDLBL(CPF0001) ENDDO /* Compone il nome del TXT da caricare. */ CHGVAR VAR(&FROMSTMF) VALUE(&FROMDIR *TCAT '/' + *TCAT &FROMFILE *TCAT &FROMEXT) /* Controlla l'esistenza del TXT da caricare. */ CHKIN OBJ(&FROMSTMF) MONMSG MSGID(CPF0000 MCH0000) EXEC(DO) SNDPGMMSG MSGID(JFT0105) MSGF(JFROMTXT) + MSGDTA(&FROMSTMF) TOPGMQ(*PRV (&REFPGM)) + MSGTYPE(*DIAG) GOTO CMDLBL(CPF0001) ENDDO /* Controlla l'esistenza della libreria ricevente. */ RTVLIBD LIB(&TOLIB) MONMSG MSGID(CPF0000 MCH0000) EXEC(DO) SNDPGMMSG MSGID(JFT0106) MSGF(JFROMTXT) MSGDTA(&TOLIB) + TOPGMQ(*PRV (&REFPGM)) MSGTYPE(*DIAG) GOTO CMDLBL(CPF0001) ENDDO CHKOUTEND: /* Se prototipo e ricevente sono diversi */ /* e se e' richiesta la cancellazione preliminare del ricevente, */ /* la esegue. */ IF COND((*NOT &EQ) *AND (&FILEOPT *EQ + *REPLACE)) THEN(DO) DLTF FILE(&TOLIB/&TOFILE) MONMSG MSGID(CPF0000 MCH0000) ENDDO /* Se prototipo e ricevente sono diversi, */ /* crea il file ricevente. */ IF COND(*NOT &EQ) THEN(DO) CPYF FROMFILE(&PROTOLIB/&PROTOFILE) + TOFILE(&TOLIB/&TOFILE) MBROPT(*REPLACE) + CRTFILE(*YES) NBRRCDS(1) MONMSG MSGID(CPF0000 MCH0000) ENDDO /* Se richiesta sostituzione record, */ /* pulisce il file ricevente. */ IF COND(&FILEOPT *EQ *REPLACE) THEN(DO) CLRPFM FILE(&TOLIB/&TOFILE) ENDDO /* Recupera la lunghezza record del file ricevente. */ DSPFD FILE(&TOLIB/&TOFILE) TYPE(*RCDFMT) + OUTPUT(*OUTFILE) FILEATR(*PF) + OUTFILE(QTEMP/JFROMTXTFD) OVRDBF FILE(QAFDRFMT) TOFILE(QTEMP/JFROMTXTFD) RCVF /* Crea il file di lavoro con la lunghezza del record ricevente. */ CRTPF FILE(QTEMP/JFROMTXTWK) RCDLEN(&RFLEN) + TEXT('Load TXT to Database. Transito') + SIZE(*NOMAX) /* STRALCIO HELP DEL COMANDO CPYFRMIMPF: */ /* Un importante aspetto di CPYFRMIMPF e' costituito dalla capacita' */ /* di copiare i dati in parallelo. Il parallelismo viene attivato per */ /* file con almeno 50.000 record. I record non sono copiati in */ /* parallelo quando viene specificato FROMSTMF. */ /* FINE STRALCIO */ /* Pur non essendo garanzia di buon esito e pur avendo sulle macchine */ /* che frequento un valore di sistema QQRYDEGREE gia' uguale a *NONE, */ /* mi cautelo contro le elaborazioni parallele che aumenterebbero */ /* il disordine nei record travasati. */ CHGQRYA DEGREE(*NONE) /* Ad evitare incidente se l'utente non gode di autorita' *JOBCTL, */ /* intercetta l'errore. */ MONMSG MSGID(CPF222E CPF43A3) /* Carica il file TXT nel file di lavoro. */ /* Il comando CPYFRMIMPF usa implicitamente sql che non rispetta */ /* l'arrival sequence. */ /* Sperimentando "ERRLVL(0)" ho riscontrato un buon esito pratico */ /* che non avevo con il default "ERRLVL(*NOMAX)". */ CPYFRMIMPF FROMSTMF(&FROMSTMF) TOFILE(QTEMP/JFROMTXTWK) + MBROPT(*REPLACE) FROMCCSID(280) + TOCCSID(280) RCDDLM(*CRLF) STRDLM(*NONE) + RMVBLANK(*NONE) ERRLVL(0) /* Trascrive il file di lavoro nel file ricevente. */ CPYF FROMFILE(QTEMP/JFROMTXTWK) + TOFILE(&TOLIB/&TOFILE) MBROPT(*ADD) + FMTOPT(*NOCHK) /* Se prototipo e ricevente sono uguali, messaggia completamento. */ IF COND(&EQ) THEN(DO) SNDPGMMSG MSGID(JFT0191) MSGF(JFROMTXT) MSGDTA(&TOLIB + *CAT &TOFILE *CAT &FROMSTMF) TOPGMQ(*PRV + (&REFPGM)) MSGTYPE(*COMP) MONMSG MSGID(CPF0000 MCH0000) ENDDO /* Se prototipo e ricevente sono diversi, messaggia completamento. */ IF COND(*NOT &EQ) THEN(DO) SNDPGMMSG MSGID(JFT0192) MSGF(JFROMTXT) MSGDTA(&TOLIB + *CAT &TOFILE *CAT &PROTOLIB *CAT + &PROTOFILE *CAT &FROMSTMF) TOPGMQ(*PRV + (&REFPGM)) MSGTYPE(*COMP) MONMSG MSGID(CPF0000 MCH0000) ENDDO JRQT CMD(RUNQRY QRYFILE((&TOLIB/&TOFILE)) + RCDSLT(*YES)) REFPGM(&REFPGM) MONMSG MSGID(CPF0000 MCH0000) /* Label di esecuzione delle attivita' finali. */ RCLRSC: /* Dealloca... */ /* Riacquisisce le risorse. */ RCLRSC MONMSG MSGID(CPF0000 MCH0000) /* Se richiesto, rilascia il CPF0001. */ IF COND(&CPF0001) THEN(DO) SNDPGMMSG MSGID(CPF0001) MSGF(QCPFMSG) + MSGDTA(JFROMTXT) MSGTYPE(*ESCAPE) MONMSG MSGID(CPF0000 MCH0000) ENDDO /* Ritorna. */ RETURN /* Label di errore. */ ERRORE: /* Restituisce i messaggi al chiamante, */ /* trasformando eventuali escape in diagnostici. */ JRSNMSG RMV(*NO) 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(JFROMTXTP) FILETYPE(*SRC) ENDCHAR('//ENDSRC') :PNLGRP. :IMPORT NAME='*' PNLGRP=JPNL. .*------------------------------------------------------------------------------ :HELP NAME=CMD. :H3.Comando JFROMTXT :H2.Carica un file TXT nel database :P.Il comando permette di caricare un file di testo dentro un file fisico dell'AS400. :P.Il file di testo giace in un indirizzario IFS. :P.Per indirizzario IFS si intende un indirizzario giacente su AS400 ed indirizzabile tramite il comando :HP2.WRKLNK:EHP2.. Sul lato pc si accede al medesimo indirizzario essenzialmente tramite FTP. Spesso e' possibile vedere un indirizzario IFS anche tramite la gestione risorse del pc. :P.Il comando e' una semplice interfaccia verso il :HP2.CPYFRMIMPF:EHP2. veramente delicatuccio per un rapido uso. :P.La presente utility fornisce anche due file di comodo :HP2.JFROMTXT1:EHP2. e :HP2.JFROMTXT2:EHP2. da usare come prototipo per caricare testi con un campo lungo 1000 e 2000 caratteri. :EHELP. .*------------------------------------------------------------------------------ :HELP name='CMD/protofile'. :H3.Prototype file (PROTOFILE) - file :P.Nome del file prototipo di database contenente il tracciato secondo il quale deve essere ricaricato il file testo. :P.Valori permessi: :PARML. :PT.nome-file-dati :PD.Il valore e' obbligatorio. Il tracciato del file ricevente deve essere di soli campi carattere (e allora non si manifesteranno mai errori nei dati decimali) o, almeno, "piatti" cioe' contenenti anche campi numerici ma solo di tipo zonato (o segnato, che dir si voglia). In questo caso occorre fare in modo che i campi numerici zonati ricevano solo caratteri numerici. L'uso di campi impaccati, binari od altri tipi di numerici provochera' errori nei dati decimali, specialmente al momento dell'uso successivo del file caricato. :PT.JFROMTXT1 :PD.Nome del file dati di comodo il cui tracciato, fornito dalla presente utility, contiene un solo campo di 1000 caratteri. :PT.JFROMTXT2 :PD.Nome del file dati di comodo il cui tracciato, fornito dalla presente utility, contiene un solo campo di 2000 caratteri. :EPARML. :H3.Prototype file (PROTOFILE) - library :P.Nome della libreria in cui risiede il file prototipo. :P.Valori permessi: :PARML. :PT.:PK DEF.*LIBL:EPK. :PD.Il file dati viene cercato in lista librerie. :PT.nome-libreria :PD.Il file dati viene cercato nella libreria richiesta. :EPARML. :EHELP. .*------------------------------------------------------------------------------ :HELP name='CMD/tofile'. :H3.To file (TOFILE) - file :P.Nome del file AS400 destinato a contenere i dati provenienti dal file TXT. :P.Se il file ricevente non preesiste, viene creato nella libreria ricevente. :P.Se il file ricevente preesiste e non coincide con il prototipo, viene prima cancellato e poi ricreato. :P.Se la libreria ricevente e' *LIBL, il file ricevente deve preesistere in lista librerie affinche' si possa individuare una specifica libreria ricevente da usare invece di *LIBL. :P.Valori permessi: :PARML. :PT.nome-file-dati :PD.Il valore e' obbligatorio. :PT.*PROTOFILE :PD.Il file ricevente coincide con il file prototipo. :EPARML. :H3.To file (TOFILE) - library :P.Nome della libreria in cui risiede o risiedera' il file ricevente. :P.Valori permessi: :PARML. :PT.:PK DEF.QTEMP:EPK. :PD.Il file dati viene cercato e/o creato in libreria temporanea. :PT.nome-libreria :PD.Il file dati viene cercato e/o creato nella libreria richiesta. :EPARML. :EHELP. .*------------------------------------------------------------------------------ :HELP name='CMD/fromfile'. :H3.From TXT File (no extension) (FROMFILE) :P.Nome del file giacente nell'IFS in formato testo. :P.Il nome qui riportato puo' essere senza estensione poiche' l'estensione puo' essere indicata nel parametro apposito. :P.Valori permessi: :PARML. :PT.nome-file-IFS :PD.Il valore e' obbligatorio. :PT.*PROTOFILE :PD.Il nome del file IFS coincide col nome del file prototipo. :PT.*TOFILE :PD.Il nome del file IFS coincide col nome del file ricevente. :EPARML. :EHELP. .*------------------------------------------------------------------------------ :HELP name='CMD/fromext'. :H3.From extension (FROMEXT) :P.Estensione del file di provenienza da aggiungere in coda al nome. :P.Valori permessi: :PARML. :PT.:PK DEF.'.txt':EPK. :PD.Estensione classica dei file di testo. :PT.'' :PD.Nessuna estensione. Utile sia quando il file IFS manca dell'estensione, sia quando l'estensione e' gia' scritta nel parametro nome del file IFS. :PT.punto-estensione :PD.Estensione comprensiva del punto da accodare al nome del file IFS. :EPARML. :EHELP. .*------------------------------------------------------------------------------ :HELP name='CMD/fromdir'. :H3.From Directory (FROMDIR) :P.Nome dell'indirizzario IFS in cui giace il file pc da caricare. :P.Tutto quanto e' indirizzabile nel parametro :HP2.OBJ:EHP2. del comando :HP2.WRKLNK:EHP2. puo' essere indirizzato anche in questo parametro. :P.Si raccomanda tuttavia che sia un sottoindirizzario di "/home", come consigliato dalla letteratura per i dati utente. :P.Valori permessi: :PARML. :PT.indirizzario-IFS :PD.Nome dell'indirizzario in cui cercare il file pc. :EPARML. :P.Valori speciali: :PARML. :PT.:PK DEF.*USR:EPK. :PD.Il nome dell'indirizzario IFS viene composto riunendo "/home/" con il nome dell'utente corrente. :PT./home/mydir :PD.La presente entrata costituisce un semplice promemoria sulla forma del parametro. :PT.*UF :PD.Il nome dell'indirizzario IFS viene composto riunendo "/webufhtml/" con il nome dell'utente corrente. :PT.*XX :PD.Il nome dell'indirizzario IFS viene composto riunendo "/webufhtml/", il nome dell'utente corrente e "/xx". :EPARML. :EHELP. .*------------------------------------------------------------------------------ :HELP name='CMD/fileopt'. :H3.Replace file or add records (FILEOPT) :P.Sostituisce il file ricevente o aggiunge record in coda. :P.Valori permessi: :PARML. :PT.:PK DEF.*REPLACE:EPK. :PD.Se il file ricevente esiste gia', viene sostituito. Se il file ricevente coincide col prototipo, i dati del prototipo vengono sostituiti. :PT.*ADD :PD.I dati vengono accodati al file esistente o creato per l'occasione. :EPARML. :EHELP. .*------------------------------------------------------------------------------ :HELP name='CMD/refpgm'. :IMHELP NAME='refpgm'. :EHELP. .*------------------------------------------------------------------------------ :HELP NAME='CMD/COMMAND/EXAMPLES'. :XH3.Esempi per JFROMTXT :P.:HP2.Preparazione:EHP2. :P.Per costruire l'esempio avendo un file TXT con caratteristiche conosciute, si genera preliminarmente il file TXT in IFS facendo uso del comando :HP2.JTOTXT:EHP2. e dell'esempio di scarico spiegato nell'help relativo, qui ricapitolato. :P.Scarica un file TXT: :XMP. :HP2. > JTOTXT FROMFILE(QAUOOPT) TOTXT(PDMOPT) TODIR('/home/neroni') :EHP2. Copiato il file di database NERONI2/QAUOOPT nel file TXT /home/neroni/PDMOPT.txt :EXMP. :P.:HP2.Esempio 1: Carica da IFS un file TXT in un file di database usando come prototipo di definizione il file di database che genero' lo scarico.:EHP2. :P.Carica il file ottenuto in IFS tramite la soprastante "Preparazione". :XMP. :HP2. > JFROMTXT PROTOFILE(QAUOOPT) TOFILE(PDMOPT) FROMFILE(PDMOPT) :EHP2. Copiato il file TXT /home/NERONI/PDMOPT.txt nel file di database QTEMP/PDMOPT Prototipo: NERONI2/QAUOOPT > /**/RUNQRY QRYFILE((QTEMP/PDMOPT)) RCDSLT(*YES) :EXMP. :P.Per vedere il risultato si puo' duplicare ed eseguire il comando prototipo /**/ visibile nel log. :EHELP. .*------------------------------------------------------------------------------ :HELP NAME='CMD/ERROR/MESSAGES'. :XH3.Messaggi informativi e di completamento :P.:HP3.Messaggi *INFO e *COMP:EHP3. :DL COMPACT. :DT.JFT0191 :DD.&MSG(JFT0191,JFROMTXT,*LIBL,nosub). :DT.JFT0192 :DD.&MSG(JFT0192,JFROMTXT,*LIBL,nosub). :EDL. .*--------------------- :XH3.Messaggi di errore :P.:HP3.Messaggi *DIAG seguiti da *ESCAPE CPF0001:EHP3. :DL COMPACT. :DT.JFT0101 :DD.&MSG(JFT0101,JFROMTXT,*LIBL,nosub). :DT.JFT0102 :DD.&MSG(JFT0102,JFROMTXT,*LIBL,nosub). :DT.JFT0103 :DD.&MSG(JFT0103,JFROMTXT,*LIBL,nosub). :DT.JFT0104 :DD.&MSG(JFT0104,JFROMTXT,*LIBL,nosub). :DT.JFT0105 :DD.&MSG(JFT0105,JFROMTXT,*LIBL,nosub). :DT.JFT0106 :DD.&MSG(JFT0106,JFROMTXT,*LIBL,nosub). :EDL. :EHELP. .*------------------------------------------------------------------------------ :EPNLGRP. //ENDSRC /*----------------------------------------------------------------------------*/ //DATA FILE(JFROMTXT1) FILETYPE(*SRC) ENDCHAR('//ENDSRC') A R RCD TEXT('Ricevitore generico per TXT') A F001 1000 COLHDG('Campo' 'dati') //ENDSRC /*----------------------------------------------------------------------------*/ //DATA FILE(JFROMTXT2) FILETYPE(*SRC) ENDCHAR('//ENDSRC') A R RCD TEXT('Ricevitore generico per TXT') A F001 2000 COLHDG('Campo' 'dati') //ENDSRC //ENDBCHJOB