j'ai un souci avec un block basé sur une table contenant un trigger.
la table se nomme ALJ_ECRITURE et le 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
CREATE OR REPLACE TRIGGER ALJ.TRIGG_ECRITURE_CODE
BEFORE INSERT
ON ALJ.ALJ_ECRITURE 
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
BEGIN
  IF (:NEW.ALJ_ECR_CODE IS NULL) THEN 
     select To_Char(SYSDATE,'YYYY')||:NEW.ALJ_ECR_PC_CODE||LPAD( To_number(nvl(max(substr(ALJ_ECR_CODE,9)),0)) + 1,11,0 )
       into :NEW.ALJ_ECR_CODE
       from alj_ecriture
      where substr(ALJ_ECR_CODE,1,4) = To_Char(SYSDATE,'YYYY')
        and substr(ALJ_ECR_CODE,5,3) = :NEW.ALJ_ECR_PC_CODE;
  END IF;
END;
/
J'ai un module basé sur la table donc je fais un simple
commit_form
pour enregistrer les données dans la table.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
F Get_Item_Property('ALJ_ECRITURE.valider', ENABLED) = 'TRUE' THEN
	Do_Key('Commit_Form');
	P_Clear;
END IF;
P_Clear
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
Go_Block('ALJ_ECRITURE');
  Clear_Form(NO_VALIDATE, FULL_ROLLBACK);
 
  Go_Block('ALJ_ECRITURE1');
  Clear_Form(NO_VALIDATE, FULL_ROLLBACK);
 
  Go_Block('ALJ_ECRITURE2');
  Clear_Form(NO_VALIDATE, FULL_ROLLBACK);
 
  :ALJ_ECRITURE.ALJ_ECR_JOURNEE   := SYSDATE;
  Init_Form;
Init_Form
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
PROCEDURE Init_Form IS
  cursor c_data is
	select ALJ_OP_DEB_CPT,
         ALJ_OP_ECR_1_CPT,
         ALJ_OP_ECR_2_CPT,
         ALJ_OP_ECR_3_CPT,
         ALJ_OP_ECR_4_CPT,
         ALJ_OP_ECR_1_PERCENT,
         ALJ_OP_ECR_2_PERCENT,
         ALJ_OP_ECR_3_PERCENT,
         ALJ_OP_ECR_4_PERCENT,
         ALJ_OP_JRN_CODE
    from ALJ_OPERATION
 where ALJ_OP_CODE = :GLOBAL.OP_CODE;
 c_d c_data%rowtype;
 
 cursor c_lib_cpt(cpt varchar2) is
 select alj_cp_lib  
   from alj_compte 
  where alj_cp_code = cpt;
 
BEGIN
	null;
	Open c_data;
  Fetch c_data into c_d;
  Copy(c_d.ALJ_OP_DEB_CPT,'ALJ_ECRITURE.ALJ_ECR_DEB_CPT');
  --POPULATE_LIST_WITH_QUERY('ALJ_ECRITURE.ALJ_ECR_DEB_CPT','select alj_cp_code||'' - ''|| alj_cp_lib,alj_cp_code from alj_compte where alj_cp_code in (''512.2'',''515.2'')') ; 
  --POPULATE_LIST_WITH_QUERY('ALJ_ECRITURE.ALJ_ECR_ECR_1_CPT','select alj_cp_code||'' - ''|| alj_cp_lib,alj_cp_code from alj_compte where alj_cp_code like ''390.300.%''') ; 
 
  --Copy(c_d.ALJ_OP_ECR_1_CPT,'ALJ_ECRITURE.ALJ_ECR_ECR_1_CPT'); 
  Copy(c_d.ALJ_OP_ECR_2_CPT,'ALJ_ECRITURE.ALJ_ECR_ECR_2_CPT');
  Copy(c_d.ALJ_OP_ECR_3_CPT,'ALJ_ECRITURE.ALJ_ECR_ECR_3_CPT');
  Copy(c_d.ALJ_OP_ECR_4_CPT,'ALJ_ECRITURE.ALJ_ECR_ECR_4_CPT');
  Copy(c_d.ALJ_OP_ECR_1_PERCENT,'ALJ_ECRITURE.ALJ_ECR_ECR_1_PERCENT');
  Copy(c_d.ALJ_OP_ECR_2_PERCENT,'ALJ_ECRITURE.ALJ_ECR_ECR_2_PERCENT');
  Copy(c_d.ALJ_OP_ECR_3_PERCENT,'ALJ_ECRITURE.ALJ_ECR_ECR_3_PERCENT');
  Copy(c_d.ALJ_OP_ECR_4_PERCENT,'ALJ_ECRITURE.ALJ_ECR_ECR_4_PERCENT');
 
  Copy(c_d.ALJ_OP_ECR_1_PERCENT,'GLOBAL.per_cent1');
  Copy(c_d.ALJ_OP_ECR_2_PERCENT,'GLOBAL.per_cent2');
  Copy(c_d.ALJ_OP_ECR_3_PERCENT,'GLOBAL.per_cent3');
  Copy(c_d.ALJ_OP_ECR_4_PERCENT,'GLOBAL.per_cent4');
  Copy(c_d.ALJ_OP_JRN_CODE,'ALJ_ECRITURE.ALJ_JRN_CODE');
 
  :ALJ_ECRITURE.ALJ_OP_CODE      := :GLOBAL.OP_CODE;
  :ALJ_ECRITURE.ALJ_ECR_STAT     := 'S';
 
  Open c_lib_cpt(:ALJ_ECRITURE.ALJ_ECR_DEB_CPT);
  Fetch c_lib_cpt into :ALJ_ECRITURE.ALJ_ECR_DEB_LIB;
  If c_lib_cpt%notfound then :ALJ_ECRITURE.ALJ_ECR_DEB_LIB := null; end if;
  Close c_lib_cpt;
 
  Open c_lib_cpt(:ALJ_ECRITURE.ALJ_ECR_ECR_1_CPT);
  Fetch c_lib_cpt into :ALJ_ECRITURE.ALJ_ECR_ECR_1_LIB;
  If c_lib_cpt%notfound then :ALJ_ECRITURE.ALJ_ECR_ECR_1_LIB := null; end if;
  Close c_lib_cpt;
 
  /*if (:ALJ_ECRITURE.ALJ_ECR_DEB_CPT is null) then
  	 Set_Item_Property('ALJ_ECRITURE.ALJ_ECR_DEB_CPT',VISIBLE,PROPERTY_FALSE);
  	 Set_Item_Property('ALJ_ECRITURE.ALJ_ECR_DEB_LIB',VISIBLE,PROPERTY_FALSE);
  	 Set_Item_Property('ALJ_ECRITURE.ALJ_ECR_DEB_MT',VISIBLE,PROPERTY_FALSE);
  end if;
  
  if (:ALJ_ECRITURE.ALJ_ECR_ECR_1_CPT is null) then
  	 Set_Item_Property('ALJ_ECRITURE.ALJ_ECR_ECR_1_CPT',VISIBLE,PROPERTY_FALSE);
  	 Set_Item_Property('ALJ_ECRITURE.ALJ_ECR_ECR_1_LIB',VISIBLE,PROPERTY_FALSE);
  	 Set_Item_Property('ALJ_ECRITURE.ALJ_ECR_ECR_1_MT',VISIBLE,PROPERTY_FALSE);
  end if;
  */
  if (:ALJ_ECRITURE.ALJ_ECR_ECR_2_CPT is null) then
  	 Set_Item_Property('ALJ_ECRITURE.ALJ_ECR_ECR_2_CPT',VISIBLE,PROPERTY_FALSE);
  	 Set_Item_Property('ALJ_ECRITURE.ALJ_ECR_ECR_2_LIB',VISIBLE,PROPERTY_FALSE);
  	 Set_Item_Property('ALJ_ECRITURE.ALJ_ECR_ECR_2_MT',VISIBLE,PROPERTY_FALSE);
  else
   	 Open c_lib_cpt(:ALJ_ECRITURE.ALJ_ECR_ECR_2_CPT);
     Fetch c_lib_cpt into :ALJ_ECRITURE.ALJ_ECR_ECR_2_LIB;
     If c_lib_cpt%notfound then :ALJ_ECRITURE.ALJ_ECR_ECR_2_LIB := null; end if;
     Close c_lib_cpt;
  end if;
 
  if (:ALJ_ECRITURE.ALJ_ECR_ECR_3_CPT is null) then
  	 Set_Item_Property('ALJ_ECRITURE.ALJ_ECR_ECR_3_CPT',VISIBLE,PROPERTY_FALSE);
  	 Set_Item_Property('ALJ_ECRITURE.ALJ_ECR_ECR_3_LIB',VISIBLE,PROPERTY_FALSE);
  	 Set_Item_Property('ALJ_ECRITURE.ALJ_ECR_ECR_3_MT',VISIBLE,PROPERTY_FALSE);
  else
     Open c_lib_cpt(:ALJ_ECRITURE.ALJ_ECR_ECR_3_CPT);
     Fetch c_lib_cpt into :ALJ_ECRITURE.ALJ_ECR_ECR_3_LIB;
     If c_lib_cpt%notfound then :ALJ_ECRITURE.ALJ_ECR_ECR_3_LIB := null; end if;
     Close c_lib_cpt;
  end if;
 
  if (:ALJ_ECRITURE.ALJ_ECR_ECR_4_CPT is null) then
  	 Set_Item_Property('ALJ_ECRITURE.ALJ_ECR_ECR_4_CPT',VISIBLE,PROPERTY_FALSE);
  	 Set_Item_Property('ALJ_ECRITURE.ALJ_ECR_ECR_4_LIB',VISIBLE,PROPERTY_FALSE);
  	 Set_Item_Property('ALJ_ECRITURE.ALJ_ECR_ECR_4_MT',VISIBLE,PROPERTY_FALSE);
  else
  	 Open c_lib_cpt(:ALJ_ECRITURE.ALJ_ECR_ECR_4_CPT);
     Fetch c_lib_cpt into :ALJ_ECRITURE.ALJ_ECR_ECR_4_LIB;
     If c_lib_cpt%notfound then :ALJ_ECRITURE.ALJ_ECR_ECR_4_LIB := null; end if;
     Close c_lib_cpt;
  end if;
 
 
  if c_data%notfound then
	   null;
  end if;
  close c_data;
  null;
  INIT_BLOC1;
  INIT_BLOC2;
  --INIT_BLOC3;
 
END;
Mon problème est le suivante:
quand je fais un premier enregistrement, ça passe
un second sans fermer la forme et la reouvrir, il m'affiche l'erreur ORA 0001
mais quand je ferme la forme et je l'a relance le premier passe et les autres tentatives d'insertion m'affiche l'erreur.
Le trigger est sensé gerer automatiquement la clé sans doublons alors pourquoi cette erreur?