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

Langage SQL Discussion :

Trigger de vérification et de mise à jour


Sujet :

Langage SQL

  1. #1
    Membre habitué Avatar de Jefty
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Décembre 2009
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2009
    Messages : 203
    Points : 125
    Points
    125
    Par défaut Trigger de vérification et de mise à jour
    Bonjour,

    J'ai un soucis sur la réalisation d'un trigger.
    Je m'explique, j'ai 3 tables, COMMANDE, BL et BL_Ligne.
    Une COMMANDE peut avoir plusieurs BL, un BL n'appartient qu'a une COMMANDE.
    Un BL peut avoir plusieurs BL_Ligne et un BL_Ligne n'appartient qu'a un BL.

    Je souhaite qu'a l'insert, l'update et le delete d'un BL, on vérifie que le BL est valide et que chaque BL_Ligne est Valide aussi.
    Pour ça dans chacune des deux tables on à une propriété Valide de type booléen.

    Si tous les BL d'une COMMANDE sont "Valide" et que tous les BL_Ligne des BL correspondant sont "Valide" aussi, on considère que COMMANDE est "Soldé".
    Soldé est aussi un booléen, dans la table COMMANDE.

    Mon trigger doit donc, en ayant à disposition l'Identifiant du BL et celui de la COMMANDE puisqu'il aura lieu au insert/update/delete d'un BL, vérifié que les BL_Lignes qui lui sont rattachés soient tous "Valide" et que le BL lui même soit "Valide".
    Il doit de plus chercher tout les autres BL qui correspondent à la COMMANDE, à partir de l'IdCommande. Et donc vérifié de nouveau la validité des BL et des BL_Ligne.

    Je sais pas si c'est pas un peu confus ce que je raconte.
    Si vous avez des questions, hésité pas.

    J'avais fait un petit bout de code complètement faux, mais bon, c'est juste pour vous montrez que j'ai chercher un peu.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    BEGIN
    		for each row(
    			SELECT BON_LIVRAISON_LIGNE.Solde 
    			FROM BON_LIVRAISON 
    			INNER JOIN BON_LIVRAISON_LIGNE ON BON_LIVRAISON_LIGNE.IdBonLivraison = BON_LIVRAISON.IdBonLivraison
    			WHERE BON_LIVRAISON.IdCommande = @IdCOmmande
    			)
    		IF BON_LIVRAISON_LIGNE.Solde = 0
    			@Count = 1
    		end loop;
    		IF @Count = 0 
    			UPDATE COMMANDE SET Commande.Solde = 1
        END
    Merci d'avance pour toute aide apportée.

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    1) Quel est votre SGBD ?
    Il y a des variantes dans le langage et la syntaxe employés pour le SQL procédural selon le SGBD.

    2) Le trigger s'applique à quelle table ?
    Je souhaite qu'a l'insert, l'update et le delete d'un BL, on vérifie que le BL est valide et que chaque BL_Ligne est Valide aussi.
    Apparemment, c'est un trigger sur la table des BL.

    3) Quel type de BL ?
    Sont-ce des BL de commandes reçues d'un fournisseur ou des BL de commandes à livrer à un client ?

    4) Quel est le processus ?
    Validation individuelle des lignes puis validation manuelle du BL ou automatique ?

    L'application permet-elle d'enregistrer en même temps un nouveau BL et toutes ses lignes validées ou bien y a t-il d'abord création du BL puis des lignes puis validation des lignes... ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre habitué Avatar de Jefty
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Décembre 2009
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2009
    Messages : 203
    Points : 125
    Points
    125
    Par défaut
    Vous allez rire, ou pas, mais en faite je suis partie trop loin.
    Mon chef de projet vient de me voir et j'ai mal compris la table BL_Ligne.
    En faite j'ai juste un trigger à faire qui vérifie la validité dans la table BL a l'insert update et delete d'un BL.
    Ça va être tout de suite moins perché.

    A part peut être la vérification de chaque BL dans un trigger.

  4. #4
    Membre habitué Avatar de Jefty
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Décembre 2009
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2009
    Messages : 203
    Points : 125
    Points
    125
    Par défaut
    Voilà mon nouveau code:

    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
     DECLARE @IdCommande int
        DECLARE @IdFacture int
        DECLARE @Count int = 0
     
        SELECT @IdCommande = IdCommande FROM deleted
        SELECT @IdCommande = IdCommande FROM inserted
     
     
        create table #Result
        (
    		IdFacture int
        )
     
         INSERT #Result (IdFacture)
    		SELECT 
    		IdFacture
    		FROM BON_LIVRAISON
    		WHERE BON_LIVRAISON.IdCommande = @IdCommande 
     
     
        SELECT @IdFacture = IdFacture FROM #Result
        IF @IdFacture = null
    		SET @Count = 1
     
    	IF @Count = 0
    		UPDATE COMMANDE SET Solde = 1 WHERE IdCommande = @IdCommande
    Mais je me pose plusieurs questions.

    La première, c'est au sujet de la gestion des tables Inserted et Deleted, la manière utilisé est elle bonne?

    L'autre question c'est de savoir si en fessant comme ça, je lis bien toutes les lignes de la table #Result que j'ai créée avant de faire le IF, si c'est pas le cas, bah ça sert à rien, je me trompe donc.

    Si vous pouviez m'éclairé.
    Merci.

  5. #5
    Membre habitué Avatar de Jefty
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Décembre 2009
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2009
    Messages : 203
    Points : 125
    Points
    125
    Par défaut
    J'ai finalement fait une simple reqête avec un count.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    DECLARE @IdCommande int
    DECLARE @IdFacture int
     
    SELECT @IdCommande = IdCommande FROM deleted
    SELECT @IdCommande = IdCommande FROM inserted
     
    SELECT @IdFacture = COUNT(1) 
    FROM BON_LIVRAISON bl 
    WHERE bl.IdFacture is null 
    AND bl.IdCommande = @IdCommande

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

Discussions similaires

  1. CREATE TRIGGER d'insertion ou de mise à jour
    Par SOPSOU dans le forum InterBase
    Réponses: 0
    Dernier message: 22/10/2009, 18h56
  2. Trigger sur une table et mise à jour
    Par fffonck dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 08/06/2009, 11h11
  3. Réponses: 9
    Dernier message: 13/02/2009, 18h54
  4. [trigger] problème de mise à jour
    Par Ouark dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 23/03/2006, 01h13
  5. Réponses: 4
    Dernier message: 25/01/2006, 15h42

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