Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
J'essaye d'appeler une procedure stockée depuis PB et je n'y arrive pas.
Cote BDD j'ai :
CREATE PROCEDURE kone.sp_set_num_devis -- Add the parameters for the stored procedure here @Agence varchar(6) OUTPUT, @Devis varchar(4) OUTPUT, @Vers varchar(1) OUTPUT, @Cprofit varchar(6), @coderetour int OUTPUT, @retour varchar(255) OUTPUT BEGIN --blabla SELECT @Agence,@Devis,@Vers,@coderetour,@retour return END
Coté PB :
ls_retour='' DECLARE p_set_num_devis PROCEDURE FOR kone.sp_set_num_devis ( @Agence= :is_devis_ag OUTPUT , @Devis = :is_devis_no , @Vers = :is_devis_vers , @Cprofit = :ls_centreProfit , @coderetour = :ll_coderetour , @retour = :ls_retour ) USING SQLCA; EXECUTE p_set_num_devis ; IF SQLCA.sqlcode = 0 THEN FETCH p_set_num_devis INTO :ls_devis_ag,:ls_devis_no,:ls_devis_vers,:ll_coderetour,:ls_retour; ELSE gnv_app.inv_error.of_message("EDS-004") Close(w_maj_donnees) return -1 END IF CLOSE p_set_num_devis;
Pb m'empeche de specifier OUTPUT au niveau des parametres :
C0038 : SQLSTATE =37000 Microsoft ODBC SQL Server Driver Impossible d'utiliserl'option OUTPUT pour passer une constante à une procedure stockee.
Et sans cet output, quand j'execute mon programme j'ai l'erreur suivante : type mismatch between retrieve columns and fetch columns.
Au niveau acces BDD, je passe par ODBC avec al connect string suivvante :
DBParm = "ConnectString='DSN=;UID=;PWD=',DisableBind=1,CommitOnDisconnect='Yes',DelimitIdentifier='No',MsgTerse='Yes',CallEscape='No',FormatArgsAsExp='N'"
J'ai absolument besoin de cette procedure stockee.
Je craque ;-)
merci pour votre aide
[edit] [ code=mssql ] [ code=pb]
Hors ligne
salut, t'es sûr qu'il faut des parenthèses dans ta déclaration :
DECLARE p_set_num_devis PROCEDURE FOR kone.sp_set_num_devis ***(*** @Agence= :is_devis_ag OUTPUT , @Devis = :is_devis_no , @Vers = :is_devis_vers , @Cprofit = :ls_centreProfit , @coderetour = :ll_coderetour , @retour = :ls_retour ***)*** USING SQLCA;
Hors ligne
j'ai essaye avec et sans parenthese, mem resultat.
J'aie ssaye egalement d'enlever les "@Agence =" sans succes.
Je suis en train de tester un appel de procedure sans parametre et lors d el'execute j'ai un sqlcode=100 comme si il ne trouvait pas la proc stoc.
Hors ligne
Bonjour,
Et comme ça, ce ne serait pas mieux?
ls_retour='' DECLARE p_set_num_devis PROCEDURE FOR kone.sp_set_num_devis @Agence= :is_devis_ag OUTPUT, @Devis = :is_devis_no OUTPUT, @Vers = :is_devis_vers OUTPUT, @Cprofit = :ls_centreProfit, @coderetour = :ll_coderetour OUTPUT, @retour = :ls_retour OUTPUT USING SQLCA; EXECUTE p_set_num_devis ; IF SQLCA.sqlcode = 0 THEN FETCH p_set_num_devis INTO :ls_devis_ag,:ls_devis_no,:ls_devis_vers,:ll_coderetour,:ls_retour; ELSE gnv_app.inv_error.of_message("EDS-004") Close(w_maj_donnees) return -1 END IF CLOSE p_set_num_devis;
NB: Normalement, le sqlcode 100 correspond au code retour "NO DATA FOUND" pour une requête SQL ou une procédure
Hors ligne
avec ton code, j'ai le message suivant lors de la sauvegarde de mon code :
C0038 : SQLSTATE =37000 Microsoft ODBC SQL Server Driver Impossible d'utiliserl'option OUTPUT pour passer une constante à une procedure stockée
Hors ligne
essaie avec juste OUT
Hors ligne
Arrêtes-moi si je me trompe, mais tu n'aurais pas fait une erreur au niveau du passage des variables:
Tu passes :is_devis_ag, et tu fetches dans :ls_devis_ag par exemple.
Ce sont des paramètres exclusivement en OUTPUT, ou en INPUT/OUTPUT?
Hors ligne
en fait je passe @Agence,@Devis,@Vers,@Cprofit à ma proc stock qui va faire son traitement et qui me renvoie agence,devis et vers (dont les valeurs sont modifiées).
je m'y prends peut etre mal effectivement. Comment je lui indique que c'est du input/output ?
Hors ligne
Inferni, avec le OUT mememessage d'erreur
Hors ligne
Eric06 a écrit:
en fait je passe @Agence,@Devis,@Vers,@Cprofit à ma proc stock qui va faire son traitement et qui me renvoie agence,devis et vers (dont les valeurs sont modifiées).
je m'y prends peut etre mal effectivement. Comment je lui indique que c'est du input/output ?
en oracle c'est INOUT, ça doit être ça aussi en SQL Server
Hors ligne
Bon, alors en Oracle, pour PB 9 (Je sais pas pour PB10.5, mais je pense que ça n'a pas changé) il n'est pas possible de gérer les paramètres en IN/OUT via le traditionnel "DECLARE ... EXECUTE" : Il faut obligatoirement déclarer une RPCFUNC.
Pour SQLServer, je n'ai jamais eu à gérer ce cas de figure et je ne suis pas sûr que le IN/OUT soit réellement supporté. (L'aide PB est muette à ce propos)
Je te propose donc de tester deux solutions (Je suis sous ORACLE, et donc je ne peux pas le faire moi-même ):
1ère option:
Utiliser uniquement des variables locales pour passer les paramètres (Pour vérifier que ça ne vienne pas de tes variables d'instance, mais j'en doute):
String ls_devis_ag, ls_devis_no, ls_devis_vers, ls_retour Long ll_coderetour ls_retour='' ls_devis_ag = is_devis_ag ls_devis_no = is_devis_no ls_devis_vers = is_devis_vers DECLARE p_set_num_devis PROCEDURE FOR kone.sp_set_num_devis @Agence= :ls_devis_ag OUTPUT, @Devis = :ls_devis_no OUTPUT, @Vers = :ls_devis_vers OUTPUT, @Cprofit = :ls_centreProfit, @coderetour = :ll_coderetour OUTPUT, @retour = :ls_retour OUTPUT USING SQLCA; EXECUTE p_set_num_devis ; IF SQLCA.sqlcode = 0 THEN FETCH p_set_num_devis INTO :ls_devis_ag,:ls_devis_no,:ls_devis_vers,:ll_coderetour,:ls_retour; ELSE gnv_app.inv_error.of_message("EDS-004") Close(w_maj_donnees) return -1 END IF CLOSE p_set_num_devis;
2ème option: Dupliquer les paramètres au niveau de ta procédure stockée sous SQLServer:
CREATE PROCEDURE kone.sp_set_num_devis -- Add the parameters for the stored procedure here @Agence varchar(6), @Devis varchar(4), @Vers varchar(1), @Agence_ret varchar(6) OUTPUT, @Devis_ret varchar(4) OUTPUT, @Vers_ret varchar(1) OUTPUT, @Cprofit varchar(6), @coderetour int OUTPUT, @retour varchar(255) OUTPUT BEGIN --blabla SELECT @Agence,@Devis,@Vers,@coderetour,@retour return END
Dans ce cas, il te faudra, bien évidemment, modifier ton DECLARE en conséquence dans PB:
String ls_devis_ag, ls_devis_no, ls_devis_vers, ls_retour Long ll_coderetour DECLARE p_set_num_devis PROCEDURE FOR kone.sp_set_num_devis @Agence= :is_devis_ag, @Devis = :is_devis_no, @Vers = :is_devis_vers, @Agence_ret= :ls_devis_ag OUTPUT, @Devis_ret = :ls_devis_no OUTPUT, @Vers_ret = :ls_devis_vers OUTPUT, @Cprofit = :ls_centreProfit, @coderetour = :ll_coderetour OUTPUT, @retour = :ls_retour OUTPUT USING SQLCA; EXECUTE p_set_num_devis ; IF SQLCA.sqlcode = 0 THEN FETCH p_set_num_devis INTO :ls_devis_ag,:ls_devis_no,:ls_devis_vers,:ll_coderetour,:ls_retour; ELSE gnv_app.inv_error.of_message("EDS-004") Close(w_maj_donnees) return -1 END IF CLOSE p_set_num_devis;
Hors ligne
foon a écrit:
1ère option:
Utiliser uniquement des variables locales pour passer les paramètres (Pour vérifier que ça ne vienne pas de tes variables d'instance, mais j'en doute):
je ne pense pas non plus que ça soit la cause, j'ai des scripts SQL embarqués avec des :inv_objet.is_pte
qui marchent bien. (mais ne sait-on jamais avec des procédures en SQL server... ?)
Hors ligne
C'est vrai, j'avais mis ça pour le cas où les string is_devis_ag et autres auraient été des constantes, mais dans ce cas, elles auraient été nommées différemment.
C'est le message d'erreur ODBC qui m'a fait penser à cette hypothèse...
Hors ligne
J'ai testé les 2 solutions mais j'ai toujours le message C0038 : SQLSTATE =37000 Microsoft ODBC SQL Server Driver Impossible d'utiliserl'option OUTPUT pour passer une constante à une procedure stockée
qui me bloque.
Je confirme le INOUT n'est pas supporte
je vais tester RPCFUNC et je vous tiens au courant.
merci pour votre aide
Hors ligne
Une autre hypothèse à tester si le RPCFUNC ne marche pas: L'ordre de déclaration des paramètres IN et OUT:
CREATE PROCEDURE kone.sp_set_num_devis -- Add the parameters for the stored procedure here @Agence varchar(6), @Devis varchar(4), @Vers varchar(1), @Cprofit varchar(6), @Agence_ret varchar(6) OUTPUT, @Devis_ret varchar(4) OUTPUT, @Vers_ret varchar(1) OUTPUT, @coderetour int OUTPUT, @retour varchar(255) OUTPUT BEGIN --blabla SELECT @Agence,@Devis,@Vers,@coderetour,@retour return END
Et en PB:
String ls_devis_ag, ls_devis_no, ls_devis_vers, ls_retour Long ll_coderetour DECLARE p_set_num_devis PROCEDURE FOR kone.sp_set_num_devis @Agence= :is_devis_ag, @Devis = :is_devis_no, @Vers = :is_devis_vers, @Cprofit = :ls_centreProfit, @Agence_ret= :ls_devis_ag OUTPUT, @Devis_ret = :ls_devis_no OUTPUT, @Vers_ret = :ls_devis_vers OUTPUT, @coderetour = :ll_coderetour OUTPUT, @retour = :ls_retour OUTPUT USING SQLCA; EXECUTE p_set_num_devis ; IF SQLCA.sqlcode = 0 THEN FETCH p_set_num_devis INTO :ls_devis_ag,:ls_devis_no,:ls_devis_vers,:ll_coderetour,:ls_retour; ELSE gnv_app.inv_error.of_message("EDS-004") Close(w_maj_donnees) return -1 END IF CLOSE p_set_num_devis;
Hors ligne
et bien le rpcfunc fonctionne tres bien. Je vais donc l'utiliser adonf ;-)
Merci pour votre aide.
J'espere pouvoir repondre bientot a certaines questions des autres membres.
bon week end
Hors ligne
Eric06 a écrit:
et bien le rpcfunc fonctionne tres bien. Je vais donc l'utiliser adonf ;-)
J'espere pouvoir repondre bientot a certaines questions des autres membres.
bon week end
oui, pour commencer, c'est quoi le code de déclaration et d'appel en rpcfunc de ton exemple ?
Hors ligne
Bonjour,
PB ne sais pas récupérer les paramètres en OUTPUT d'une procédure stockée (ou plutot je n'ai jamais réussi à le faire depuis des années).
Dans ce cas précis, on n'a pas besoin de paramètres en OUTPUT. La procédure peut être réécrite comme suit:
CREATE PROCEDURE kone.sp_set_num_devis -- Add the parameters for the stored procedure here @Cprofit varchar(6) BEGIN /* déclarer les variables de retour */ Declare @Agence varchar(6), Declare @Devis varchar(4), Declare @Vers varchar(1), Declare @coderetour int, Declare @retour varchar(255) /* Renseigner les variables de retours */ Select @Agence = .... --blabla /* Retourner les valeurs */ SELECT @Agence, @Devis, @Vers, @coderetour, @retour return END
Coté PB :
ls_retour='' DECLARE p_set_num_devis PROCEDURE FOR kone.sp_set_num_devis ( @Cprofit = :ls_centreProfit ) USING SQLCA; EXECUTE p_set_num_devis ; IF SQLCA.sqlDBcode = 0 THEN FETCH p_set_num_devis INTO :ls_devis_ag, :ls_devis_no, :ls_devis_vers, :ll_coderetour, :ls_retour; ELSE gnv_app.inv_error.of_message("EDS-004") Close(w_maj_donnees) return -1 END IF CLOSE p_set_num_devis;
Je n'ai pas testé mais ça devrait marcher.
Tiens moi au courant.
A+
Hors ligne
Perfecto. Cela focntionne tres bien.
Desole pour le long retard dans ma reponse.
;-)
merci beaucoup en tout cas
Hors ligne