IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Trigger pour 3 tables (commande,produit,ligne de comande)


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Février 2009
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 35
    Par défaut Trigger pour 3 tables (commande,produit,ligne de comande)
    Bonjour,
    jai un trigger ke j'arrive pas a realiser .en fait jai 3 tables avec les champs suivant: voila le code de creation de ses tables

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    ---les triggers 
    create database commerciale 
    create table produit ( 
    no_pdt int not null primary key, 
    design_pdt varchar(50), 
    pu float not null, 
    stock int default 0) 
     
    create table commande( 
    no_commande int not null primary key, 
    date_com datetime, 
    montant float default 0) 
     
    create table ligneCommand( 
    no_cde int not null, 
    qte int not null, 
    no_pdt int not null Foreign key references produit(no_pdt), 
     
    pu float, 
    montant float, 
    constraint pk primary key(no_pdt,no_cde), 
    constraint fk_com foreign key(no_cde) references commande(no_commande))


    les questions sont les suivantes:
    1)lorsquil ya une nouvelle ligne de commande ,le prix unitaire actuel du produit est enregistré dans la ligne de commande .la quantité en stock du produit concerné est diminué .le montant de la commande est augmanté du montant de la ligne
    la reponse est la suivante:
    --question 1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    create trigger trig 
    on ligneCommande for insert 
    as 
    if insert(no_cde) 
    SET stock=stock-qte 
    set commande.montant=montant+(qte*pu) 
    from inserted 
    where commande.no_commande=inserted.no_cde 
    go
    2)a chake mise a jour d'une ligne de commande il faut mettre a jour le montant de la commande et eventuelelmnt les quantité en stock

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE TRIGGER commandes_update
     ON ldc AFTER UPDATE
     AS
     IF UPDATE(qte) 
     BEGIN
    lmontant=qte*pu
     UPDATE produit SET stock = stock - qte,set montant=montant-lmontant
     FROM produit AS a
     JOIN inserted AS b ON (a.no_pdt = b.no_pdt)
     ENd
    3)idem en cas de suppression d'une ligne de commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TRIGGER commandes_delete
     ON ldv AFTER DELETE
     AS
     UPDATE produit SET stock = stock - qte
     FROM produit AS a
     JOIN deleted AS b ON (a.no_pdt= b.no_pdt)
    je ne sais pas, est ce que c'est correcte svp aidez moi
    merci de votre attention

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    Votre premier trigger ne peut pas fonctionner parce que vous ne spécifiez pas sur quelle table doit être effectuée la mise à jour.
    Le traitement ne peut de plus pas être effectué après l'insertion, sinon vous ne pouvez pas obtenir le prix du produit au moment de l'ajout de la ligne de commande. Votre trigger devrait donc être un INSTEAD OF :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    CREATE TRIGGER TR_IOF_I_ligneCommand
    	ON dbo.ligneCommande
    INSTEAD OF INSERT
    AS
    BEGIN
    	BEGIN TRANSACTION IOF_I_ligneCommand
     
    		-- Ajout de la ligne de commande avec le prix actuel du produit
    		INSERT INTO dbo.ligneCommand
    		(
    			no_cde,
    			qte,
    			no_pdt,
    			pu,
    			montant
    		)
    		SELECT I.no_cde,
    				I.qte,
    				I.no_pdt,
    				P.pu
    		FROM INSERTED AS I
    		JOIN dbo.produit AS P
    			ON I.no_pdt = P.no_pdt
     
    		-- Mise à jour du montant de la commande
    		UPDATE dbo.commande
    		SET montant = montant + I.montant
    		FROM dbo.commande AS C
    		JOIN INSERTED AS I
    			ON C.no_commande = I.no_cde
     
    		-- Mise à jour du stock
    		UPDATE dbo.produit
    		SET stock = stock - I.qte
    		FROM dbo.produit AS P
    		JOIN INSERTED AS I
    			ON I.no_pdt = P.no_pdt
     
    	COMMIT TRANSACTION IOF_I_ligneCommand
    END
    Votre second trigger est incorrect puisque vous ne traitez que le cas où la quantité de produit commandée et/ou le montant ont augmenté.
    Le recalcul du montant de la ligne de commande peut être évité si cette colonne est calculée.
    Mais dans votre cas, le trigger devient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    CREATE TRIGGER TR_A_U_ligneCommande
    	ON dbo.ligneCommande
    AFTER UPDATE
    AS
    BEGIN
    	IF UPDATE(qte) 
    	BEGIN
    		BEGIN TRANSACTION A_U_ligneCommande
     
    			-- Mise à jour du montant de la commande
    			UPDATE dbo.commande
    			SET montant = CASE 
    							WHEN D.montant > I.montant THEN C.montant - I.montant -- le montant de la ligne de commande a diminué
    							WHEN D.montant < I.montant THEN C.montant + I.montant -- le montant de la ligne de commande a augmenté
    							ELSE D.montant -- le montant est inchangé, mais si on ne met rien, il deviendra NULL
    						END	
    			FROM dbo.commande AS C
    			JOIN INSERTED AS I
    				ON C.no_commande = I.no_cde
    			JOIN DELETED AS D
    				ON C.no_commande = D.no_cde
     
    			--- Mise à jour de la quantité en stock
    			UPDATE dbo.produit
    			SET stock = CASE 
    							WHEN D.stock > I.stock THEN P.stock - I.stock -- la quantité commandée a diminué, donc la quantité en stock est créditée
    							WHEN D.stock < I.stock THEN P.stock + I.stock -- la quantité commandée a augmenté, donc la quantité en stock est débitée
    							ELSE P.stock -- la quantité commandée est inchangée, mais si on ne met rien, elle deviendra NULL
    						END
    			FROM dbo.produit AS P
    			JOIN INSERTED AS I
    				ON P.no_pdt = I.no_pdt
    			JOIN DELETED AS D
    				ON C.no_pdt = D.no_pdt
     
    		COMMIT TRANSACTION A_U_ligneCommande
    	END
    END
    Le dernier trigger est incorrect puisque quand on supprime une ligne de commande, le stock de produits est crédité de la quantité de produit de la ligne de commande.
    Vous n'avez pas traité le montant de la commande

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    CREATE TRIGGER TR_A_D_ligneCommand
    	ON dbo.ligneCommand
    AFTER DELETE
    AS
    BEGIN
    	BEGIN TRANSACTION A_D_ligneCommand
     
    		UPDATE dbo.Produit
    		SET stock = stock + D.qte -- la ligne de commande a été supprimée, donc le stock est crédité
    		FROM dbo.Produit AS P
    		JOIN DELETED AS D
    			ON P.no_pdt = D.no_pdt
     
    		UPDATE dbo.commande
    		SET montant = montant - D.montant
    		FROM dbo.commande AS C
    		JOIN DELETED AS D
    			ON C.no_commande = D.no_cde
     
    	COMMIT TRANSACTION A_D_ligneCommand
    END
    Prenez l'habitude de qualifier les objets de base de données par le nom du schéma auquel ils appartiennent.

    Aucune instruction SQL ne peut commencer sans un SELECT, INSERT, UPDATE ou DELETE, donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    BEGIN
    lmontant=qte*pu
    UPDATE
    Est incorrect.

    @++

  3. #3
    Membre averti
    Inscrit en
    Février 2009
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 35
    Par défaut
    merci pour votre aide ,je suis vraimant reconnaissante.

  4. #4
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Avec plaisir

    @++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. trigger pour supprimer les lignes d'une table
    Par gilles_906 dans le forum Requêtes
    Réponses: 11
    Dernier message: 15/12/2012, 15h54
  2. Réponses: 4
    Dernier message: 24/01/2011, 17h28
  3. [SQL SERVER 2005]créer un trigger pour chaque table de chaque DB
    Par Kropernic dans le forum Développement
    Réponses: 14
    Dernier message: 23/02/2010, 12h56
  4. Réponses: 1
    Dernier message: 18/02/2006, 02h45
  5. Trigger pour faire une table "mirroir"
    Par lgomez dans le forum Oracle
    Réponses: 8
    Dernier message: 26/10/2005, 13h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo