Volubis, le forum IBM i Index du Forum Volubis, le forum IBM i
avec les clubs Informatiques IPL et Bretagne.
 
 FAQFAQ   RechercherRechercher   Liste des MembresListe des Membres   Groupes d'utilisateursGroupes d'utilisateurs   S'enregistrerS'enregistrer 
 ProfilProfil   Se connecter pour vérifier ses messages privésSe connecter pour vérifier ses messages privés   ConnexionConnexion 

SQL descriptor

 
Poster un nouveau sujet   Répondre au sujet    Volubis, le forum IBM i Index du Forum -> langages
Voir le sujet précédent :: Voir le sujet suivant  
Auteur Message
Igrecaimo



Inscrit le: 04 Mai 2017
Messages: 3

MessagePosté le: Mar 14 Nov 2017, 15:56:46    Sujet du message: Répondre en citant

Bonjour,

Je connais peu les descripteurs SQL et j'aurais besoin de savoir si mon code est correct. Je n'ai pas trouvé d'exemple sur le web pour mon cas.

Le principe du programme est simple : Les éléments d'une requête SELECT (nom de la table, noms du champ à afficher et de ceux à retourner, critères de sélection et de tri) sont reçus en paramètres. Le programme construit une requête et l'exécute. Un zone en saisie sur l'écran permet de restreindre l'affichage (par exemple, afficher tous le noms commençant par "R").

Le programme fonctionne jusqu'au moment où il ne trouve aucune info pour la seconde fois consécutive : Erreur SQL0901 (erreur système) sur une instruction SET DESCRIPTOR. A partir de là, plus rien de va.

Il me manque certainement quelque chose mais je ne vois pas quoi. Je pense pourtant avoir collé au manuel SQL d'IBM.

Si quelqu'un peut m'aider, merci.
Voici mon code (des chevrons sont sur la ligne en erreur) :

Code:
     *
      *-------------------------------------------------------------------------------------------*
      *
     D SQL_NUM         c                   const( 6 )
     D EMBARQUE        c                   const( 'E' )
     D PORTABLE        c                   const( 'P' )
      *
     D MTREC02O        PR                  extpgm( 'MTREC02O' )
     D pi$Table                      32
     D pi$Filtre                    128
     D pi$Tri                       128
     D pi$Display                    32
     D pi$Typecr                      1
     D pi$data1                      32
     D pi$data2                      32
     D pi$data3                      32
     D pi$data4                      32
     D pi$data5                      32
     D po$Retour1                   128
     D po$Retour2                   128
     D po$Retour3                   128
     D po$Retour4                   128
     D po$Retour5                   128
     D po$cdret                       1
      *
     D MTREC02O        PI
     D pi$Table                      32
     D pi$Filtre                    128
     D pi$Tri                       128
     D pi$Display                    32
     D pi$Typecr                      1
     D pi$data1                      32
     D pi$data2                      32
     D pi$data3                      32
     D pi$data4                      32
     D pi$data5                      32
     D po$Retour1                   128
     D po$Retour2                   128
     D po$Retour3                   128
     D po$Retour4                   128
     D po$Retour5                   128
     D po$cdret                       1
      *
      *
     D X1AFFICHER      s             20
     D X2AFFICHER      s             44
     D wwAfficher      s                   like( X2AFFICHER )
     D wwCount         s              5i 0
     D wwData          s                   like( X2AFFICHER )
     D wwI             s              3i 0
     D wwStmt          s           5000    varying
      *
      /free
        exec sql include SQLDA;
        exec sql set option datfmt=*ISO, commit=*NONE;

        exsr InitSQLStmt;
        exsr ReadResult;

        X2Afficher = 'R';
        exsr ReadResult;

        X2Afficher = ' ';
        exsr ReadResult;

        X2Afficher = 'x';
        exsr ReadResult;

        X2Afficher = 'A';
        exsr ReadResult;

        *inlr = *ON;

        //---------------------------------------------------------------------//
        begsr InitSQLStmt;
           clear wwStmt;
           wwStmt = 'SELECT ' + %trim( pi$Display );
           if pi$Data1 <> *BLANKS;
             wwStmt = %trim( wwStmt ) + ',' + %trim( pi$Data1 );
           endif;
           if pi$Data2 <> *BLANKS;
             wwStmt = %trim( wwStmt ) + ',' + %trim( pi$Data2 );
           endif;
           if pi$Data3 <> *BLANKS;
             wwStmt = %trim( wwStmt ) + ',' + %trim( pi$Data3 );
           endif;
           if pi$Data4 <> *BLANKS;
             wwStmt = %trim( wwStmt ) + ',' + %trim( pi$Data4 );
           endif;
           if pi$Data5 <> *BLANKS;
             wwStmt = %trim( wwStmt ) + ',' + %trim( pi$Data5 );
           endif;
           wwStmt = %trim( wwStmt ) + ' FROM ' + %trim( pi$Table );
           select;
           when pi$TypEcr = PORTABLE;
             wwAfficher = X1AFFICHER;
           when pi$TypEcr = EMBARQUE;
             wwAfficher = X2AFFICHER;
           endsl;
           if pi$Filtre <> *BLANKS;
             wwStmt = %trim( wwStmt ) + ' WHERE ' + %trim( pi$Filtre );
             if wwAfficher <> *BLANKS;
               wwStmt = %trim( wwStmt ) + ' AND ' + %trim( pi$Display )
                      + ' LIKE ' + '''' + %trim( wwAfficher ) + '%'
                      + '''';
             endif;
           else;
             if wwAfficher <> *BLANKS;
               wwStmt = %trim( wwStmt ) + ' WHERE ' + %trim( pi$Display )
                      + ' LIKE ' + '''' + %trim( wwAfficher ) + '%'
                      + '''';
             endif;
           endif;
           if pi$Tri = *BLANKS;
             wwStmt = %trim( wwStmt ) + ' ORDER BY ' + %trim( pi$Display );
           else;
             wwStmt = %trim( wwStmt ) + ' ORDER BY '
                    + %trim( pi$Tri )
                    + ', ' + pi$Display;
           endif;
           exec sql prepare selectStmt from :wwStmt;
           exec sql declare RECHERCHE cursor for selectStmt;
           exec sql open RECHERCHE;
           exec sql allocate descriptor 'DESCRIPT' with max 6;
           exec sql describe selectStmt using descriptor 'DESCRIPT';
           for wwI = 1 to 6;
             select;
             when wwI = 1;
               if pi$TypEcr = PORTABLE;
               exec sql set descriptor 'DESCRIPT' value :wwI
                                                  type = 1,
                                                  length = 20;
               else;
               exec sql set descriptor 'DESCRIPT' value :wwI
                                                  type = 1,
                                                  length = 44;
               endif;
             other;
               exec sql set descriptor 'DESCRIPT' value :wwI
                                                  type = 1,
                                                  length = 128; <<<<<<<<<<<<<<<
             endsl;
           endfor;

        endsr;
        //---------------------------------------------------------------------//
        begsr ReadResult;
           if wwAfficher <> X2Afficher;
            wwAfficher = X2Afficher;
            exec sql close RECHERCHE;
            exec sql deallocate descriptor 'DESCRIPT';
            exsr InitSQLStmt;
           endif;

           exec sql fetch RECHERCHE into sql descriptor 'DESCRIPT';
           dow sqlCode = 0;

             exec sql get descriptor 'DESCRIPT' :wwCount = COUNT;
             if sqlCode = 0;
               for wwI = 1 to wwCount;
                 if wwI = 1;
                   exec sql get descriptor 'DESCRIPT' value :wwi :WWDATA = DATA;
                   dsply wwData '*EXT';
                 endif;
               endfor;
             endif;
             exec sql fetch RECHERCHE into sql descriptor 'DESCRIPT';
           enddo;
        endsr;
        //---------------------------------------------------------------------//
      /end-free
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
cmasse
Site Admin


Inscrit le: 14 Fév 2007
Messages: 716
Localisation: Nantes

MessagePosté le: Mar 14 Nov 2017, 16:20:43    Sujet du message: SQL dynamique Répondre en citant

Perso je préfère SQL dynamique

PREPARE puis OPEN CURSOR

j'ai trouvé ça https://www.itjungle.com/2015/09/15/fhg091515-story01/ qui compare les différentes méthodes...
_________________
Christian Massé (Volubis.fr)
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web de l'utilisateur
Igrecaimo



Inscrit le: 04 Mai 2017
Messages: 3

MessagePosté le: Mar 14 Nov 2017, 18:08:15    Sujet du message: Répondre en citant

Merci pour cette réponse rapide. Intéressante cette page. Je n'ai pas trop le choix dans la méthode car je ne connais ni le nom de la table ni les colonnes que je dois fournir : Descripteur obligatoire.
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
Igrecaimo



Inscrit le: 04 Mai 2017
Messages: 3

MessagePosté le: Mar 14 Nov 2017, 18:11:07    Sujet du message: Répondre en citant

Y a-t-il une astuce qui permette d'en savoir plus sur une erreur système SQL ? Il y a bien un dump quand ça se produit mais ce n'est pas vraiment exploitable.
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
cmasse
Site Admin


Inscrit le: 14 Fév 2007
Messages: 716
Localisation: Nantes

MessagePosté le: Mar 14 Nov 2017, 18:20:58    Sujet du message: DSPJOBLOG Répondre en citant

Normalement les infos SQL sont dans la JOBLOG.
_________________
Christian Massé (Volubis.fr)
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web de l'utilisateur
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    Volubis, le forum IBM i Index du Forum -> langages Toutes les heures sont au format GMT + 1 Heure
Page 1 sur 1

 
Sauter vers:  
Vous ne pouvez pas poster de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas voter dans les sondages de ce forum


Powered by phpBB © 2001, 2005 phpBB Group
Traduction par : phpBB-fr.com

Anti Bot Question MOD - phpBB MOD against Spam Bots