Bonjour, je vais essaye d'exposer mon pb le plus simplement possible :
J'ai 2 tables :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 TABLEA ( CHAMP_A1 DATE CHAMP_A2 INTEGER CHAMP_A3 INTEGER ... PRIMARY KEY (CHAMPS_A1,CHAMP_A2) )TABLEA est la table de mes entete de dossier. avec CHAMP_A1 = Date de creation de l'entete, CHAMP_A2 = numero sequentiel du dossier cree dans la meme journee. CHAMP_A3 = Nombre de ligne de detail que cet entete comprend.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 TABLEB ( CHAMP_B1 DATE CHAMP_B2 INTEGER CHAMP_B3 INTEGER ... PRIMARY KEY (CHAMP_B1, CHAMP_B2, CHAMP_B3) FOREIGN KEY (CHAMP_B1, CHAMP_B2) REFERENCES TABLEA (CHAMPS_A1,CHAMP_A2) )
TABLEB est la table de mes lignes de details de dossier. CHAMP_B1/CHAMP_B2 = liaison avec l'entete. CHAMP_B3 = numero sequentiel de la ligne cree pour un meme entete.
Question 1 : Pour determiner CHAMP_A2, je n'ai pas trouve mieux que de faire une procedure stockee que je doit appeler avant chaque INSERT TABLEA pour avoir le bon numero sequentiel. Pour cela je passe par un compteur, et Chaque jour, je remets le generator a zero.
* Est ce que ce ne sera pas un peu trop lourd dans la pratique sachant qu'il y aura plusieurs appels INSERT a la minute en multi-utilisateur ?
* Est ce que quelqu'un voit une meilleure solution ?
CODE DE LA PROCEDURE STOCKEE :
Question 2 : Pour determiner CHAMP_B3, impossible de passer par un generator puisque je ne peux pas gerer dynamiquement un generator par entete. Donc je n'ai rien trouve d'autre que de passer par un champ renfermant le nombre de ligne (CHAMP_A3) que j'incremente a chaque INSERT TABLEB. VRAI GROS PROBLEME : A chaque INSERT TABLEB, je dois acceder a CHAMP_A3 2 fois : en lecture pour connaitre le prochain numero de ma ligne et en update pour l'incrementer.
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 PROCEDURE "PROC_CLE_ENTETE" RETURNS( "DATEENTETE" DATE, "HEUREENTETE" TIME, "NUMENTETE" INTEGER) 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 */ /* JE VEUX QUE CHAQUE JOUR LE GENERATOR REPARTE A ZERO*/ 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
* Encore une fois, est ce que c'est la meilleure solution ?
* Comment etre sur qu'il n'y aura pas de conflits lorsque 2 utilisateurs feront des INSERT TABLEB en meme temps ? J'ai bien cru comprendre qu'il fallait passer par les transactions mais je n'ai pas vraiment compris comment ca fonctionnait.
CODE DU TRIGGER GERANT LE NUMERO DE TABLEB :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 (...) /* Renseignement de la zone NUM_LIGNE */ UPDATE ENTETE_DOSSIER_ENCOURS E SET E.NB_LIGNE = E.NB_LIGNE+1 WHERE E.DATE_ENTETE= NEW.DATE_ENTETE AND E.NUM_ENTETE = NEW.NUM_ENTETE; SELECT NB_LIGNE, FROM ENTETE_DOSSIER_ENCOURS E WHERE E.DATE_ENTETE= NEW.DATE_ENTETE AND E.NUM_ENTETE = NEW.NUM_ENTETE INTO NEW.NUM_LIGNE; (...)
Merci d'avance pour votre aide.
Partager