Précédent   Forum des professionnels en informatique > Bases de données > Firebird > SQL
SQL Forum d'entraide sur le SQL pour Firebird
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 08/09/2003, 13h39   #1
Membre actif
 
Inscription : juin 2002
Messages : 379
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 379
Points : 168
Points : 168
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 :
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.
kase74 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2003, 15h55   #2
Membre actif
 
Inscription : juin 2002
Messages : 379
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 379
Points : 168
Points : 168
EUREKA !!!
Je passe par une procedure, et pour remettre mon generateur a 0, je l'incremente de sa valeur negative :

Code :
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 ; !!
kase74 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2003, 18h43   #3
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
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 :
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).
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h28.


 
 
 
 
Partenaires

Hébergement Web