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

SQL Procédural MySQL Discussion :

Triggers gestion livraison


Sujet :

SQL Procédural MySQL

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    octobre 2017
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : octobre 2017
    Messages : 95
    Points : 80
    Points
    80
    Par défaut 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é
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    février 2012
    Messages
    651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : février 2012
    Messages : 651
    Points : 1 859
    Points
    1 859
    Par défaut
    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
    Homme Profil pro
    Étudiant
    Inscrit en
    octobre 2017
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : octobre 2017
    Messages : 95
    Points : 80
    Points
    80
    Par défaut
    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é
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    février 2012
    Messages
    651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : février 2012
    Messages : 651
    Points : 1 859
    Points
    1 859
    Par défaut
    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
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    juillet 2003
    Messages
    4 512
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : juillet 2003
    Messages : 4 512
    Points : 7 590
    Points
    7 590
    Billets dans le blog
    4
    Par défaut
    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 / QRCode et Images PNG ou BMP

  6. #6
    Expert confirmé
    Profil pro
    Inscrit en
    août 2008
    Messages
    2 877
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2008
    Messages : 2 877
    Points : 5 649
    Points
    5 649
    Par défaut
    Quel est votre SGBD, on dirait que vous mélanger du Oracle et du mysql.

  7. #7
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    octobre 2017
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : octobre 2017
    Messages : 95
    Points : 80
    Points
    80
    Par défaut
    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;

Discussions similaires

  1. [AC-2007] Tables pour gestion livraison et facturation
    Par magic57 dans le forum Modélisation
    Réponses: 7
    Dernier message: 20/05/2011, 13h07
  2. Trigger : gestion erreur
    Par bdf94 dans le forum Adaptive Server Enterprise
    Réponses: 1
    Dernier message: 25/02/2010, 17h08
  3. [SQL Serveur 2000] - Trigger gestion erreur
    Par Silvia12 dans le forum Développement
    Réponses: 7
    Dernier message: 12/06/2007, 12h08
  4. Réponses: 1
    Dernier message: 03/07/2006, 17h44
  5. Gestion des erreurs dans un TRIGGER
    Par SDU64 dans le forum DB2
    Réponses: 1
    Dernier message: 18/05/2006, 10h51

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