CL avec variables dans un SQL
Citation de Marc BOLARD le 7 juillet 2020, 2 h 59 minBonjour,
Je patauche lamentablement depuis plus jours sur l'insertion de données variables dans une requete SQL lancé depuis un CL.Voici mon code:
PGM PARM(&user)
DCL VAR(&user) TYPE(*CHAR) LEN(20)
DCL &SQLSTMT TYPE(*CHAR) LEN(500)CHGVAR VAR(&SQLSTMT) VALUE('INSERT INTO +
MYLIB/LOGS (DATIM, UTIL) +
VALUES(CURRENT TIMESTAMP, +
'' || &user || '')')RUNSQL SQL(&SQLSTMT) COMMIT(*NONE)
Le problème c'est qu'il ne prend pas en compte le contenu de ma variable &user, dans le fichier, je me retrouve avec "|| &user || " comme valeur de la colonne UTIL.
J'ai essayé plein de syntaxes glanées parci parla sur le net, mais aucune ne fonctionne.
Merci pour votre aide
Marc
Bonjour,
Je patauche lamentablement depuis plus jours sur l'insertion de données variables dans une requete SQL lancé depuis un CL.
Voici mon code:
PGM PARM(&user)
DCL VAR(&user) TYPE(*CHAR) LEN(20)
DCL &SQLSTMT TYPE(*CHAR) LEN(500)
CHGVAR VAR(&SQLSTMT) VALUE('INSERT INTO +
MYLIB/LOGS (DATIM, UTIL) +
VALUES(CURRENT TIMESTAMP, +
'' || &user || '')')
RUNSQL SQL(&SQLSTMT) COMMIT(*NONE)
Le problème c'est qu'il ne prend pas en compte le contenu de ma variable &user, dans le fichier, je me retrouve avec "|| &user || " comme valeur de la colonne UTIL.
J'ai essayé plein de syntaxes glanées parci parla sur le net, mais aucune ne fonctionne.
Merci pour votre aide
Marc
Citation de monthi le 7 juillet 2020, 8 h 26 minbonjour
comme cela :
PGM PARM(&USER)
DCL VAR(&USER) TYPE(*CHAR) LEN(20)
DCL VAR(&SQLSTMT) TYPE(*CHAR) LEN(500)CHGVAR VAR(&SQLSTMT) VALUE('INSERT INTO MYLIB/LOGS +
(DATIM, UTIL) VALUES(CURRENT TIMESTAMP, +
''' *CAT &USER *TCAT ''')')RUNSQL SQL(&SQLSTMT) COMMIT(*NONE)
Rappel sur le doublement de ' en cl et rpg :
pour avoir une ' il faut la doubler
pour avoir insérer une ' dans une constante, il en faut 4:
VALUE('INSERT INTO MYLIB/LOGS (DATIM, UTIL) VALUES(CURRENT TIMESTAMP, ''' *CAT &USER *TCAT ''')')
______1_____________________________________________________________234
1 ouverture de la constante
2 et 3 caractères '
4 fermeture de la constante.
Il y a un truc assez simple lorsque l'on utilise des variables dans une commande CL.
Elles doivent se trouver en majuscule après la validation du F4 sur la commande, sinon cela est vue comme une constante
Cdlt
bonjour
comme cela :
PGM PARM(&USER)
DCL VAR(&USER) TYPE(*CHAR) LEN(20)
DCL VAR(&SQLSTMT) TYPE(*CHAR) LEN(500)
CHGVAR VAR(&SQLSTMT) VALUE('INSERT INTO MYLIB/LOGS +
(DATIM, UTIL) VALUES(CURRENT TIMESTAMP, +
''' *CAT &USER *TCAT ''')')
RUNSQL SQL(&SQLSTMT) COMMIT(*NONE)
Rappel sur le doublement de ' en cl et rpg :
pour avoir une ' il faut la doubler
pour avoir insérer une ' dans une constante, il en faut 4:
VALUE('INSERT INTO MYLIB/LOGS (DATIM, UTIL) VALUES(CURRENT TIMESTAMP, ''' *CAT &USER *TCAT ''')')
______1_____________________________________________________________234
1 ouverture de la constante
2 et 3 caractères '
4 fermeture de la constante.
Il y a un truc assez simple lorsque l'on utilise des variables dans une commande CL.
Elles doivent se trouver en majuscule après la validation du F4 sur la commande, sinon cela est vue comme une constante
Cdlt
Citation de Marc BOLARD le 7 juillet 2020, 20 h 40 minAlors la, un grand merci pour tes explications limpides et le plus beau, c'est que ca marche ;-)))
Un grand merci, mais purée que c'est pas simple de travailler en CL, la syntaxe est vraiment spéciale et très strict.
Nous travaillons en émulation 5250 avec PCSWS V6, est ce que tu sais s'il existe des émulateurs, éditeurs, outils qui faciliteraient notre travail.
Encore merci
Marco
Alors la, un grand merci pour tes explications limpides et le plus beau, c'est que ca marche ;-)))
Un grand merci, mais purée que c'est pas simple de travailler en CL, la syntaxe est vraiment spéciale et très strict.
Nous travaillons en émulation 5250 avec PCSWS V6, est ce que tu sais s'il existe des émulateurs, éditeurs, outils qui faciliteraient notre travail.
Encore merci
Marco
Citation de monthi le 8 juillet 2020, 8 h 57 minBonjour
malheureusement pour la gestion des caractères d'échappement, il n'y a pas d'éditeurs qui peut te simplifier la vie. (même en dehors de l'IBMi) .
Ce problème de doublements de ' se trouve aussi bien en cl qu'en RPG (pas de souvenir en cobol).
pour les développement j'utilise RDI . (je fais surtout du RPGILE, très peu de CLLE).
Pour l'émulation j'utilse ACS car les ancien versions de Client Access pour window ne sont plus supporté).
Cdlt
Bonjour
malheureusement pour la gestion des caractères d'échappement, il n'y a pas d'éditeurs qui peut te simplifier la vie. (même en dehors de l'IBMi) .
Ce problème de doublements de ' se trouve aussi bien en cl qu'en RPG (pas de souvenir en cobol).
pour les développement j'utilise RDI . (je fais surtout du RPGILE, très peu de CLLE).
Pour l'émulation j'utilse ACS car les ancien versions de Client Access pour window ne sont plus supporté).
Cdlt
Citation de Marc BOLARD le 8 juillet 2020, 21 h 38 minMerci pour ta réponse, je vais regarder les outils que tu utilises.
Je suis novice sur AS400 et je cherche des outils qui pourraient me simplifier la vie et me faire gagner du temps.Bonne journée
Marc
Merci pour ta réponse, je vais regarder les outils que tu utilises.
Je suis novice sur AS400 et je cherche des outils qui pourraient me simplifier la vie et me faire gagner du temps.
Bonne journée
Marc
Citation de johncafe le 5 octobre 2021, 17 h 05 minBonjour,
je suis désolé de déterrer ce post mais j'ai une question concernant les variables CL.et les ordres RUNSQL
Je cherche à lancer un RUNSQL dans un CL mais avec une variable en *DEC mais je rencontre des problèmes de syntaxe.
DCL VAR(&ANN) TYPE(*DEC) LEN(4 0)
RUNSQL +
SQL('insert into mabib.cafou (CFSTE, CFTIE, CFCAAA, CFCAHT) +
( SELECT DCASTE, DCATIE, +
dcaaa, sum(DCffht - DCFaHT) FROM +
mabib2.fdca WHERE DCAC40 = +
40 and DCADEV = ''EUR'' and DCAAA = +
&ANN GROUP BY +
dcaste, DCATIE , +
dcaaa )') COMMIT(*NONE) +
NAMING(*SQL)Mais bien entendu le &ANN pose soucis.
Une idée d'un expert ?
En vous remerciant.
Jérôme
Bonjour,
je suis désolé de déterrer ce post mais j'ai une question concernant les variables CL.et les ordres RUNSQL
Je cherche à lancer un RUNSQL dans un CL mais avec une variable en *DEC mais je rencontre des problèmes de syntaxe.
DCL VAR(&ANN) TYPE(*DEC) LEN(4 0)
RUNSQL +
SQL('insert into mabib.cafou (CFSTE, CFTIE, CFCAAA, CFCAHT) +
( SELECT DCASTE, DCATIE, +
dcaaa, sum(DCffht - DCFaHT) FROM +
mabib2.fdca WHERE DCAC40 = +
40 and DCADEV = ''EUR'' and DCAAA = +
&ANN GROUP BY +
dcaste, DCATIE , +
dcaaa )') COMMIT(*NONE) +
NAMING(*SQL)
Mais bien entendu le &ANN pose soucis.
Une idée d'un expert ?
En vous remerciant.
Jérôme
Citation de remit le 6 octobre 2021, 12 h 33 minLes données variables d'une requête à exécuter par RUNSQL doivent toujours être *CHAR pour pouvoir les concaténer au reste de la requête.
Par exemple ici, déclarer une variable *CHAR de longueur 4 et y mettre la valeur de &ANN avant de l'utiliser dans la requête :
DCL VAR(&ANN_C) TYPE(*CHAR) LEN(4)
....
CHGVAR VAR(&ANN_C) VALUE (&ANN)
Les données variables d'une requête à exécuter par RUNSQL doivent toujours être *CHAR pour pouvoir les concaténer au reste de la requête.
Par exemple ici, déclarer une variable *CHAR de longueur 4 et y mettre la valeur de &ANN avant de l'utiliser dans la requête :
DCL VAR(&ANN_C) TYPE(*CHAR) LEN(4)
....
CHGVAR VAR(&ANN_C) VALUE (&ANN)
Citation de remit le 7 octobre 2021, 10 h 54 minIl manque aussi l'opérateur de concaténation *CAT dans la requête. Les lignes 5 et 6 deviennent donc :
40 and DCADEV = ''EUR'' and DCAAA = ' +
*CAT & ANN_C *CAT ' GROUP BY +
Il manque aussi l'opérateur de concaténation *CAT dans la requête. Les lignes 5 et 6 deviennent donc :
40 and DCADEV = ''EUR'' and DCAAA = ' +
*CAT & ANN_C *CAT ' GROUP BY +
Citation de monthi le 7 octobre 2021, 16 h 17 minBonjour
depuis la V7R2 on peut utiliser la bif %char
RUNSQL SQL('insert into mabib.cafou (CFSTE, CFTIE, +
CFCAAA, CFCAHT) ( SELECT DCASTE, DCATIE, +
dcaaa, sum(DCffht - DCFaHT) FROM +
mabib2.fdca WHERE DCAC40 = 40 and DCADEV +
= ''EUR'' and DCAAA =' *CAT %CHAR(&ANN) +
*CAT ' GROUP BY dcaste, DCATIE , dcaaa +
)') COMMIT(*NONE) NAMING(*SQL)
Bonjour
depuis la V7R2 on peut utiliser la bif %char
RUNSQL SQL('insert into mabib.cafou (CFSTE, CFTIE, +
CFCAAA, CFCAHT) ( SELECT DCASTE, DCATIE, +
dcaaa, sum(DCffht - DCFaHT) FROM +
mabib2.fdca WHERE DCAC40 = 40 and DCADEV +
= ''EUR'' and DCAAA =' *CAT %CHAR(&ANN) +
*CAT ' GROUP BY dcaste, DCATIE , dcaaa +
)') COMMIT(*NONE) NAMING(*SQL)
Citation de johncafe le 13 octobre 2021, 7 h 55 minBonjour,
Merci à tous pour votre aide.
@monthi , votre solution fonctionne parfaitement et va me permettre d'enfin avancer sur mes programmes. J'envisage de suivre une formation de mise à niveau sur SQL dans des programmes CL et RPG, je suis resté figé dans les années 2000. Si vous connaissez des formations sur le sujet n'hésitez pas à me contacter.
@remit merci d'avoir pris de votre temps pour me répondre.
Cdlt
Jérôme
Bonjour,
Merci à tous pour votre aide.
@monthi , votre solution fonctionne parfaitement et va me permettre d'enfin avancer sur mes programmes. J'envisage de suivre une formation de mise à niveau sur SQL dans des programmes CL et RPG, je suis resté figé dans les années 2000. Si vous connaissez des formations sur le sujet n'hésitez pas à me contacter.
@remit merci d'avoir pris de votre temps pour me répondre.
Cdlt
Jérôme