H copyright('David MALLE 2007') H DEBUG DECEDIT('0,') DATEDIT(*DMY.) H Option( *SrcStmt: *NoDebugIO ) H DftActGrp (*no) ******************************************************** * Détection des doublons dans un physique sans clé * Envoi des enregistrements doublons dans un fichier de l'IFS * Paramètre : * 1) Bibliothèque * 2) Fichier physique * 3) Fichier résultat dans l'IFS * 4) Supprimer le fichier de l'IFS avant N par défaut * -> Compilation * CRTSQLRPGI OBJ(BIB/DBLPF00001) * SRCFILE(BIB/QRPGLESRC) * SRCMBR(DBLPF00001) ******************************************************** ******************************************************** * Prototypes procédure ******************************************************** * Test existance et droits de fichier dans l'IFS D access PR 10I 0 ExtProc('access') D Path * Value Options(*string) D amode 10I 0 Value * Exécution de commande CLP D Commande S 5000 D CLPCMD PR EXTPGM('QCMDEXC') D cmd 5000 D cmdlen 15P 5 CONST ********************************************************************** * Modes d'accès pour API QSH access() * F_OK = File Exists * R_OK = Read Access * W_OK = Write Access * X_OK = Execute or Search ********************************************************************** D F_OK C 0 D R_OK C 4 D W_OK C 2 D X_OK C 1 ********************************************************************** * Pour conversion majuscules / minuscules ********************************************************************** D upper c 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' D lower c 'abcdefghijklmnopqrstuvwxyz' ******************************************************** * Variable de type autonome * ******************************************************** DCreateTabOn s N inz D nbr s 10I 0 D p_LIB S 10 D p_FIC S 10 D p_RES S 100 D p_SUP S 1 D c_LGN S 1000 D c_STM S 5000 D c_RQT S 5000 D r_RET S 1 0 D CR c x'0d' C *ENTRY PLIST C PARM p_LIB C PARM p_FIC C PARM p_RES C PARM p_SUP /free p_FIC = %xlate(lower:upper:p_FIC); p_LIB = %xlate(lower:upper:p_LIB); p_SUP = %xlate(lower:upper:p_SUP); c_RQT = 'SELECT ''SELECT '' as stm ' + 'from SYSIBM/SYSDUMMY1 ' + 'union all ' + 'SELECT trim(DBIFLD) CONCAT '' , '' as stm ' + 'FROM QSYS/QADBIFLD WHERE ' + 'DBILIB = ''' + %trim(p_LIB) + ''' AND ' + 'DBIFIL = ''' + %trim(p_FIC) + ''' ' + 'union all ' + 'select ''count(*) from ' + %trim(p_LIB) + '.' + %trim(p_FIC) + ''' as stm ' + 'from sysibm/sysdummy1 ' + 'union all ' + 'select ''group by '' as stm ' + 'from sysibm/sysdummy1 ' + 'union all ' + 'SELECT trim(DBIFLD) CONCAT '' , '' as stm ' + 'FROM QSYS/QADBIFLD WHERE ' + 'DBILIB = ''' + %trim(p_LIB) + ''' AND ' + 'DBIFIL = ''' + %trim(p_FIC) + ''' ' + 'and dbipos < ( select max(dbipos) ' + 'FROM QSYS/QADBIFLD WHERE ' + 'DBILIB = ''' + %trim(p_LIB) + ''' AND ' + 'DBIFIL = ''' + %trim(p_FIC) + ''' ) ' + 'union all ' + 'SELECT DBIFLD as stm ' + 'FROM QSYS/QADBIFLD WHERE ' + 'DBILIB = ''' + %trim(p_LIB) + ''' AND ' + 'DBIFIL = ''' + %trim(p_FIC) + ''' ' + 'and dbipos = ( select max(dbipos) ' + 'FROM QSYS/QADBIFLD WHERE ' + 'DBILIB = ''' + %trim(p_LIB) + ''' AND ' + 'DBIFIL = ''' + %trim(p_FIC) + ''' ) ' + 'union all ' + 'select ''having count(*) > 1'' as stm ' + 'from sysibm/sysdummy1 '; /end-free * ---------------------------------------------------- * Curseur : liste des commandes SQL pour recherche des doublons * ---------------------------------------------------- C/Exec SQL C+ PREPARE SLT1 FROM :c_RQT C/End-Exec C/Exec SQL C+ DECLARE CRS1 CURSOR FOR SLT1 C/End-Exec C/Exec SQL C+ OPEN CRS1 C/End-Exec C DOW SQLCOD = 0 C/Exec SQL C+ FETCH NEXT FROM CRS1 C+ INTO :c_LGN C/End-Exec C IF SQLCOD = 0 C EVAL c_STM = %trim(c_STM) + ' ' + %trim(c_LGN) C ENDIF C ENDDO C/Exec SQL C+ CLOSE CRS1 C/End-Exec /free // Par défaut, le fichier n'est pas supprimé de l'IFS if ( p_SUP <> 'O' and p_SUP <> 'N' ); p_SUP = 'N'; endif; CreateTabOn = *off ; if ( access(%trim(p_RES): F_OK) >= 0 ); // Si fichier existe dans l'IFS et suppression demandée. if (p_SUP = 'O'); Commande = 'QSH CMD(''rm -f ' + %trim(p_RES) + ''')'; CLPCMD(Commande:%size(Commande)); CreateTabOn = *on ; endif; else; CreateTabOn = *on ; endif; // Création du fichier dans l'IFS avec le CCSID ASCII if CreateTabOn; Commande = 'QSH CMD(''touch -C 1252 ' + %trim(p_RES) + ''')'; CLPCMD(Commande:%size(Commande)); endif; // Commande pour exécuter la requête SQL générée // et mettre le résultat dans l'IFS Commande = 'QSH CMD(''db2 ''''' + %trim(c_STM) + ''''' >> ' + %trim(p_RES) + ''')'; CLPCMD(Commande:%size(Commande)); *inlr = *on; /end-free