OVH Cloud OVH Cloud

Declencheur

3 réponses
Avatar
ludo
Bonsoir,

Je suppose que c'est quelque chose de facile a faire, mais quand même trop
compliqué pour moi.
J'ai un table avec une colonne "cpte comptable", une colonne "sens" et une
colonne "montant".
La valeur de "sens" peut etre 0 ou 1 (debit ou credit)
J'ai rajouter deux colonnes , une debit et une credit, et je voudrai
qu'elles soient updatées automatiquement a chaque fois que la table est mise
a jour. Par exemple si la valeur de sens est 1 , le montant de "montant"
est copier dans ma colonne "credit", si le sens est "0", alors le montant
est copier dans "debit"

Merci de votre aide
Ludo

3 réponses

Avatar
Steve Kass
Ludo,

Il n'y a pas besoin d'ajouter les colonnes debit et credit, qui ne
contiennent aucunes informations indépendentes. Vous pouvez créer une
vue avec ces colonnes, ou même les calculer dans vos requêtes.

create view maVue as
select
[cpte comptable],
sens,
montant,
case when sens = 0 then montant end as debit,
case when sens = 1 then montant end as credit
from T

Cette solution évite la nécessité de mettre à jour les colonnes debit et
credit avec une déclencheur, et s'il vous faut ajouter ces colonnes dans
la table, vous pouvez les créer comme colonnes calculées:

alter table T add
debit as case when sens = 0 then montant end,
credit as case when sens = 1 then montant end

Steve Kass
Drew University


ludo wrote:

Bonsoir,

Je suppose que c'est quelque chose de facile a faire, mais quand même trop
compliqué pour moi.
J'ai un table avec une colonne "cpte comptable", une colonne "sens" et une
colonne "montant".
La valeur de "sens" peut etre 0 ou 1 (debit ou credit)
J'ai rajouter deux colonnes , une debit et une credit, et je voudrai
qu'elles soient updatées automatiquement a chaque fois que la table est mise
a jour. Par exemple si la valeur de sens est 1 , le montant de "montant"
est copier dans ma colonne "credit", si le sens est "0", alors le montant
est copier dans "debit"

Merci de votre aide
Ludo






Avatar
jppreaux
/*Même si Steve Kass a raison tu peux procéder comme cela:*
CREATE TRIGGER monTriggerDeMaTable ON proprietaire.maTabl
FOR INSERT A

/* ce trigger permet de mettre à jour les champs débit et crédit *

Declare @montant money, @sens bit , @cpte_comptable int --- int ou le type que tu lui a donn
Avatar
Fred BROUARD
C'est halucinant de voir un trigger aussi débile !

Il faut comprendre qu'un trigger peut porter sur des millions de ligne d'UN SEUL COUP !!!

Le code que tu as donné va porter au mieux sur une seule ligne, au pire recopier les mêmes données dans tout un tas de
ligne !!!

un petit exemple :

INSERT INTO maTable
SELECT cpte_comptable, 0, montant
FROM UneAutreTable

Pour écrire un trigger correct il ne faut JAMAIS instancier des variables reprenant les valeurs des tables INSERTEED ou
DELETED, sauf à agir dans un curseur.

Le plus simple et le plus élégant c'est de procéder en une seule requête imbriquée...

CREATE TRIGGER monTriggerDeMaTable ON maTable
FOR INSERT
AS

UPDATE maTable
SET debit = CASE
WHEN sens = 0 THEN montant
END,
credit = CASE
WHEN sens = 1 THEN montant
END
FROM maTable t
INNER JOIN inserted i
ON t.LaClef = i.Laclef

A lire sur l'écriture des triggers : http://sqlpro.developpez.com/TransactSQL/SQL_MSTransactSQL.html#5

A +


jppreaux a écrit:
/*Même si Steve Kass a raison tu peux procéder comme cela:*/
CREATE TRIGGER monTriggerDeMaTable ON proprietaire.maTable


> FOR INSERT AS

/* ce trigger permet de mettre à jour les champs débit et crédit */


Declare @montant money, @sens bit , @cpte_comptable int --- int ou le type que tu lui a donné
Select @montant =montant, @sens = sens, @cpte_comptable = cpte_comptable from inserted --- on récupère les valeurs que l'on insère

if sens = 0
update maTable set debit = @montant where cpte_comptable = @cpte_comptable
else
update maTable set credit = @montant where cpte_comptable = @cpte_comptable


@+



--
Frédéric BROUARD, MVP MS SQL Server. Expert Langage SQL / 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 *************************