Overblog Tous les blogs Top blogs Technologie & Science Tous les blogs Technologie & Science
Editer l'article Suivre ce blog Administration + Créer mon blog
MENU
Publicité
Attn's blog

Attributs Table Sql

20 Juillet 2010 , Rédigé par Pam007 Publié dans #SqlRpg

      * Demande un nom de fichier, biblio, éventuellement un préfix.
      * Génère dans un fichier source "srcg", 

      * le détail des instructions SQL Select, Insert, Update

      * et des cartes D.
      * afin d'éviter l'emploi de * (toute les zones).
      *
     Hdftactgrp(*no)
     Hactgrp('milan')
     Hoption(*srcstmt:*nodebugio)

     Ftst020D   cf   e             workstn

     D                sds
     Dproc_name          *proc
     Duserr2                 254    263


     Dbouclew          s               n                        Do *hival
     Diw               s              3  0                      Ctr
     Dimaxw            s              3  0                      Ctr zones
     Dtrvw             s               n                        Trouvé
     Dokw              s               n                        OK
     Dzerow            s              3  0                      Pour anom
     Dopenw            s               n                        ouverture curseur
     Dbibfichw         s             21    varying              Pour message info

      * Attn, certaines longueurs tronquées...
     DcolomnDS         ds
     Dsys_column_name                10
     Ddata_type                       8
     Dlength                          3  0
     Dnumeric_scale                   3  0
     Dis_nullable                     1
     Dcolumn_heading                 60
     Dcolumn_text                    50

     Dsrcdtaw          s            100
     Dsrcseqw          s              6  0
     Despacesw         s             10
     Despace5w         s              5
     Dnumeric_scale2w  s              3
     Dtextew           s             60
     Dvirgw            s              1
     Dcmdw             s           2000    varying


      * La spécif D
     Dspecifdds        ds
     Dddw                             1    inz('D')
     Ddnomw                          15
     Dsp1W                            2
     Dddeclaw                         2
     Dsp2W                            7
     Ddlongw                          7
     Ddtypew                          1
     Dddecw                           2
     Ddkw                            37
     Dsp3W                            1
     Ddcommentw                      20


     Dfetchsql         pr
     D NextFirstw                     9    value

     Dvrfsql           pr

     Ddegrossissage    pr

     Diplus            pr
     Dquoiw                          10    value varying

     Dclosecurseur     pr

     Dqcmdexc          pr                  extpgm('QCMDEXC')
     D cmd                        32702    options(*varsize) const
     D cmdlen                        15  5 const


      /free
              exec sql
              set option commit = *none, datfmt = *iso;

              exec sql
              declare curseur scroll cursor for
              select system_column_name, data_type,
              length, ifnull(numeric_scale, -1), is_nullable,
              ifnull(column_heading, ''),
              ifnull(column_text, '')
              from syscolumns
              where system_table_name = :fichierw and
                    system_table_schema = :bibliow;


           monitor;

           dou bouclew;        // B o u c l e   1
           closecurseur();
           exfmt ecran01;      // A f f i c h a g e
           if *inkc or *inkl;  //
           exsr srfin;         // Fin
           endif;

           if fichierw= *blanks;
           *in51 = *on;             // Saisir le nom d'un fichier !
           iter;
           endif;

           if  bibliow= *blanks;
           *in52 = *on;             // Saisir le nom de bibliothèque !
           iter;
           endif;

           bibfichw = %trim(bibliow) + '/' +  %trim(fichierw);


           messw = *blanks;


           cmdw = 'clrpfm srcg';    //  Mise à blanc du fichier résultat
           qcmdexc(cmdw:%len(cmdw));

           srcseqw = 0;


          // P h a s e   1 ,  g é n é r a t i o n   d e   S e l e c t   :
              exec sql           -- Ouverture du curseur
              open curseur;
              vrfsql();
              openw = *on;

 

           iw = 0;
           dou bouclew;          // Boucle de lecture

           fetchsql('NEXT');

           if sqlstate = '02000';
           leave;                // Retour affichage
           endif;

           iw += 1;

           if iw = 1;
           srcseqw += 1;
           srcdtaw = espacesw + 'Declare curseur scroll cursor for select';
              exec sql                                         -- Première ligne
              insert into srcg(srcseq, srcdta) values(:srcseqw, :srcdtaw);
              vrfsql();
           endif;

           degrossissage();

           srcseqw += 1;
           srcdtaw = espacesw + sys_column_name + ', -- ' + textew +
                   %editc(length:'J') + ' ' + numeric_scale2W;
              exec sql                                               -- Ecriture
              insert into srcg(srcseq, srcdta) values(:srcseqw, :srcdtaw);
              vrfsql();

           enddo;

           imaxw = iw;               // Nbre de zones


           srcseqw += 1;
           if iw > 0;
           srcdtaw = espacesw + 'from ' + fichierw + ' where ... ' +
                     %editc(iw:'J') + ' zones   ' +  %char(%timestamp());
           else;
           srcdtaw = espacesw + 'Fichier ' + bibfichw + ' NON trouvé !';
           endif;
              exec sql                                         -- Dernière ligne
              insert into srcg(srcseq, srcdta) values(:srcseqw, :srcdtaw);
              vrfsql();

           if iw > 0;
           messw = 'Fichier ' + bibfichw + ' traité.   ' + %editc(imaxw:'J') +
                   ' zones.   ' + %char(%timestamp());
           else;
           *in53 = *on;            // Fichier NON trouvé !
           iter;
           endif;


          // P h a s e   2 ,   g é n é r a t i o n   d e   F e t c h  :

           srcseqw += 1;
           srcdtaw = '2 * * * * * * * * * * * * *';
              exec sql                                              -- Ecriture
              insert into srcg(srcseq, srcdta) values(:srcseqw, :srcdtaw);
              vrfsql();

           srcseqw += 1;
           srcdtaw = espacesw + 'fetch next from curseur into';
              exec sql                                        -- Première ligne
              insert into srcg(srcseq, srcdta) values(:srcseqw, :srcdtaw);
              vrfsql();

           fetchsql('FIRST');

           virgw = ',';
           iw = 0;
           dou bouclew;          // Boucle de lecture

           if sqlstate = '02000';
           leave;
           endif;

           iplus(';');

           degrossissage();

           srcseqw += 1;
           srcdtaw = espacesw + ':' +
                   %replace(%trim(prefixw):sys_column_name:1:carasuppw) +
                   virgw + ' -- ' + textew +
                   %editc(length:'J') + ' ' + numeric_scale2W;
              exec sql                                                -- Ecriture
              insert into srcg(srcseq, srcdta) values(:srcseqw, :srcdtaw);
              vrfsql();

           fetchsql('NEXT');

           enddo;

 

          // P h a s e   3 ,   g é n é r a t i o n   d e   I n s e r t   :

           srcseqw += 1;
           srcdtaw = '3 * * * * * * * * * * * * *';
              exec sql                                                -- Ecriture
              insert into srcg(srcseq, srcdta) values(:srcseqw, :srcdtaw);
              vrfsql();

           srcseqw += 1;
           srcdtaw = espacesw + 'insert into ' + fichierw + ' (';
              exec sql                                          -- Première ligne
              insert into srcg(srcseq, srcdta) values(:srcseqw, :srcdtaw);
              vrfsql();

           fetchsql('FIRST');

 

           virgw = ',';
           iw = 0;
           dou bouclew;          // Boucle de lecture

           if sqlstate = '02000';
           leave;
           endif;

           iplus(' ');

           degrossissage();

           srcseqw += 1;
           srcdtaw = espacesw + sys_column_name + virgw + ' -- ' + textew +
                   %editc(length:'J') + ' ' + numeric_scale2W;
              exec sql                                              -- Ecriture
              insert into srcg(srcseq, srcdta) values(:srcseqw, :srcdtaw);
              vrfsql();

           fetchsql('NEXT');

           enddo;

 

           srcseqw += 1;
           srcdtaw = espacesw + ') values (';
              exec sql                                              -- Transition
              insert into srcg(srcseq, srcdta) values(:srcseqw, :srcdtaw);
              vrfsql();


           fetchsql('FIRST');   // Insert, 2°partie

 

           virgw = ',';
           iw = 0;
           dou bouclew;          // Boucle de lecture

           if sqlstate = '02000';
           leave;
           endif;

           iplus(');');

           degrossissage();

           srcseqw += 1;
           srcdtaw = espacesw + ':' +
                   %replace(%trim(prefixw):sys_column_name:1:carasuppw) +
                   virgw + ' -- ' + textew +
                   %editc(length:'J') + ' ' + numeric_scale2W;
              exec sql                                                -- Ecriture
              insert into srcg(srcseq, srcdta) values(:srcseqw, :srcdtaw);
              vrfsql();

           fetchsql('NEXT');

           enddo;

 


          // P h a s e   4 ,   g é n é r a t i o n   d e   U p d a t e   :

           srcseqw += 1;
           srcdtaw = '4 * * * * * * * * * * * * *';
              exec sql                                                -- Ecriture
              insert into srcg(srcseq, srcdta) values(:srcseqw, :srcdtaw);
              vrfsql();

           srcseqw += 1;
           srcdtaw = espacesw + 'update ' + fichierw + ' set';
              exec sql                                        -- Première ligne
              insert into srcg(srcseq, srcdta) values(:srcseqw, :srcdtaw);
              vrfsql();

           fetchsql('FIRST');

           virgw = ',';
           iw = 0;
           dou bouclew;          // Boucle de lecture

           if sqlstate = '02000';
           leave;
           endif;

           iplus(' ');

           degrossissage();

           srcseqw += 1;
           srcdtaw = espacesw + sys_column_name + ' = ' +
            ':' +  %replace(%trim(prefixw):sys_column_name:1:carasuppw) +
                   virgw + ' -- ' + %subst(textew:1:45) +
                   %editc(length:'J') + ' ' + numeric_scale2W;
              exec sql                                              -- Ecriture
              insert into srcg(srcseq, srcdta) values(:srcseqw, :srcdtaw);
              vrfsql();

           fetchsql('NEXT');

           enddo;


           srcseqw += 1;
           srcdtaw = espacesw + 'where ???';
              exec sql                                        -- Dernière ligne
              insert into srcg(srcseq, srcdta) values(:srcseqw, :srcdtaw);
              vrfsql();

 


          // P h a s e   5 ,   g é n é r a t i o n   d e   S p é c i f   D   :

           srcseqw += 1;
           srcdtaw = '5 * * * * * * * * * * * * *';
              exec sql                                                -- Pam
              insert into srcg(srcseq, srcdta) values(:srcseqw, :srcdtaw);
              vrfsql();

           srcseqw += 1;
           dnomw = %trim(fichierw) + 'DS';
           ddeclaw = 'ds';
           srcdtaw = espace5w + specifdds;
              exec sql                                       -- Première ligne
              insert into srcg(srcseq, srcdta) values(:srcseqw, :srcdtaw);
              vrfsql();

           fetchsql('FIRST');

           ddeclaw = '';
           iw = 0;
           dou bouclew;          // Boucle de lecture

           if sqlstate = '02000';
           leave;
           endif;

           iplus(' ');

           degrossissage();

           dnomw = %replace(%trim(prefixw):sys_column_name:1:carasuppw);
           if numeric_scale2w = 'D' or numeric_scale2W = 'Z';      // Type D ou Z
           dtypew = numeric_scale2w;
           dlongw = *blanks;
           ddecw  = *blanks;
           else;                                                   // Usual type
           dtypew = *blanks;
           evalr dlongw = %editc(length:'3');
           evalr ddecw  = %editc(numeric_scale:'3');
           endif;
           dcommentw = textew;
           srcseqw += 1;
           srcdtaw = espace5w + specifdds;
              exec sql                                              -- Ecriture
              insert into srcg(srcseq, srcdta) values(:srcseqw, :srcdtaw);
              vrfsql();

           fetchsql('NEXT');

           enddo;

 


           enddo;

 

           on-error;
           exfmt ecranom;         // Anomalie grave
           exsr srfin;
       endmon;

         // S o u s - p r o g r a m m e ( s ) * * * * * * * * * * * * * * * * * *


           begsr srfin;        // Fin de programme
           closecurseur();
           *inlr = *on;
           return;
           endsr;


      /end-free

         // S o u s - p r o c é d u r e ( s )  *****************************************************

     Pvrfsql           b
     D                 pi
     C                   select
     C                   when      sqlstate = '00000'
     C                   when      sqlstate = '02000'
     C                   when      sqlstate = '01504'
     C                   other
      * Anomalie grave : remontée dans le "main"...
     C                   eval      zerow = 1/zerow
     C                   endsl

     C                   return
     P                 e

 

     Pfetchsql         b
     D                 pi
     D NextFirstw                     9    value
      /free
           select;
           when      nextfirstw = 'NEXT';
              exec sql                                                -- Le suivant
              fetch next  from curseur into
              :sys_column_name, :data_type,
              :length, :numeric_scale, :is_nullable,
              :column_heading, :column_text;
           when      nextfirstw = 'FIRST';
              exec sql                                                -- Le premier
              fetch first from curseur into
              :sys_column_name, :data_type,
              :length, :numeric_scale, :is_nullable,
              :column_heading, :column_text;
           endsl;
              vrfsql();
              return;
      /end-free
     P                 e

 

     Piplus            b
     D                 pi
     Dquoiw                          10    value varying
      /free
           iw += 1;
           if iw = imaxw;
           virgw = quoiw;
           endif;

           return;
      /end-free
     P                 e

 

     Pdegrossissage    b
     D                 pi
      /free
           exec sql

           values lower(:sys_column_name)

           into :sys_column_name;   -- En minuscule
           vrfsql();

           if numeric_scale = -1;
           numeric_scale2w = *blanks;
           else;
           numeric_scale2w = %editc(numeric_scale:'3');
           endif;

           select;
           when data_type = 'DATE';
           numeric_scale2w = 'D';
           when data_type = 'TIMESTMP';
           numeric_scale2w = 'Z';
           endsl;

           if column_text = '';                // Heading ou Text
           textew = column_heading;
           else;
           textew = column_text;
           endif;

           return;
      /end-free
     P                 e

 

     Pclosecurseur     b
     D                 pi
      /free
           if openw;          // Si nécessaire
              exec sql
              close curseur;
              vrfsql();
           openw = *off;
           endif;

           return;
      /end-free
     P                 e

 

Publicité
Partager cet article
Repost0
Pour être informé des derniers articles, inscrivez vous :
Commenter cet article