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 inclusion / exclusion


Sujet :

Développement SQL Server

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 11
    Par défaut Trigger inclusion / exclusion
    bonjour bonjour !

    je réalise des triggers en ce moment et je bloque sur ça ...

    voici la partie du MCD sur laquelle je travaille



    voici le trigger pour l'exclusion dans concerner :

    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
    drop trigger TInsert_concerner
    go
    create trigger TInsert_concerner
    on concerner 
    for insert as
    begin
    if exists(select * 
    from inserted i 
    where exists (select * 
    		from reserver r
    		where r.pro_id = i.pro_id and r.com_id=i.com_id))
    begin
    	raiserror 30003 'Impossible d''insérer cette commande dans CONCERNER car celle-ci est déjà réservé ! (RESERVER)'
    	rollback transaction
    end
    end
    go
    celui-ci fonctionne jusque là tout va bien !

    par contre je bloque pour le second, il faut à la fois que je vérifie que ma commande n'est pas créée dans concerner ça c'est facile (il me semble ) c'est comme ça :

    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
    drop trigger TInsert_reserver
    go
    create trigger TInsert_reserver
    on reserver 
    for insert as
    begin
    if exists(select * 
    from inserted i 
    where exists (select * 
    		from concerner c 
    		where c.pro_id = i.pro_id and c.com_id=i.com_id))
    begin
    	raiserror 30002 'Impossible d''insérer cette commande dans RESERVER car celle-ci est déjà validé ! (CONCERNER)'
    	rollback transaction
    end
    end
    go
    par contre je dois vérifier dans le même trigger (je pense que c'est dans le même) que les produits commandés sont bien stocké dans le dépot en rapport avec cette réservation... vous suivez ?!

    un petit coup de pouce ? :p

    merci

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 11
    Par défaut
    personne n'a d'idées ?!

  3. #3
    Membre éprouvé
    Inscrit en
    Mars 2004
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 126
    Par défaut
    salut.

    si j'ai bien compris ton modèle le MPD ressemblera à ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Depot( dep_id, ... )
    Produit( pro_id,... )
    stocks( sto_id, pro_id, dep_id, pro_qtte,... )
    Commande( com_id, etat, ...)
    CommandeDet( com_id, pro_id, pro_qtte,... ) = Concerne
    Reservation( com_id, pro_id, sto_id, pro_qtte, ... ).
    • Une commande concerne 1 ou plusieurs produits.

    • Pour qu'une commande soit servie elle doit spécifier dans quels stocks seront puisé(s) le(s) produit(s).

    • Un même produit pour une même commande peut etre puisé dans plusieurs stocks.

    Une commande a trois (3) états:
    -(N) Non reservée : commande saisie sans précision de stock.
    -(R) Reservée : commande saisie avec précision de stock. La somme des réservations pour un produit donné doit correspondre à la quantité demandée de ce produit dans la commande.
    -(V) Validée : commande exécutée.

    Les états de la commande ont des invariants:
    -(N) Non reservée : saisie libre
    -(R) Reservée : le détail de la commande a été entièrement reservée.La somme des réservations pour un produit donné doit correspondre à la quantité demandée de ce produit dans la commande.
    -(V) Validée : une ne peut être validée que si elle a été reservée(R).

    La cohérence de ton système depend du respect de ces invariants.
    Ces invariants peuvent être garantis dans les triggers de manière simple.

    Si tu veux savoir, pour un produit donné ( 12 par exemple ) :
    - quelle quantité a été reservé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT Sum( R.pro_qtte )
      FROM Commande C
      INNER JOIN Reservation R
        ON ( R.com_id = C.com_id )
      WHERE ( R.pro_id = 12 ) And
                 ( C.etat = 'R' )
    - quelle quantité a été validée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT Sum( R.pro_qtte )
      FROM Commande C
      INNER JOIN Reservation R
        ON ( R.com_id = C.com_id )
      WHERE ( R.pro_id = 12 ) And
                 ( C.etat = 'V' )
    J'espère que ca repond à ta question.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 11
    Par défaut
    salut !

    alors pour parler français voici ce que j'ai modélisé :

    une commande est soit passée immédiatement (enregistrement dans concerner) soit réservée (enregistrement dans réserver). une même commande ne peut pas être réservée et commandée en même temps.
    Si une commande est réservée, je dois vérifier que celle-ci n'a pas été commandé avant, puis vérifier si les produits réservés pour un dépot donné sont bien stocker dans le dépot en question

    j'espère avoir était plus clair

    merci !

  5. #5
    Membre éprouvé
    Inscrit en
    Mars 2004
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 126
    Par défaut
    Salut.

    une commande est soit passée immédiatement (enregistrement dans concerner) soit réservée (enregistrement dans réserver)
    Une commande a un état :
    -réservée
    -validée
    une commande peut etre créée( avec évidemment son détail), réservée et validée immédiatement( ici c'est de la cinématique!!! ) ce qui correspond à "passée immédiatement".

    une même commande ne peut pas être réservée et commandée en même temps
    En effet l'état de la commande est unique à un instant donné.

    Si une commande est réservée, je dois vérifier que celle-ci n'a pas été commandé avant
    J'estime que tu as un moyen de vérifier l'unicité....

    puis vérifier si les produits réservés pour un dépot donné sont bien stocker dans le dépot en question
    Dans le trigger d'insertion de la table (RESERVER) tu pourras imposer cette règle:

    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
     
    IF Exists(
          SELECT *
            FROM (
              SELECT dep_id, pro_id, Sum(qtte) Qte
                FROM INSERTED
                GROUP BY dep_id, pro_id
           ) V
           LEFT JOIN Stocker S
             ON ( S.dep_id = V.dep_id ) And
                ( S.pro_id = V.pro_id )
           WHERE ( S.dep_id Is Null ) Or
                 ( V.Qte > S.qtte )
       )
    BEGIN
      RAISERROR( 'Produit(s) non disponible(s) en stock.', 16, 1 )
    END
    La table RESERVER, à mons sens, devrait indiquer:
    -Si la commande est validée d'où seront puisés les produits.
    -Si la commande est reservée, dans quels stocks sont reservés les produits concernés.

    Ce que je ne comprends pas:
    -"l'exclusion" dans ton modèle, je n'en vois aucune utilité.
    -Dans le trigger "TInsert_reserver" tu utilises "concerner" pour savoir si une commande a été validée, à mon avis c'est "Commande" qui est sensée detenir cette information( comme un attribut ).

    Je t'invite donc à repenser ton MCD.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 11
    Par défaut
    salut merci pour tes réponses... je suis d'accord avec toi sur le fait que mon exclusion n'a aucune utilité, si je met en oeuvre ce concept c'est parce qu'on me le demande... mais à proprement parlé c'est pas trés cohérent je te l'accorde ! je dois réctifier certaines chose dans mon mcd qui me paraisse pas très cohérente ... je repasse une fois cela effectué

    merci !

Discussions similaires

  1. Sélection avec inclusion/exclusion sur un même champ
    Par hsoulard dans le forum Langage SQL
    Réponses: 8
    Dernier message: 05/01/2012, 13h17
  2. contraintes inclusion exclusion totalité
    Par ds_ryo dans le forum PowerAMC
    Réponses: 7
    Dernier message: 10/04/2009, 22h39
  3. Réponses: 2
    Dernier message: 28/08/2007, 09h10
  4. Réponses: 2
    Dernier message: 27/02/2007, 13h50
  5. Inclusion/exclusion de fichiers/répertoires
    Par GLDavid dans le forum Linux
    Réponses: 17
    Dernier message: 10/11/2005, 16h17

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