Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Bonjour,
Voici ma problématique :
J'ai une procédure stockée qui a en output une variable de type varchar(255).
Cette procédure est appelée par PB, je l'ai donc ajoutée dans mes local external functions où ma variable output est identifiée avec un "ref" devant.
Voici mon code PB :
SQLCA.SP_I_CORRESPONDANCE(ls_correspondance, ls_pays_cible, ls_retour) commit; If ls_retour <> "OK" then MessageBox("Correspondance Pays", ls_retour)
Or la variable ls_retour définie comme un string ne contient pas la chaine de caractères renvoyée par la proc.
J'ai testé la proc seule et elle renvoie bien la chaine désirée.
Je conclue donc qu'il y a un problème de type de données ?
Pouvez-vous m'en dire plus ?
Merci.
Hors ligne
voila comment j'utilise les procédures stockées, avec la variable de retour....
tout d'abord, je declare de cette facon ma procedure stockée...
la variable de retour se trouve directement dans le Select Finale
et depuis pb,
le bout de script pour l'appeler :
// compte le nombre de jours écoulés entre la date d'expiration // et la date du moment DECLARE nb_jours_expires_maxi PROCEDURE FOR pc_nb_jours_expires @nom = :ls_code_user; EXECUTE nb_jours_expires_maxi; IF SQLCA.sqlcode = 0 THEN FETCH nb_jours_expires_maxi INTO :li_nb_jours_expires; else ls_err = sqlca.sqlerrtext CLOSE nb_jours_expires_maxi; messagebox("Attention",ls_err) return END IF CLOSE nb_jours_expires_maxi;
Et ca fonctionne bien !!!!!
Hors ligne
Merci, mais tu n'as pas une idée de pourquoi ça ne marche aps dans mon cas. Sachant que si ma variable de retour est un integer dans Sybase et un long dans PB, ça marche très bien...
Hors ligne
C'est quoi ta base de données ? Sybase ?
Driver natif, Ole db, odbc ?
Pb version ?
OS version ?
Je vois que pick-ouic utilise cast Workbench (excellent outil) et probablement Sybase ASE.
Il faut peut-être reserver l'espace mémoire.
ls_retour = space (255)
D'autre part, il est extrémement important que tu fournisse ta déclaration de SP_I_CORRESPONDANCE
Dernière modification par shahin (03-10-2006 14:12:28)
Hors ligne
disons donc que je n'ai jamais utilisé ta méthode...avec la valeur de retour dans le REF.....
par contre ma méthode fonctionne à tous les coups....que soit pour un decimal, un string ou autre format.
A Confirmer...
Hors ligne
shahin a écrit:
C'est quoi ta base de données ? Sybase ?
Driver natif ?
Il faut peut-être reserver l'espace mémoire.
ls_retour = space (255)
D'autre part, il est extrémement important que tu fournisse ta déclaration de SP_I_CORRESPONDANCE
Oui c'est du Syabe 12.5.1
Voila la déclaration :
subroutine SP_I_CORRESPONDANCE(string PAYS_FICHIER,string PAYS_BASE,ref string RETOUR) RPCFUNC ALIAS FOR "dbo.SP_I_CORRESPONDANCE"
Sachant que space(255) ,'arrange pas le problème.
Hors ligne
space(255) n'arrange pas le problème, mais je viens de relire la doc au chapitre "Declaring DBMS stored procedures as remote procedure calls", et c'est obligatoire.
Je croyais que t'avais oublié le mot clef "REF", mais ce n'est pas le cas.
Cependant si ton retour est "Ok" ou "erreur", pas besoin de string utilise un entier (int/long) avec les conventions habituelles 1=ok, -1 =erreur 1, -2=erreur 2, etc ...
Quel est le retour de SQLCA.sqlcode ? A tester en premier.
SQLCA.SP_I_CORRESPONDANCE(ls_correspondance, ls_pays_cible, ls_retour) IF SQLCA.sqlcode = 0 THEN commit; If ls_retour <> "OK" then MessageBox("Correspondance Pays", ls_retour) messagebox("Error", SQLCA.sqlerrtext) Else messagebox("ok", "ok") end if ELSE messagebox("Error", SQLCA.sqlerrtext) END IF
Dernière modification par shahin (03-10-2006 14:30:10)
Hors ligne
Le SQLCA.sqlcode ne renvoie rien. La procédure seule marche bien, il n'y a pas de soucis. Si je l'éxécute manuellement, je récupère bien mon string.
Mais quand je l'éxécute depuis PB la variable ls_retour est toujours vide, elle ne "passe" pas... C'est bizarre. Alors que avec un integer ça marche très bien.
Hors ligne
Rien ? tu veux dire 0 je suppose ?
Ici j'ai pas ASE (que Oracle) et ne peux pas investiguer plus.
Essaie la méthode de Pick Ouic.
Hors ligne
c'est pas lié avec une histoire de autocommit à true ?
tu le mets juste avant l'appel de ta proc...
apres , tu le remets comme il etait avant....
enfin, je dis comme ca.... j'en sais pas plus
Hors ligne
Bon... Vous allez rire...
En fait je faisais pas le space(255) sur la bonne variable...
Merci !
Hors ligne
T'inquiéte pas Deedoo, ça arrive à tout le monde
L'important c'est que ça fonctionne maintenant
Dernière modification par shahin (03-10-2006 14:45:26)
Hors ligne
pas grave, tu me devras juste un menu maxi best of....
Hors ligne