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

Insert dans une table avec une colonne de cumul

2 réponses
Avatar
B. Neve
Bonjour à tous,

J'ai une table reprenant des futurs mouvements de stocks pour des articles.
3 des colonnes sont en fait des cumuls de stock afin d'isoler le plus
rapidement possible les problèmes de stocks.
Les colonnes sont les suivantes :
Codearticle, Date1, heure, Ordre, Variation, CumulStock

Exemple avec 1 seul article.
Art1, 20080705, 1000, Z,-2,xxx
Art1, 20080706, 1100, A,+2,xxx
Art1, 20080707, 1000, Z,-2,xxx
Art1, 20080709, 1400, A,+1,xxx
Art1, 20080710, 1300, Z,-2,xxx
Art1, 20080711, 1000, Z,-4,xxx
Art1, 20080713, 1000, Z,-6,xxx

La colonne XXX devrait reprende la valeur stock d'une AUTRE TABLE + la somme
de toutes les lignes ayant une date et une heure inférieures. J'ai un
Trigger qui fait cela mais la vitesse n'est pas au rendez-vous dès que le
nombre de lignes de la table augmente.
comment optimatliser cela ?

ci-dessous, le code du Trigger actuel.

La table qui comprend les cumuls s'appelle DISPON
La table avec la valeur du stock de référence s'appelle ARTICLE

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER OFF

GO

ALTER TRIGGER [dbo].[TR_DISPON_INSERT] ON [dbo].[DISPON]

FOR INSERT

AS

BEGIN

UPDATE DISPON SET QTYCUMUL=((SELECT ARTICLE.QUANTITE FROM ARTICLE where
ARTICLE.CODEARTICL=DISPON.codearticl)

+(SELECT SUM(DISPON2.QUANTITE) FROM DISPON DISPON2 WHERE
DISPON2.CODEARTICL=DISPON.CODEARTICL AND DISPON2.CODESTATUS>2 AND
((DISPON2.DATE1+DISPON2.TIME1)<=(DISPON.DATE1+DISPON.TIME1)) )),

QTYCUMULOPT=((SELECT ARTICLE.QUANTITE FROM ARTICLE where
ARTICLE.CODEARTICL=DISPON.codearticl)

+(SELECT SUM(DISPON2.QUANTOPT) FROM DISPON DISPON2 WHERE
DISPON2.CODEARTICL=DISPON.CODEARTICL AND DISPON2.CODESTATUS>1 AND
((DISPON2.DATE1+DISPON2.TIME1)<=(DISPON.DATE1+DISPON.TIME1)) )),

QTYCUMULWS=((SELECT ISNULL(SUM(ARTSTK.QUANTITE),0) FROM ARTSTK where
ARTSTK.CODEARTICL=DISPON.codearticl AND ARTSTK.WACLEUNIK=DISPON.WACLEUNIK
AND ARTSTK.STOREID=DISPON.STOREID)

+(SELECT ISNULL(SUM(DISPON2.QUANTITE),0) FROM DISPON DISPON2 WHERE
DISPON2.CODEARTICL=DISPON.CODEARTICL AND DISPON2.CODESTATUS>2 AND
((DISPON2.DATE1+DISPON2.TIME1)<=(DISPON.DATE1+DISPON.TIME1)) AND
DISPON2.WACLEUNIK=DISPON.WACLEUNIK AND DISPON2.STOREID=DISPON.STOREID)),

QTYCUMULNORET=((SELECT ARTICLE.QUANTITE FROM ARTICLE where
ARTICLE.CODEARTICL=DISPON.codearticl)

+(SELECT SUM(DISPON2.QUANTITE) FROM DISPON DISPON2 WHERE
DISPON2.CODEARTICL=DISPON.CODEARTICL AND DISPON2.CODESTATUS>2 AND
((DISPON2.DATE1<DISPON.DATE1) OR (
(DISPON2.DATE1+DISPON2.TIME1)<=(DISPON.DATE1+DISPON.TIME1) and
ORDRE='Z' )) ))

WHERE DISPON.IDDISPON IN (SELECT DISPON.IDDISPON FROM DISPON INNER JOIN
INSERTED ON INSERTED.CODEARTICL=DISPON.CODEARTICL WHERE
DISPON.DATE1>=INSERTED.DATE1)

END



Merci d'avance pour vos réponses...

B. Neve

2 réponses

Avatar
Yann L'ARVOR
Je ne vois pas comment remplacer le curseur vu la complexité du traitement
mais vous pouvez optimiser avec une indexation appropriée les requetes de
votre trigger, pour une grosse base de données, vous avez des gains
possibles...


"B. Neve" a écrit dans le message de news:
4896f83d$0$2863$
Bonjour à tous,

J'ai une table reprenant des futurs mouvements de stocks pour des
articles.
3 des colonnes sont en fait des cumuls de stock afin d'isoler le plus
rapidement possible les problèmes de stocks.
Les colonnes sont les suivantes :
Codearticle, Date1, heure, Ordre, Variation, CumulStock

Exemple avec 1 seul article.
Art1, 20080705, 1000, Z,-2,xxx
Art1, 20080706, 1100, A,+2,xxx
Art1, 20080707, 1000, Z,-2,xxx
Art1, 20080709, 1400, A,+1,xxx
Art1, 20080710, 1300, Z,-2,xxx
Art1, 20080711, 1000, Z,-4,xxx
Art1, 20080713, 1000, Z,-6,xxx

La colonne XXX devrait reprende la valeur stock d'une AUTRE TABLE + la
somme
de toutes les lignes ayant une date et une heure inférieures. J'ai un
Trigger qui fait cela mais la vitesse n'est pas au rendez-vous dès que le
nombre de lignes de la table augmente.
comment optimatliser cela ?

ci-dessous, le code du Trigger actuel.

La table qui comprend les cumuls s'appelle DISPON
La table avec la valeur du stock de référence s'appelle ARTICLE

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER OFF

GO

ALTER TRIGGER [dbo].[TR_DISPON_INSERT] ON [dbo].[DISPON]

FOR INSERT

AS

BEGIN

UPDATE DISPON SET QTYCUMUL=((SELECT ARTICLE.QUANTITE FROM ARTICLE where
ARTICLE.CODEARTICL=DISPON.codearticl)

+(SELECT SUM(DISPON2.QUANTITE) FROM DISPON DISPON2 WHERE
DISPON2.CODEARTICL=DISPON.CODEARTICL AND DISPON2.CODESTATUS>2 AND
((DISPON2.DATE1+DISPON2.TIME1)<=(DISPON.DATE1+DISPON.TIME1)) )),

QTYCUMULOPT=((SELECT ARTICLE.QUANTITE FROM ARTICLE where
ARTICLE.CODEARTICL=DISPON.codearticl)

+(SELECT SUM(DISPON2.QUANTOPT) FROM DISPON DISPON2 WHERE
DISPON2.CODEARTICL=DISPON.CODEARTICL AND DISPON2.CODESTATUS>1 AND
((DISPON2.DATE1+DISPON2.TIME1)<=(DISPON.DATE1+DISPON.TIME1)) )),

QTYCUMULWS=((SELECT ISNULL(SUM(ARTSTK.QUANTITE),0) FROM ARTSTK where
ARTSTK.CODEARTICL=DISPON.codearticl AND ARTSTK.WACLEUNIK=DISPON.WACLEUNIK
AND ARTSTK.STOREID=DISPON.STOREID)

+(SELECT ISNULL(SUM(DISPON2.QUANTITE),0) FROM DISPON DISPON2 WHERE
DISPON2.CODEARTICL=DISPON.CODEARTICL AND DISPON2.CODESTATUS>2 AND
((DISPON2.DATE1+DISPON2.TIME1)<=(DISPON.DATE1+DISPON.TIME1)) AND
DISPON2.WACLEUNIK=DISPON.WACLEUNIK AND DISPON2.STOREID=DISPON.STOREID)),

QTYCUMULNORET=((SELECT ARTICLE.QUANTITE FROM ARTICLE where
ARTICLE.CODEARTICL=DISPON.codearticl)

+(SELECT SUM(DISPON2.QUANTITE) FROM DISPON DISPON2 WHERE
DISPON2.CODEARTICL=DISPON.CODEARTICL AND DISPON2.CODESTATUS>2 AND
((DISPON2.DATE1<DISPON.DATE1) OR (
(DISPON2.DATE1+DISPON2.TIME1)<=(DISPON.DATE1+DISPON.TIME1) and
ORDRE='Z' )) ))

WHERE DISPON.IDDISPON IN (SELECT DISPON.IDDISPON FROM DISPON INNER JOIN
INSERTED ON INSERTED.CODEARTICL=DISPON.CODEARTICL WHERE
DISPON.DATE1>=INSERTED.DATE1)

END



Merci d'avance pour vos réponses...

B. Neve



Avatar
Fred BROUARD
Bonjour,

B. Neve a écrit :
Bonjour à tous,

J'ai une table reprenant des futurs mouvements de stocks pour des articles.
3 des colonnes sont en fait des cumuls de stock afin d'isoler le plus
rapidement possible les problèmes de stocks.
Les colonnes sont les suivantes :
Codearticle, Date1, heure, Ordre, Variation, CumulStock

Exemple avec 1 seul article.
Art1, 20080705, 1000, Z,-2,xxx
Art1, 20080706, 1100, A,+2,xxx
Art1, 20080707, 1000, Z,-2,xxx
Art1, 20080709, 1400, A,+1,xxx
Art1, 20080710, 1300, Z,-2,xxx
Art1, 20080711, 1000, Z,-4,xxx
Art1, 20080713, 1000, Z,-6,xxx

La colonne XXX devrait reprende la valeur stock d'une AUTRE TABLE + la
somme
de toutes les lignes ayant une date et une heure inférieures. J'ai un
Trigger qui fait cela mais la vitesse n'est pas au rendez-vous dès que le
nombre de lignes de la table augmente.
comment optimatliser cela ?



Il serait beaucoup plus performant de supprimer votre colonne CumulStock
et de passer à une vue indexée. C'est fait pour cela.

A +


--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
*********************** http://www.sqlspot.com *************************




ci-dessous, le code du Trigger actuel.

La table qui comprend les cumuls s'appelle DISPON
La table avec la valeur du stock de référence s'appelle ARTICLE

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER OFF

GO

ALTER TRIGGER [dbo].[TR_DISPON_INSERT] ON [dbo].[DISPON]

FOR INSERT

AS

BEGIN

UPDATE DISPON SET QTYCUMUL=((SELECT ARTICLE.QUANTITE FROM ARTICLE where
ARTICLE.CODEARTICL=DISPON.codearticl)

+(SELECT SUM(DISPON2.QUANTITE) FROM DISPON DISPON2 WHERE
DISPON2.CODEARTICL=DISPON.CODEARTICL AND DISPON2.CODESTATUS>2 AND
((DISPON2.DATE1+DISPON2.TIME1)<=(DISPON.DATE1+DISPON.TIME1)) )),

QTYCUMULOPT=((SELECT ARTICLE.QUANTITE FROM ARTICLE where
ARTICLE.CODEARTICL=DISPON.codearticl)

+(SELECT SUM(DISPON2.QUANTOPT) FROM DISPON DISPON2 WHERE
DISPON2.CODEARTICL=DISPON.CODEARTICL AND DISPON2.CODESTATUS>1 AND
((DISPON2.DATE1+DISPON2.TIME1)<=(DISPON.DATE1+DISPON.TIME1)) )),

QTYCUMULWS=((SELECT ISNULL(SUM(ARTSTK.QUANTITE),0) FROM ARTSTK where
ARTSTK.CODEARTICL=DISPON.codearticl AND ARTSTK.WACLEUNIK=DISPON.WACLEUNIK
AND ARTSTK.STOREID=DISPON.STOREID)

+(SELECT ISNULL(SUM(DISPON2.QUANTITE),0) FROM DISPON DISPON2 WHERE
DISPON2.CODEARTICL=DISPON.CODEARTICL AND DISPON2.CODESTATUS>2 AND
((DISPON2.DATE1+DISPON2.TIME1)<=(DISPON.DATE1+DISPON.TIME1)) AND
DISPON2.WACLEUNIK=DISPON.WACLEUNIK AND DISPON2.STOREID=DISPON.STOREID)),

QTYCUMULNORET=((SELECT ARTICLE.QUANTITE FROM ARTICLE where
ARTICLE.CODEARTICL=DISPON.codearticl)

+(SELECT SUM(DISPON2.QUANTITE) FROM DISPON DISPON2 WHERE
DISPON2.CODEARTICL=DISPON.CODEARTICL AND DISPON2.CODESTATUS>2 AND
((DISPON2.DATE1<DISPON.DATE1) OR (
(DISPON2.DATE1+DISPON2.TIME1)<=(DISPON.DATE1+DISPON.TIME1) and
ORDRE='Z' )) ))

WHERE DISPON.IDDISPON IN (SELECT DISPON.IDDISPON FROM DISPON INNER JOIN
INSERTED ON INSERTED.CODEARTICL=DISPON.CODEARTICL WHERE
DISPON.DATE1>=INSERTED.DATE1)

END



Merci d'avance pour vos réponses...

B. Neve