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 : 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;
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
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;
Les scripts des triggers sur la vue vgamme_article sont à la fin de la partie code sur la vue vgamme_article.

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.