Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 5 sur 5
  1. #1
    Nouveau Membre du Club Avatar de Jefty
    Homme Profil pro
    Développeur informatique
    Inscrit en
    décembre 2009
    Messages
    169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : décembre 2009
    Messages : 169
    Points : 39
    Points
    39

    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 :
    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 Philippe Leménager
    Ingénieur d'études en informatique
    Inscrit en
    août 2006
    Messages
    13 819
    Détails du profil
    Informations personnelles :
    Nom : Homme Philippe Leménager
    Âge : 51
    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 : 13 819
    Points : 24 808
    Points
    24 808

    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 de Formation Agronomique. Autoentrepreneur.
    Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
    « 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
    Nouveau Membre du Club Avatar de Jefty
    Homme Profil pro
    Développeur informatique
    Inscrit en
    décembre 2009
    Messages
    169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : décembre 2009
    Messages : 169
    Points : 39
    Points
    39

    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
    Nouveau Membre du Club Avatar de Jefty
    Homme Profil pro
    Développeur informatique
    Inscrit en
    décembre 2009
    Messages
    169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : décembre 2009
    Messages : 169
    Points : 39
    Points
    39

    Par défaut

    Voilà mon nouveau code:

    Code :
    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
    Nouveau Membre du Club Avatar de Jefty
    Homme Profil pro
    Développeur informatique
    Inscrit en
    décembre 2009
    Messages
    169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : décembre 2009
    Messages : 169
    Points : 39
    Points
    39

    Par défaut

    J'ai finalement fait une simple reqête avec un count.

    Code :
    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •