Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

function et procédure stockée

8 réponses
Avatar
aitoz
Bonjour a tous,

je voudrais savoir comment récuperer une valeur pour procédure stockée ?
est-ce que vous avez un doc sur internet qui explique ca.

Mon probleme rapidement, je veux obtenir un N° de ligne pour mes lignes dans
mon Bon de livraison.
Pour ca je voudrais obtenir le N° de ligne le plus élévé (MAX) et lui
ajouter +1 pour avoir mon nouveau n° de ligne.
C'est bien parce que comme ca si quelqu'un supprime une ligne il ne pourra
pas réutiliser le N° dans le meme BL.

j'ai une procédure stockée pour ajouter la ligne du BL et je voudrais y
ajouter une fonction pour justement récupérer mon N° de ligne ??

Merci pour vos infos et bonne journée

Ps : Mon interface graphique est en vb.net

8 réponses

Avatar
Laxa
"aitoz" wrote in message
news:
Bonjour a tous,

je voudrais savoir comment récuperer une valeur pour procédure stockée ?
est-ce que vous avez un doc sur internet qui explique ca.

Mon probleme rapidement, je veux obtenir un N° de ligne pour mes lignes
dans mon Bon de livraison.
Pour ca je voudrais obtenir le N° de ligne le plus élévé (MAX) et lui
ajouter +1 pour avoir mon nouveau n° de ligne.
C'est bien parce que comme ca si quelqu'un supprime une ligne il ne pourra
pas réutiliser le N° dans le meme BL.

j'ai une procédure stockée pour ajouter la ligne du BL et je voudrais y
ajouter une fonction pour justement récupérer mon N° de ligne ??

Merci pour vos infos et bonne journée

Ps : Mon interface graphique est en vb.net



Dans ta procédure ajoute un paramètre de type OUTPUT

En vb.net déclare ce paramètre et ajoute le dans ta commande, par expl:

Dim CMD As SqlCommand = New SqlCommand
Dim Value as Object
CMD.Parameters.Add(New SqlParameter("Ton_parametername", SqlDbType.Int,
Nothing, ParameterDirection.Output, False, 0, 0, "", DataRowVersion.Current,
Value))

Idéalement c'est mieux d'utiliser une colonne de type Identity plutôt que de
rechercher le MAX, dans ta procédure tu peux récupérer le numéro via
@@IDENTITY juste après l'INSERT.

Pascal
Avatar
aitoz
J'ai regardé la variable @@IDENTITY, mais ca ne conviens pas a ce que je
veux. C'est bon pour un n° de facture, mais moi je veux un numéro de ligne
de bordereau de livraison. J'aurai donc la ligne N°1 a tous les BL.

En fait j'ai une procédure stockée qui me renvoie bien le bon nombre et j'ai
une procédure stockée qui m'effectue bien l'ajout de la nouvelle ligne de
livraison. Mais je n'arrive pas a ajouter ma ligne de livraison avec le n°
de ligne récupérer dans la première procédure stockée.
Voici mon code ! et la valeur retournée dans NBLGN est -1 ??? moi je
voudrais voir marqué 3 qui correspond au MAX de N° de ligne de la table BL.
With cmdNumLigne
.Connection = SqlConnection1
.CommandType = CommandType.StoredProcedure
.CommandText = "ps_sgsa_numligne"
NBLGN = cmdNumLigne.ExecuteNonQuery()
End With
Avatar
aitoz
J'ai trouvé la réponse grace a fabien !
Je dois faire Executescalar pour recevoir la réponse de ma procédure stockée
et pas Executenonquery !

Merci a tous
Avatar
Laxa
"aitoz" wrote in message
news:
J'ai regardé la variable @@IDENTITY, mais ca ne conviens pas a ce que je
veux. C'est bon pour un n° de facture, mais moi je veux un numéro de ligne
de bordereau de livraison. J'aurai donc la ligne N°1 a tous les BL.

En fait j'ai une procédure stockée qui me renvoie bien le bon nombre et
j'ai une procédure stockée qui m'effectue bien l'ajout de la nouvelle
ligne de livraison. Mais je n'arrive pas a ajouter ma ligne de livraison
avec le n° de ligne récupérer dans la première procédure stockée.
Voici mon code ! et la valeur retournée dans NBLGN est -1 ??? moi je
voudrais voir marqué 3 qui correspond au MAX de N° de ligne de la table
BL.
With cmdNumLigne
.Connection = SqlConnection1
.CommandType = CommandType.StoredProcedure
.CommandText = "ps_sgsa_numligne"
NBLGN = cmdNumLigne.ExecuteNonQuery()
End With



Tout d'abord il faut utiliser ExecuteScalar plutôt que ExecuteNonQuery car
ce dernier ne retourne que le nombre de row affecté (-1 pour ta procédure)
ExecuteScalar retourne une valeur, ca évite de passer par un datareader etc
pour récupérer juste une valeur, ce qui est ton cas.

De plus tu dois retourner ce genre de valeur pas par un return mais par un
paramètre de type OUTPUT
(sinon je trouve plus logique d'utiliser une fonction SQL plutôt qu'une SP,
enfin, ce n'est que mon avis)

Sinon ajoute un paramètre "LigneLivraison" à ta "ps_sgsa_numligne" en
oubliant pas de spécifier OUTPUT
create procedure ps_sgsa_numligne (@LigneLivraison int output)
......


Dim NBLGN as Object
Dim ReturnValue as Object
With cmdNumLigne
.Connection = SqlConnection1
.CommandType = CommandType.StoredProcedure
.CommandText = "ps_sgsa_numligne"
cmdNumLigne.Parameters.Add(New SqlParameter("LigneLivraison", SqlDbType.Int,
Nothing, ParameterDirection.Output, False, 0, 0, "", DataRowVersion.Current,
NBLGN ))
SqlConnection1.Open()
ReturnValue = cmdNumLigne.ExecuteScalar()
NBLGN = cmdNumLigne.Parameters("LigneLivraison").Value
End With


Voila, j'espère que ca répond à ta demande.

Pascal
Avatar
Laxa
"aitoz" wrote in message
news:
J'ai trouvé la réponse grace a fabien !
Je dois faire Executescalar pour recevoir la réponse de ma procédure
stockée et pas Executenonquery !

Merci a tous



Si tu utilise le return pour retourner ce genre d'info et que tu n'utilise
pas de paramètre de type OUTPUT, comment tu fais pour remonter une erreur
qui pourait se déclencher dans ta procédure ?

Pascal
Avatar
aitoz
ma variable dans ma procédure stockée est bien en OUTPUT,
mon probleme était d'envoyer ma command avec executenonquery !

merci pour votre aide
Avatar
Laxa
"aitoz" wrote in message
news:%
ma variable dans ma procédure stockée est bien en OUTPUT,
mon probleme était d'envoyer ma command avec executenonquery !

merci pour votre aide



Pas de quoi :-)
C'est plus un problème .NET que SQL, peut-être crossposte aussi ce genre de
problème sur d'autres newsgroup comme .fr.donet.adonet etc

En ce qui concerne cette logique, depuis .SQL2000 j'utilise des
uniqueidentifier et utilise une table supplémentaire pout tout ce qui est
compteur, juste pour être certain que c'est unique et de plus c'est mon code
en vb.net qui peut créer le guid et donc plus facile pour retourner à coup
sur la valeur après un insert (avant j'utilisais un "insert....; select
@@indetity" pour retourner la valeur sans devoir utiliser de procédure).
Bon d'accord, c'est moins clair quand on consulte les tables en enterprise
manager ou query analyzer etc mais bon depuis le temps mes yeux se sont
habitué aux guid :-))


Pascal
Avatar
Fred BROUARD
votre faon de procéder risque de conduire un jour ou l'autre à une
"désintégration" de la base de données.
En effet, le calcul de clef, quelles qu'elle soient doit se faire dans une
transaction au niveau SERIALIZABLE et les n° consommés doivent être stocké dans
une table.
posez vous la question de savoir ce qui se passe dans votre code si deux
utilisateurs distints effectuent le même travail sur les mêmes données au même
moment. Et ne me dite pas que cela est impossible : cela arrivera !

A lire sur le sujet :
http://sqlpro.developpez.com/cours/clefs/

A +

aitoz a écrit:
Bonjour a tous,

je voudrais savoir comment récuperer une valeur pour procédure stockée ?
est-ce que vous avez un doc sur internet qui explique ca.

Mon probleme rapidement, je veux obtenir un N° de ligne pour mes lignes dans
mon Bon de livraison.
Pour ca je voudrais obtenir le N° de ligne le plus élévé (MAX) et lui
ajouter +1 pour avoir mon nouveau n° de ligne.
C'est bien parce que comme ca si quelqu'un supprime une ligne il ne pourra
pas réutiliser le N° dans le meme BL.

j'ai une procédure stockée pour ajouter la ligne du BL et je voudrais y
ajouter une fonction pour justement récupérer mon N° de ligne ??

Merci pour vos infos et bonne journée

Ps : Mon interface graphique est en vb.net





--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************