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 : Tout sélectionner
*
*-------------------------------------------------------------------------------------------*
*
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