Vous n'êtes pas identifié(e).
Pages : 1
Bonjour,
Dans un cl j'ai besoin de passer plusieurs variables une qui sera passer au lancement et une autre charger par mon code
exemple
PGM PARM(&NUM)
DCL VAR(&NUM) TYPE(*DEC) LEN(2)
DCL VAR(&VARTOT) TYPE(*CHAR) LEN(10)
DCL VAR(&VARDAT) TYPE(*CHAR) LEN(6)
[...]
RTVSYSVAL SYSVAL(QDATE) RTNVAR(&DATE)
CVTDAT DATE(&DATE) TOVAR(&VARDAT) FROMFMT(*SYSVAL) +
TOFMT(*YMD) TOSEP(*NONE)
CHGVAR VAR(&VARTOT) VALUE('SR' *CAT &NUM *CAT &VARDAT)
[...]
ENDPGM
Je but sur la concaténation des variables &NUM et &VARDAT
Pour lancer mon cl je dois bien faire CALL MABIB/PGM PARM(12)
Dernière modification par aawoopy56 (2009-12-09 11:14:43)
Hors ligne
Bonjour fred
Ben ça marche pas mieux
Hors ligne
salut,
le passage de paramètres numériques est toujours un peu délicat.
Si tu veux passer une valeur numérique, tu devras déclarer &NUM *dec (2 0)
mais... il y a un mais...
si tu appelles le programme en interactif sur la ligne de commande... CALL Monpgm parm(12) çà sera probablement caca-boudin..
çà marchera mieux avec parm(X'012F')
par contre un appel dans un autre CL call Monpgm parm(&var) avec &var *dec (2 0) sera OK
tu pourrais garder &num *char 2 et appeler call .. parm('12')
en plus çà et permettrait de pouvoir utiliser &NUM directement avec *cat ce que tu ne peux pas faire avec une variable *DEC
ff
Hors ligne
Heu fred la commande suivante est elle bonne pour le lancement de mon code avec le param car lorsque je regarde le dump je vois la variable vartot avec la valeur <<&VARTOT *CHAR 10 'SR 091204' >> c bizarre
Ma commande:
CALL MABIB/MONPGM PARM(12)
Hors ligne
salut,
le passage de paramètres numériques est toujours un peu délicat.
Si tu veux passer une valeur numérique, tu devras déclarer &NUM *dec (2 0)
mais... il y a un mais...
si tu appelles le programme en interactif sur la ligne de commande... CALL Monpgm parm(12) çà sera probablement caca-boudin..
çà marchera mieux avec parm(X'012F')
Excepté si c'est un dec de 15,5 tu peux l'appeler directement sur une ligne de commande.
CALL MONPGM parm(1)
D'ailleurs on recommande toujours de déclarer les champs numériques paramètres en 15,5 pour pouvoir les passer directement en ligne de commande.
Dernière modification par k2r400 (2009-12-04 19:44:23)
Patrick
Hors ligne
Slt K2r400
Dac alors si je met dans mon pgm <<DCL VAR(&NUM) TYPE(*DEC) LEN(15 5) ça devrait fonctionner c'est quand même curieux comme fonctionnement d'être obligé de forcer la longueur de ma variable mais bon je vais tester lundi matin je vous tiens au courant
Hors ligne
Slt K2R400
Bon j'ai essayé ta solution, le résultat c'est que lors de la compile il y a plantage ci-joint le message aurais tu une solution
8900- CHGVAR VAR(&VARTOT) VALUE('SR' *CAT &NUM *CAT &VARDAT)
* CPD0712 30 Operand does not have valid type for operator.
* CPD0711 30 Operands in expression not same type.
Mon CL:
PGM
[...]
DCL VAR(&NUM) TYPE(*DEC) LEN(15 5)
DCL VAR(&VARDAT) TYPE(*CHAR) LEN(6)
DCL VAR(&VARTOT) TYPE(*CHAR) LEN(10)
[...]
CHGVAR VAR(&VARTOT) VALUE('SR' *CAT &NUM *CAT &VARDAT)
[...]
ENDPGM
Dernière modification par aawoopy56 (2009-12-07 10:16:24)
Hors ligne
Bon la question va peut être vous surprendre mais bon je la pose quand même est-il possible de forcer une convertion d'une variable de type *DEC en *CHAR
Je sais qu'on peut le faire avec la date mais pour mon cas je ne sais pas si c'est possible
Hors ligne
On ne peut pas concaténer des numérique, fred te l'a montré en début de post.
Tu déclares une variable Alpha de la même longueur que ton numérique et tu fais un
CHGVAR(&MONALPHA) VALUE(&MONUMERIQUE).
Ainsi tu peux concaténer ton alpha avec d'autres alpha
Dernière modification par Philippe (2009-12-07 16:54:08)
Patrick
Hors ligne
Un truc tout simple c'est de déclarer 2 variables, une décimale et une autre de même longueur mais alpha.
Tu fais un &varCHAR = &varNUM et tu peux utiliser ta variable &varCHAR dans ta chaine de concaténation.
grillé 
Dernière modification par macounet (2009-12-07 13:30:39)
Hors ligne
Un truc curieux lorsque j'associe la valeur de la variable en dur dans le CL il n'y a pas de pbl
Ce n'est que lorsque je passe la valeur de ma variable dans ma ligne de commande et que je retire la valeur en dur de mon CL qu'il y a un pbl
POURQUOI??????? AU SECOUR HELP !!!!!!!
K2R400 j'ai fait ce test mais le prog ce plante <<MCH1202 40 ESC Decimal data error.>> qd il fait le chargement de la variable numérique dans l'alpha et je l'avais indiqué a Fred
que puis-je faire de plus pour que cela fonctionne ce n'est qd même pas une nouveauté ce type de manipe comment concaténer ????
Dernière modification par aawoopy56 (2009-12-07 15:44:21)
Hors ligne
En gros tu fais ça (par rapport à ton exemple du début, tu rajoute ce que j'ai mis en gras)
PGM PARM(&NUM)
DCL VAR(&NUM) TYPE(*DEC) LEN(2)
DCL VAR(&NUMA) TYPE(*CHAR) LEN(2)
DCL VAR(&VARTOT) TYPE(*CHAR) LEN(10)
DCL VAR(&VARDAT) TYPE(*CHAR) LEN(6)
[...]
CHGVAR VAR(&NUMA) VALUE(&NUM)
CHGVAR VAR(&VARTOT) VALUE('SR' *CAT &NUMA *CAT &VARDAT)
ça devrait passer sans problème ...
Hors ligne
Un truc curieux lorsque j'associe la valeur de la variable en dur dans le CL il n'y a pas de pbl
Ce n'est que lorsque je passe la valeur de ma variable dans ma ligne de commande et que je retire la valeur en dur de mon CL qu'il y a un pblPOURQUOI??????? AU SECOUR HELP !!!!!!!
Là c'est peut-être la valeur de ton paramètre qui n'est pas bonne.
Tu fais comment le call de ton prog ?
Hors ligne
Merci Macounet mais ça ne marche pas j'ai l'erreur suivante dans le dump
MCH1202 40 ESC Decimal data error.
Et j'ai bien fait comme tu me la dit
call MABIB/MONPROG PARM(34)
Dernière modification par aawoopy56 (2009-12-07 15:49:47)
Hors ligne
Regarde un peu plus haut ce que highvalue.fr te dit concernant les paramètres numériques en ligne de commande.
Si tu veux passer 34 dans un paramètre numérique il faut que tu saisisses
CALL MABIB/MONPROG PARM(X'034F')
Dernière modification par macounet (2009-12-07 16:06:59)
Hors ligne
Quoi mais c'est quoi que cette codif on peut pas passer directement du numérique en paramètre du pgm alors la j'suis sidéré
J'ai exécuté le programme avec le X'034F' et oui cela fonctionne
pourquoi il est impossible de passer la valeur 34 directement la je ne comprends pas
Hors ligne
Je ne connais pas exactement la raison. (vue la syntaxe je dirais qu'il les passe en héxa et pas en numérique étendu)
Il y a certainement sur ce forum des personnes plus calées que moi pour te l'expliquer.
Sinon je pense qu'en créant une commande tu devrait solutionner ton problème.
Hors ligne
Tu la verrais comment cette commande toi
Hors ligne
Il y a déja un post la-dessus : http://forum.xdocs400.com/viewtopic.php?id=848
Pour la commande "call" les parametres décimaux sont passés en Packé et avec une longueur de (15 5) donc 15 chifres de long dont 5 décimales.
Si le paramètre 12345 est passé, le programme receveur doit déclarer le champ décimal comme (15 5), le paramètre recu sera 1234500000 (ce qui est 12,345.00000).
Si tu veux appeler avec call MABIB/MONPROG PARM(34), change ta définition de variable en 15 5 et ca passera.
PS:
N'oublie pas de changer ton &numa (longueur 15)
ainsi que ton CHGVAR VAR(&VARTOT) VALUE('SR' *CAT &NUMA *CAT &VARDAT) pour ne prendre que la partie de &numa qui t'intéresse (%SST(&numa 9 2) par exemple.
Hors ligne
Max merci mais il me semble que j'ai déjà testé cette solution mais ça ne passe pas
Je vais quand même re-tester pour être sur car avec tous ces tests je mis perd un peut
Hors ligne
Essaie :
PGM PARM(&NUM)
DCL VAR(&NUM) TYPE(*DEC) LEN(15 5)
DCL VAR(&NUMA) TYPE(*CHAR) LEN(15)
DCL VAR(&VARTOT) TYPE(*CHAR) LEN(10)
DCL VAR(&VARDAT) TYPE(*CHAR) LEN(6)
DCL VAR(&DATE) TYPE(*CHAR) LEN(6)
RTVSYSVAL SYSVAL(QDATE) RTNVAR(&DATE)
CVTDAT DATE(&DATE) TOVAR(&VARDAT) FROMFMT(*SYSVAL) +
TOFMT(*YMD) TOSEP(*NONE)
CHGVAR VAR(&NUMA) VALUE(&NUM)
CHGVAR VAR(&VARTOT) VALUE('SR' *CAT %SST(&NUMA 8 2) *CAT &VARDAT)
SNDMSG MSG(&VARTOT) TOUSR(MAX)
ENDPGM
si je fais call tst001 17
cela donne :
From . . . : MAX 07/12/09 17:06:00
SR17091207
Personnellement, j'aime pas cela, j'évite toujours les param numériques.
Si tu as besoin de 2 positions numériques , passe un char de 2.
c'est franchement pas plus compliqué à la ligne de commande que d'ajouter les quotes :
call tst001 '17' C'est pas si pénalisant que cela.
Le petit test ci-dessus lorsque tu l'appellera avec
"call tst001 617" ignorera completement ton 6. C'est pas top...
Hors ligne
Convention IBM : longueur par défaut des variables
*DEC (15 5) pour les variables de type décimal condensé ("packé").
*CHAR (32) pour les variables de type caractère.
*INT (4) et *UINT (4) pour les variables de type binaire signé et non signé.
Ce qui veut dire que si on ne précise pas la longueur lors de la définition/déclaration des variables en CL, le compilateur prendra en compte la longueur par défaut selon le type de la variable. Ceci vaut également pour les constantes passées "en dur" dans les paramètres des commandes CALL. Donc, dans la mesure du possible et comme déjà indiqué, définis tes variables de type décimal condensé avec une longueur de (15 5) et tu n'auras alors plus de problème pour passer les valeurs en dur directement sur les commandes CALL. L'autre solution est de faire une commande "maison".
Hors ligne
Tu la verrais comment cette commande toi
Par exemple
La commande
CMD PROMPT('TEST PARAM NUMERIQUE')
PARM KWD(NUM) TYPE(*DEC) LEN(2) RANGE(01 99) +
PROMPT('Paramètre numérique')la compilation de la commande
CRTCMD CMD(LGLIB/TST03) PGM(LGLIB/TST03) SRCFILE(LGLIB/QSRC) ALLOW(*INTERACT)Tu adaptes avec tes noms de programme et de bib
Hors ligne
Merci à tous ça fonctionne nickel
Bonne journée
Hors ligne
Pages : 1