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);
}
}