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 :

RAZ GENERATOR dans un trigger


Sujet :

SQL Firebird

  1. #1
    Membre actif
    Inscrit en
    Juin 2002
    Messages
    409
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 409
    Points : 234
    Points
    234
    Par défaut RAZ GENERATOR dans un trigger
    Bonjour,

    J'ai une table avec une vingtaine de champs, dont la cle unique est composee de deux de ces champ : DATE et NUM
    J'ai un trigger (before input) qui rempli ces deux champs avec DATE=CURRENT DATE et NUM=GEN_ID(num,1)

    Mon souci est de remettre le generateur a zero quand la date a changee.
    Mais impossible d'utiliser SET GENERATOR dans un trigger ou dans une procedure stockee.
    Et malheureusement, pour un souci de performance et d'integrite de la base, j'ai un imperatif : il faut que ce soit le serveur qui gere ceci !

    Voici le code avec lequel j'esperais faire ca mais qui ne convient 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
    begin
       date_entete = CURRENT_DATE;
       heure_entete = CURRENT_TIME;
     
       /* GESTION DE L'INCREMENTATION DE NUM_ENTETE AVEC LE GENERATOR GEN_NUM_ENTETE */
       /* LE NUMERO D'ENTETE (LE GENERATOR) REPART A 1 CHAQUE NOUVELLE JOURNEE */
       select max(num_entete)
       from entete_dossier_encours
       where entete_dossier_encours.date_entete = date_entete
       into i;
       if (i is null) then
          SET GENERATOR(GEN_NUM_ENTETE,0);
       num_entete = GEN_ID(GEN_NUM_ENTETE, 1);
    end!!
    Merci d'avance pour l'aide.

  2. #2
    Membre actif
    Inscrit en
    Juin 2002
    Messages
    409
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 409
    Points : 234
    Points
    234
    Par défaut
    EUREKA !!!
    Je passe par une procedure, et pour remettre mon generateur a 0, je l'incremente de sa valeur negative :

    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
    SET TERM !! ;
    create procedure PROC_CLE_ENTETE returns (DateEntete date, HeureEntete time, NumEntete integer)
    /* Renvoi la date du jour, l'heure actuelle et un numero d'entete */
    /* Cette PROC remplace le trigger_insert */
    as
       declare variable i integer;
       declare variable n integer;
    begin
       DateEntete = CURRENT_DATE;
       HeureEntete = CURRENT_TIME;
     
       /* GESTION DE L'INCREMENTATION DE NUM_ENTETE AVEC LE GENERATOR GEN_NUM_ENTETE */
       /* POUR ASSURER LA SYNCHRONISATION DES DONNEES */
       /* LE NUMERO D'ENTETE (LE GENERATOR) REPART A 1 CHAQUE NOUVELLE JOURNEE */
       select max(Num_Entete)
       from entete_dossier_encours
       where entete_dossier_encours.date_entete = :DateEntete
       into i;
       n = GEN_ID(GEN_NUM_ENTETE, 1);
       if (i is null) then
          /* Remise a zero du generator par incrementation negative */
          /* car impossible de le faire avec SET GENERATOR => interdit dans procedures ou triggers */
          NumEntete = GEN_ID(GEN_NUM_ENTETE,-n+1);
       else
          NumEntete = n;
    end!!
    commit!!
    set term ; !!

  3. #3
    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
    Tu n'es pas obligé de le faire dans une procédure, et tu n'es pas obligé d'incrémenter par un ton générateur pour en connaitre la valeur..

    Fait juste un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gen_id(GEN_ID, -GEN_ID(GEN_ID,0));
    Pour le remettre à zero. Ce qui marche aussi bien dans un trigger que dans une procédure stockée (ou même dans un ordre SQL).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Calcul dans un triggers : problème du +
    Par eXiaNazaire dans le forum Oracle
    Réponses: 3
    Dernier message: 07/01/2005, 10h14
  2. Réponses: 4
    Dernier message: 18/10/2004, 16h18
  3. Recuperer derniere valeur modifiée dans un trigger
    Par xabs dans le forum Développement
    Réponses: 2
    Dernier message: 06/08/2004, 16h22
  4. select dans un trigger sous Postgresql
    Par kastor_grog dans le forum Requêtes
    Réponses: 1
    Dernier message: 03/09/2003, 17h00
  5. [PostgreSQL] Refus de STATEMENT dans un trigger
    Par alex2205 dans le forum Requêtes
    Réponses: 3
    Dernier message: 10/03/2003, 12h51

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