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

SQL Procédural MySQL Discussion :

Triggers gestion livraison


Sujet :

SQL Procédural MySQL

  1. #1
    Membre régulier
    Triggers gestion livraison
    Bonjour,

    Lors de la livraison d'une céréale par un adhérent, celle ci est pesée, et le système doit alors rechercher un silo disposant d'une capacité de stockage suffisante pour la céréale livrée. Si un silo est trouvé, alors la livraison est acceptée, enregistrée et affectée au silo trouvé. Sinon, la livraison est refusée, et bien sûr non enregistrée.

    La gestion des livraisons et de stockage de céréales est modélisée par le modèle relationnel suivant :

    CEREALE (code, nom)
    clé primaire : code

    SILO (numéro, capacité, quantitéSilo, codeCéréale)
    clé primaire : numéro
    clé étrangère : codeCéréale en référence à code de CEREALE

    ADHERENT (numéro, nom, rue, CP, ville)
    clé primaire : numéro

    LIVRAISON (numéro, date, quantitéLivrée, refAdhérent, codeCéréale, numéroSilo)
    clé primaire : numéro : clé primaire
    clé étrangère : refAdhérent en référence à numéro de ADHERENT
    clé étrangère : codeCéréale en référence à code de CEREALE
    clé étrangère : numéroSilo en référence à numéro de SILO

    Alors pour la gestion, j'ai décidé de réaliser deux triggers, l'un permettant de gérer les livraisons et un deuxième pour gérer le stockage.

    J'ai essayé d'effectuer celui de la livraison mais il ne marche pas :
    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
     
    DELIMITER |
    CREATE TRIGGER livr
    BEFORE INSERT
    ON livraison
    FOR EACH ROW
    BEGIN 
    DECLARE QtteSilo INT
    SELECT quantiteSilo INTO QtteSilo
    FROM SILO AS S 
    WHERE S.codeCéréale = :new.codeLivraison
    AND  L.numéroSIlo = :new.numéroSilo
     
    IF :new.QuantitéLivrée < QtteSilo
    THEN
    	RAISE_APPLICATION_ERROR(-201201,’desole le silo ne peut pas s'enregistrer')
    ELSE
     
    END IF
    END

  2. #2
    Membre chevronné
    Bonjour,

    Que veut dire : Il ne marche pas ?


    Sinon, beaucoup d'erreurs dans le code, en vrac :
    - Omission des ; en fin d'instruction
    - Mot clé DECLARE à enlever
    - Utilisation apostrophe puis quote (Au niveau du RAISE)
    - Doubler les quotes dans les textes ('desole le silo ne peut pas s''enregistrer')
    - Pas de code dans le ELSE
    - etc...

  3. #3
    Membre régulier
    Bonjour,

    Eh bien, lors de l'insert d'un enregistrement dans la table Livraison, il n'y a pas le traitement des silos (de chaque quantité). J'ai essayé de faire avec la requête suivante :

    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
     
    DELIMITER |
    CREATE TRIGGER livr
    BEFORE INSERT
    ON livraison
    FOR EACH ROW
    BEGIN 
    DECLARE QtteSilo INT
    DECLARE cursor_qtteSilo
    SELECT quantiteSilo 
    FROM SILO AS S 
    WHERE S.codeCéréale = :new.codeLivraison
    AND  L.numéroSilo = :new.numéroSilo
     
    OPEN cursor_qtteSilo INTO QtteSIlo
    IF :new.QuantitéLivrée < QtteSilo THEN
    	RAISE_APPLICATION_ERROR(-201201,’desole le silo ne peut pas ... ‘)
    END IF
    ELSE
    	UPDATE 
     
    END IF
    END

  4. #4
    Membre chevronné
    J'ai comme un doute que vous compreniez ce que vous codez tellement il y a d'erreurs, mais je confirme un tel code ne "marche" pas !
    Commencez par faire la requête de mise à jour uniquement testez-la, puis implémentez des fonctionnalités supplémentaires au fur et à mesure.

  5. #5
    Expert éminent
    Normalement tu devrais avoir des erreurs de compilations :

    exemple
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SQL> CREATE TRIGGER livr
     BEFORE INSERT
    ON t
     FOR EACH ROW
     BEGIN 
      if 1=1 then null; else end if;
      END;
     /
     
    Warning: Trigger created with compilation errors.
    SQL>

    Faut faire un show error; pour voir les erreurs.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB

  6. #6
    Expert confirmé
    Quel est votre SGBD, on dirait que vous mélanger du Oracle et du mysql.

  7. #7
    Membre régulier
    Bonjour, alors mon SGBD est MySql. Et oui, je vous ai donné sans le vouloir une mauvaise version du code. Je n'ai pas modéliser le code dans la BDD puisque je dois le faire sans avoir recours au SGBD.

    Sinon, si je comprends le code que j'écris. C'est juste que je n'arrive pas à comprendre la logique..

    Voici ce que j'ai fait pour pouvoir gérer les livraisons :

    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
     
    DELIMITER |
    CREATE TRIGGER livr
    BEFORE INSERT
    ON livraison
    FOR EACH ROW
    BEGIN 
    DECLARE QtteSilo INT
    DECLARE cursor_qtteSilo
     
    SELECT quantiteSilo 
    FROM SILO AS S 
    WHERE S.codeCéréale = :new.codeLivraison
    AND  L.numéroSilo = :new.numéroSilo
     
    OPEN cursor_qtteSilo INTO QtteSIlo
    IF :new.QuantitéLivrée < QtteSilo THEN
    	RAISE_APPLICATION_ERROR(-201201,’desole le silo ne peut pas ... ‘)
    ELSE
    	SET quantiteSilo = :new.quantiteLivrée + quantiteSilo
     
    END IF;
    END;