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 Firebird Discussion :

Un trigger et un casse tête


Sujet :

SQL Firebird

  1. #1
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut Un trigger et un casse tête
    Salut
    j'ai en effet réussis à créer un trigger qui fonctionne super bien en mode insert mais on mode update c'est la galère malgré qu'il a été défini pour fonctionner dans les deux modes.

    en fait, je me suis aperçu que le trigger est ignoré tout bétement quand je modifie mes données ... que dois-je vérifier ? j'ai désactivé puis réactivé le trigger mais toujours rien.

    voici l'entête du trigger :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CREATE OR ALTER trigger tb_energie_biu0 for tb_energie
    active before insert or update position 0
    toute aide éventuelle est la bienvenue

    merci par avance.
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  2. #2
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Bonjour,

    La déclaration est correcte.

    Le problème doit plutôt être dans le corps du trigger. Quand c'est un insert ca fonctionne et quand c'est un Update votre code ne le détecte pas ou ne fait pas ce qu'il faudrait.

    Postez le code du trigger complet ca sera plus simple

  3. #3
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    Citation Envoyé par Barbibulle Voir le message
    Bonjour,

    La déclaration est correcte.

    Le problème doit plutôt être dans le corps du trigger. Quand c'est un insert ca fonctionne et quand c'est un Update votre code ne le détecte pas ou ne fait pas ce qu'il faudrait.

    Postez le code du trigger complet ca sera plus simple
    Salut et merci
    voilà le code complet du trigger :
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    CREATE OR ALTER trigger tb_energie_biu0 for tb_energie
    active before insert or update position 0
    AS
         declare variable n_contrat varchar(12);
         declare variable x float;
         declare variable y float;
         declare variable t_arret smallint;
         declare variable periode varchar(10);
    begin
      /* si les deux codes STEP et SR sont renseignés alors déclencher une exception */
      if ( (new.code_step is not null) and (new.code_sr is not null) ) then Exception Code_STEP_Code_SR_Impossible;
     
      /**********************************************************************/
      /* si c'est le code STEP qui est renseigné alors exécuter ce qui suit */
      /**********************************************************************/
      if ((new.code_step is not null)) then
     
      select distinct   tb_contrat.num_client,
                        tb_process.temps_arret_mois,
     
                (  select a.periode
     
                        from tb_consigne_energie a
                            inner join tb_tarif b on (b.code_tarif = a.code_tarif)
                            inner join tb_contrat c on (c.code_tarif = b.code_tarif)
                            inner join tb_step d on (d.num_client = c.num_client)
     
                   where    (
                                    a.pu_periode =  (
                                                        select min(tb_consigne_energie.pu_periode) from tb_consigne_energie
                                                        where tb_consigne_energie.code_tarif = a.code_tarif
                                                    )
                                and tb_contrat.num_client = c.num_client)
                            )
     
      from tb_contrat
        inner join tb_step on (tb_step.num_client = tb_contrat.num_client)
        inner join tb_process on (tb_process.code_step = tb_step.code_step)
        inner join tb_tarif  on (tb_tarif.code_tarif = tb_contrat.code_tarif)
     
      where (
                tb_step.code_step = new.code_step
            )
     
      /* paramètres de sortie*/
      into  :n_contrat,         /* numéro du client ou numéro de contrat */
            :t_arret,           /* temps d'arrêt durant la période */
            :periode;           /* période où le coût de l'énergie est le plus bas ==> consigne */
     
      /***********************/
      /* sinon exécuter cela */
      /***********************/
      else
      select distinct tb_contrat.num_client,
                (  select a.periode
     
                        from tb_consigne_energie a
                            inner join tb_tarif b on (b.code_tarif = a.code_tarif)
                            inner join tb_contrat c on (c.code_tarif = b.code_tarif)
                            inner join tb_sr d on (d.num_client = c.num_client)
     
                   where    (
                                    a.pu_periode =  (
                                                        select min(tb_consigne_energie.pu_periode) from tb_consigne_energie
                                                        where tb_consigne_energie.code_tarif = a.code_tarif
                                                    )
                                and tb_contrat.num_client = c.num_client)
                            )
     
      from tb_contrat
      inner join tb_sr on (tb_sr.num_client = tb_contrat.num_client)
      inner join tb_sr_service on (tb_sr_service.code_sr = tb_sr.code_sr)
              and (tb_sr_service.date_bilan = new.date_mois)
     
      where (
              tb_sr.code_sr = new.code_sr
            )
     
      /* paramètres de sortie*/
      into  :n_contrat,
            :periode;
      /* calcul du rapport de puissance */
      new.rap_puissance = (case when new.energie_active = 0 then NULL
      else (cast(new.energie_active as float) / new.energie_reactive) * 100 end);
     
      /* affecter le numéro de contrat et la consigne à respecter */
      /* à la ligne en cours de modification */
      new.num_client = n_contrat;
      new.consigne = periode;
     
      /* vérifier si le code tarif n'est pas null ou n'est pas dans l'un des codes ci-dessous */
      /*if (c_tarif not in ('E31', 'E41', 'E42') or (c_tarif is null) ) then
      begin
        Exception pas_pointe;
        new.cons_pointe = null;
      end
      */
      if (new.montant_facture_ht = new.montant_facture) then Exception Erreur_Sasie_HT_Egal_TTC;
     
      /* vérifier si la différence entre les deux montants HT et TTC,
      le montant TTC ne devrait pas excèder, en théorie, les 12% du montant HT*/
      if (new.montant_facture_ht is not null) then
      begin
        x = new.montant_facture - new.montant_facture_ht;
        y = 0.12 * new.montant_facture_ht;
        if (x > y) then Exception Erreur_Saisie_Montant_HT_TTC;
      end
     
      if (new.temps_arret_mois > t_arret) then exception Erreur_temps_arret;
    end
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  4. #4
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    C'est un gros trigger :p

    Pouvez vous compléter tester ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Insert into tb_energie(code_step, code_sr,.....) values(1,1, .....);
    Normalement cela déclenche l'exception Code_STEP_Code_SR_Impossible.

    Completez et essayer ensuite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Update tb_energie
    Set code_step=code_sr
    where .......;
    Est ce que l'exception le lance également ? Si oui c'est que le trigger se déclenche bien.

Discussions similaires

  1. [Tableaux] Casse têtes de boucles
    Par Anduriel dans le forum Langage
    Réponses: 5
    Dernier message: 28/06/2006, 00h24
  2. Casse tête chinois
    Par Jahjouh dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 15/03/2006, 09h04
  3. requête SQL un peu casse tête
    Par hellbilly dans le forum Langage SQL
    Réponses: 4
    Dernier message: 15/12/2005, 10h03
  4. Classe, pile, pointeurs et casse-tête!
    Par zazaraignée dans le forum Langage
    Réponses: 6
    Dernier message: 26/09/2005, 16h57
  5. casse-tête excel
    Par gregius dans le forum Access
    Réponses: 2
    Dernier message: 21/09/2005, 16h38

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