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.
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:
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)
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; /
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.
Partager