Précédent   Forum des professionnels en informatique > Bases de données > Oracle > Outils > Forms
Forms Forum d'entraide sur Oracle Forms
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 25/07/2011, 11h53   #1
Nouveau Membre du Club
 
Inscription : mai 2003
Messages : 231
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 231
Points : 31
Points : 31
Envoyer un message via ICQ à yLaplace Envoyer un message via AIM à yLaplace Envoyer un message via MSN à yLaplace Envoyer un message via Yahoo à yLaplace
Par défaut forms 10g blocks basés trigger ORA 0001

j'ai un souci avec un block basé sur une table contenant un trigger.
la table se nomme ALJ_ECRITURE et le trigger:
Code :
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
Citation:
commit_form
pour enregistrer les données dans la table.
Code :
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 :
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 :
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?
yLaplace est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/07/2011, 12h03   #2
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 34

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
c'est pas un bloc basé ? Pourquoi tu remplis toi-même le bloc ?
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/07/2011, 12h36   #3
Nouveau Membre du Club
 
Inscription : mai 2003
Messages : 231
Détails du profil
Informations forums :
Inscription : mai 2003
Messages : 231
Points : 31
Points : 31
Envoyer un message via ICQ à yLaplace Envoyer un message via AIM à yLaplace Envoyer un message via MSN à yLaplace Envoyer un message via Yahoo à yLaplace
si c'est un bloc basé, je ne remplis pas les données provenant de la table correspondante mais j'ai rajouter des champs non basé au block basé. Donc pour avoir les valeurs de ces champs j’écris un script pour récupérer ces valeurs.
Néanmoins mon problème est résolu. J'utilisais un Clear_Form au lieu d'un Clear_Block. C'était là mon problème car il vidait les champs de l’entête
Merci
Cependant je voudrais savoir comment récupérer le type de canvas dans le script avec get_canvas_property ou autre ?
yLaplace est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h59.


 
 
 
 
Partenaires

Hébergement Web