OVH Cloud OVH Cloud

Récupération d'une valeur avant INSERTED

3 réponses
Avatar
Nicolas
Bonjour,

Je réalise un trigger où je souhaiterais comparer une valeur calculée avec
la valeur saisie d'un champ, je m'explique :

J'utilise une logiciel de gestion commerciale (SAGE Gestion Commerciale SQL
Server) dans lequel lorsque je saisis un document, j'entre la date, le tiers
puis je saisi ensuite le code article. En fonction de ce code article, le
logiciel calcule automatique le prix à payer en fonction du client et des
divers remises, notons PUHTauto ce prix. L'utilisateur a tout de même la
possibilité de saisir un autre prix qu'on notera PUHTuser. Je souhaiterais
donc que mon trigger compare ces 2 valeurs et m'indique un message pour
chacun des trois cas de la comparaison (>, <, =). Je précise que j'ai déjà
fait un trigger qui permettait d'afficher un message en fonction du prix de
la fiche article mais ça n'est pas ce qui m'intéresse, ce que je veux c'est
comparer le prix calculé avec le prix saisi. Ci dessous mon trigger :

CREATE TRIGGER [FGS_TRIGGER_001] ON [dbo].[F_DOCLIGNE]

FOR INSERT, UPDATE, DELETE

AS

BEGIN

DECLARE @prix1 MONEY

DECLARE @prix2 MONEY

DECLARE @texte VARCHAR(100)

DECLARE @ref VARCHAR(35)

SELECT @prix1 = DL_PRIXUNITAIRE, @ref = AR_REF FROM
INSERTED

SELECT @prix2 = AR_PRIXVEN FROM F_ARTICLE, INSERTED
WHERE INSERTED.AR_REF = F_ARTICLE.AR_REF

SET @texte='Le P.U. HT de l''article ' + @ref + ' ne
peut être différent de : '+CONVERT(VARCHAR,@prix2)



IF IS_MEMBER('db_owner') = 1

IF @prix1 <> @prix2

BEGIN


raiserror(@texte,16,1)

ROLLBACK

END

END


Merci infiniment

Nicolas

3 réponses

Avatar
Fred BROUARD
pas compris ta question, mais d'emblé ton trigger est faux.

Un trigger ne s'exécute qu'UNE SEULE FOIS quelque soit le nombre de lignes
impacté par l'ordre.

Autrement dit, si l'ordre SQL suivant :
DELETE FROM MaTable
supprime 3 millions de lignes, alors le trigger FOR DELETE ne sera déclenché
qu'une seule fois et non pas trois millions de fois (et heureusement !).

Donc, dès que je voit une variable locale dans un trigger => celui qui a écrit
ce code n'a rien compris aux triggers !

Le code d'un trigger doit être ensembliste => pas de variable locale, sauf dans
une boucle de curseur.

A +

Nicolas a écrit:
Bonjour,

Je réalise un trigger où je souhaiterais comparer une valeur calculée avec
la valeur saisie d'un champ, je m'explique :

J'utilise une logiciel de gestion commerciale (SAGE Gestion Commerciale SQL
Server) dans lequel lorsque je saisis un document, j'entre la date, le tiers
puis je saisi ensuite le code article. En fonction de ce code article, le
logiciel calcule automatique le prix à payer en fonction du client et des
divers remises, notons PUHTauto ce prix. L'utilisateur a tout de même la
possibilité de saisir un autre prix qu'on notera PUHTuser. Je souhaiterais
donc que mon trigger compare ces 2 valeurs et m'indique un message pour
chacun des trois cas de la comparaison (>, <, =). Je précise que j'ai déjà
fait un trigger qui permettait d'afficher un message en fonction du prix de
la fiche article mais ça n'est pas ce qui m'intéresse, ce que je veux c'est
comparer le prix calculé avec le prix saisi. Ci dessous mon trigger :

CREATE TRIGGER [FGS_TRIGGER_001] ON [dbo].[F_DOCLIGNE]

FOR INSERT, UPDATE, DELETE

AS

BEGIN

DECLARE @prix1 MONEY

DECLARE @prix2 MONEY

DECLARE @texte VARCHAR(100)

DECLARE @ref VARCHAR(35)

SELECT @prix1 = DL_PRIXUNITAIRE, @ref = AR_REF FROM
INSERTED

SELECT @prix2 = AR_PRIXVEN FROM F_ARTICLE, INSERTED
WHERE INSERTED.AR_REF = F_ARTICLE.AR_REF

SET @texte='Le P.U. HT de l''article ' + @ref + ' ne
peut être différent de : '+CONVERT(VARCHAR,@prix2)



IF IS_MEMBER('db_owner') = 1

IF @prix1 <> @prix2

BEGIN


raiserror(@texte,16,1)

ROLLBACK

END

END


Merci infiniment

Nicolas



--
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
Nicolas
Bonjour,

Merci pour ton message, tu sembles avoir un problème avec les conventions
d'écriture.

Deux choses :
1) quel est le rapport avec la question que j'ai posée ?
2) puisque je semble n'avoir rien compris au triggers (j'ai le droit d'être
débutant non ?), que proposes-tu à la place de mon code ?

La critique est constructive lorsqu'elle apporte une réponse ...

Nicolas

"Fred BROUARD" a écrit :

pas compris ta question, mais d'emblé ton trigger est faux.

Un trigger ne s'exécute qu'UNE SEULE FOIS quelque soit le nombre de lignes
impacté par l'ordre.

Autrement dit, si l'ordre SQL suivant :
DELETE FROM MaTable
supprime 3 millions de lignes, alors le trigger FOR DELETE ne sera déclenché
qu'une seule fois et non pas trois millions de fois (et heureusement !).

Donc, dès que je voit une variable locale dans un trigger => celui qui a écrit
ce code n'a rien compris aux triggers !

Le code d'un trigger doit être ensembliste => pas de variable locale, sauf dans
une boucle de curseur.

A +

Nicolas a écrit:
> Bonjour,
>
> Je réalise un trigger où je souhaiterais comparer une valeur calculée avec
> la valeur saisie d'un champ, je m'explique :
>
> J'utilise une logiciel de gestion commerciale (SAGE Gestion Commerciale SQL
> Server) dans lequel lorsque je saisis un document, j'entre la date, le tiers
> puis je saisi ensuite le code article. En fonction de ce code article, le
> logiciel calcule automatique le prix à payer en fonction du client et des
> divers remises, notons PUHTauto ce prix. L'utilisateur a tout de même la
> possibilité de saisir un autre prix qu'on notera PUHTuser. Je souhaiterais
> donc que mon trigger compare ces 2 valeurs et m'indique un message pour
> chacun des trois cas de la comparaison (>, <, =). Je précise que j'ai déjà
> fait un trigger qui permettait d'afficher un message en fonction du prix de
> la fiche article mais ça n'est pas ce qui m'intéresse, ce que je veux c'est
> comparer le prix calculé avec le prix saisi. Ci dessous mon trigger :
>
> CREATE TRIGGER [FGS_TRIGGER_001] ON [dbo].[F_DOCLIGNE]
>
> FOR INSERT, UPDATE, DELETE
>
> AS
>
> BEGIN
>
> DECLARE @prix1 MONEY
>
> DECLARE @prix2 MONEY
>
> DECLARE @texte VARCHAR(100)
>
> DECLARE @ref VARCHAR(35)
>
> SELECT @prix1 = DL_PRIXUNITAIRE, @ref = AR_REF FROM
> INSERTED
>
> SELECT @prix2 = AR_PRIXVEN FROM F_ARTICLE, INSERTED
> WHERE INSERTED.AR_REF = F_ARTICLE.AR_REF
>
> SET @texte='Le P.U. HT de l''article ' + @ref + ' ne
> peut être différent de : '+CONVERT(VARCHAR,@prix2)
>
>
>
> IF IS_MEMBER('db_owner') = 1
>
> IF @prix1 <> @prix2
>
> BEGIN
>
>
> raiserror(@texte,16,1)
>
> ROLLBACK
>
> END
>
> END
>
>
> Merci infiniment
>
> Nicolas

--
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
Michel PRIORI
Salut Nico,

Avant tout permet moi de te dire que le ton ironique ou agacé n'encourage
pas les bonnes volontés.
Je suis volontier taquin. Je sais de quoi je parle !

Voilà pour l'intro, maintenant 'have fun' ;-))

1) quel est le rapport avec la question que j'ai posée ?


Aucun .. ou tout! ça dépends de ton coefficient de compréhention

2) puisque je semble n'avoir rien compris au triggers (j'ai le droit d'être
débutant non ?), que proposes-tu à la place de mon code ?


un truc comme ...
> >CREATE TRIGGER [FGS_TRIGGER_001] ON [dbo].[F_DOCLIGNE]
> > FOR INSERT, UPDATE, DELETE
> > AS


@nb integer
> > BEGIN
> > SELECT @nb=count(*)


FROM F_ARTICLE A inner join inserted A on A.AR_ref = I.ar_Ref
where A.AR_prixven <> I.DL_prixunitaire

if is_member('db_owner')=1 and @nb >0
begin
raiserror (@nb + ' prix ne sont pas correct. opération annulée',16,1)
rollback
end
> END



*****************

A toi de voir si des modifs sont necessaires.

bon courage.


"Nicolas" a écrit :

Bonjour,

Merci pour ton message, tu sembles avoir un problème avec les conventions
d'écriture.

Deux choses :
1) quel est le rapport avec la question que j'ai posée ?
2) puisque je semble n'avoir rien compris au triggers (j'ai le droit d'être
débutant non ?), que proposes-tu à la place de mon code ?

La critique est constructive lorsqu'elle apporte une réponse ...

Nicolas

"Fred BROUARD" a écrit :

> pas compris ta question, mais d'emblé ton trigger est faux.
>
> Un trigger ne s'exécute qu'UNE SEULE FOIS quelque soit le nombre de lignes
> impacté par l'ordre.
>
> Autrement dit, si l'ordre SQL suivant :
> DELETE FROM MaTable
> supprime 3 millions de lignes, alors le trigger FOR DELETE ne sera déclenché
> qu'une seule fois et non pas trois millions de fois (et heureusement !).
>
> Donc, dès que je voit une variable locale dans un trigger => celui qui a écrit
> ce code n'a rien compris aux triggers !
>
> Le code d'un trigger doit être ensembliste => pas de variable locale, sauf dans
> une boucle de curseur.
>
> A +
>
> Nicolas a écrit:
> > Bonjour,
> >
> > Je réalise un trigger où je souhaiterais comparer une valeur calculée avec
> > la valeur saisie d'un champ, je m'explique :
> >
> > J'utilise une logiciel de gestion commerciale (SAGE Gestion Commerciale SQL
> > Server) dans lequel lorsque je saisis un document, j'entre la date, le tiers
> > puis je saisi ensuite le code article. En fonction de ce code article, le
> > logiciel calcule automatique le prix à payer en fonction du client et des
> > divers remises, notons PUHTauto ce prix. L'utilisateur a tout de même la
> > possibilité de saisir un autre prix qu'on notera PUHTuser. Je souhaiterais
> > donc que mon trigger compare ces 2 valeurs et m'indique un message pour
> > chacun des trois cas de la comparaison (>, <, =). Je précise que j'ai déjà
> > fait un trigger qui permettait d'afficher un message en fonction du prix de
> > la fiche article mais ça n'est pas ce qui m'intéresse, ce que je veux c'est
> > comparer le prix calculé avec le prix saisi. Ci dessous mon trigger :
> >
> > CREATE TRIGGER [FGS_TRIGGER_001] ON [dbo].[F_DOCLIGNE]
> >
> > FOR INSERT, UPDATE, DELETE
> >
> > AS
> >
> > BEGIN
> >
> > DECLARE @prix1 MONEY
> >
> > DECLARE @prix2 MONEY
> >
> > DECLARE @texte VARCHAR(100)
> >
> > DECLARE @ref VARCHAR(35)
> >
> > SELECT @prix1 = DL_PRIXUNITAIRE, @ref = AR_REF FROM
> > INSERTED
> >
> > SELECT @prix2 = AR_PRIXVEN FROM F_ARTICLE, INSERTED
> > WHERE INSERTED.AR_REF = F_ARTICLE.AR_REF
> >
> > SET @texte='Le P.U. HT de l''article ' + @ref + ' ne
> > peut être différent de : '+CONVERT(VARCHAR,@prix2)
> >
> >
> >
> > IF IS_MEMBER('db_owner') = 1
> >
> > IF @prix1 <> @prix2
> >
> > BEGIN
> >
> >
> > raiserror(@texte,16,1)
> >
> > ROLLBACK
> >
> > END
> >
> > END
> >
> >
> > Merci infiniment
> >
> > Nicolas
>
> --
> 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 *************************
>
>