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"
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
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
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"
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
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
/*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
/*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
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 *************************
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 *************************
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 *************************