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

Trigger complexe... Probleme

2 réponses
Avatar
B. Neve
Bonjour,

Mes connaissance sont assez basiques en Transac-SQL. J'ai fait un trigger
dont le but est le suivant :
Lors de certains INSERT ou UPDATE d'une table (LIGORSR), je voudrais
alimenter une table (DISPON) avec 2 enregistrements. Cela a l'air de
fontionner mais j'ai oublié une notion TRES importante... Elle ne fonctionne
que si la table Inserted ne contient qu'UN seul enregistrement. Je ne
comprends pas comment la transformer pour qu'elle fonctionne pour CHACUNE
des lignes de mon Update comme par exemple avec un UPDATE du type :
UPDATE LIGORSR SET DATE1='20030402'

Merci d'avance de vos lumières.

B. Neve
Un programmeur en détresse


CREATE TRIGGER UPDLIGORSR ON [dbo].[LIGORSR]
FOR INSERT,UPDATE
AS
DECLARE @newLOCLEUNIK bigint
DECLARE @DAYTOADD int
DECLARE @DAYTOREM int
DECLARE @newDATE1 CHAR(8)
DECLARE @newDATE2 CHAR(8)
DECLARE @newCODEARTICL VARCHAR(20)
DECLARE @newQUANTITE REAL
DECLARE @newQUANTOPT REAL
DECLARE @newCODESTATUS TINYINT
DECLARE @newWACLEUNIK bigint
DECLARE @newSTOREID bigint
DECLARE @newARTLOTID bigint
SELECT @newLOCLEUNIK =(SELECT LOCLEUNIK FROM Inserted)
SELECT @newCODEARTICL =(SELECT CODEARTICL FROM Inserted)
SELECT @DAYTOADD=(SELECT NAAFTER FROM ARTICLE WHERE
CODEARTICL=@newCODEARTICL)
SELECT @DAYTOREM=(SELECT NABEFORE FROM ARTICLE WHERE
CODEARTICL=@newCODEARTICL)
SELECT @newDATE1 =(SELECT DATE1 FROM Inserted)
SELECT @newDATE1=dbo.Get_Right_Date(DATEADD(day,@DAYTOADD,@newDATE1))
SELECT @newDATE2 =(SELECT DATE2 FROM Inserted)
SELECT @newDATE2 =dbo.Get_Right_Date(DATEADD(day,@DAYTOREM,@newDATE2))
SELECT @newQUANTITE =(SELECT QUANTITE FROM Inserted)
SELECT @newCODESTATUS =(SELECT CODESTATUS FROM Inserted)
SELECT @newWACLEUNIK =(SELECT WACLEUNIKD FROM Inserted)
SELECT @newSTOREID =(SELECT STOREID FROM Inserted)
SELECT @newARTLOTID =(SELECT ARTLOTID FROM Inserted)
DELETE FROM DISPON WHERE LOCLEUNIK=@newLOCLEUNIK
AGAIN:
IF (SELECT GESTIONEP FROM Inserted)=1 AND (SELECT CODESTATUS FROM
Inserted)>1
BEGIN
IF (SELECT ARTICLE.WHUSED FROM ARTICLE WHERE
ARTICLE.CODEARTICL=@newCODEARTICL)=2 AND @newCODESTATUS=5
BEGIN
UPDATE ARTICLE
SET WHUSED=0 WHERE ARTICLE.CODEARTICL=@newCODEARTICL
END
IF @newCODESTATUS>2 AND @newCODESTATUS<5
BEGIN
INSERT INTO DISPON (LOCLEUNIK,
DATE1,CODEARTICL,ORDRE,QUANTITE,QUANTOPT,CODESTATUS,WACLEUNIK,STOREID,ARTLOT
ID)
VALUES
(@newLOCLEUNIK,@newDATE1,@newCODEARTICL,'Z',-@newQUANTITE,0,@newCODESTATUS,@
newWACLEUNIK,@newSTOREID,@newARTLOTID)
END
IF @newCODESTATUS=2
BEGIN
INSERT INTO DISPON (LOCLEUNIK,
DATE1,CODEARTICL,ORDRE,QUANTITE,QUANTOPT,CODESTATUS,WACLEUNIK,STOREID,ARTLOT
ID)
VALUES
(@newLOCLEUNIK,@newDATE1,@newCODEARTICL,'Z',0,-@newQUANTITE,@newCODESTATUS,@
newWACLEUNIK,@newSTOREID,@newARTLOTID)
END
IF (SELECT TYPELIGNE FROM Inserted)<>3 AND @newCODESTATUS<7
BEGIN
IF @newCODESTATUS>2
BEGIN
INSERT INTO DISPON (LOCLEUNIK,
DATE1,CODEARTICL,ORDRE,QUANTITE,QUANTOPT,CODESTATUS,WACLEUNIK,STOREID,ARTLOT
ID)
VALUES
(@newLOCLEUNIK,@newDATE2,@newCODEARTICL,'A',@newQUANTITE,0,@newCODESTATUS,@n
ewWACLEUNIK,@newSTOREID,@newARTLOTID)
END
IF @newCODESTATUS=2
BEGIN
INSERT INTO DISPON (LOCLEUNIK,
DATE1,CODEARTICL,ORDRE,QUANTITE,QUANTOPT,CODESTATUS,WACLEUNIK,STOREID,ARTLOT
ID)
VALUES
(@newLOCLEUNIK,@newDATE2,@newCODEARTICL,'A',0,@newQUANTITE,@newCODESTATUS,@n
ewWACLEUNIK,@newSTOREID,@newARTLOTID)
END
END
IF @DAYTOADD>0 AND @newCODESTATUS=7
BEGIN
INSERT INTO DISPON (LOCLEUNIK,
DATE1,CODEARTICL,ORDRE,QUANTITE,QUANTOPT,CODESTATUS,WACLEUNIK,STOREID,ARTLOT
ID)
VALUES
(@newLOCLEUNIK,@newDATE2,@newCODEARTICL,'Z',-@newQUANTITE,0,10,@newWACLEUNIK
,@newSTOREID,@newARTLOTID)
SELECT @newDATE2 =dbo.Get_Right_Date(DATEADD(day,@DAYTOADD,@newDATE2))
INSERT INTO DISPON (LOCLEUNIK,
DATE1,CODEARTICL,ORDRE,QUANTITE,QUANTOPT,CODESTATUS,WACLEUNIK,STOREID,ARTLOT
ID)
VALUES
(@newLOCLEUNIK,@newDATE2,@newCODEARTICL,'A',@newQUANTITE,0,10,@newWACLEUNIK,
@newSTOREID,@newARTLOTID)
END
END
SELECT @newCODEARTICL=(SELECT FIELD6 FROM ARTICLE WHERE
CODEARTICL=@newCODEARTICL)
PRINT @newCODEARTICL
IF @newCODEARTICL<>"" GOTO AGAIN

2 réponses

Avatar
Fred BROUARD
Simplifie en faisant :
SELECT @newLOCLEUNIK = LOCLEUNIK,
@newCODEARTICL =CODEARTICL,
@newDATE1 ÚTE1,
@newDATE2 ÚTE2,
@newQUANTITE =QUANTITE,
@newCODESTATUS =CODESTATUS,
@newWACLEUNIK = WACLEUNIKD,
@newSTOREID = STOREID,
...

FROM Inserted


2) utilise un CURSOR for update

3) réécriture strictement ensembliste possible.

Mais sans documenter ton truc, c'est très difficile

A +

B. Neve a écrit:
Bonjour,

Mes connaissance sont assez basiques en Transac-SQL. J'ai fait un trigger
dont le but est le suivant :
Lors de certains INSERT ou UPDATE d'une table (LIGORSR), je voudrais
alimenter une table (DISPON) avec 2 enregistrements. Cela a l'air de
fontionner mais j'ai oublié une notion TRES importante... Elle ne fonctionne
que si la table Inserted ne contient qu'UN seul enregistrement. Je ne
comprends pas comment la transformer pour qu'elle fonctionne pour CHACUNE
des lignes de mon Update comme par exemple avec un UPDATE du type :
UPDATE LIGORSR SET DATE1='20030402'

Merci d'avance de vos lumières.

B. Neve
Un programmeur en détresse


CREATE TRIGGER UPDLIGORSR ON [dbo].[LIGORSR]
FOR INSERT,UPDATE
AS
DECLARE @newLOCLEUNIK bigint
DECLARE @DAYTOADD int
DECLARE @DAYTOREM int
DECLARE @newDATE1 CHAR(8)
DECLARE @newDATE2 CHAR(8)
DECLARE @newCODEARTICL VARCHAR(20)
DECLARE @newQUANTITE REAL
DECLARE @newQUANTOPT REAL
DECLARE @newCODESTATUS TINYINT
DECLARE @newWACLEUNIK bigint
DECLARE @newSTOREID bigint
DECLARE @newARTLOTID bigint
SELECT @newLOCLEUNIK =(SELECT LOCLEUNIK FROM Inserted)
SELECT @newCODEARTICL =(SELECT CODEARTICL FROM Inserted)
SELECT @DAYTOADD=(SELECT NAAFTER FROM ARTICLE WHERE
CODEARTICL=@newCODEARTICL)
SELECT @DAYTOREM=(SELECT NABEFORE FROM ARTICLE WHERE
CODEARTICL=@newCODEARTICL)
SELECT @newDATE1 =(SELECT DATE1 FROM Inserted)
SELECT @newDATE1Ûo.Get_Right_Date(DATEADD(day,@DAYTOADD,@newDATE1))
SELECT @newDATE2 =(SELECT DATE2 FROM Inserted)
SELECT @newDATE2 Ûo.Get_Right_Date(DATEADD(day,@DAYTOREM,@newDATE2))
SELECT @newQUANTITE =(SELECT QUANTITE FROM Inserted)
SELECT @newCODESTATUS =(SELECT CODESTATUS FROM Inserted)
SELECT @newWACLEUNIK =(SELECT WACLEUNIKD FROM Inserted)
SELECT @newSTOREID =(SELECT STOREID FROM Inserted)
SELECT @newARTLOTID =(SELECT ARTLOTID FROM Inserted)
DELETE FROM DISPON WHERE LOCLEUNIK=@newLOCLEUNIK
AGAIN:
IF (SELECT GESTIONEP FROM Inserted)=1 AND (SELECT CODESTATUS FROM
Inserted)>1
BEGIN
IF (SELECT ARTICLE.WHUSED FROM ARTICLE WHERE
ARTICLE.CODEARTICL=@newCODEARTICL)=2 AND @newCODESTATUS=5
BEGIN
UPDATE ARTICLE
SET WHUSED=0 WHERE ARTICLE.CODEARTICL=@newCODEARTICL
END
IF @newCODESTATUS>2 AND @newCODESTATUS<5
BEGIN
INSERT INTO DISPON (LOCLEUNIK,
DATE1,CODEARTICL,ORDRE,QUANTITE,QUANTOPT,CODESTATUS,WACLEUNIK,STOREID,ARTLOT
ID)
VALUES
(@newLOCLEUNIK,@newDATE1,@newCODEARTICL,'Z',,0,@newCODESTATUS,@
newWACLEUNIK,@newSTOREID,@newARTLOTID)
END
IF @newCODESTATUS=2
BEGIN
INSERT INTO DISPON (LOCLEUNIK,
DATE1,CODEARTICL,ORDRE,QUANTITE,QUANTOPT,CODESTATUS,WACLEUNIK,STOREID,ARTLOT
ID)
VALUES
(@newLOCLEUNIK,@newDATE1,@newCODEARTICL,'Z',0,,@newCODESTATUS,@
newWACLEUNIK,@newSTOREID,@newARTLOTID)
END
IF (SELECT TYPELIGNE FROM Inserted)<>3 AND @newCODESTATUS<7
BEGIN
IF @newCODESTATUS>2
BEGIN
INSERT INTO DISPON (LOCLEUNIK,
DATE1,CODEARTICL,ORDRE,QUANTITE,QUANTOPT,CODESTATUS,WACLEUNIK,STOREID,ARTLOT
ID)
VALUES
(@newLOCLEUNIK,@newDATE2,@newCODEARTICL,'A',@newQUANTITE,0,@newCODESTATUS,@n
ewWACLEUNIK,@newSTOREID,@newARTLOTID)
END
IF @newCODESTATUS=2
BEGIN
INSERT INTO DISPON (LOCLEUNIK,
DATE1,CODEARTICL,ORDRE,QUANTITE,QUANTOPT,CODESTATUS,WACLEUNIK,STOREID,ARTLOT
ID)
VALUES
(@newLOCLEUNIK,@newDATE2,@newCODEARTICL,'A',0,@newQUANTITE,@newCODESTATUS,@n
ewWACLEUNIK,@newSTOREID,@newARTLOTID)
END
END
IF @DAYTOADD>0 AND @newCODESTATUS=7
BEGIN
INSERT INTO DISPON (LOCLEUNIK,
DATE1,CODEARTICL,ORDRE,QUANTITE,QUANTOPT,CODESTATUS,WACLEUNIK,STOREID,ARTLOT
ID)
VALUES
(@newLOCLEUNIK,@newDATE2,@newCODEARTICL,'Z',,0,10,@newWACLEUNIK
,@newSTOREID,@newARTLOTID)
SELECT @newDATE2 Ûo.Get_Right_Date(DATEADD(day,@DAYTOADD,@newDATE2))
INSERT INTO DISPON (LOCLEUNIK,
DATE1,CODEARTICL,ORDRE,QUANTITE,QUANTOPT,CODESTATUS,WACLEUNIK,STOREID,ARTLOT
ID)
VALUES
(@newLOCLEUNIK,@newDATE2,@newCODEARTICL,'A',@newQUANTITE,0,10,@newWACLEUNIK,
@newSTOREID,@newARTLOTID)
END
END
SELECT @newCODEARTICL=(SELECT FIELD6 FROM ARTICLE WHERE
CODEARTICL=@newCODEARTICL)
PRINT @newCODEARTICL
IF @newCODEARTICL<>"" GOTO AGAIN















--
Frédéric BROUARD - expert SQL, spécialiste : SQL Server / 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
****************** mailto: ******************
Avatar
nospam
une seul remarque :

SELECT @DAYTOADD=(SELECT NAAFTER FROM ARTICLE WHERE
CODEARTICL=@newCODEARTICL)
SELECT @DAYTOREM=(SELECT NABEFORE FROM ARTICLE WHERE
CODEARTICL=@newCODEARTICL)



utilise plutot la requete suivante

SELECT @DAYTOADD=NAAFTER , @DAYTOREM=NABEFORE FROM ARTICLE WHERE
CODEARTICL=@newCODEARTICL