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)
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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 *************************
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 *************************
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 *************************
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 *************************
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 *************************
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 *************************
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 ************************* > >
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 *************************
>
>
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 ************************* > >