//BCHJOB JOB(JTOCSV) 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 16:12 */ /* To File : "JTOCSV" */ /* To Library : "NERONI2" */ /* To Text : "Unload database to CSV. 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 "JTOCSV.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:\JTOCSV.txt" "/qsys.lib/NERONI2.lib/stringhe.file/JTOCSV.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(JTOCSV) 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/JTOCSV" */ /* FACENDO ATTENZIONE ALL'ORDINE DI ESECUZIONE INDICATO NEL */ /* MEMBRO FACOLTATIVO "A.LEGGIMI", AD ESEMPIO: */ /* SBMDBJOB FILE(NERONI2/JTOCSV) MBR(JTOCSV.) 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/JTOCSV) CRTSRCPF FILE(NERONI2/JTOCSV) RCDLEN(112) + TEXT('Unload database to CSV. Src') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JTOCSV) TOFILE(NERONI2/JTOCSV) + TOMBR(JTOCSV) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JTOCSV) MBR(JTOCSV) + SRCTYPE(CMD) + TEXT('Unload database to CSV. Cmd') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JTOCSV.) TOFILE(NERONI2/JTOCSV) + TOMBR(JTOCSV.) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JTOCSV) MBR(JTOCSV.) + SRCTYPE(CL) + TEXT('Unload database to CSV. CrtJs') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JTOCSVC) TOFILE(NERONI2/JTOCSV) + TOMBR(JTOCSVC) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JTOCSV) MBR(JTOCSVC) + SRCTYPE(CLLE) + TEXT('Unload database to CSV. Cpp') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JTOCSVD) TOFILE(NERONI2/JTOCSV) + TOMBR(JTOCSVD) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JTOCSV) MBR(JTOCSVD) + SRCTYPE(RPGLE) + TEXT('Unload database to CSV. WrtColHdg') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JTOCSVP) TOFILE(NERONI2/JTOCSV) + TOMBR(JTOCSVP) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JTOCSV) MBR(JTOCSVP) + SRCTYPE(PNLGRP) + TEXT('Unload database to CSV. Help') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JTOCSV1) TOFILE(NERONI2/JTOCSV) + TOMBR(JTOCSV1) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JTOCSV) MBR(JTOCSV1) + SRCTYPE(PF) + TEXT('Unload database to CSV. ColHdg') /*----------------------------------------------------------------------------*/ //DATA FILE(JTOCSV) FILETYPE(*SRC) ENDCHAR('//ENDSRC') /* Claudio Neroni 17-06-2008 Creato. */ /* Unload Database to CSV. Cpp */ /* Scarica Database in CSV. Cpp */ CMD PROMPT('Unload database to CSV') PARM KWD(FROMFILE) TYPE(FROMFILE) MIN(1) + PROMPT('From database file') FROMFILE: QUAL TYPE(*NAME) QUAL TYPE(*NAME) DFT(*LIBL) SPCVAL((*LIBL)) + MIN(0) PROMPT('library') PARM KWD(TOCSV) TYPE(*PNAME) LEN(256) DFT(*DFT) + SPCVAL((*DFT) (*FROMFILE)) PROMPT('To CSV + file (no extension)') PARM KWD(TODIR) TYPE(*PNAME) LEN(256) DFT(*USR) + SPCVAL((*USR) ('/home/mydir') (*UF) + (*XX)) PROMPT('To directory') PARM KWD(HEAD) TYPE(*CHAR) LEN(10) RSTD(*YES) + DFT(*BOTH) VALUES(*BOTH *FIELD *TEXT + *NONE) PROMPT('Heading') PARM KWD(STRDLM) TYPE(*CHAR) LEN(10) + DFT(*DBLQUOTE) SPCVAL((*DBLQUOTE '"') + (*NONE) ('"')) PROMPT('String delimiter') PARM KWD(RMVBLANK) TYPE(*CHAR) LEN(10) RSTD(*YES) + DFT(*NONE) VALUES(*NONE *LEADING + *TRAILING *BOTH *EOR) PROMPT('Remove blanks') PARM KWD(REFPGM) TYPE(*NAME) LEN(10) DFT(*CPP) + SPCVAL((*CPP)) PROMPT('Reference program + for messages') //ENDSRC /*----------------------------------------------------------------------------*/ //DATA FILE(JTOCSV.) FILETYPE(*SRC) ENDCHAR('//ENDSRC') //BCHJOB JOB(JTOCSV.) JOBD(NERONI2/NERONI2) OUTQ(QPRINTS) + ENDSEV(60) LOG(4 00 *SECLVL) MSGQ(*USRPRF) CCSID(280) jmy /* Claudio Neroni 10-05-2007 Creato. */ /* JTOCSV */ /* Unload Database to CSV.. */ /* Scarica Database in CSV. */ /* Prerequisiti: nessuno. */ /* Imposta la lista librerie. */ CHGLIBL LIBL(QTEMP QGPL) ADDLIBLE LIB(NERONI2) POSITION(*AFTER QTEMP) /* Cancella il file messaggi preesistente. */ DLTMSGF MSGF(NERONI2/JTOCSV) /* Cancella i testi d'aiuto preesistenti. */ DLTPNLGRP PNLGRP(NERONI2/JTOCSVP) /* Cancella i logici preesistenti. */ /* Cancella i fisici preesistenti. */ DLTF FILE(NERONI2/JTOCSV1) /* Cancella i comandi preesistenti. */ DLTCMD CMD(NERONI2/JTOCSV) /* Cancella i programmi preesistenti. */ DLTPGM PGM(NERONI2/JTOCSVC) DLTPGM PGM(NERONI2/JTOCSVD) /* Crea i file fisici. */ CRTPF FILE(NERONI2/JTOCSV1) SRCFILE(JTOCSV) SIZE(*NOMAX) /* Crea i file logici. */ /* Crea i comandi. */ CRTCMD CMD(NERONI2/JTOCSV) PGM(JTOCSVC) SRCFILE(JTOCSV) + ALLOW(*ALL) HLPPNLGRP(JTOCSVP) HLPID(CMD) PRDLIB(NERONI2) /* Duplica i comandi in QGPL. */ CRTPRXCMD CMD(QGPL/JTOCSV) TGTCMD(NERONI2/JTOCSV) AUT(*USE) + REPLACE(*YES) /* Crea i programmi. */ CRTBNDCL PGM(NERONI2/JTOCSVC) SRCFILE(JTOCSV) TGTRLS(*CURRENT) + DBGVIEW(*ALL) CRTBNDRPG PGM(NERONI2/JTOCSVD) SRCFILE(JTOCSV) DBGVIEW(*ALL) + TGTRLS(*CURRENT) /* Crea il file messaggi. */ CRTMSGF MSGF(NERONI2/JTOCSV) TEXT('Unload database to CSV. Msgf') /* Fotografia comandi (xxxA001). */ /* Messaggi comuni a pgm di comandi diversi (xxx0001). */ /* Messaggi nei pgm del Cmd 1 (xxx0101). */ ADDMSGD MSGID(JTC0101) MSGF(NERONI2/JTOCSV) MSG('Il delimitatore + di stringa &1 contiene piu'' di un carattere') + FMT((*CHAR 10)) ADDMSGD MSGID(JTC0111) MSGF(NERONI2/JTOCSV) MSG('L''indirizzario + IFS &1 non esiste') FMT((*CHAR 256)) ADDMSGD MSGID(JTC0112) MSGF(NERONI2/JTOCSV) MSG('Il file &1/&2 + non esiste') FMT((*CHAR 10) (*CHAR 10)) ADDMSGD MSGID(JTC0191) MSGF(NERONI2/JTOCSV) MSG('Copiato il file + di database datore &1/&2 nel file IFS ricevente &3') + FMT((*CHAR 10) (*CHAR 10) (*CHAR 200)) /* Messaggi nei pgm del Cmd 2 (xxx0201). */ /* Messaggi dei Cmd (xxx1001). */ /* Messaggi del Vcp (xxxB001). */ /* Crea i testi d'aiuto. */ CRTPNLGRP PNLGRP(NERONI2/JTOCSVP) SRCFILE(JTOCSV) //ENDBCHJOB //ENDSRC /*----------------------------------------------------------------------------*/ //DATA FILE(JTOCSVC) FILETYPE(*SRC) ENDCHAR('//ENDSRC') /* Claudio Neroni 10-05-2007 Creato. */ /* Unload Database to CSV. Cpp */ /* Scarica Database in CSV. Cpp */ /* */ PGM PARM(&FROMFILEQ &TOCSV &TODIR &HEAD &STRDLM + &RMVBLANK &REFPGM) /* Riceve Nome qualificato del file originale. */ DCL VAR(&FROMFILEQ) TYPE(*CHAR) LEN(20) /* Riceve Nome CSV di destinazione. */ DCL VAR(&TOCSV) TYPE(*CHAR) LEN(256) /* Riceve Nome indirizzario di destinazione. */ DCL VAR(&TODIR) TYPE(*CHAR) LEN(256) /* Riceve Tipo delle intestazioni da generare. */ DCL VAR(&HEAD) TYPE(*CHAR) LEN(10) /* Riceve Delimitatore stringa. */ DCL VAR(&STRDLM) TYPE(*CHAR) LEN(10) /* Riceve Rimozione blank. */ DCL VAR(&RMVBLANK) TYPE(*CHAR) LEN(10) /* Riceve Programma di riferimento per i messaggi. */ DCL VAR(&REFPGM) TYPE(*CHAR) LEN(10) /* Libreria del file da scaricare. */ DCL VAR(&FROMLIB) TYPE(*CHAR) LEN(10) /* File da scaricare. */ DCL VAR(&FROMFILE) TYPE(*CHAR) LEN(10) /* Indirizzo e Nome del file csv. */ DCL VAR(&TOSTMF) TYPE(*CHAR) LEN(200) /* Utente corrente. */ DCL VAR(&CURUSER) TYPE(*CHAR) LEN(10) /* Prenotazione del CPF0001. */ DCL VAR(&CPF0001) TYPE(*LGL) /* Intercetta tutti gli errori imprevisti. */ MONMSG MSGID(CPF0000 MCH0000 CEE0000) EXEC(GOTO + CMDLBL(ERRORE)) /* Estrae parametri. */ CHGVAR VAR(&FROMFILE) VALUE(%SST(&FROMFILEQ 1 10)) CHGVAR VAR(&FROMLIB) VALUE(%SST(&FROMFILEQ 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) /* Controlla la lunghezza del delimitatore. */ IF COND(&STRDLM *NE *NONE) THEN(DO) IF COND(%SST(&STRDLM 2 9) *NE ' ') THEN(DO) SNDPGMMSG MSGID(JTC0101) MSGF(JTOCSV) MSGDTA(&STRDLM) + TOPGMQ(*PRV (&REFPGM)) MSGTYPE(*DIAG) GOTO CMDLBL(CPF0001) ENDDO ENDDO /* Se richiesto il valore speciale "*USR" dell'indizzario di scarico, */ /* costruisce un percorso. */ IF COND(&TODIR *EQ *USR) THEN(CHGVAR + VAR(&TODIR) VALUE('/home/' *CAT &CURUSER)) /* Se richiesto il valore speciale "*UF" dell'indizzario di scarico, */ /* costruisce un percorso. */ IF COND(&TODIR *EQ *UF) THEN(CHGVAR VAR(&TODIR) + VALUE('/webufhtml/' *CAT &CURUSER)) /* Se richiesto il valore speciale "*XX" dell'indizzario di scarico, */ /* costruisce un percorso. */ IF COND(&TODIR *EQ *XX) THEN(CHGVAR VAR(&TODIR) + VALUE('/webufhtml/' *CAT &CURUSER *TCAT + '/XX')) /* Controlla l'esistenza dell'indirizzario di scarico. */ CHKIN OBJ(&TODIR) MONMSG MSGID(CPFA0DA) MONMSG MSGID(CPF0000 MCH0000) EXEC(DO) SNDPGMMSG MSGID(JTC0111) MSGF(JTOCSV) MSGDTA(&TODIR) + TOPGMQ(*PRV (&REFPGM)) MSGTYPE(*DIAG) GOTO CMDLBL(CPF0001) ENDDO /* Controlla l'esistenza del file. */ CHKOBJ OBJ(&FROMLIB/&FROMFILE) OBJTYPE(*FILE) + MBR(*FIRST) MONMSG MSGID(CPF0000 MCH0000) EXEC(DO) SNDPGMMSG MSGID(JTC0112) MSGF(JTOCSV) MSGDTA(&FROMLIB + *CAT &FROMFILE) TOPGMQ(*PRV (&REFPGM)) + MSGTYPE(*DIAG) GOTO CMDLBL(CPF0001) ENDDO /* Se la libreria del file originale e' *LIBL, */ /* trasforma *LIBL in un nome di libreria. */ IF COND(&FROMLIB *EQ *LIBL) THEN(DO) RTVOBJD OBJ(&FROMFILE) OBJTYPE(*FILE) RTNLIB(&FROMLIB) ENDDO /* Se il nome dello scarico e' *FROMFILE, lo assume. */ IF COND(&TOCSV *EQ *FROMFILE) THEN(CHGVAR + VAR(&TOCSV) VALUE(&FROMFILE)) /* Compone il nome dello scarico. */ IF COND(&TOCSV *EQ *DFT) THEN(CHGVAR + VAR(&TOSTMF) VALUE(&TODIR *TCAT '/' *TCAT + &FROMLIB *TCAT '-' *TCAT &FROMFILE *TCAT + '.csv')) ELSE CMD(CHGVAR VAR(&TOSTMF) VALUE(&TODIR *TCAT + '/' *TCAT &TOCSV *TCAT '.csv')) /* Cancella il preesistente file da scaricare. */ RMVLNK OBJLNK(&TOSTMF) MONMSG MSGID(CPFA0A9) /* Recupera le descrizioni dei campi e le trascrive in un transito. */ DSPFFD FILE(&FROMLIB/&FROMFILE) OUTPUT(*OUTFILE) + OUTFILE(QTEMP/JTOCSVX) DLTF FILE(QTEMP/JTOCSV1) MONMSG MSGID(CPF0000 MCH0000) CPYF FROMFILE(JTOCSV1) TOFILE(QTEMP/JTOCSV1T) + MBROPT(*REPLACE) CRTFILE(*YES) MONMSG MSGID(CPF0000 MCH0000) CLRPFM FILE(QTEMP/JTOCSV1T) MONMSG MSGID(CPF0000 MCH0000) OVRDBF FILE(QADSPFFD) TOFILE(QTEMP/JTOCSVX) OVRDBF FILE(JTOCSV1) TOFILE(QTEMP/JTOCSV1T) CALL PGM(JTOCSVD) PARM(&HEAD &STRDLM) /* Scarica le descrizioni dei campi nel file csv. */ CPYTOIMPF FROMFILE(QTEMP/JTOCSV1T) TOSTMF(&TOSTMF) + MBROPT(*REPLACE) STMFCODPAG(*PCASCII) + RCDDLM(*CRLF) DTAFMT(*DLM) STRDLM(*NONE) + RMVBLANK(*TRAILING) FLDDLM('"') + DECPNT(*COMMA) /* Scarica i dati nel file csv. */ CPYTOIMPF FROMFILE(&FROMLIB/&FROMFILE) TOSTMF(&TOSTMF) + MBROPT(*ADD) STMFCODPAG(*PCASCII) + RCDDLM(*CRLF) DTAFMT(*DLM) + STRDLM(&STRDLM) RMVBLANK(&RMVBLANK) + FLDDLM(';') DECPNT(*COMMA) /* Fornisce autorita' pubblica sul file scaricato. */ CHGAUT OBJ(&TOSTMF) USER(*PUBLIC) DTAAUT(*RWX) + OBJAUT(*ALL) /* Cambia l'autorita' assassina sul file IFS appena creato. */ CHGAUT OBJ(&TOSTMF) USER(&CURUSER) DTAAUT(*RWX) + OBJAUT(*ALL) MONMSG MSGID(CPF0000) /* Invia il messaggio di completamento. */ SNDPGMMSG MSGID(JTC0191) MSGF(JTOCSV) MSGDTA(&FROMLIB + *CAT &FROMFILE *CAT &TOSTMF) TOPGMQ(*PRV + (&REFPGM)) MSGTYPE(*COMP) MONMSG MSGID(CPF0000 MCH0000) JRQT CMD(DSPF STMF(&TOSTMF)) 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(JTOCSV) + 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(JTOCSVD) FILETYPE(*SRC) ENDCHAR('//ENDSRC') /TITLE Unload Database to CSV. WrtColHdg * Claudio Neroni 14-05-2007 Creato. * Compone e scrive intestazioni. *--------------------------------------------------------------------------------------------- * Elenco dei campi del file in corso di scarico. Fqadspffd ip e disk * Emissione delle intestazioni. FJTOCSV1 o f10000 disk *--------------------------------------------------------------------------------------------- * Intestazioni da nome campo. D fld s 10000 * Intestazioni da testo campo. D txt s 10000 *--------------------------------------------------------------------------------------------- * Scambia parametri. C *entry plist * Riceve Tipo delle intestazioni da generare. C parm head 10 * Riceve Delimitatore stringa. C parm strdlm 10 *--------------------------------------------------------------------------------------------- * L'elaborazione di dettaglio avviene per L0, * il tempo di totale che e' disponibile dopo ogni record * dopo la prelettura del successivo. *---- * Se doppio apice serve come delimitatore, * lo sostituisce nel testo con apice semplice. Cl0 if sd = '"' Cl0 eval whftxt=%xlate('"':'''':whftxt) Cl0 endif * Se apice semplice serve come delimitatore, * lo sostituisce nel testo con doppio apice. Cl0 if sd = '''' Cl0 eval whftxt=%xlate('''':'"':whftxt) Cl0 endif * Accumula il nome campo corrente nella stringa di emissione. Cl0 eval fld=%trim(fld) + C %trim(sd) + C %trim(whfldi) + C %trim(sd) * Se non corre l'ultimo campo, aggiunge il separatore di campo. Cl0nlr eval fld=%trim(fld) + ';' * Accumula il testo campo corrente nella stringa di emissione. Cl0 eval txt=%trim(txt) + C %trim(sd) + C %trim(whftxt) + C %trim(sd) * Se non corre l'ultimo campo, aggiunge il separatore di campo. Cl0nlr eval txt=%trim(txt) + ';' *--------------------------------------------------------------------------------------------- * Se corre fine file. *---- * Se richiesto, emette la riga di intestazione basata su nome campo. Clr if head = '*BOTH' or head = '*FIELD' Clr except wrifld Clr endif * Se richiesto, emette la riga di intestazione basata su testo campo. Clr if head = '*BOTH' or head = '*TEXT' Clr except writxt Clr endif *--------------------------------------------------------------------------------------------- * Inizializza. C *inzsr begsr * Trasforma il delimitatore di stringa in un carattere solo. C select C when strdlm = '*DBLQUOTE' C movel(p) '"' sd 1 C when strdlm = '*NONE' C clear sd C other C movel(p) strdlm sd C endsl C endsr *--------------------------------------------------------------------------------------------- * Riga di intestazione basata su nome campo. OJTOCSV1 e wrifld O fld * Riga di intestazione basata su testo campo. OJTOCSV1 e writxt O txt *--------------------------------------------------------------------------------------------- //ENDSRC /*----------------------------------------------------------------------------*/ //DATA FILE(JTOCSVP) FILETYPE(*SRC) ENDCHAR('//ENDSRC') :PNLGRP. :IMPORT NAME='*' PNLGRP=JPNL. .*------------------------------------------------------------------------------ :HELP NAME=CMD. :H3.Comando JTOCSV :H2.Unload database to CSV :P.Scarica un file di database su IFS usando il formato CSV. :P.Con un FTP chiamato da pc o se l'IFS e' definito come disco PC, il file puo' essere portato su pc e poi aperto con EXCEL. Non e' opportuno aprirlo direttamente su IFS con Excel perche' normalmente l'apertura dura un tempo esagerato. :P.Il comando e' nato per trasferire dati su pc in un formato familiare all'utente Office. :EHELP. .*------------------------------------------------------------------------------ :HELP name='CMD/FROMFILE'. :H3.From database file (FROMFILE) - file :P.Nome del file fisico o logico contenente i dati da scaricare. :P.Valore obbligatorio. :P.Valori permessi: :PARML. :PT.nome-file-emissione :PD.Il nome indicato viene usato per il file da scaricare. :EPARML. :H3.From database file (FROMFILE) - library :P.Nome della libreria in cui risiede il file fisico o logico contenente i dati da scaricare. :P.Valori permessi: :PARML. :PT.:PK DEF.*LIBL:EPK. :PD.Il file da scaricare viene cercato in lista librerie. :PT.nome-libreria :PD.Il file da scaricare viene cercato nella libreria richiesta. :EPARML. :EHELP. .*------------------------------------------------------------------------------ :HELP name='CMD/tocsv'. :H3.To CSV file (no extension) (TOCSV) :P.Nome del file CSV da scrivere nell'indirizzario IFS (senza estensione) :P.Valori permessi: :PARML. :PT.nome-file-IFS :PD.Il nome del file con tracciato CSV da scrivere sull'indirizzario IFS. :EPARML. :P.Valori speciali: :PARML. :PT.:PK DEF.*DFT:EPK. :PD.Il nome del file IFS viene composto riunendo con un trattino nome libreria e nome file da scaricare. :PT.*FROMFILE :PD.Il nome del file IFS viene composto con il solo nome del file da scaricare. :EPARML. :EHELP. .*------------------------------------------------------------------------------ :HELP name='CMD/todir'. :H3.To directory (TODIR) :P.Indirizzario ricevente del file scaricato. :P.Valori permessi: :PARML. :PT.nome-indirizzario-IFS :PD.Il nome dell'indirizzario IFS ricevente del file scaricato con tracciato CSV. :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/head'. :H3.Heading (HEAD) :P.Intestazioni :P.Inserisce in testa al file le intestazioni di colonna. :P.Valori permessi: :PARML. :PT.:PK DEF.*BOTH:EPK. :PD.Inserisce due righe di intestazione. La prima come quella prevista per l'opzione *FIELD. La seconda come quella prevista per l'opzione *TEXT. :PT.*FIELD :PD.Inserisce una riga di intestazione composta con i nomi di campo del file datore. :PT.*TEXT :PD.Inserisce una riga di intestazione composta con il testo dei campi del file datore. :PT.*NONE :PD.Non inserisce alcuna intestazione. :EPARML. :EHELP. .*------------------------------------------------------------------------------ :HELP name='CMD/strdlm'. :H3.String delimiter (STRDLM) :P.Delimitatore di stringa :P.Un solo carattere usato per contornare i dati alfanumerici. :P.Valori permessi: :PARML. :PT.carattere :PD.Qualsiasi carattere. :EPARML. :P.Valori speciali: :PARML. :PT.:PK DEF.*DBLQUOTE:EPK. :PD.Il carattere scelto e' doppio apice ("). :PT.*NONE :PD.Nessun delimitatore per contornare i dati alfanumerici. :PT." :PD.Come *DBLQUOTE. :EPARML. :EHELP. .*------------------------------------------------------------------------------ :HELP name='CMD/rmvblank'. :H3.Remove blanks (RMVBLANK) :P.Rimuove spazi :P.Specifica se gli spazi vengono eliminati o conservati per ogni singolo campo dati. :P.Valori permessi: :PARML. :PT.:PK DEF.*NONE:EPK. :PD.Tutti gli spazi iniziali e di coda vengono conservati. :PT.*TRAILING :PD.Gli spazi di coda vengono eliminati. :PT.*LEADING :PD.Gli spazi iniziali vengono eliminati. :PT.*BOTH :PD.Gli spazi iniziali e di coda vengono eliminati. :PT.*EOR :PD.Gli spazi in coda vengono eliminati dall'ultimo campo del record. :EPARML. :EHELP. .*------------------------------------------------------------------------------ :HELP name='CMD/refpgm'. :IMHELP NAME='refpgm'. :EHELP. .*------------------------------------------------------------------------------ :HELP NAME='CMD/COMMAND/EXAMPLES'. :XH3.Esempi per JTOCSV :P.:HP2.Esempio 1: Scarica su IFS un file di database:EHP2. :P.Genera un file da scaricare: :XMP. :HP2. > DSPFD FILE(NERONI2/JRSNMSG) TYPE(*MBRLIST) OUTPUT(*OUTFILE) OUTFILE(QTEMP/TEST) :EHP2. Il file di emissione TEST e' stato creato nella libreria QTEMP. Il membro TEST e' stato aggiunto al file di emissione TEST nella libreria QTEMP. 6 record sono stati aggiunti al membro TEST nel file TEST in QTEMP. :EXMP. :P.Scarica con i soli parametri necessari: :XMP. :HP2. > JTOCSV FROMFILE(QTEMP/TEST) RMVBLANK(*TRAILING) :EHP2. Copiato il file di database datore QTEMP/TEST nel file IFS ricevente /home/NERONI/QTEMP-TEST.csv > /**/DSPF STMF('/home/NERONI/QTEMP-TEST.csv') :EXMP. :P.Anche con i parametri di default: :XMP. :HP2. > JTOCSV FROMFILE(QTEMP/TEST) TOCSV(*DFT) TODIR(*USR) HEAD(*BOTH) STRDLM(*DBLQUOTE) RMVBLANK(*TRAILING) REFPGM(*CPP) :EHP2. :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.JTC0191 :DD.&MSG(JTC0191,JTOCSV,*LIBL,nosub). :EDL. .*--------------------- :XH3.Messaggi di errore :P.:HP3.Messaggi *DIAG seguiti da *ESCAPE CPF0001:EHP3. :DL COMPACT. :DT.JTC0101 :DD.&MSG(JTC0101,JTOCSV,*LIBL,nosub). :DT.JTC0111 :DD.&MSG(JTC0111,JTOCSV,*LIBL,nosub). :DT.JTC0112 :DD.&MSG(JTC0112,JTOCSV,*LIBL,nosub). :EDL. :EHELP. .*------------------------------------------------------------------------------ :EPNLGRP. //ENDSRC /*----------------------------------------------------------------------------*/ //DATA FILE(JTOCSV1) FILETYPE(*SRC) ENDCHAR('//ENDSRC') A R JTOCSV1R A FLAT 10000 //ENDSRC //ENDBCHJOB