Extraction de fichiers sur AS/400-iSeries puis envoi par FTP
Résumé
- Date limite pour sélection stockée dans une zone de données (*DTAARA) ;
- Programme RPG pour calculer les dates-limites de sélection ;
- Création des fichiers d’extraction par SQL lancé sous QSHELL.
- Génération de fichiers csv dans l’IFS. Suppression des blancs/espaces par l’utility QSHELL sed complètée par iconv car on se retrouve avec en EBCDIC après le SED.
- Constitution du script FTP par « sandwich » de lignes ajoutées par commandes QHSELL entre deux membres sources AS/400.
- Contrôle du transfert FTP : on doit avoir deux transferts réussis. Traîtement du log par « utilities » QSHELL grep (comptage) puis dtarea (résultat mis dans une DTAAREA AS/400.
Adaptations éventuelles
- Dans le script FTP, la façon d’envoyer l’identifiant utilisateur et son mot de passe peut varier en fonction du serveur auquel on se connecte.
- Dans le log FTP, la chaîne de caractère indiquant la bonne fin du transfert peut aussi varier en fonction du serveur auquel on se connecte. Par exemple, ce peut être transfer complete au lieu de transfer OK.
Le CL
/* ENVOI D'UNE EXTRACTION DE DEUX FICHIERS */ /* Principe : on enregistre dans une dataarea la date du dernier jour . */ /* traîté. Format : jjmmaa */ /* On sélectionne les enregistrements dont la date d'enregistrement du */ /* paiement est dans une plage qui va du LENDEMAIN de la date contenue */ /* dans la dataarea à la VEILLE de la date en cours. */ /* Pour relancer dans une plage donnée, on peut modifier la DATAAREA */ /* (CHGDTAARA ...), modifier la date du jour (CHGJOB DATE(jjmmaa)) */ /* puis envoyer : CALL SCH_PGC */ PGM DCL &NOMDTAR *CHAR 0010 'SCH_PGC ' /* NOM DE LA DTAARA */ DCL &DATDEB *CHAR 0006 /* DERNIERE DATE + 1 JOUR */ DCL &DATFIN *CHAR 0006 /* JOUR EN COURS -1 */ DCL &ERR *CHAR 0001 ' ' /* ERREUR DATE ENVOYEE */ DCL &ZDEB *CHAR 0010 '20 - - ' DCL &ZFIN *CHAR 0010 '20 - - ' DCL &SQL1 *CHAR 0512 DCL &SQL2 *CHAR 0512 DCL &NBRE *CHAR 0009 DCL &NOMFIFE *CHAR 0026 DCL &NOMFIFL *CHAR 0026 DCL &SED *CHAR 0128 DCL &PUT *CHAR 0128 DCL &MSGERR *CHAR 0256 /* FICHIERS DE TRAVAIL - du fait de l'utilisation de cdes QSHELL, on ne */ /* peut se servir de la bibliothèque QTEMP. */ CRTLIB TRAVAIL MONMSG CPF0000 DLTF TRAVAIL/PGCECDE MONMSG CPF0000 DLTF TRAVAIL/PGCLCDE MONMSG CPF0000 CRTDUPOBJ PGCECDE BIBLIO_SRC *FILE TOLIB(TRAVAIL) MONMSG CPF0000 CRTDUPOBJ PGCLCDE BIBLIO_SRC *FILE TOLIB(TRAVAIL) MONMSG CPF0000 /* RECUPERATION DE LA DATE DERNIER TRAITEMENT */ RTVDTAARA BIBLIO_SRC/&NOMDTAR &DATDEB MONMSG CPF1015 EXEC(DO) CHGVAR &MSGERR VALUE('DTAARA ' !! &NOMDTAR !! ' NON TROUVéE') GOTO FINERR ENDDO MONMSG CPF1016 EXEC(DO) CHGVAR &MSGERR VALUE('ACCES NON AUTORISE A LA DTAARA ' !! &NOMDTAR) GOTO FINERR ENDDO MONMSG CPF1021 EXEC(DO) CHGVAR &MSGERR VALUE('BIBLIOTHEQUE DE LA DTAARA ' !! &NOMDTAR !! ' + NON TROUVEE') GOTO FINERR ENDDO MONMSG CPF1022 EXEC(DO) CHGVAR &MSGERR VALUE('ACCES NON AUTORISE A LA BIBLIOTHEQUE DE LA + DTAARA ' !! &NOMDTAR) GOTO FINERR ENDDO MONMSG CPF1063 EXEC(DO) CHGVAR &MSGERR VALUE('IMPOSSIBLE D ALLOUER LA DTAARA ' !! &NOMDTAR) GOTO FINERR ENDDO MONMSG CPF1067 EXEC(DO) CHGVAR &MSGERR VALUE('IMPOSSIBLE D ALLOUER LA BIBLIOTHEQUE DE LA DTAARA ' + !! &NOMDTAR) GOTO FINERR ENDDO /* CALCULE LA FOURCHETTE DE DATES à TRAITER */ CALL SCH_PGC1 (&DATDEB &DATFIN &ERR) IF COND(&ERR *EQ '1') THEN(DO) CHGVAR &MSGERR VALUE('DATE ' !! &DATDEB !! ' FAUSSE, VOIR DTAARA SCH_PGC' + !! &NOMDTAR) GOTO FINERR ENDDO CHGVAR (%SST(&ZDEB 3 2)) (%SST(&DATDEB 5 2)) CHGVAR (%SST(&ZDEB 6 2)) (%SST(&DATDEB 3 2)) CHGVAR (%SST(&ZDEB 9 2)) (%SST(&DATDEB 1 2)) CHGVAR (%SST(&ZFIN 3 2)) (%SST(&DATFIN 5 2)) CHGVAR (%SST(&ZFIN 6 2)) (%SST(&DATFIN 3 2)) CHGVAR (%SST(&ZFIN 9 2)) (%SST(&DATFIN 1 2)) /* "POPULATION" DES FICHIERS DE TRAVAIL */ /* UTILISATION DE QSHELL : */ /* 1) NOTER L'ANTISLASH AVANT LE DOLLAR */ /* (SINON ERREUR CAR LA ZONE E OU L N'EXISTE PAS ! ) */ /* 2) BIBLIOTHEQUE QTEMP INUTILISABLE */ /* REDIRIGE LES SORTIES DE QSHELL */ DLTF FILE(TRAVAIL/STDOUTPGC) MONMSG CPF2105 CRTPF FILE(TRAVAIL/STDOUTPGC) RCDLEN(128) OVRDBF STDOUT TRAVAIL/STDOUTPGC /* Extraction par SQL - 1er fichier */ CHGVAR &SQL1 VALUE('DB2 "INSERT INTO TRAVAIL.PGCECDE SELECT * + FROM BIBLIO_SRC.PGCECDE WHERE E\$DISP >= ''' *CAT &ZDEB *CAT '''' + *BCAT 'AND E\$DISP <= ''' *CAT &ZFIN *CAT ''' AND E\$CMOO + NOT IN (''1'', ''2'', ''3'', ''4'')"') QSH CMD(&SQL1) /* Extraction par SQL - 2e fichier */ CHGVAR &SQL2 VALUE('DB2 "INSERT INTO TRAVAIL.PGCLCDE + SELECT * FROM SHARBDD.PGCLCDE WHERE L\$ICDE IN + (SELECT E\$ICDE FROM SHARBDD.PGCECDE + WHERE E\$DISP >= ''' *CAT &ZDEB *CAT '''' *BCAT + 'AND E\$DISP <= ''' *CAT &ZFIN *CAT ''' + AND E\$CMOO NOT IN (''1'', ''2'', ''3'', ''4''))"') QSH CMD(&SQL2) /* Transfert dans l'IFS avec la date de fin dans le nom */ DEL '/tmp/SCH_PGC_tmp.txt' MONMSG CPF0000 CPYTOIMPF TRAVAIL/PGCECDE TOSTMF('/tmp/SCH_PGC_tmp.txt') + MBROPT(*REPLACE) STMFCODPAG(*PCASCII) RCDDLM(*CRLF) + FLDDLM(';') DECPNT(*COMMA) DATFMT(*EUR) CHGVAR &NOMFIFE VALUE('/tmp/pgcecde' *CAT &ZFIN *CAT '.csv') /* Ote les blancs du fichier - et gare au CCSID ! */ CHGVAR &SED VALUE('sed -e "s/ //g" /tmp/SCH_PGC_tmp.txt | + iconv -f 1147 -t 1252 > ' !! &NOMFIFE) QSH CMD(&SED) CPYTOIMPF TRAVAIL/PGCLCDE TOSTMF('/tmp/SCH_PGC_tmp.txt') + MBROPT(*REPLACE) STMFCODPAG(*PCASCII) RCDDLM(*CRLF) + FLDDLM(';') DECPNT(*COMMA) DATFMT(*EUR) CHGVAR &NOMFIFL VALUE('/tmp/pgclcde' *CAT &ZFIN *CAT '.csv') /* Ote les blancs du fichier - et gare au CCSID ! */ CHGVAR &SED VALUE('sed -e "s/ //g" /tmp/SCH_PGC_tmp.txt | + iconv -f 1147 -t 1252 > ' !! &NOMFIFL) QSH CMD(&SED) /* CREATION DU SCRIPT */ CPYF BIBLIO_SRC/QFTPSRC BIBLIO_SRC/QFTPSRC FROMMBR(SCH_PGC_I1) + TOMBR(SCH_PGC_IN) MBROPT(*REPLACE) CRTFILE(*NO) CHGVAR &PUT VALUE('print "PUT' *BCAT &NOMFIFE *CAT + '" >> /qsys.lib/BIBLIO_SRC.lib/qftpsrc.file/SCH_pgc_in.mbr') QSH CMD(&PUT) CHGVAR &PUT VALUE('print "PUT' *BCAT &NOMFIFL *CAT + '" >> /qsys.lib/BIBLIO_SRC.lib/qftpsrc.file/SCH_pgc_in.mbr') QSH CMD(&PUT) CPYF BIBLIO_SRC/QFTPSRC BIBLIO_SRC/QFTPSRC FROMMBR(SCH_PGC_I2) + TOMBR(SCH_PGC_IN) MBROPT(*ADD) /* ENVOI DES FICHIERS PAR FTP */ DLTOVR INPUT MONMSG CPF0000 DLTOVR OUTPUT MONMSG CPF0000 CLRPFM BIBLIO_SRC/QFTPSRC SCH_PGC_OU MONMSG CPF0000 OVRDBF INPUT BIBLIO_SRC/QFTPSRC SCH_PGC_IN /* SCRIPT */ OVRDBF OUTPUT BIBLIO_SRC/QFTPSRC SCH_PGC_OU /* REDIRIGE LA SORTIE LOG */ FTP DRAYAF2.SCRIBTEL.NET /* LANCE LE TRANSFERT */ DLTOVR INPUT MONMSG CPF0000 DLTOVR OUTPUT MONMSG CPF0000 /* Vérifier la bonne fin du ftp : on doit avoir 2 transmissions OK */ DLTDTAARA TRAVAIL/SCH_TMP MONMSG CPF0000 CRTDTAARA TRAVAIL/SCH_TMP *CHAR 9 MONMSG CPF0000 QSH CMD('grep -c "226 Transfer OK" + /QSYS.LIB/BIBLIO_SRC.LIB/QFTPSRC.FILE/SCH_PGC_OU.MBR | datarea -w + /QSYS.LIB/TRAVAIL.LIB/SCH_tmp.dtaara') RTVDTAARA BIBLIO_SRC/SCH_TMP RTNVAR(&NBRE) IF COND(&NBRE *NE '2 ') THEN(DO) CHGVAR &MSGERR VALUE('LE TRANSFERT VERS SCHMURKTZ A ÉCHOUÉ, + VOIR LE LOG SHARBDD/QFTPSRC(SCH_PGC_OU)') GOTO FINERR ENDDO /* - - - - - - - - - - - - - - - - - - - - - */ /* ON MET A JOUR LA DATE DERNIER JOUR TRAITE */ CHGDTAARA (BIBLIO_SRC/&NOMDTAR (1 6)) VALUE(&DATFIN) MONMSG CPF0000 FIN: /* - - - - - - - - - - - - - - - - - - - - - */ /*GOTO FINFIN /* SAUT POUR DEBUG */ /* MENAGE FINAL - - - - - */ DLTOVR STDOUT MONMSG CPF0000 DLTF TRAVAIL/STDOUTPGC MONMSG CPF0000 DLTF TRAVAIL/PGCECDE MONMSG CPF0000 DLTF TRAVAIL/PGCLCDE MONMSG CPF0000 DEL &NOMFIFE MONMSG CPF0000 DEL &NOMFIFL MONMSG CPF0000 CLRPFM BIBLIO_SRC/QFTPSRC SCH_PGC_OU MONMSG CPF0000 DLTDTAARA TRAVAIL/SCH_TMP MONMSG CPF0000 DEL '/tmp/SCH_PGC_tmp.txt' MONMSG CPF0000 DLTSPLF *SELECT SELECT(*CURRENT *ALL *ALL QZSHSH) MONMSG CPF0000 DLTSPLF *SELECT SELECT(*CURRENT *ALL *ALL QP0ZSPWP) MONMSG CPF0000 GOTO FINFIN FINERR: /* Message + eMail signalant une anomalie - - - - - - - */ SNDUSRMSG MSG(&MSGERR) MSGTYPE(*INFO) SNDDST TYPE(*LMSG) TOINTNET(('yukyo.mushimoyaàbigfoot.org')) DSTD('x') + LONGMSG(&MSGERR) + SUBJECT('Probleme pour SCH_PGC') MONMSG CPF0000 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ FINFIN: ENDPGM
Le programme RPG
Nom : SCH_PGC1. Noter l’instruction MONITOR pour prévoir le cas où la donnée entrée n’est pas une date valable (Erreur RNX0112). Noter aussi l’utilisation des fonctions évoluées de calculs de dates par ajout où soustraction.
* Ce programme reçoit en premier paramètre une date au format JJMMAA. * Cette date (DATDEB) est transformée en la date du jour suivant. * Dans une deuxième date (DATFIN), on met la date de la veille * du jour en cours. d caldeb S D DATFMT(*DMY) d calfin S D DATFMT(*DMY) C *Entry PList C Parm DATDEB 6 C Parm DATFIN 6 C Parm ERR 1 C MONITOR C MOVE DATDEB N6 6 0 C *DMY MOVE N6 caldeb C adddur 1:*D caldeb C MOVE UDATE calfin C calfin subdur 1:*D calfin /FREE if caldeb > calfin; caldeb = calfin; endif; /END-FREE C MOVE caldeb N6 C MOVE N6 DATDEB C MOVE calfin N6 C MOVE N6 DATFIN /FREE On-Error 112; ERR = '1'; endmon; *inlr='1'; /END-FREE
Le script 1ère partie
Cf nom dans le CL : BIBLIO_SRC/QFTPSRC(SCH_PGC_I1). Namefmt 1 pour utilisation des noms de répertoires à la mode UNIX. Si namefmt 0, on localise les objets dans des bibliothèques OS/400, avec une syntaxe du genre : /QSYS.LIB/MABIBLIO.LIB/CLIENTS.FILE/TOTO.MBR.
alfons 2trt984ff alfons 2trt984ff namefmt 1 BINARY
Le script 2e partie
Cf nom dans le CL : BIBLIO_SRC/QFTPSRC(SCH_PGC_I2).
QUIT
Le script aprés exécution.
Cf nom dans le CL : BIBLIO_SRC/QFTPSRC(SCH_PGC_IN).
alfons 2trt984ff alfons 2trt984ff namefmt 1 BINARY PUT /tmp/pgcecde2004-01-02.csv PUT /tmp/pgclcde2004-01-02.csv QUIT
Exemple de log
Commande DSPPFM BIBLIO_SRC/QFTPSRC MBR(SCH_PGC_OU)
Output redirected to a file. Input read from specified override file. Connecting to host Konsole-SKATZ at address 192.168.1.118 using port 21. 220-FileZilla Server version 0.9.22 beta 220-written by Tim Kosse (Tim.Kosse@gmx.de) 220 Please visit http://sourceforge.net/projects/filezilla/ Enter login ID (django): 331 Password required for alfons 230 Logged on UNIX emulated by FileZilla Enter an FTP subcommand. > > alfons ******** Subcommand 'alfons' not valid. For a list of available FTP subcommands, enter subcommand HELP. Enter an FTP subcommand. > > namefmt 1 200 Now using naming format "1" Client NAMEFMT is 1. Enter an FTP subcommand. > > BINARY 200 Type set to I Enter an FTP subcommand. > > PUT /tmp/pgcecde2004-01-02.csv 227 Entering Passive Mode (192,168,6,8,6,219) 150 Connection accepted 226 Transfer OK 825099 bytes transferred in 0.882 seconds. Transfer rate 935.660 KB/sec. Enter an FTP subcommand. > > PUT /tmp/pgclcde2004-01-02.csv 227 Entering Passive Mode (192,168,6,8,6,220) 150 Connection accepted 226 Transfer OK 524853 bytes transferred in 0.561 seconds. Transfer rate 936.323 KB/sec. Enter an FTP subcommand. > > QUIT 221 Goodbye