Commande AS400 avec prompt pour selection jusqu’à 20 codes
Saisie d’un nombre variable de zones. Utilisation d’OPNQRYF, sélection suivant nom de zones de fichiers BD et mapping de zones numériques. Utilise CPYFRMQRYF Sortie d’un fichier dans l’IFS formaté par un programme Java. Envoi d’un message final à l’utilisateur qui a lancé le job.
POSITIONS LISTE CPTES/PERIODE (FACGEN) Indiquez vos choix, puis appuyez sur ENTREE. Liste de comptes . . . . . . . . +______ Valeur alpha + si autres valeurs _______ Depuis (JJMMAA) . . . . . . . ______ Valeur alpha Jusqu'à (JJMMAA) . . . . . . . ______ Valeur alpha Nom fichier . . . . . . . . . . __________ Valeur alpha Fin F3=Exit F4=Invite F5=Réafficher F12=Annuler F13=Mode d'emploi invite F24=Autres touches Paramètre LISTE obligatoire. +
En mettant "+" sur la première zone, l’écran offrira les 20 zones prévues :
Définition d'autres valeurs du paramètre LISTE Indiquez vos choix, puis appuyez sur ENTREE. Liste de comptes . . . . . . . . _______ Valeur alpha _______ _______ _______ _______ _______ _______ _______ _______ _______ _______ _______ _______ _______ _______ A suivre... F3=Exit F4=Invite F5=Réafficher F12=Annuler F13=Mode d'emploi invite F24=Autres touches Paramètre LISTE obligatoire.
Commande
/* Dernier parametre : CONSTANTE recuperee dans une data area nommee */ /* DGBIBLIO, contenant le nom de la bibliotheque ou se trouvent tous */ /* les modules. */ /* */ /* 1er parametre "LISTE" : 20 zones de 7 caracteres */ /* */ CMD PROMPT('POSITIONS LISTE CPTES/PERIODE') PARM KWD(LISTE) TYPE(*CHAR) LEN(7) MIN(1) MAX(20) FULL(*YES) + PROMPT('Liste de comptes') PARM KWD(DAT6D) TYPE(*CHAR) LEN(6) MIN(1) FULL(*YES) + PROMPT('Depuis (JJMMAA)') PARM KWD(DAT6F) TYPE(*CHAR) LEN(6) MIN(1) FULL(*YES) + PROMPT('Jusqu''à (JJMMAA)') PARM KWD(NOMFIC) TYPE(*CHAR) LEN(10) FULL(*NO ) + PROMPT('Nom fichier') PARM DTA *CNAME 10 CONSTANT(DGBIBLIO) DTAARA(*YES) PARM WKSTN *PNAME 10 CONSTANT(' ') DTAARA(*YES)
Création de la commande
/** FACGEN : LISTE DE POSITIONS FACTURES (LISTE DE CPTE/PERIODE) CRTCMD CMD(&LIB/FACGEN) PGM(&LIB/FACGENCL) + SRCFILE(&LIB/QCMDSRC) SRCMBR(FACGENCMD) + TEXT('POS. POUR COMPTES/PERIODE ')
Programme CLP FACGENCL.
/* CE CL SE LANCE LUI-MEME EN BATCH */ /* PARAMETRES : */ /* &LISTE : LISTE DES COMPTES */ /* &DAT6D : DATE DE DEBUT (AAMMJJ) */ /* &DAT6F : DATE DE FIN (AAMMJJ) */ /* &NOMFIC : NOM DE FICHIER SORTI */ /* &DTA : DTAARA CONTENANT LE NOM DE LA BIBLIO */ /* DE CES PROGRAMMES */ /* */ /* Variable LISTE : saisie par prompt de jusqu'a 20 zones de 7 carac-*/ /* teres : on recupere 142 octets, les deux premiers contiennent en */ /* binaire la longueur des zones saisies. */ /* Voir la commande RENTACMD pour le parametrage d'une liste saisie. */ /* ATTENTION : LE NOM DE BIBLIOTHEQUE DE TRAVAIL ET DES */ /* PROGRAMMES (&LIB) EST UN PARAMETRE FIXE DE LA */ /* COMMANDE , VOIR &LIB/QCMDSRC( ) */ /* VOIR &LIB/QCLSRC(GENCOMCL) POUR CREER LA COMMANDE */ PGM PARM(&LISTE &DAT6D &DAT6F &NOMFIC &DTA &WKSTN) DCL &LISTE *CHAR 142 DCL &DAT6D *CHAR 06 DCL &DAT6F *CHAR 06 DCL &TRAV *CHAR 160 DCL &CT *DEC 3 0 DCL &C01 *CHAR 7 DCL &C02 *CHAR 7 DCL &C03 *CHAR 7 DCL &C04 *CHAR 7 DCL &C05 *CHAR 7 DCL &C06 *CHAR 7 DCL &C07 *CHAR 7 DCL &C08 *CHAR 7 DCL &C09 *CHAR 7 DCL &C10 *CHAR 7 DCL &C11 *CHAR 7 DCL &C12 *CHAR 7 DCL &C13 *CHAR 7 DCL &C14 *CHAR 7 DCL &C15 *CHAR 7 DCL &C16 *CHAR 7 DCL &C17 *CHAR 7 DCL &C18 *CHAR 7 DCL &C19 *CHAR 7 DCL &C20 *CHAR 7 DCL &TYPE *CHAR 01 DCL &NOMFIC *CHAR 10 DCL &DTA *CHAR 10 DCL &WKSTN *CHAR 10 DCL &LIB *CHAR 10 ADDLIBLE GUEBEY MONMSG CPF0000 CALL SBRBIBCL PARM(&DTA &LIB)/* Nom de la bibliotheque de travail */ MONMSG CPF0000 /* NOM JOB = NOM FICHIER SORTI */ IF COND(&NOMFIC *EQ ' ') THEN(CHGVAR + VAR(&NOMFIC) VALUE('Enzliste')) /* INTERACTIF SEULEMENT POUR TESTS */ /* GOTO OK */ /* TESTE SI BATCH : --------------------------------- */ RTVJOBA TYPE(&TYPE) /* SI OUI : TRAITEMENT */ IF COND(&TYPE *EQ '0') THEN(GOTO CMDLBL(OK)) /* SI NON, ENVOI EN BATCH */ RTVJOBA JOB(&WKSTN) RTVDTAARA DTAARA(&DTA (1 10)) RTNVAR(&LIB) SBMJOB CMD(CALL PGM(&LIB/FACGENCL) + PARM(&LISTE &DAT6D &DAT6F &NOMFIC &DTA &WKSTN)) JOB(&NOMFIC) RETURN /* --------------------------------------------- */ OK: CALL &LIB/SBRDATCL PARM(&DAT6D) /* inverse jj et aa */ MONMSG CPF0000 CALL &LIB/SBRDATCL PARM(&DAT6F) MONMSG CPF0000 ADDLIBLE FR_SPPDTA MONMSG CPF0000 ADDLIBLE FR_SPPARC MONMSG CPF0000 DLTF QTEMP/ENZSORTIE MONMSG CPF0000 CHGVAR &CT VALUE(%BINARY(&LISTE 1 2)) IF (&CT > 00) THEN(CHGVAR &C01 %SST(&LISTE 003 7)) IF (&CT > 01) THEN(CHGVAR &C02 %SST(&LISTE 010 7)) IF (&CT > 02) THEN(CHGVAR &C03 %SST(&LISTE 017 7)) IF (&CT > 03) THEN(CHGVAR &C04 %SST(&LISTE 024 7)) IF (&CT > 04) THEN(CHGVAR &C05 %SST(&LISTE 031 7)) IF (&CT > 05) THEN(CHGVAR &C06 %SST(&LISTE 038 7)) IF (&CT > 06) THEN(CHGVAR &C07 %SST(&LISTE 045 7)) IF (&CT > 07) THEN(CHGVAR &C08 %SST(&LISTE 052 7)) IF (&CT > 08) THEN(CHGVAR &C09 %SST(&LISTE 059 7)) IF (&CT > 09) THEN(CHGVAR &C10 %SST(&LISTE 066 7)) IF (&CT > 10) THEN(CHGVAR &C11 %SST(&LISTE 073 7)) IF (&CT > 11) THEN(CHGVAR &C12 %SST(&LISTE 080 7)) IF (&CT > 12) THEN(CHGVAR &C13 %SST(&LISTE 087 7)) IF (&CT > 13) THEN(CHGVAR &C14 %SST(&LISTE 094 7)) IF (&CT > 14) THEN(CHGVAR &C15 %SST(&LISTE 101 7)) IF (&CT > 15) THEN(CHGVAR &C16 %SST(&LISTE 108 7)) IF (&CT > 16) THEN(CHGVAR &C17 %SST(&LISTE 115 7)) IF (&CT > 17) THEN(CHGVAR &C18 %SST(&LISTE 122 7)) IF (&CT > 18) THEN(CHGVAR &C19 %SST(&LISTE 129 7)) IF (&CT > 19) THEN(CHGVAR &C20 %SST(&LISTE 136 7)) IF (&C01 *GE '0000000' *AND &C01 *LE '9999999') THEN(DO) CHGVAR &TRAV VALUE(&C01 *BCAT &C02 + *BCAT &C03 *BCAT &C04 + *BCAT &C05 *BCAT &C06 + *BCAT &C07 *BCAT &C08 + *BCAT &C09 *BCAT &C10 + *BCAT &C11 *BCAT &C12 + *BCAT &C13 *BCAT &C14 + *BCAT &C15 *BCAT &C16 + *BCAT &C17 *BCAT &C18 + *BCAT &C19 *BCAT &C20) GOTO PASDTA ENDDO ELSE GOTO TOUT /* SELECTION DANS *DTA* */ CLOF OPNID(ENZENDZE) MONMSG CPF0000 /* SELECTIONNE COMPTE/PERIODE */ OPNQRYF FILE((FR_SPPDTA/ENZENDZE)) OPTION(*INP) + QRYSLT(' + IDZDZE *GT 0 + *AND TPZDZE *EQ ''R'' + *AND DTRGZE *GE D6D + *AND DTRGZE *LE D6F + *AND FNSTZE *EQ SFDZZE + *AND RDSTZE *NE ''XB'' + *AND DERFZE *EQ %VALUES(' !! &TRAV !! ') + *AND PFVBZE *NE ''£££'' + ') + MAPFLD((D6D &DAT6D *DEC 6 0) + (D6F &DAT6F *DEC 6 0)) /* FICHIER DE TRAVAIL */ DLTF QTEMP/ENZENDTA MONMSG CPF0000 CPYFRMQRYF FROMOPNID(ENZENDZE) TOFILE(QTEMP/ENZENDTA) CRTFILE(*YES) MONMSG CPF0000 TOUT: CLOF OPNID(ENZENDZE) MONMSG CPF0000 /* SELECTION /COMPTE/PERIODE */ OPNQRYF FILE((FR_SPPARC/ENZENDZE)) OPTION(*INP) + QRYSLT(' + IDZDZE *GT 0 + *AND TPZDZE *EQ ''R'' + *AND DTRGZE *GE D6D + *AND DTRGZE *LE D6F + *AND FNSTZE *EQ SFDZZE + *AND RDSTZE *NE ''XB'' + *AND PFVBZE *NE ''£££'' + ') + MAPFLD((D6D &DAT6D *DEC 6 0) + (D6F &DAT6F *DEC 6 0)) MONMSG CPF0000 GOTO SUI PASDTA: /* SELECTION DANS *ARCHIVES* */ CLOF OPNID(ENZENDZE) MONMSG CPF0000 /* SELECTION /COMPTE/PERIODE */ OPNQRYF FILE((FR_SPPARC/ENZENDZE)) OPTION(*INP) + QRYSLT(' + IDZDZE *GT 0 + *AND TPZDZE *EQ ''R'' + *AND DTRGZE *GE D6D + *AND DTRGZE *LE D6F + *AND FNSTZE *EQ SFDZZE + *AND RDSTZE *NE ''XB'' + *AND DERFZE *EQ %VALUES(' !! &TRAV !! ') + *AND PFVBZE *NE ''£££'' + ') + MAPFLD((D6D &DAT6D *DEC 6 0) + (D6F &DAT6F *DEC 6 0)) MONMSG CPF0000 SUI: /* FICHIER DE TRAVAIL */ DLTF QTEMP/ENZENARC MONMSG CPF0000 /* CPYFRMQRYF FROMOPNID(ENZENDZE) TOFILE(QTEMP/ENZENARC) + CRTFILE(*YES) */ CPYFRMQRYF FROMOPNID(ENZENDZE) TOFILE(QTEMP/ENZSORTIE) + MBROPT(*REPLACE) CRTFILE(*YES) MONMSG CPF0000 GOTO PASFUS /* LES DEUX FICHIERS ACCOLES */ RUNQRY &LIB/ENZFUSARC /* SELECTIONNE ENZENDTA PAS DANS ENZENARC CHKOBJ OBJ(QTEMP/ENZSORTIE) OBJTYPE(*FILE) MONMSG MSGID(CPF9801) EXEC(DO) CRTDUPOBJ OBJ(ENZENARC) FROMLIB(QTEMP) OBJTYPE(*FILE) + TOLIB(*FROMLIB) NEWOBJ(ENZSORTIE) ENDDO CPYF QTEMP/ENZENARC QTEMP/ENZSORTIE MBROPT(*ADD) FMTOPT(*NOCHK) MONMSG CPF0000 PASFUS: /* DSPPFM QTEMP/ENZSORTIE */ /* FORMATAGE GENRE CLEROUX/FACTRUC */ /* LIT QTEMP/ENZSORTIE SORT GUEBEY/FACGEN */ RUNQRY &LIB/FACGEN MONMSG QRY0000 EXEC(DO) GOTO ERR ENDDO DLTF GUEBEY/&NOMFIC MONMSG CPF0000 RNMOBJ GUEBEY/FACGEN *FILE &NOMFIC MONMSG CPF0000 /* M.AJ. TEXTE FICHIER + SORTIE DANS IFS */ CALL &LIB/SBRSORTIE + PARM(&LIB &LIB &NOMFIC &C01 ' ') MONMSG CPF0000 CLOF OPNID(ENZENDZE) MONMSG CPF0000 /* GARDER FIC. TRAVAIL POUR TESTS */ /* GOTO FIN */ /* DLTF QTEMP/ENZENDTA */ MONMSG CPF0000 /* DLTF QTEMP/ENZENARC */ MONMSG CPF0000 /* DLTF QTEMP/ENZSORTIE */ MONMSG CPF0000 IF COND(&TYPE *EQ '0') THEN(DO) CALL PGM(&LIB/SBRMSGCL) PARM(&NOMFIC &LIB &WKSTN) MONMSG CPF0000 ENDDO GOTO FIN ERR: IF COND(&TYPE *EQ '0') THEN(DO) IF COND(&WKSTN *NE ' ') THEN(DO) SNDBRKMSG MSG('Anomalie : ' !! &NOMFIC !! 'non créé' ) + TOMSGQ(&WKSTN) MONMSG CPF0000 ENDDO ENDDO FIN: ENDPGM
Routine SBRBIBCL
/* Ce CL charge le nom de la bibliotheque des programmes */ PGM PARM(&DTA &LIB) DCL &DTA *CHAR 10 /* Nom dtaara contenant le nom de la biblio */ DCL &LIB *CHAR 10 /* RECUPERE LE NOM DE LA BIBLIOTHEQUE */ RTVDTAARA DTAARA(&DTA (1 10)) RTNVAR(&LIB) MONMSG CPF0000 IF COND(&LIB *EQ ' ') THEN(DO) CHGVAR &LIB 'GUEBEY ' ENDDO ENDPGM
Routine SBRDATCL
/* recoit une date JJMMAA et la restitue sous la forme AAMMJJ, et vice-sersa */ PGM PARM(&DATE) DCL &DATE *CHAR 6 DCL &AA *CHAR 2 DCL &JJ *CHAR 2 CHGVAR &AA %SST(&DATE 5 2) CHGVAR &JJ %SST(&DATE 1 2) CHGVAR %SST(&DATE 1 2) &AA CHGVAR %SST(&DATE 5 2) &JJ ENDPGM
Routine SBRMSGCL
PGM PARM(&NOMFIC &LIB &WKSTN) DCL &NOMFIC *CHAR 10 DCL &LIB *CHAR 10 DCL &WKSTN *CHAR 10 IF COND(&WKSTN *NE ' ') THEN(DO) SNDBRKMSG MSG('Fichier ' !! &NOMFIC !! ' créé' ) + TOMSGQ(&WKSTN) MONMSG CPF0000 ENDDO FIN: ENDPGM
Routine SBRSORTIE
PGM PARM(&LIB &XBIBL &XFICH &XDESC &PREFIX) DCL &LIB *CHAR 10 DCL &XBIBL *CHAR 10 DCL &XFICH *CHAR 10 DCL &XDESC *CHAR 14 DCL &PREFIX *CHAR 14 /* MàJ description du fichier (user date heure taille ...) */ CALL &LIB/SBRFICTXT PARM(&XBIBL &XFICH &XDESC) MONMSG CPF0000 /* Génération d'un fichier en format csv dans l'IFS */ CALL &LIB/SBREXPORT PARM(&LIB &XBIBL &XFICH &PREFIX) MONMSG CPF0000 ENDPGM
Routine SBRFICTXT
/******************************************************************* */ /* MODIFICATION DU TEXTE DESCRIPTIF D'UN FICHIER */ /* */ /* ON INDIQUE : UTILISATEUR, */ /* DATE, */ /* HEURE, */ /* NOMBRE D'ENREG DU DERNIER MEMBRE DANS L'ORDRE DE */ /* DATE */ /* (OU TAILLE SI CE N'EST PAS UN FICHIER PHYSIQUE) */ /* LIBELLE COURT */ /* */ /* PARAMETRES : NOM DE LA BIBLIOTHEQUE 10 CAR. */ /* NOM DE L'OBJET 10 CAR. */ /* TEXTE LIBRE 14 CAR. */ /* */ /******************************************************************* */ PGM PARM(&XBIBL &XFICH &XDESC) DCL VAR(&XBIBL) TYPE(*CHAR) LEN(10) DCL VAR(&XFICH) TYPE(*CHAR) LEN(10) DCL VAR(&XDESC) TYPE(*CHAR) LEN(14) DCL VAR(&USRID) TYPE(*CHAR) LEN(10) DCL VAR(&DATE) TYPE(*CHAR) LEN(06) DCL VAR(&HEURE) TYPE(*CHAR) LEN(06) DCL VAR(&RECO) TYPE(*DEC) LEN(10 0) DCL VAR(&SIZE) TYPE(*DEC) LEN(15 0) DCL VAR(&TEXT) TYPE(*CHAR) LEN(50) RTVJOBA USER(&USRID) RTVSYSVAL SYSVAL(QDATE) RTNVAR(&DATE) RTVSYSVAL SYSVAL(QTIME) RTNVAR(&HEURE) /* FICHIER PHYSIQUE : NOMBRE D'ENREG */ RTVMBRD FILE(&XBIBL/&XFICH) MBR(*LAST) NBRCURRCD(&RECO) /* AUTRE TYPE DE FICHIER : TAILLE */ MONMSG CPF0000 EXEC(DO) RTVOBJD &XBIBL/&XFICH *FILE SIZE(&SIZE) MONMSG CPF0000 CHGVAR &RECO &SIZE CHGVAR %SST(&TEXT 25 1) '*' ENDDO CHGVAR %SST(&TEXT 01 10) &USRID CHGVAR %SST(&TEXT 12 06) &DATE CHGVAR %SST(&TEXT 19 06) &HEURE CHGVAR %SST(&TEXT 26 10) &RECO CHGVAR %SST(&TEXT 37 14) &XDESC CHGOBJD &XBIBL/&XFICH *FILE &TEXT MONMSG CPF0000 ENDPGM
Routine SBREXPORT
************** Début des données ************************************ /* CREE UN FICHIER DELIMITE DANS L'IFS */ /* */ /* Parametres : */ /* - XBIBL : bibliotheque du fichier lu */ /* - XFICH : nom du fichier lu */ /* - PREFIX : prefixe facultatif (defaut = userid) */ /* - PATH : emplacement du lecteur reseau dans l'IFS */ /* (defaut = /home/guebey/transferts') */ /* - NOMF : nom du fichier a sortir (prefixe + nom fichier) */ /* - NOMP : nom complet PATH + NOMF */ PGM PARM(&LIB &XBIBL &XFICH &PREFIX) DCL &LIB *CHAR 10 DCL &XBIBL *CHAR 10 DCL &XFICH *CHAR 10 DCL &PREFIX *CHAR 10 DCL &PATH *CHAR 256 *BLANK DCL &NOMF *CHAR 256 DCL &NOMFEXT *CHAR 256 DCL &NOMP *CHAR 256 DCL &CLASSES *CHAR 256 DCL &SYSTEM *CHAR 10 DCL &USER *CHAR 10 RTVNETA SYSNAME(&SYSTEM) /* CHEMIN PAR DEFAUT */ IF COND(&PATH *EQ *BLANK) THEN(CHGVAR &PATH VALUE('/home/guebey/transferts')) RTVJOBA USER(&USER) IF COND(&PREFIX *EQ ' ') THEN(CHGVAR &PREFIX VALUE(&USER)) ELSE IF COND(&XFICH *EQ &PREFIX) THEN(CHGVAR &PREFIX VALUE(&USER)) GOTO JAVA /* UTILISATION DE L'INSTRUCTION CPYTOIMPF */ /* -------------------------------------- */ /* COPIE DANS IFS AVEC SEPARATEUR DE ZONE AUTOMATIQUE */ CHGVAR &NOMF VALUE(&PREFIX *TCAT '_' *TCAT &XFICH *TCAT '.TXT') CHGVAR &NOMP VALUE(&PATH *TCAT '/' *TCAT &NOMF) CPYTOIMPF FROMFILE(&XBIBL/&XFICH) TOSTMF(&NOMP) + MBROPT(*REPLACE) STMFCODPAG(*STDASCII) + RCDDLM(*CRLF) STRDLM(*NONE) FLDDLM(';') MONMSG CPF0000 CHGAUT OBJ(&NOMP ) USER(*PUBLIC) DTAAUT(*NONE) OBJAUT(*ALL) MONMSG CPF0000 GOTO FIN /* UTILISATION D'UNE CLASSE JAVA */ /* ----------------------------- */ JAVA: CHGVAR &NOMF VALUE(&PREFIX *TCAT '_' *TCAT &XFICH) RTVDTAARA &LIB/DGCLASSES &CLASSES MONMSG CPF0000 EXEC(DO) CHGVAR &CLASSES '/home/guebey/java' ENDDO CHGCURDIR &CLASSES RUNJVA CLASS(JDBCQcsv) PARM(&SYSTEM &XBIBL &XFICH &PATH &NOMF) + CLASSPATH('.:/QIBM/PRODDATA/HTTP/PUBLIC/JT400/LIB/JT400.JAR') + OUTPUT(*PRINT) MONMSG JVA0000 /* LE PROGRAMME JAVA RAJOUTE L'EXTENSION AU NOM DU FICHIER */ CHGVAR &NOMFEXT VALUE(&PATH *TCAT '/' *TCAT &NOMF *TCAT '.TXT') CHGAUT OBJ(&NOMFEXT ) USER(*PUBLIC) DTAAUT(*R) OBJAUT(*ALL) MONMSG CPF0000 FIN: ENDPGM
Classe JAVA JDBCQcsv
/** Lecture d’un fichier AS400/iSeries par SQL/Jdbc, <br /> sort dans l’IFS un fichier CSV (separateurs ";"). <br /> Exemple : java JDBCQcsv nomsysteme nombiblio nomfichier cheminIFS nomfichIFS<br /> @author Dominique Guebey d.guebey@abxlogistics.fr @param nom de l’as400, nom de la bibliotheque, nom du fichier as400, chemin_ifs, nom_fich_ifs. @version 25 octobre 2004 */ // Utilisation de com.ibm.as400.access de jt400.jar // cf dans /QIBM/ProdData/HTTP/Public/jt400/lib/ // Inspire au depart du manuel IBM Toolbox for Java version 6. // Voir JDBCQtxt derive de JDBCQuery et IFSCopyFile // Modifications : // 2004-05-19 : optimisation : sortir une ligne en un bloc au lieu de zone par zone // 2004-07-21 : optimisation : utiliser "trim" pour supprimer les blancs non significatifs // 2004-07-21 : si presence d'un ";", remplacement par "," // 2004-10-25 : optimisation : utilisation de StringBuffer pour charger l'enreg. // TODO : // - AS400Text est "deprecated" // - mettre le nom d'user dans le nom du fichier si nomfichIFS=null // - pour Excel : remplacer le '.' decimal par ',' import java.sql.*; import java.io.*; import java.util.*; import com.ibm.as400.access.*; public class JDBCQcsv extends Object { // 2004-07-21 : methode "format" supprimee public static void main (String[] parameters) { // Verifie les parametres (2 derniers facultatifs) if (parameters.length < 3) { return; } if (parameters.length > 5) { return; } String chemin = null; String nomfic = null; String system = parameters[0]; String collectionName = parameters[1]; String tableName = parameters[2]; if (parameters.length > 3) { chemin = parameters[3]; } if (parameters.length > 4) { nomfic = parameters[4]; } Connection connection = null; IFSTextFileOutputStream target = null; int textLength = 0; byte[] data = null; String wzone = null; String zone = null; String javaText = null; AS400Text textConverter = null; AS400Text textConvert = null; try { if (chemin == null) { chemin = "/home/guebey/transferts"; } if (nomfic == null) { nomfic = tableName; } // Definir et ouvrir le fichier en sortie et obtenir la connexion... String targetName = chemin + "/" + nomfic + ".txt"; AS400 as400 = new AS400(system); target = new IFSTextFileOutputStream(as400,targetName); // Charge le driver JDBC du IBM Toolbox for Java. DriverManager.registerDriver(new com.ibm.as400.access.AS400JDBCDriver()); // Connection a la base de donnee. connection = DriverManager.getConnection ("jdbc:as400://" + system); DatabaseMetaData dmd = connection.getMetaData (); // Query sur le fichier Statement select = connection.createStatement (); ResultSet rs = select.executeQuery ("SELECT * FROM " + collectionName + dmd.getCatalogSeparator() + tableName); // Obtenir des informations du "result set". // Etablir la largeur de colonne a sa plus grande valeur : data ou label ResultSetMetaData rsmd = rs.getMetaData (); int columnCount = rsmd.getColumnCount (); String[] columnLabels = new String[columnCount]; int[] columnWidths = new int[columnCount]; for (int i = 1; i <= columnCount; ++i) { columnLabels[i-1] = rsmd.getColumnLabel (i); columnWidths[i-1] = Math.max (columnLabels[i-1].length(), rsmd.getColumnDisplaySize (i)); } // SORTIE DE L ENTETE for (int i = 1; i <= columnCount; ++i) { // 2004-07-21 zone = rsmd.getColumnLabel(i); textLength = zone.length(); // page de code 850 sinon recupere de l'UNICODE textConverter = new AS400Text(textLength,850); // 2004-07-21 : plus de "format", trim et remplacer les ";" wzone = rsmd.getColumnLabel(i); zone = wzone.trim(); zone = zone.replace(';',','); data = textConverter.toBytes(zone); target.write(data); textConvert = new AS400Text(1,850); data = textConvert.toBytes(";"); target.write(data); } data = textConvert.toBytes("\n"); target.write(data); // Boucle de lecture du fichier // colonne par colonne while (rs.next ()) { // 2004-05-19 : String ligne : sortie enreg en une fois au lieu de zone par zone String ligne = ""; // 2004-10-25 UTILISATION de StringBuffer StringBuffer buf = new StringBuffer(); for (int i = 1; i <= columnCount; ++i) { String value = rs.getString (i); if (rs.wasNull ()) value = "<null>"; // 2004-07-21 : plus de "format", trim et remplacer les ";" zone = value.trim(); zone = zone.replace(';',','); buf.append(zone).append(";"); // ligne = ligne + zone + ";"; } ligne = buf.toString(); textLength = ligne.length(); textConverter = new AS400Text(textLength,850); data = textConverter.toBytes(ligne); target.write(data); data = textConvert.toBytes("\n"); target.write(data); } target.close(); } catch (Exception e) { // System.out.println (); // System.out.println ("ERROR: " + e.getMessage()); } finally { // Clean up. try { if (connection != null) connection.close (); } catch (SQLException e) { // Ignore. } } System.exit (0); } }