Fil d’Ariane du forum – Vous êtes ici :ForumForums techniques: AS/400CL avec variables dans un SQL
Vous devez vous identifier pour créer des messages et des sujets.

CL avec variables dans un SQL

12

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

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

 

 

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

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

 

 

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

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

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)

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 +

 

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)

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

 

 

12