*/?----------------------------------------------------------------------- */?® MALLE David programme de lecture d'un fichier via curseur */ et analyse de zones via appel des procédures */ FILESCANCRT, FILESCANFLD et FILESCANDLT du programme de */ service SRVPFILFLD */-> CRTSQLRPGI OBJ(MYBIB/EXPSCAN001) *SRCFILE(MYBIB/QRPGLESRC) */ DBGVIEW(*SOURCE) */?----------------------------------------------------------------------- H dftactgrp(*no) actgrp(*caller) H COPYRIGHT('David MALLE') H BNDDIR('MYBNDDIR') /COPY QCPYSRC,CP_FILFLD /COPY QCPYSRC,CP_CONVERT ** ---------------------------------------------------- ** DS sur fichier pour récup fetch * ** ---------------------------------------------------- DDsFile E DS EXTNAME(QCLSRC) ** ------------------------------------------------------------------------ ** Prototype pour scan des zones ramenées par le fetch ** ------------------------------------------------------------------------ D ScanField PR D pFile 10A CONST D pFld 10A CONST D pValStr 32767 VARYING D pValNum 30S 9 D pType 1 ** ---------------------------------------------------- ** Variables de travail ** ---------------------------------------------------- D ValStr S 32767 VARYING D ValNum S 30S 9 D TypeField S 1 /free // // 1er appel : crée userspace dans qtemp (basé sur nom du fichier) FileScanCRT('QCLSRC':'QCLSRC':'*LIBL'); // // Curseur sur le fichier QCLSRC exec sql declare c1 cursor for select * from QCLSRC a; exec sql open c1; exec sql fetch c1 into :DsFile; dow (SQLCOD = 0); // On peut insérer ici une boucle sur la recherche de différentes // zones du fichier. Ici, on recherche en dur les 3 zones de QCLSRC ScanField('QCLSRC':'SRCSEQ':ValStr:ValNum:TypeField); ScanField('QCLSRC':'SRCDAT':ValStr:ValNum:TypeField); ScanField('QCLSRC':'SRCDTA':ValStr:ValNum:TypeField); exec sql fetch c1 into :dsFile; enddo; // // Supression UserSpace et fin du pgm FileScanDLT('QCLSRC'); *inlr = *on; /end-free ** ------------------------------------------------------------------------ ** Procédure qui scan la DSE du fichier ** ------------------------------------------------------------------------ P ScanField B D ScanField PI D pFile 10A CONST D pFld 10A CONST D pValStr 32767 VARYING D pValNum 30S 9 D pType 1 * D s_Val S 32767 VARYING D c_Val S 31 VARYING D n_Val S 30S 9 D sPCK S 16 D sNUM S 31 /free // Appel pour scanner la liste des zones ramenées par le fetch. // Recherche de la zone pFld dans la liste des zone de pFile // Si non trouvée dsSF retournée à *BLANKS FileScanFLD(pFile:pFld:dsSF); if (dsSF <> *Blanks); // Selon le type de zone : récup sous forme alpha s_Val // et numérique n_Val (30,9) // Zones packées if (datatype = 'P'); sPCK = %subst(DsFile:inBufPos:byteLeng); s_Val = SPackToSNum(sPCK:byteleng:digits:decpos); c_Val = %trim(s_Val); EXEC SQL SET :n_Val = CAST(:c_Val AS DEC(30, 9)); endif; // Zones numérique étendue if (datatype = 'S'); sNUM = %subst(DsFile:inBufPos:byteLeng); s_Val = SDecToSNum(sNUM:byteleng:digits:decpos); c_Val = %trim(s_Val); EXEC SQL SET :n_Val = CAST(:c_Val AS DEC(30, 9)); endif; // Zones alpha if (datatype = 'A'); s_Val = %subst(DsFile:inBufPos:byteLeng); n_Val = 0; endif; // Retour des valeurs et du type pValStr = s_Val; pValNum = n_Val; pType = datatype; endif; return; /end-free P ScanField E