Le forum (ô combien francophone) des utilisateurs de Powerbuilder.







Bonjour,
Je sens que je vais encore passer pour un boulet mais j'ai du mal dans le retrieve d'une datawindow.
J'ai créé une datawindow qui fait appel à une procédure stockée mais je me retrouve tout le temps avec l'erreur An illegal value of 16 given for parameter item
Comme j'ai activé la trace je regarde dans pbtrace.log et je récupère la ligne suivante :
execute OBI_S_REV_v2;1 @CODE_TITRE = '1038', @PARUTION = '8', @SPECIFICITE = ' ', @ID_EDITEUR = 12780 (15 MilliSeconds)
BIND SELECT OUTPUT BUFFER (DataWindow):
CLI 1 #5 ct_bind(): user api layer: external error: An illegal value of 16 given for parameter item. (0 MilliSeconds) (0 MilliSeconds)
Error 5 (rc -1) : ct_bind(): user api layer: external error: An illegal value of 16 given for parameter item.
Je récupère l'appel de la procédure stockée et je l'execute sur SqlAdvantage :
execute dbo.OBI_S_REV_v2 @CODE_TITRE="1038", @PARUTION="8", @SPECIFICITE="", @ID_EDITEUR=12780
Et là je retrouve bien le résultat que je cherchais.
J'avoue ne pas trop comprendre pourquoi celà ne fonctionne pas, avez vous des idées?
Je précise que je travaille sur le même serveur que ce soit pour le test de la procédure sur PB ou sur SqlAdvantage, que la procédure appellée existe bien sur le serveur
Merci pour vos reponses ou eclaircissements
Dernière modification par Nephtis (10-10-2007 12:26:36)
Hors ligne








j'ai eu le meme probleme
il me semble que c'est un probleme de type
Tu as quoi comme retrieval argument? as tu des decimaux?
Dernière modification par hellkinder (10-10-2007 11:12:47)
Hors ligne







Pour la procédure stockée je passe ces arguments:
@CODE_TITRE char(4),
@PARUTION char(6),
@SPECIFICITE char(1),
@ID_EDITEUR integer
Dans le code PB j'ai un retrieve qu imarche et un autre qui marche pas:
-Celui qui marche
dw_1.retrieve( '****' , i_s_parution , i_s_specificite , i_i_editeur)
-Celui qui ne fonctionne pas
dw_1.Retrieve ( l_s_code_titre , l_s_parution , l_s_specificite , ll_editeur)
Mais ce que je comprends surtout pas c'est pourquoi lorsque j'essaie de visualiser ma datawindow (avec l'icone en forme de loupe) et que je lui renseigne les valeurs qu'on peut voir ci-dessus j'ai aussi l'erreur Illegal parameter value
Dernière modification par Nephtis (10-10-2007 11:21:46)
Hors ligne








ah par contre, ca serait pas mal de savoir ce qu'il y a exactement dans ces variables.. pour celle qui marche et celle qui marche pas
Dernière modification par hellkinder (10-10-2007 11:21:40)
Hors ligne
ce n'est pas du à une histoire de taille d'une variable ?
si tu declares un string taille 15 et tu envoyes un string taille 16...

Hors ligne







Donc en mode debug voici le contenu des variables:
Pour le retrieve qui marche :
- code_titre = "****"
- parution = null
- specificite = null
- id_editeur = null
Pour le retrieve qui ne marche pas :
- code_titre = null
- parution = null
- specificite = null
- id_editeur = 12780
D'autre part ma procédure stockée comporte en fait plusieurs requetes qui sont conditionnées par les paramètres en entrée, on retrouve le select correspondant à la condition : if (@CODE_TITRE = '****' ) and (@PARUTION is null ) and (@SPECIFICITE is null) and (@ID_EDITEUR is null) (celle-ci marche)
et l'autre select correspondant à la condition : if (@CODE_TITRE is null) and (@ID_EDITEUR is not null) and (@PARUTION is null) (celle qui bizarrement ne marche pas)
J'ai recopié la requete select de cette dernière dans SqlAdvantage et j'ai renseigné avec le code editeur que j'utilise depuis le début et je retrouve bien le résultat espéré
Dernière modification par Nephtis (10-10-2007 11:36:16)
Hors ligne








Nephtis a écrit:
Pour la procédure stockée je passe ces arguments:
@CODE_TITRE char(4),
@PARUTION char(6),
@SPECIFICITE char(1),
@ID_EDITEUR integerDans le code PB j'ai un retrieve qu imarche et un autre qui marche pas:
-Celui qui marcheCode: pb
dw_1.retrieve( '****' , i_s_parution , i_s_specificite , i_i_editeur)
-Celui qui ne fonctionne pasCode: pb
dw_1.Retrieve ( l_s_code_titre , l_s_parution , l_s_specificite , ll_editeur)
Mais ce que je comprends surtout pas c'est pourquoi lorsque j'essaie de visualiser ma datawindow (avec l'icone en forme de loupe) et que je lui renseigne les valeurs qu'on peut voir ci-dessus j'ai aussi l'erreur Illegal parameter value
le premier id_editeur est en integer le second en long?
Hors ligne







thezerg a écrit:
Nephtis a écrit:
Pour la procédure stockée je passe ces arguments:
@CODE_TITRE char(4),
@PARUTION char(6),
@SPECIFICITE char(1),
@ID_EDITEUR integerDans le code PB j'ai un retrieve qu imarche et un autre qui marche pas:
-Celui qui marcheCode: pb
dw_1.retrieve( '****' , i_s_parution , i_s_specificite , i_i_editeur)
-Celui qui ne fonctionne pasCode: pb
dw_1.Retrieve ( l_s_code_titre , l_s_parution , l_s_specificite , ll_editeur)
Mais ce que je comprends surtout pas c'est pourquoi lorsque j'essaie de visualiser ma datawindow (avec l'icone en forme de loupe) et que je lui renseigne les valeurs qu'on peut voir ci-dessus j'ai aussi l'erreur Illegal parameter valuele premier id_editeur est en integer le second en long?
Le second est en long, est ce vraiment ça qui ferait planter pb?
On dirait que non puisque j'ai rajouté un integer temporaire et je l'ai utilisé dans le retrieve mais ça n'a pas arrangé les choses
Dernière modification par Nephtis (10-10-2007 11:41:25)
Hors ligne











Au niveau des retrieve arguments définis sur ta datawindow, quels sont les types passés en paramètres?
Hors ligne








Dans ta procédure les arguments sont déclarés comment?
Hors ligne







pick ouic a écrit:
ce n'est pas du à une histoire de taille d'une variable ?
si tu declares un string taille 15 et tu envoyes un string taille 16...
Pour l'instant par rapport au jeu de test je ne vois pas de probleme de taille de variable et puis dans le code PB, je récupère les données provenant de la base, donc déjà à la bonne taille
Hors ligne








pick ouic a écrit:
ce n'est pas du à une histoire de taille d'une variable ?
si tu declares un string taille 15 et tu envoyes un string taille 16...
Ah c'est possible aussi...
et probleme integer long...
dans celle qui marche pas essaye de declarer l_l_editeur en integer l_i_editeur
peut tu copier coller l'edit source de ta dw?
Dernière modification par hellkinder (10-10-2007 11:45:17)
Hors ligne







Resumons nous:
Voici un peu la structure de la procédure stockée
Create Proc OBI_S_REV_v2 ( @CODE_TITRE char(4), @PARUTION char(6), @SPECIFICITE char(1), @ID_EDITEUR integer ) As Begin declare @erreur int ,@erreur_utilisateur int ,@message_erreur varchar(255) select @erreur = 0 select @erreur_utilisateur = 30000 select @message_erreur = '' /* 1? cas : INIT */ if (@CODE_TITRE = '****' ) and (@PARUTION is null ) and (@SPECIFICITE is null) and (@ID_EDITEUR is null) [LE CODE POUR LE SELECT] /* 2? cas : not null, not null, not null */ if (@CODE_TITRE is not null) and (@ID_EDITEUR is not null) and (@PARUTION is not null) [LE CODE POUR LE SELECT] [...] /* 9? cas : null, null, null */ if (@CODE_TITRE is null) and (@ID_EDITEUR is null) and (@PARUTION is null)
Maintenant la structure de la datawindow (pour pas me compliquer la tache j'ai juste fait un export) :
$PBExportHeader$d_liste_rev3.srd
release 6;
datawindow(units=0 timer_interval=0 color=16777215 processing=1 print.documentname="" print.orientation = 0 print.margin.left = 110 print.margin.right = 110 print.margin.top = 96 print.margin.bottom = 96 print.paper.source = 0 print.paper.size = 0 print.prompt=no print.buttons=no print.preview.buttons=no grid.lines=0 )
header(height=80 color="536870912" )
summary(height=0 color="536870912" )
footer(height=76 color="536870912" )
detail(height=92 color="536870912" )
table(column=(type=long updatewhereclause=no name=id_editeur dbname="ID_EDITEUR" )
column=(type=char(30) updatewhereclause=no name=libelle_titre dbname="LIBELLE_TITRE" )
column=(type=char(4) updatewhereclause=no name=code_titre dbname="CODE_TITRE" )
column=(type=char(6) updatewhereclause=no name=id_parution dbname="ID_PARUTION" )
column=(type=char(6) updatewhereclause=no name=parution dbname="PARUTION" )
column=(type=char(1) updatewhereclause=no name=specificite dbname="SPECIFICITE" )
column=(type=long updatewhereclause=no name=id_rev dbname="ID_REV" )
column=(type=long updatewhereclause=no name=qte_demandee dbname="QTE_DEMANDEE" )
column=(type=long updatewhereclause=no name=qte_livree dbname="QTE_LIVREE" )
column=(type=datetime updatewhereclause=no name=dt_creation dbname="DT_CREATION" )
column=(type=char(1) updatewhereclause=no name=etat dbname="ETAT" values="En cours E/Clos C/" )
column=(type=char(30) updatewhereclause=no name=prestataire dbname="PRESTATAIRE" )
column=(type=char(1) updatewhereclause=no name=titre_rev dbname="TITRE_REV" values="Oui O/Non N/" )
column=(type=datetime updatewhereclause=no name=d_maj dbname="D_MAJ" )
column=(type=datetime updatewhereclause=no name=d_livraison dbname="D_LIVRAISON" )
column=(type=datetime updatewhereclause=no name=date_releve dbname="DATE_RELEVE" )
procedure="1 execute OBI_S_REV_v2;1 @CODE_TITRE = :CODE_TITRE, @PARUTION = :PARUTION, @SPECIFICITE = :SPECIFICITE, @ID_EDITEUR = :ID_EDITEUR" arguments=(("CODE_TITRE", string),("PARUTION", string),("SPECIFICITE", string),("ID_EDITEUR", number)) )
[... Tout le blabla sur l'alignement des colonnes ...]
Dernière modification par Nephtis (10-10-2007 11:54:11)
Hors ligne







hellkinder a écrit:
pick ouic a écrit:
ce n'est pas du à une histoire de taille d'une variable ?
si tu declares un string taille 15 et tu envoyes un string taille 16...Ah c'est possible aussi...
et probleme integer long...
dans celle qui marche pas essaye de declarer l_l_editeur en integer l_i_editeur
peut tu copier coller l'edit source de ta dw?
J'ai testé le cast en Integer mais ça a pas marché
Integer li_test li_test = Integer(ll_editeur) dw_1.Retrieve ( l_s_code_titre, l_s_parution , l_s_specificite , li_test )
Dernière modification par Nephtis (10-10-2007 11:57:13)
Hors ligne








dans ta proc, tu peux changer le type de @ID_EDITEUR de integer à number (je sais pas si ca existe en SQLAdvantage)
Dernière modification par hellkinder (10-10-2007 12:05:35)
Hors ligne







hellkinder a écrit:
dans ta proc, tu peux changer le type de @EDITEUR de integer à number (je sais pas si ca existe en SQLAdvantage)
J'ai testé mais: Can't find type 'number'.
Dernière modification par Nephtis (10-10-2007 12:07:05)
Hors ligne








Nephtis a écrit:
hellkinder a écrit:
dans ta proc, tu peux changer le type de @EDITEUR de integer à number (je sais pas si ca existe en SQLAdvantage)
J'ai testé mais Can't find type 'number'.
super, genial
Hors ligne








peux tu me dire ce que retourne ta procedure..enfin les valeurs de tes varaibles à la fin de la proc et il faudrait qu'on puisse voir les codes de chaque if.
A mon avis, tu essayes de mettre une valeur incorrecte dans un champs de la datawindow.
Pour tester tu peux essayer par exemple dans l'edit source de remplacer le type long de id_editeur par decimal(2)
Dernière modification par hellkinder (10-10-2007 12:17:19)
Hors ligne







Heu... comment dire ...
Ben c'est que, ...
Heu... Ben je crois que j'ai retrouvé mon bonnet d'âne
Je viens de regarder la liste des colonnes renvoyées par le select et il en manque toujours une sauf pour le premier cas
J'ai pas encore vraiment testé mais je crains vraiment de retrouver mes grandes oreilles
Dernière modification par Nephtis (10-10-2007 12:18:24)
Hors ligne








et ben voilà... tiens nous au courrant
Dernière modification par hellkinder (10-10-2007 12:19:43)
Hors ligne







Et bien oui il manquait bien ce satané champ que je n'avais certainement du rajouter que dans le premier cas
Mais bon l'âne est généreux et offre 100 pépites pour tous les participants à ce post
Dernière modification par Nephtis (10-10-2007 12:24:13)
Hors ligne








ca sera parfait avec un RESOLU.
see you
PS (Pepite Sent) : Merci bcp !
Dernière modification par hellkinder (10-10-2007 12:26:00)
Hors ligne











Et la prochaine fois, donne nous la totalité des arguments de ta procédure (les IN, les OUT, et les IN/OUT). Ca aide
[EDIT] pour les pépites
Hors ligne







foon a écrit:
Et la prochaine fois, donne nous la totalité des arguments de ta procédure (les IN, les OUT, et les IN/OUT). Ca aide
J'ai donné la totalité des paramètres
Ce que j'ai pas donné c'est le contenu des select
Hors ligne