OVH Cloud OVH Cloud

question fonctionnelle sur une appli SQL

9 réponses
Avatar
jeorme
Bonjour à tous.


Je dois créer une appli avec une base SQL.

Dans cette appli je dois insérer des données dans une table Stock. Chaque
enregistrement est défini par une clé numéro de colis / code fournisseur
unique.

Mon problème est que je stocke dans une autre table le dernier numéro de
colis. Je ne peux pas faire un Max de mon numéro car je pourrait avoir un
numéro d'un fournisseur très grand qui me fausserai tout.

Donc je cherche à faire une Procédure stockée qui me récupère le dernier
numéro dans une table , qui insère ce numéro et les autres infos dans une
table stock et qui incrémente mon numéro pour le colis suivant.

Mon souci est que mon appli sera multi user, multi poste etc... Donc comment
puis je être sur que je n'aurais pas de doublon. (il faut bloquer la table
ou dans la proc mettre un blocage) mais je sais pas comment faire.

De plus je dois renvoyer en parametre mon dernier numéro pour l'impression

Exemple:

create procedure test

@produit char(10),
@fournisseur char(10),
@colis int OUTPUT

AS

declare @LastNumero int

Select @lastnumero = lastnumero from DernierNum

Insert into stock (colis, fournisseur, produit )
values(@lastnumero, @fournisseur, @produit)

update DernierNumero
set lastnumero = @lastnumero + 1 From DernierNum

select @colis = @lastNumero


Voila ma PS . Quelqu'un sait il comment faire en sorte que je ne puisse pas
avoir de souci de doublons entre deux user.

Merci d'avance

9 réponses

Avatar
Laurent MOREAU
Il te suffit de declarer dans ta table stock le champ colis en Identity
(également appelé numéro auto)

pour récupérer sa valeur apres un insert faire SELECT @@identity



create procedure test
@produit char(10),
@fournisseur char(10)

AS
Insert into stock (fournisseur, produit )
values(@fournisseur, @produit)

Select @@identity AS LeDernierNumeroDeColisQuiVientDetreInsere



Laurent.





"jeorme" wrote in message
news:
Bonjour à tous.


Je dois créer une appli avec une base SQL.

Dans cette appli je dois insérer des données dans une table Stock. Chaque
enregistrement est défini par une clé numéro de colis / code fournisseur
unique.

Mon problème est que je stocke dans une autre table le dernier numéro de
colis. Je ne peux pas faire un Max de mon numéro car je pourrait avoir un
numéro d'un fournisseur très grand qui me fausserai tout.

Donc je cherche à faire une Procédure stockée qui me récupère le dernier
numéro dans une table , qui insère ce numéro et les autres infos dans une
table stock et qui incrémente mon numéro pour le colis suivant.

Mon souci est que mon appli sera multi user, multi poste etc... Donc


comment
puis je être sur que je n'aurais pas de doublon. (il faut bloquer la table
ou dans la proc mettre un blocage) mais je sais pas comment faire.

De plus je dois renvoyer en parametre mon dernier numéro pour l'impression

Exemple:

create procedure test

@produit char(10),
@fournisseur char(10),
@colis int OUTPUT

AS

declare @LastNumero int

Select @lastnumero = lastnumero from DernierNum

Insert into stock (colis, fournisseur, produit )
values(@lastnumero, @fournisseur, @produit)

update DernierNumero
set lastnumero = @lastnumero + 1 From DernierNum

select @colis = @lastNumero


Voila ma PS . Quelqu'un sait il comment faire en sorte que je ne puisse


pas
avoir de souci de doublons entre deux user.

Merci d'avance





Avatar
jeorme
Bonjour,

mon problème est que je ne veux pas avoir un numéro auto car des fois
j'aurais des numéros qui viennent de l'extérieur par EDI.


"Laurent MOREAU" <l.moreau(enleverceci)@systonic.fr> a écrit dans le message
de news: d7hrml$kmm$
Il te suffit de declarer dans ta table stock le champ colis en Identity
(également appelé numéro auto)

pour récupérer sa valeur apres un insert faire SELECT @@identity



create procedure test
@produit char(10),
@fournisseur char(10)

AS
Insert into stock (fournisseur, produit )
values(@fournisseur, @produit)

Select @@identity AS LeDernierNumeroDeColisQuiVientDetreInsere



Laurent.





"jeorme" wrote in message
news:
> Bonjour à tous.
>
>
> Je dois créer une appli avec une base SQL.
>
> Dans cette appli je dois insérer des données dans une table Stock.


Chaque
> enregistrement est défini par une clé numéro de colis / code fournisseur
> unique.
>
> Mon problème est que je stocke dans une autre table le dernier numéro de
> colis. Je ne peux pas faire un Max de mon numéro car je pourrait avoir


un
> numéro d'un fournisseur très grand qui me fausserai tout.
>
> Donc je cherche à faire une Procédure stockée qui me récupère le dernier
> numéro dans une table , qui insère ce numéro et les autres infos dans


une
> table stock et qui incrémente mon numéro pour le colis suivant.
>
> Mon souci est que mon appli sera multi user, multi poste etc... Donc
comment
> puis je être sur que je n'aurais pas de doublon. (il faut bloquer la


table
> ou dans la proc mettre un blocage) mais je sais pas comment faire.
>
> De plus je dois renvoyer en parametre mon dernier numéro pour


l'impression
>
> Exemple:
>
> create procedure test
>
> @produit char(10),
> @fournisseur char(10),
> @colis int OUTPUT
>
> AS
>
> declare @LastNumero int
>
> Select @lastnumero = lastnumero from DernierNum
>
> Insert into stock (colis, fournisseur, produit )
> values(@lastnumero, @fournisseur, @produit)
>
> update DernierNumero
> set lastnumero = @lastnumero + 1 From DernierNum
>
> select @colis = @lastNumero
>
>
> Voila ma PS . Quelqu'un sait il comment faire en sorte que je ne puisse
pas
> avoir de souci de doublons entre deux user.
>
> Merci d'avance
>
>
>




Avatar
Laurent MOREAU
create procedure test

@produit char(10),
@fournisseur char(10),
@colis int OUTPUT

AS

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION
SELECT @colis = MAX(Colis)+1 FROM Stock
INSERT INTO Stock (Colis, Fournisseur, Produit )
VALUES(@colis , @fournisseur, @produit)
COMMIT TRANSACTION
SET TRANSACTION ISOLATION LEVEL READ COMMITTED

Laurent.




"jeorme" wrote in message
news:
Bonjour,

mon problème est que je ne veux pas avoir un numéro auto car des fois
j'aurais des numéros qui viennent de l'extérieur par EDI.


"Laurent MOREAU" <l.moreau(enleverceci)@systonic.fr> a écrit dans le


message
de news: d7hrml$kmm$
> Il te suffit de declarer dans ta table stock le champ colis en Identity
> (également appelé numéro auto)
>
> pour récupérer sa valeur apres un insert faire SELECT @@identity
>
>
>
> create procedure test
> @produit char(10),
> @fournisseur char(10)
>
> AS
> Insert into stock (fournisseur, produit )
> values(@fournisseur, @produit)
>
> Select @@identity AS LeDernierNumeroDeColisQuiVientDetreInsere
>
>
>
> Laurent.
>
>
>
>
>
> "jeorme" wrote in message
> news:
> > Bonjour à tous.
> >
> >
> > Je dois créer une appli avec une base SQL.
> >
> > Dans cette appli je dois insérer des données dans une table Stock.
Chaque
> > enregistrement est défini par une clé numéro de colis / code


fournisseur
> > unique.
> >
> > Mon problème est que je stocke dans une autre table le dernier numéro


de
> > colis. Je ne peux pas faire un Max de mon numéro car je pourrait avoir
un
> > numéro d'un fournisseur très grand qui me fausserai tout.
> >
> > Donc je cherche à faire une Procédure stockée qui me récupère le


dernier
> > numéro dans une table , qui insère ce numéro et les autres infos dans
une
> > table stock et qui incrémente mon numéro pour le colis suivant.
> >
> > Mon souci est que mon appli sera multi user, multi poste etc... Donc
> comment
> > puis je être sur que je n'aurais pas de doublon. (il faut bloquer la
table
> > ou dans la proc mettre un blocage) mais je sais pas comment faire.
> >
> > De plus je dois renvoyer en parametre mon dernier numéro pour
l'impression
> >
> > Exemple:
> >
> > create procedure test
> >
> > @produit char(10),
> > @fournisseur char(10),
> > @colis int OUTPUT
> >
> > AS
> >
> > declare @LastNumero int
> >
> > Select @lastnumero = lastnumero from DernierNum
> >
> > Insert into stock (colis, fournisseur, produit )
> > values(@lastnumero, @fournisseur, @produit)
> >
> > update DernierNumero
> > set lastnumero = @lastnumero + 1 From DernierNum
> >
> > select @colis = @lastNumero
> >
> >
> > Voila ma PS . Quelqu'un sait il comment faire en sorte que je ne


puisse
> pas
> > avoir de souci de doublons entre deux user.
> >
> > Merci d'avance
> >
> >
> >
>
>




Avatar
Fred BROUARD
Cette manière de faire n'est pas bonne du tout

1) aucune gestion d'erreur si le SELECT ne se fait pas
2) blocage de toute la table => performances lamentable possibilité de blocage,
etc...
Le seul moyen de réaliser ce genre de choses proprement est de rajouter une
table de clefs comme indiqué dans l'article que j'ai rédigé :
http://sqlpro.developpez.com/cours/clefs/#L3.2

En ce qui concerne les ajouts avec clef valuée, il suffit de revaluer la clef de
la table des clefs AVANT l'insertion définitive.

Voir avec => les corrections de ton code

Laurent MOREAU a écrit:
create procedure test

@produit char(10),
@fournisseur char(10),
@colis int OUTPUT

AS

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION
SELECT @colis = MAX(Colis)+1 FROM Stock


=> IF @@ERROR <> 0 GOTO TRAITE_ERREUR
INSERT INTO Stock (Colis, Fournisseur, Produit )
VALUES(@colis , @fournisseur, @produit)


=> IF @@ERROR <> 0 GOTO TRAITE_ERREUR
COMMIT TRANSACTION


=> RETURN TRAITE_ERREUR:
=> ROLLBACK
SET TRANSACTION ISOLATION LEVEL READ COMMITTED





A +

Laurent.




"jeorme" wrote in message
news:

Bonjour,

mon problème est que je ne veux pas avoir un numéro auto car des fois
j'aurais des numéros qui viennent de l'extérieur par EDI.


"Laurent MOREAU" <l.moreau(enleverceci)@systonic.fr> a écrit dans le



message

de news: d7hrml$kmm$

Il te suffit de declarer dans ta table stock le champ colis en Identity
(également appelé numéro auto)

pour récupérer sa valeur apres un insert faire SELECT @@identity



create procedure test
@produit char(10),
@fournisseur char(10)

AS
Insert into stock (fournisseur, produit )
values(@fournisseur, @produit)

Select @@identity AS LeDernierNumeroDeColisQuiVientDetreInsere



Laurent.





"jeorme" wrote in message
news:

Bonjour à tous.


Je dois créer une appli avec une base SQL.

Dans cette appli je dois insérer des données dans une table Stock.





Chaque

enregistrement est défini par une clé numéro de colis / code







fournisseur

unique.

Mon problème est que je stocke dans une autre table le dernier numéro







de

colis. Je ne peux pas faire un Max de mon numéro car je pourrait avoir





un

numéro d'un fournisseur très grand qui me fausserai tout.

Donc je cherche à faire une Procédure stockée qui me récupère le







dernier

numéro dans une table , qui insère ce numéro et les autres infos dans





une

table stock et qui incrémente mon numéro pour le colis suivant.

Mon souci est que mon appli sera multi user, multi poste etc... Donc



comment

puis je être sur que je n'aurais pas de doublon. (il faut bloquer la





table

ou dans la proc mettre un blocage) mais je sais pas comment faire.

De plus je dois renvoyer en parametre mon dernier numéro pour





l'impression

Exemple:

create procedure test

@produit char(10),
@fournisseur char(10),
@colis int OUTPUT

AS

declare @LastNumero int

Select @lastnumero = lastnumero from DernierNum

Insert into stock (colis, fournisseur, produit )
values(@lastnumero, @fournisseur, @produit)

update DernierNumero
set lastnumero = @lastnumero + 1 From DernierNum

select @colis = @lastNumero


Voila ma PS . Quelqu'un sait il comment faire en sorte que je ne







puisse

pas

avoir de souci de doublons entre deux user.

Merci d'avance

















--
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 *************************
Avatar
jeorme
merci beaucoup
Simple question

" SET TRANSACTION ISOLATION LEVEL SERIALIZABLE"

y a t-il un danger à utiliser cette option ?

Merci


"Laurent MOREAU" <l.moreau(enleverceci)@systonic.fr> a écrit dans le message
de news: d7jst3$mhk$
create procedure test

@produit char(10),
@fournisseur char(10),
@colis int OUTPUT

AS

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION
SELECT @colis = MAX(Colis)+1 FROM Stock
INSERT INTO Stock (Colis, Fournisseur, Produit )
VALUES(@colis , @fournisseur, @produit)
COMMIT TRANSACTION
SET TRANSACTION ISOLATION LEVEL READ COMMITTED

Laurent.




"jeorme" wrote in message
news:
> Bonjour,
>
> mon problème est que je ne veux pas avoir un numéro auto car des fois
> j'aurais des numéros qui viennent de l'extérieur par EDI.
>
>
> "Laurent MOREAU" <l.moreau(enleverceci)@systonic.fr> a écrit dans le
message
> de news: d7hrml$kmm$
> > Il te suffit de declarer dans ta table stock le champ colis en


Identity
> > (également appelé numéro auto)
> >
> > pour récupérer sa valeur apres un insert faire SELECT @@identity
> >
> >
> >
> > create procedure test
> > @produit char(10),
> > @fournisseur char(10)
> >
> > AS
> > Insert into stock (fournisseur, produit )
> > values(@fournisseur, @produit)
> >
> > Select @@identity AS LeDernierNumeroDeColisQuiVientDetreInsere
> >
> >
> >
> > Laurent.
> >
> >
> >
> >
> >
> > "jeorme" wrote in message
> > news:
> > > Bonjour à tous.
> > >
> > >
> > > Je dois créer une appli avec une base SQL.
> > >
> > > Dans cette appli je dois insérer des données dans une table Stock.
> Chaque
> > > enregistrement est défini par une clé numéro de colis / code
fournisseur
> > > unique.
> > >
> > > Mon problème est que je stocke dans une autre table le dernier


numéro
de
> > > colis. Je ne peux pas faire un Max de mon numéro car je pourrait


avoir
> un
> > > numéro d'un fournisseur très grand qui me fausserai tout.
> > >
> > > Donc je cherche à faire une Procédure stockée qui me récupère le
dernier
> > > numéro dans une table , qui insère ce numéro et les autres infos


dans
> une
> > > table stock et qui incrémente mon numéro pour le colis suivant.
> > >
> > > Mon souci est que mon appli sera multi user, multi poste etc... Donc
> > comment
> > > puis je être sur que je n'aurais pas de doublon. (il faut bloquer la
> table
> > > ou dans la proc mettre un blocage) mais je sais pas comment faire.
> > >
> > > De plus je dois renvoyer en parametre mon dernier numéro pour
> l'impression
> > >
> > > Exemple:
> > >
> > > create procedure test
> > >
> > > @produit char(10),
> > > @fournisseur char(10),
> > > @colis int OUTPUT
> > >
> > > AS
> > >
> > > declare @LastNumero int
> > >
> > > Select @lastnumero = lastnumero from DernierNum
> > >
> > > Insert into stock (colis, fournisseur, produit )
> > > values(@lastnumero, @fournisseur, @produit)
> > >
> > > update DernierNumero
> > > set lastnumero = @lastnumero + 1 From DernierNum
> > >
> > > select @colis = @lastNumero
> > >
> > >
> > > Voila ma PS . Quelqu'un sait il comment faire en sorte que je ne
puisse
> > pas
> > > avoir de souci de doublons entre deux user.
> > >
> > > Merci d'avance
> > >
> > >
> > >
> >
> >
>
>




Avatar
jeorme
merci FRED pour ta réponse.
Simple question :

Les clefs valués c'est quoi ?

"Fred BROUARD" a écrit dans le message de news:

Cette manière de faire n'est pas bonne du tout

1) aucune gestion d'erreur si le SELECT ne se fait pas
2) blocage de toute la table => performances lamentable possibilité de


blocage,
etc...
Le seul moyen de réaliser ce genre de choses proprement est de rajouter


une
table de clefs comme indiqué dans l'article que j'ai rédigé :
http://sqlpro.developpez.com/cours/clefs/#L3.2

En ce qui concerne les ajouts avec clef valuée, il suffit de revaluer la


clef de
la table des clefs AVANT l'insertion définitive.

Voir avec => les corrections de ton code

Laurent MOREAU a écrit:
> create procedure test
>
> @produit char(10),
> @fournisseur char(10),
> @colis int OUTPUT
>
> AS
>
> SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
> BEGIN TRANSACTION
> SELECT @colis = MAX(Colis)+1 FROM Stock
=> IF @@ERROR <> 0 GOTO TRAITE_ERREUR
> INSERT INTO Stock (Colis, Fournisseur, Produit )
> VALUES(@colis , @fournisseur, @produit)
=> IF @@ERROR <> 0 GOTO TRAITE_ERREUR
> COMMIT TRANSACTION
=> RETURN TRAITE_ERREUR:
=> ROLLBACK
> SET TRANSACTION ISOLATION LEVEL READ COMMITTED
>


A +

> Laurent.
>
>
>
>
> "jeorme" wrote in message
> news:
>
>>Bonjour,
>>
>>mon problème est que je ne veux pas avoir un numéro auto car des fois
>>j'aurais des numéros qui viennent de l'extérieur par EDI.
>>
>>
>>"Laurent MOREAU" <l.moreau(enleverceci)@systonic.fr> a écrit dans le
>
> message
>
>>de news: d7hrml$kmm$
>>
>>>Il te suffit de declarer dans ta table stock le champ colis en Identity
>>>(également appelé numéro auto)
>>>
>>>pour récupérer sa valeur apres un insert faire SELECT @@identity
>>>
>>>
>>>
>>>create procedure test
>>>@produit char(10),
>>>@fournisseur char(10)
>>>
>>>AS
>>>Insert into stock (fournisseur, produit )
>>>values(@fournisseur, @produit)
>>>
>>>Select @@identity AS LeDernierNumeroDeColisQuiVientDetreInsere
>>>
>>>
>>>
>>>Laurent.
>>>
>>>
>>>
>>>
>>>
>>>"jeorme" wrote in message
>>>news:
>>>
>>>>Bonjour à tous.
>>>>
>>>>
>>>>Je dois créer une appli avec une base SQL.
>>>>
>>>>Dans cette appli je dois insérer des données dans une table Stock.
>>
>>Chaque
>>
>>>>enregistrement est défini par une clé numéro de colis / code
>
> fournisseur
>
>>>>unique.
>>>>
>>>>Mon problème est que je stocke dans une autre table le dernier numéro
>
> de
>
>>>>colis. Je ne peux pas faire un Max de mon numéro car je pourrait avoir
>>
>>un
>>
>>>>numéro d'un fournisseur très grand qui me fausserai tout.
>>>>
>>>>Donc je cherche à faire une Procédure stockée qui me récupère le
>
> dernier
>
>>>>numéro dans une table , qui insère ce numéro et les autres infos dans
>>
>>une
>>
>>>>table stock et qui incrémente mon numéro pour le colis suivant.
>>>>
>>>>Mon souci est que mon appli sera multi user, multi poste etc... Donc
>>>
>>>comment
>>>
>>>>puis je être sur que je n'aurais pas de doublon. (il faut bloquer la
>>
>>table
>>
>>>>ou dans la proc mettre un blocage) mais je sais pas comment faire.
>>>>
>>>>De plus je dois renvoyer en parametre mon dernier numéro pour
>>
>>l'impression
>>
>>>>Exemple:
>>>>
>>>>create procedure test
>>>>
>>>>@produit char(10),
>>>>@fournisseur char(10),
>>>>@colis int OUTPUT
>>>>
>>>>AS
>>>>
>>>>declare @LastNumero int
>>>>
>>>>Select @lastnumero = lastnumero from DernierNum
>>>>
>>>>Insert into stock (colis, fournisseur, produit )
>>>>values(@lastnumero, @fournisseur, @produit)
>>>>
>>>>update DernierNumero
>>>>set lastnumero = @lastnumero + 1 From DernierNum
>>>>
>>>>select @colis = @lastNumero
>>>>
>>>>
>>>>Voila ma PS . Quelqu'un sait il comment faire en sorte que je ne
>
> puisse
>
>>>pas
>>>
>>>>avoir de souci de doublons entre deux user.
>>>>
>>>>Merci d'avance
>>>>
>>>>
>>>>
>>>
>>>
>>
>
>

--
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 *************************



Avatar
Fred BROUARD
jeorme a écrit:
merci FRED pour ta réponse.
Simple question :

Les clefs valués c'est quoi ?



Une clef qui possède une valeur.

Tu dis que soit tu veut générer une nouvelle valeur (clef non valuée) soit
importer un tuple contenant déjà une clef (clef valuée).

A +


"Fred BROUARD" a écrit dans le message de news:


Cette manière de faire n'est pas bonne du tout

1) aucune gestion d'erreur si le SELECT ne se fait pas
2) blocage de toute la table => performances lamentable possibilité de



blocage,

etc...
Le seul moyen de réaliser ce genre de choses proprement est de rajouter



une

table de clefs comme indiqué dans l'article que j'ai rédigé :
http://sqlpro.developpez.com/cours/clefs/#L3.2

En ce qui concerne les ajouts avec clef valuée, il suffit de revaluer la



clef de

la table des clefs AVANT l'insertion définitive.

Voir avec => les corrections de ton code

Laurent MOREAU a écrit:

create procedure test

@produit char(10),
@fournisseur char(10),
@colis int OUTPUT

AS

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION
SELECT @colis = MAX(Colis)+1 FROM Stock



=> IF @@ERROR <> 0 GOTO TRAITE_ERREUR

INSERT INTO Stock (Colis, Fournisseur, Produit )
VALUES(@colis , @fournisseur, @produit)



=> IF @@ERROR <> 0 GOTO TRAITE_ERREUR

COMMIT TRANSACTION



=> RETURN TRAITE_ERREUR:
=> ROLLBACK

SET TRANSACTION ISOLATION LEVEL READ COMMITTED





A +


Laurent.




"jeorme" wrote in message
news:


Bonjour,

mon problème est que je ne veux pas avoir un numéro auto car des fois
j'aurais des numéros qui viennent de l'extérieur par EDI.


"Laurent MOREAU" <l.moreau(enleverceci)@systonic.fr> a écrit dans le



message


de news: d7hrml$kmm$


Il te suffit de declarer dans ta table stock le champ colis en Identity
(également appelé numéro auto)

pour récupérer sa valeur apres un insert faire SELECT @@identity



create procedure test
@produit char(10),
@fournisseur char(10)

AS
Insert into stock (fournisseur, produit )
values(@fournisseur, @produit)

Select @@identity AS LeDernierNumeroDeColisQuiVientDetreInsere



Laurent.





"jeorme" wrote in message
news:


Bonjour à tous.


Je dois créer une appli avec une base SQL.

Dans cette appli je dois insérer des données dans une table Stock.





Chaque


enregistrement est défini par une clé numéro de colis / code







fournisseur


unique.

Mon problème est que je stocke dans une autre table le dernier numéro







de


colis. Je ne peux pas faire un Max de mon numéro car je pourrait avoir





un


numéro d'un fournisseur très grand qui me fausserai tout.

Donc je cherche à faire une Procédure stockée qui me récupère le







dernier


numéro dans une table , qui insère ce numéro et les autres infos dans





une


table stock et qui incrémente mon numéro pour le colis suivant.

Mon souci est que mon appli sera multi user, multi poste etc... Donc



comment


puis je être sur que je n'aurais pas de doublon. (il faut bloquer la





table


ou dans la proc mettre un blocage) mais je sais pas comment faire.

De plus je dois renvoyer en parametre mon dernier numéro pour





l'impression


Exemple:

create procedure test

@produit char(10),
@fournisseur char(10),
@colis int OUTPUT

AS

declare @LastNumero int

Select @lastnumero = lastnumero from DernierNum

Insert into stock (colis, fournisseur, produit )
values(@lastnumero, @fournisseur, @produit)

update DernierNumero
set lastnumero = @lastnumero + 1 From DernierNum

select @colis = @lastNumero


Voila ma PS . Quelqu'un sait il comment faire en sorte que je ne







puisse


pas


avoir de souci de doublons entre deux user.

Merci d'avance














--
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 *************************









--
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 *************************
Avatar
jeorme
merci pour l'info
Je viens de lire ton article sur SQLPRO, il ya un truc que je pige pas, en
fait en quoi la PS m'assure que je ne peux pas avoir deux users simultanés.

"Fred BROUARD" a écrit dans le message de news:
#


jeorme a écrit:
> merci FRED pour ta réponse.
> Simple question :
>
> Les clefs valués c'est quoi ?

Une clef qui possède une valeur.

Tu dis que soit tu veut générer une nouvelle valeur (clef non valuée) soit
importer un tuple contenant déjà une clef (clef valuée).

A +

>
> "Fred BROUARD" a écrit dans le message de


news:
>
>
>>Cette manière de faire n'est pas bonne du tout
>>
>>1) aucune gestion d'erreur si le SELECT ne se fait pas
>>2) blocage de toute la table => performances lamentable possibilité de
>
> blocage,
>
>>etc...
>>Le seul moyen de réaliser ce genre de choses proprement est de rajouter
>
> une
>
>>table de clefs comme indiqué dans l'article que j'ai rédigé :
>>http://sqlpro.developpez.com/cours/clefs/#L3.2
>>
>>En ce qui concerne les ajouts avec clef valuée, il suffit de revaluer la
>
> clef de
>
>>la table des clefs AVANT l'insertion définitive.
>>
>>Voir avec => les corrections de ton code
>>
>>Laurent MOREAU a écrit:
>>
>>>create procedure test
>>>
>>>@produit char(10),
>>>@fournisseur char(10),
>>>@colis int OUTPUT
>>>
>>>AS
>>>
>>>SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
>>>BEGIN TRANSACTION
>>>SELECT @colis = MAX(Colis)+1 FROM Stock
>>
>>=> IF @@ERROR <> 0 GOTO TRAITE_ERREUR
>>
>>>INSERT INTO Stock (Colis, Fournisseur, Produit )
>>>VALUES(@colis , @fournisseur, @produit)
>>
>>=> IF @@ERROR <> 0 GOTO TRAITE_ERREUR
>>
>>>COMMIT TRANSACTION
>>
>>=> RETURN TRAITE_ERREUR:
>>=> ROLLBACK
>>
>>>SET TRANSACTION ISOLATION LEVEL READ COMMITTED
>>>
>>
>>
>>A +
>>
>>
>>>Laurent.
>>>
>>>
>>>
>>>
>>>"jeorme" wrote in message
>>>news:
>>>
>>>
>>>>Bonjour,
>>>>
>>>>mon problème est que je ne veux pas avoir un numéro auto car des fois
>>>>j'aurais des numéros qui viennent de l'extérieur par EDI.
>>>>
>>>>
>>>>"Laurent MOREAU" <l.moreau(enleverceci)@systonic.fr> a écrit dans le
>>>
>>>message
>>>
>>>
>>>>de news: d7hrml$kmm$
>>>>
>>>>
>>>>>Il te suffit de declarer dans ta table stock le champ colis en


Identity
>>>>>(également appelé numéro auto)
>>>>>
>>>>>pour récupérer sa valeur apres un insert faire SELECT @@identity
>>>>>
>>>>>
>>>>>
>>>>>create procedure test
>>>>>@produit char(10),
>>>>>@fournisseur char(10)
>>>>>
>>>>>AS
>>>>>Insert into stock (fournisseur, produit )
>>>>>values(@fournisseur, @produit)
>>>>>
>>>>>Select @@identity AS LeDernierNumeroDeColisQuiVientDetreInsere
>>>>>
>>>>>
>>>>>
>>>>>Laurent.
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>"jeorme" wrote in message
>>>>>news:
>>>>>
>>>>>
>>>>>>Bonjour à tous.
>>>>>>
>>>>>>
>>>>>>Je dois créer une appli avec une base SQL.
>>>>>>
>>>>>>Dans cette appli je dois insérer des données dans une table Stock.
>>>>
>>>>Chaque
>>>>
>>>>
>>>>>>enregistrement est défini par une clé numéro de colis / code
>>>
>>>fournisseur
>>>
>>>
>>>>>>unique.
>>>>>>
>>>>>>Mon problème est que je stocke dans une autre table le dernier


numéro
>>>
>>>de
>>>
>>>
>>>>>>colis. Je ne peux pas faire un Max de mon numéro car je pourrait


avoir
>>>>
>>>>un
>>>>
>>>>
>>>>>>numéro d'un fournisseur très grand qui me fausserai tout.
>>>>>>
>>>>>>Donc je cherche à faire une Procédure stockée qui me récupère le
>>>
>>>dernier
>>>
>>>
>>>>>>numéro dans une table , qui insère ce numéro et les autres infos


dans
>>>>
>>>>une
>>>>
>>>>
>>>>>>table stock et qui incrémente mon numéro pour le colis suivant.
>>>>>>
>>>>>>Mon souci est que mon appli sera multi user, multi poste etc... Donc
>>>>>
>>>>>comment
>>>>>
>>>>>
>>>>>>puis je être sur que je n'aurais pas de doublon. (il faut bloquer la
>>>>
>>>>table
>>>>
>>>>
>>>>>>ou dans la proc mettre un blocage) mais je sais pas comment faire.
>>>>>>
>>>>>>De plus je dois renvoyer en parametre mon dernier numéro pour
>>>>
>>>>l'impression
>>>>
>>>>
>>>>>>Exemple:
>>>>>>
>>>>>>create procedure test
>>>>>>
>>>>>>@produit char(10),
>>>>>>@fournisseur char(10),
>>>>>>@colis int OUTPUT
>>>>>>
>>>>>>AS
>>>>>>
>>>>>>declare @LastNumero int
>>>>>>
>>>>>>Select @lastnumero = lastnumero from DernierNum
>>>>>>
>>>>>>Insert into stock (colis, fournisseur, produit )
>>>>>>values(@lastnumero, @fournisseur, @produit)
>>>>>>
>>>>>>update DernierNumero
>>>>>>set lastnumero = @lastnumero + 1 From DernierNum
>>>>>>
>>>>>>select @colis = @lastNumero
>>>>>>
>>>>>>
>>>>>>Voila ma PS . Quelqu'un sait il comment faire en sorte que je ne
>>>
>>>puisse
>>>
>>>
>>>>>pas
>>>>>
>>>>>
>>>>>>avoir de souci de doublons entre deux user.
>>>>>>
>>>>>>Merci d'avance
>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>
>>--
>>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 *************************
>>
>
>
>

--
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 *************************



Avatar
Fred BROUARD
jeorme a écrit:
merci pour l'info
Je viens de lire ton article sur SQLPRO, il ya un truc que je pige pas, en
fait en quoi la PS m'assure que je ne peux pas avoir deux users simultanés.





Quelle SP ?

Elle n'assure pas de ne pas avoir 2 utilisateurs simultané, mais elle traite le
code de façon a ce qu'aucun des utilisateurs ne gène l'autre.

Tout dépend de la présence d'une transaction et de son niveau d'isolation.

A +

--
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 *************************