PS de mises à jour de plusieurs tables

Le
EmanuelL
Bonjour à Tous,

Je voulais vos conseils concernant l'utilisation de la PS ci-dessous.
Le but est de faire les mises à jour des 2 tables qui sont modifiées
sur le même formulaire. :-Z

"ComplementBoucRevi" est une table relationnelle et "Bouclement" est
une table entitée.

Est-il correcte de concevoir une PS pour les mises à jour automatique
de plusieurs tables de cette manières?

Sinon, pouvez-vous mes données de pistes?

CREATE PROCEDURE [dbo].[usp_BoucUpdate](
@Client_ID decimal(10, 0),
@Bouclement_IdLigne smallint,
@Date_RecepDoc datetime,
@Date_BoucProv datetime,
@Date_BoucDefi datetime,
@Commentaire nvarchar(max),
@PvAgRecu bit,
@F103_Envoye bit,
@R25_Envoye bit,
@DeclIntegrite_Recu bit,
@ComplementBoucRevi_IdLigne smallint
)
AS
UPDATE [ComplementBoucRevi]
SET [PvAgRecu] = @PvAgRecu,
[F103_Envoye] = @F103_Envoye,
[R25_Envoye] = @R25_Envoye,
[DeclIntegrite_Recu] = @DeclIntegrite_Recu
WHERE [ComplementBoucRevi_IdLigne] = @ComplementBoucRevi_IdLigne

UPDATE [Bouclement]
SET [Date_RecepDoc] = @Date_RecepDoc,
[Date_BoucProv] = @Date_BoucProv,
[Date_BoucDefi] = @Date_BoucDefi,
[Commentaire] = @Commentaire
WHERE [Bouclement_IdLigne] = @Bouclement_IdLigne
RETURN @@IDENTITY


Merci d'avance. ;-)

--

*!* --
EmanuelL
Membre d'AtoutFox
www.atoutfox.org
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
EmanuelL
Le #20571781
Apparement, ça ne fonctionnement pas correctement.
Car d'après quelques tests, la table "ComplementBoucRevi" ne s'est pas
à jour sans que je puisse comprendre pourquoi!>:|

Quelqu'un a-t'il une idée?

EmanuelL a émis l'idée suivante :
Bonjour à Tous,

Je voulais vos conseils concernant l'utilisation de la PS ci-dessous.
Le but est de faire les mises à jour des 2 tables qui sont modifiées sur le
même formulaire. :-Z

"ComplementBoucRevi" est une table relationnelle et "Bouclement" est une
table entitée.

Est-il correcte de concevoir une PS pour les mises à jour automatique de
plusieurs tables de cette manières?

Sinon, pouvez-vous mes données de pistes?

CREATE PROCEDURE [dbo].[usp_BoucUpdate](
@Client_ID decimal(10, 0),
@Bouclement_IdLigne smallint,
@Date_RecepDoc datetime,
@Date_BoucProv datetime,
@Date_BoucDefi datetime,
@Commentaire nvarchar(max),
@PvAgRecu bit,
@F103_Envoye bit,
@R25_Envoye bit,
@DeclIntegrite_Recu bit,
@ComplementBoucRevi_IdLigne smallint
)
AS
UPDATE [ComplementBoucRevi]
SET [PvAgRecu] = @PvAgRecu,
[F103_Envoye] = @F103_Envoye,
[R25_Envoye] = @R25_Envoye,
[DeclIntegrite_Recu] = @DeclIntegrite_Recu
WHERE [ComplementBoucRevi_IdLigne] = @ComplementBoucRevi_IdLigne

UPDATE [Bouclement]
SET [Date_RecepDoc] = @Date_RecepDoc,
[Date_BoucProv] = @Date_BoucProv,
[Date_BoucDefi] = @Date_BoucDefi,
[Commentaire] = @Commentaire
WHERE [Bouclement_IdLigne] = @Bouclement_IdLigne
RETURN @@IDENTITY


Merci d'avance. ;-)



--

*!* -----------------------------------
EmanuelL
Membre d'AtoutFox
www.atoutfox.org
Patrice
Le #20572071
Bonjour,

Car d'après quelques tests, la table "ComplementBoucRevi" ne s'est pas à
jour sans que je puisse comprendre pourquoi!>:|



Le plus probable est que la valeur de @ComplementBoucRevi_IdLigne n'est pas
bonne...


Exemple :

create table a(pk int identity not null,data varchar(10))
create table b(pk int identity not null,data varchar(10))
go
insert into a values ('A')
insert into b values ('B')
go
create procedure tmp_update(@pk1 int,@data1 varchar(10),@pk2 int,@data2
varchar(10)) as
update a set data=@data1 where pk=@pk1
update b set data=@data2 where pk=@pk2
go
exec tmp_update 1,'C',1,'D'
select * from a
select * from b

affiche bien C et D

Eventuellement moins probable, la procédure stockée est bien créée avec les
deux maj ? Egalement un SET NOCOUNT ON doit pouvoir aider à générer des
messages d'erreurs.

Une amélioration possible serait de mettre éventuellement les deux maj dans
une transaction pour que les deux majs se fassent ou pas selon que l'on
rencontre une erreur ou pas (éventuellement même en vérifiant explictement
@@ROWCOUNT pour vérifier que la mise à jour a bien été effectuée)

Le RETURN @@IDENTITY ne sert à rien (on a pas d'insertion)


--
Patrice
EmanuelL
Le #20572391
Merci beaucoup Patrice,

Ton aide était précieuse, en adaptant ma PS comme ci-dessous, ça
conctionne. ;-)/ :D

CREATE PROCEDURE [dbo].[usp_BoucUpdate](
@Bouclement_IdLigne int,
@Date_RecepDoc datetime,
@Date_BoucProv datetime,
@Date_BoucDefi datetime,
@Commentaire nvarchar(max),
@PvAgRecu bit,
@F103_Envoye bit,
@R25_Envoye bit,
@DeclIntegrite_Recu bit,
@ComplementBoucRevi_IdLigne int
)
AS
--SET NOCOUNT ON

BEGIN TRANSACTION T1
UPDATE [Bouclement]
SET [Date_RecepDoc] = @Date_RecepDoc,
[Date_BoucProv] = @Date_BoucProv,
[Date_BoucDefi] = @Date_BoucDefi,
[Commentaire] = @Commentaire
WHERE [Bouclement_IdLigne] = @Bouclement_IdLigne;

--PRINT @@ROWCOUNT;

UPDATE [ComplementBoucRevi]
SET [PvAgRecu] = @PvAgRecu,
[F103_Envoye] = @F103_Envoye,
[R25_Envoye] = @R25_Envoye,
[DeclIntegrite_Recu] = @DeclIntegrite_Recu
WHERE [ComplementBoucRevi_IdLigne] = @ComplementBoucRevi_IdLigne;

--PRINT @@ROWCOUNT;
COMMIT TRANSACTION T1;
GO


Le 17.11.2009, Patrice a supposé :
Bonjour,

Car d'après quelques tests, la table "ComplementBoucRevi" ne s'est pas à
jour sans que je puisse comprendre pourquoi!>:|



Le plus probable est que la valeur de @ComplementBoucRevi_IdLigne n'est pas
bonne...


Exemple :

create table a(pk int identity not null,data varchar(10))
create table b(pk int identity not null,data varchar(10))
go
insert into a values ('A')
insert into b values ('B')
go
create procedure tmp_update(@pk1 int,@data1 varchar(10),@pk2 int,@data2
varchar(10)) as
update a set data=@data1 where pk=@pk1
update b set data=@data2 where pk=@pk2
go
exec tmp_update 1,'C',1,'D'
select * from a
select * from b

affiche bien C et D

Eventuellement moins probable, la procédure stockée est bien créée avec les
deux maj ? Egalement un SET NOCOUNT ON doit pouvoir aider à générer des
messages d'erreurs.

Une amélioration possible serait de mettre éventuellement les deux maj dans
une transaction pour que les deux majs se fassent ou pas selon que l'on
rencontre une erreur ou pas (éventuellement même en vérifiant explictement
@@ROWCOUNT pour vérifier que la mise à jour a bien été effectuée)

Le RETURN @@IDENTITY ne sert à rien (on a pas d'insertion)



--

*!* -----------------------------------
EmanuelL
Membre d'AtoutFox
www.atoutfox.org
Publicité
Poster une réponse
Anonyme