Bonjour,

Je vous demande de l'aide sur un sujet critique pour moi, et qui m'a pris énormément de temps pour ne pas le résoudre à la fin.
Merci à l'avance.

Mon problème est le suivant :
je travaille sur des Triggers de SAGE Immobilier 5.9 sur la base ORACLE 11.2 G (surtout le module fiche physique ).
mon besoin initial étant de créer des Triggers sur la fiche physique pour gérer des exceptions tels que (avant validation le champ X,Y et Z doivent être remplis).
Bref techniquement, pour la fiche physique quand je créé une fiche physique ça créé des données principales sur la table Bien_physique et les données secondaires sur la table BINVT_ZU .

j'ai créé 2 triggers, un sur chaque table, le problème c'est que quand je remplie les données principales(qui vont alimenter la 1ère table, sans alimenter les données secondaires du 2ème table) et je valide une fiche (validation = un champ BIEN_VALIDE se met à 1 dans la première table) , ça me sort un message d'erreur sur le 2ème trigger de la 2ème table et qui se repète sans fin.

Nom : sql1.PNG
Affichages : 472
Taille : 16,0 Ko


ci dessous les deux triggers :

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
CREATE OR REPLACE TRIGGER IMMOOWN.C2BF3_B_PHYSIQUE
FOR INSERT OR UPDATE
ON IMMOOWN.BIEN_PHYSIQUE
REFERENCING NEW AS NEW OLD AS OLD
COMPOUND TRIGGER
 
	FLAG    VARCHAR2(20);
	v_count number;
	MsgErr VARCHAR2(100);
 
 
BEFORE EACH ROW IS
BEGIN
 
 
IF INSERTING THEN
 
	--Alimentation d'un champ
	:NEW.CODE_BARRE := :NEW.NUM_INVT;
 
 
        --S'il s'agit d'une validation (le cas qui m'interesse maintenant)
	IF (:NEW.B_BIEN_VALIDE = 1 )
	THEN
 
		IF (:NEW.CODE_FAMILLE IS NULL OR :NEW.CODE_FAMILLE ='') THEN
			FLAG := 'Code Famille';
		ELSIF (:NEW.NUM_COMPTE IS NULL OR :NEW.NUM_COMPTE ='') THEN
			FLAG := 'Compte';
		ELSIF (:NEW.CODE_SECTION IS NULL OR :NEW.CODE_SECTION ='') THEN
			FLAG := 'Section';
		ELSIF (:NEW.DESCRIPTIF1 IS NULL OR :NEW.DESCRIPTIF1 ='') THEN
			FLAG := 'Libellés';
		ELSIF (:NEW.CODE_COMMANDE IS NULL OR :NEW.CODE_COMMANDE ='') THEN
			FLAG := 'Numéro de commande';
		ELSIF (:NEW.DATE_COMMANDE IS NULL OR :NEW.DATE_COMMANDE ='') THEN
			FLAG := 'Date de commande';
		ELSIF (:NEW.DATE_LIVRAISON IS NULL OR :NEW.DATE_LIVRAISON ='') THEN
			FLAG := 'Date de livraison';
		END IF;
 
		IF (FLAG IS NULL OR FLAG='') THEN
			PKG_VBIEN.Set_Value('VALIDE'); 
		ELSE
			PKG_VBIEN.Set_Value('NONVALIDE');
			RAISE_APPLICATION_ERROR(-20001,'Il faut remplir le champ obligatoire : "' || FLAG || '"');
		END IF;
 
 
 
END IF;
END BEFORE EACH ROW;
 
END C2BF3_B_PHYSIQUE;
/

2ème 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
CREATE OR REPLACE TRIGGER IMMOOWN.C2BF3_B_INVT_ZU
FOR INSERT OR UPDATE 
ON IMMOOWN.BINVT_ZU
COMPOUND TRIGGER 
 
  FLAG1     VARCHAR2(200) DEFAULT NULL;
  ma_val    VARCHAR2(30);
  ma_valMaj VARCHAR2(30);
  V_error   VARCHAR2(100);
  v_int     NUMBER;
 
 AFTER EACH ROW IS
    BEGIN
 
  ma_val    := PKG_VBIEN.Get_Value;
  ma_valMaj := PKG_MAJBien.Get_Value; 
 
    IF (ma_val = 'VALIDE') THEN
 
    IF (:NEW.ZU_S_10 IS NULL) THEN
      FLAG1 := 'N° Bon livraison ;';
    END IF;
 
    IF (:NEW.ZU_N_01 IS NULL) THEN
      FLAG1 := FLAG1 || ' ' || 'R.S. fournisseur ;';
    END IF;
 
    IF (:NEW.ZU_S_16 IS NULL) THEN
      FLAG1 := FLAG1 || ' ' || 'N° facture ';
    END IF;
 
    IF (FLAG1 IS NOT NULL) THEN
      IF (ma_valMaj = 'UPDATE') THEN
        V_error := ' ,ensuite Enregistrez et VALIDEZ';
      ELSE
        V_error := '';
      END IF;
 
      v_int:=v_int+1;
      Raise_application_error(-20002,'Champs obligatoirs:"' ||FLAG1|| '"' ||v_int);
      --Raise_application_error(-20002, 'Il faut remplir le(s) champ(s) obligatoire(s) :"'||FLAG1 ||'"'||V_error||:OLD.ZU_S_10||':'||:NEW.ZU_S_10||':'||:OLD.ZU_N_01||':'||:NEW.ZU_N_01);
    END IF;
 
  END IF;
 
END AFTER EACH ROW;
END C2BF3_B_INVT_ZU;
/
Le Package PKG_VBIEN utilisé pour faire savoir à la deuxième table qu'il s'agit d'une validation ou pas (parce que la 2ème table n'a pas de flag pour ça)

PS: quand je désactive un des deux triggers ça passe sans loop.

je sais bien que je n'ai pas bien expliqué mais je n'ai pas pu faire mieux, je vous écoute si vous n'avez pas compris.
Mille merci d'avance.