Bonjour,
Je reprends le développement après un arrêt de quelques années. (près de 15 ans )
Je passe du RPGIII / RPGIV au Free RPG avec SQL
Globalement çà va.
Mais là, je tombe sur un beau sujet.
Et pas facile à expliquer...
J'ai une requête SQL à construire dans le programme mais à partir de valeurs récupérées dans un fichier.
Et je bloque lorsqu'il s'agit d'une variable appartenant au programme.
ex : J'ai 3 valeurs récupérées dans le fichier, que je dois concaténer pour faire ma requête SQL.
Valeur 1 : 'TST'
Valeur 2 : ' ' (espace)
Valeur 3 : SUBSTR(: DTAMVT, 3, 6)
DTAMVT est une variable déclarée dans le programme. (le ':' me sert à récupérer avec %scan la position du nom de la variable).
On aura à la fin quelque chose comme ceci :
Select 'TST' concat ' ' concat substr(DTAMVT, 3, 6) from sysibm/sysdummy1
par exemple on a en valeur: DTAMVT = '20220330_TEST'
Le résultat final devrait donner : 'TST 220330'
Car en réalité la requête est (après interprétation) : Select 'TST' concat ' ' concat substr('20220330_TEST', 3, 6) from sysibm/sysdummy1
Pour récupérer les valeurs 1 et 2, ok, ce sont des constantes.
Cela se corse sur la récupération du contenu de la valeur de la donnée DTAMVT.
Le programme ne récupère pas la valeur de DTAMVT mais considère DTAMVT en tant que chaine de caractère.
Déroulement en gros du programme (je laisse de côté les val1 et val2 pour alléger):
Dans le code :
Variables déclarées:
DTAMVT
wDATA
wVALDATA
wREQUETE
Init variable :
wDTAMVT = '20220330_TEST';
J'ai alors une 1ère requête qui récupère les constantes et variables à utiliser.
Select val3 into :wDATA from fichier_param
=> Ici, je détermine qu'il faut utiliser "DTAMVT" en variable.
Je souhaite ensuite faire une requête pour récupérer la valeur de DTAMVT à partir de wDATA
Je prépare donc une requête :
wREQUETE = 'Select ' + wDATA + 'From sysibm/sysdummy1';
=> wREQUETE contient alors : "Select DTAMVT From sysibm/sysdummy1"
Et les instructions suivantes :
Exec SQL Declare cCLD1 cursor for cSQL1;
Exec SQL Prepare cSQL1 from :wREQUETE;
Exec SQL Open cCLD1 using :wDATA;
Exec SQL fetch cCLD1 Into :wVALDATA;
Mais j'ai une erreur m'indiquant que DTAMVT n'est pas déclarée. : Colonne ou variable globale DTAMVT est introuvable.
Je comprends l'erreur => DTAMVT devrait plutôt être déclarée comme pour la 1ère requête :
wREQUETE = 'Select ' + DTAMVT + ' From sysibm/sysdummy1'; ,
mais je ne vois pas comment faire puisque le programme ramène DTAMVT en tant que chaine de caractère ('DTAMVT') et non de variable.
Si vous aviez une astuce...
Ou alors je me plante quelque part.
Merci
Partager