Bonjour à tous
Ca fait longtemps que je n'ai pas fais appels à vos lumières pour un problème en forms.
Version forms : 6.0.8.27.0
Version Base : 9.2.0.4
Je voudrais faire un update sur une vue à travers forms. J'ai mis en place des triggers sur la base en insert, update et delete avec la fonction instead of qui envoie l'instruction sur la bonne table.
Script de la table gamme_article :
Code la vue vgamme_article. C'est cette vue que je veux modifier dans forms
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 ALTER TABLE OPS$PROJET.GAMME_ARTICLE DROP PRIMARY KEY CASCADE; DROP TABLE OPS$PROJET.GAMME_ARTICLE CASCADE CONSTRAINTS; CREATE TABLE OPS$PROJET.GAMME_ARTICLE ( SAISON VARCHAR2(5 BYTE) NOT NULL, SECTEUR VARCHAR2(5 BYTE) NOT NULL, RGP_PAYS VARCHAR2(5 BYTE) NOT NULL, ART NUMBER NOT NULL, GAMME VARCHAR2(5 BYTE) NOT NULL, DATM DATE NOT NULL, DATC DATE NOT NULL, USERM VARCHAR2(20 BYTE) NOT NULL, USERC VARCHAR2(20 BYTE) NOT NULL, IDLIG INTEGER NOT NULL ) TABLESPACE TMED PCTUSED 40 PCTFREE 10 INITRANS 1 MAXTRANS 255 STORAGE ( INITIAL 5M NEXT 5M MINEXTENTS 1 MAXEXTENTS UNLIMITED PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT ) LOGGING NOCOMPRESS NOCACHE NOPARALLEL NOMONITORING; COMMENT ON TABLE OPS$PROJET.GAMME_ARTICLE IS 'Gestion des Gamma Article par Saison,segment,pays)'; CREATE UNIQUE INDEX OPS$PROJET.K_GAMME_ARTICLE ON OPS$PROJET.GAMME_ARTICLE (IDLIG) LOGGING TABLESPACE TSMALL PCTFREE 10 INITRANS 2 MAXTRANS 255 STORAGE ( INITIAL 512K NEXT 512K MINEXTENTS 1 MAXEXTENTS UNLIMITED PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT ) NOPARALLEL; CREATE UNIQUE INDEX OPS$PROJET.K2_GAMME_ARTICLE ON OPS$PROJET.GAMME_ARTICLE (SAISON, SECTEUR, RGP_PAYS, ART, GAMME) LOGGING TABLESPACE TSMALL PCTFREE 10 INITRANS 2 MAXTRANS 255 STORAGE ( INITIAL 512K NEXT 512K MINEXTENTS 1 MAXEXTENTS UNLIMITED PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT ) NOPARALLEL; ALTER TABLE OPS$PROJET.GAMME_ARTICLE ADD ( CONSTRAINT K_GAMME_ARTICLE PRIMARY KEY (IDLIG) USING INDEX TABLESPACE TSMALL PCTFREE 10 INITRANS 2 MAXTRANS 255 STORAGE ( INITIAL 512K NEXT 512K MINEXTENTS 1 MAXEXTENTS UNLIMITED PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 )); ALTER TABLE OPS$PROJET.GAMME_ARTICLE ADD ( CONSTRAINT CR_GAMME_ARTICLE_1 FOREIGN KEY (ART) REFERENCES OPS$PROJET.ARTNEW (ART) ON DELETE CASCADE); GRANT ALTER, DELETE, INSERT, SELECT, UPDATE, ON COMMIT REFRESH, QUERY REWRITE, DEBUG, FLASHBACK ON OPS$PROJET.GAMME_ARTICLE TO MINIER;
Les scripts des triggers sur la vue vgamme_article sont à la fin de la partie code sur la vue vgamme_article.
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 DROP VIEW OPS$PROJET.VGAMME_ARTICLE; /* Formatted on 21/05/2010 09:30:09 (QP5 v5.115.810.9015) */ CREATE OR REPLACE FORCE VIEW OPS$PROJET.VGAMME_ARTICLE ( ART, BNB, BCT, HGA, SAISON, RGP_PAYS, GAMME, SECTEUR, IDLIG ) AS SELECT a.art, a.bnb, a.bct, a.hga, g.saison, g.rgp_pays, g.gamme, g.secteur, g.idlig FROM gamme_article g, artnew a WHERE a.art = a.rgpart AND a.hga IN (0, 6, 7) AND g.art(+) = a.art; DROP TRIGGER OPS$PROJET.T_VGAMME_ARTICLE_DEL; CREATE OR REPLACE TRIGGER OPS$PROJET.t_vgamme_article_del instead of delete ON OPS$PROJET.VGAMME_ARTICLE for each row begin -- -- $TRIGGER/gamme_article.sql -- Le Delete est lance sur la vue mais -- l instruction instead of permet de rediriger le delete vers la bonne table -- en l occurence gamme_article; delete gamme_article where idlig = :old.idlig; END; / DROP TRIGGER OPS$PROJET.T_VGAMME_ARTICLE_INS; CREATE OR REPLACE TRIGGER OPS$PROJET.t_vgamme_article_ins instead of insert ON OPS$PROJET.VGAMME_ARTICLE for each row begin -- -- $TRIGGER/gamme_article.sql -- L insert est lance sur la vue mais -- l instruction instead of permet de rediriger l update vers la bonne table -- en l occurence gamme_article; insert into gamme_article (saison,secteur,rgp_pays,gamme,art) values (:new.saison,:new.secteur,:new.rgp_pays,:new.gamme,:new.art); END; / DROP TRIGGER OPS$PROJET.T_VGAMME_ARTICLE_UPD; CREATE OR REPLACE TRIGGER OPS$PROJET.t_vgamme_article_upd instead of update ON OPS$PROJET.VGAMME_ARTICLE for each row begin -- -- $TRIGGER/gamme_article.sql -- Update est lance sur la vue mais -- l instruction instead of permet de rediriger l update vers la bonne table -- en l occurence gamme_article; update gamme_article set saison = :new.saison ,secteur = :new.secteur ,rgp_pays = :new.rgp_pays ,gamme = :new.gamme ,art = :new.art where idlig = :old.idlig; END; / DROP PUBLIC SYNONYM VGAMME_ARTICLE; CREATE PUBLIC SYNONYM VGAMME_ARTICLE FOR OPS$PROJET.VGAMME_ARTICLE; GRANT DELETE, INSERT, SELECT, UPDATE, ON COMMIT REFRESH, QUERY REWRITE, DEBUG, FLASHBACK ON OPS$PROJET.VGAMME_ARTICLE TO MINIER;
Lorsque je veux faire une modification dans la form, il me donne une erreur :
FRM - 40602 : cannot insert into or update in view.
Quels sont les propriétés de mon block basé sur ma vue que je dois modification pour que ca fonctionne.
J'ai vu dans un vieux message sur un forum qu'il fait modifier la valeur du champ locking mode mais je ne sais pas quoi mettre.
Si je fais un insert ou update ou delete en SQL directement, là tout fonctionne bien. Les triggers instead of jouent bien leur rôle.
Merci d'avance pour votre aide.
Partager