Modernisation Oracle Forms

Comment enregistrer des formulaires dans la base de données ?

OBJECTIF

L'objectif de cette note est d'expliquer comment enregistrer des formulaires dans la base de données.

Elle indique ce que vous devez faire pour pouvoir enregistrer le

formulaire dans la base de données. (Cela s'appliquait à Developer 6i, mais n'est plus possible depuis Forms 9.x)

Remarque : il n'est pas recommandé de stocker les modules dans la base de données. Cette fonctionnalité

pourrait être retirée dans de futures versions.

COMMENT ENREGISTRER LE FORMULAIRE DANS LA BASE DE DONNÉES ?

Par défaut, un formulaire est généralement enregistré dans le système de fichiers.

Toutefois, si vous voulez l'enregistrer dans la base de données, vous devrez effectuer quelques

opérations dans la base de données : vous devrez y exécuter des scripts. Ces

scripts sont généralement installés lorsque vous installez la "database table" à partir du

CD. (Sans ces tables, vous obtenez l'erreur ORA-942 Table not exist)

Voici, étape par étape, ce que vous devez faire, en commençant par l'installation

du script :

1) Installez Database table à partir du CD Developer. Les scripts suivants

seront alors installés :

-- frm60bld.sql

-- frm60drp.sql

-- frm60grt.sql

-- frm60rvk.sql

Ces scripts se trouvent dans le répertoire suivant :

$oracle_home$\tools\dbtab60\forms60\

Le script frm60bld.sql crée les objets suivants :

-- table FRM50__OBJECT

-- index ifrm50_object sur frm50__object

-- synonyme public FRM50_OBJECT pour system.FRM50__OBJECT

-- table FRM50__BUFFER

-- index ifrm50_buffer sur frm50__buffer

-- synonyme public FRM50_BUFFER pour system.FRM50__BUFFER

-- table FRM50__BINDVAR

-- index ifrm50_bindvar sur frm50__bindvar

-- synonyme public FRM50_BINDVAR pour system.FRM50__BINDVAR

-- table FRM50__GRP

-- index unique iFRM50_grp sur FRM50__grp

-- synonyme public FRM50_GRP pour system.FRM50

__GRP

-- vue FRM50_ENABLED_ROLES

-- synonyme public FRM50_ENABLED_ROLES pour system.FRM50_ENABLED_ROLES

-- rôle ORAFORMS$OSC

-- rôle ORAFORMS$DBG

-- rôle ORAFORMS$BGM

Voici une copie du script, au cas où vous en auriez besoin.

create table FRM50__OBJECT
(
   OWNER         VARCHAR2(32),
   MODID         NUMBER(9),
   ITEMID        NUMBER,
   NAME          VARCHAR2(32),
   OBJECTTYPE    NUMBER,
   SEQUENCE      NUMBER,
   RAWLEN        NUMBER,
   TEXTLEN       NUMBER,
   CHUNKNO       NUMBER,
   SCOPEID       NUMBER,
   SCOPE1        VARCHAR2(32),
   SCOPE2        VARCHAR2(32),
   SCOPE3        VARCHAR2(32),
   RAWDATA       RAW(250),
   TEXTDATA1     VARCHAR2(2000),
   TEXTDATA2     VARCHAR2(2000),
   TEXTDATA3     VARCHAR2(2000),
   TEXTDATA4     VARCHAR2(2000),
   PROGRAMUNITID NUMBER
);
create index ifrm50_object on frm50__object(modid,itemid);
create public synonym FRM50_OBJECT for system.FRM50__OBJECT;

create table FRM50__BUFFER
(
   OWNER        VARCHAR2(32),
   MODID        NUMBER(9),
   STARTADDR    NUMBER,
   STARTREF     NUMBER,
   DATATYPE     NUMBER,
   LONGID       NUMBER
);
create index ifrm50_buffer on frm50__buffer(modid);
create public synonym FRM50_BUFFER for system.FRM50__BUFFER;

create table FRM50__BINDVAR
(
   OWNER        	VARCHAR2(32),
   MODID        	NUMBER(9),
   ITEMID      		NUMBER,
   NEXTBPOS     	NUMBER,
   PLSQLBV_EP   	NUMBER,
   TOTAL_BINDVAR	NUMBER
);
create index ifrm50_bindvar on frm50__bindvar(modid, itemid);
create public synonym FRM50_BINDVAR for system.FRM50__BINDVAR;


create table FRM50__GRP
(
   OWNER       VARCHAR(30),
   MODID       DECIMAL(9),
   ITEMID      DECIMAL(9),
   GRPNAME     VARCHAR(30),
   GRPFLAG     NUMBER
);
create unique index iFRM50_grp on FRM50__grp(modid,itemid);
create public synonym FRM50_GRP for system.FRM50__GRP;

create or replace view FRM50_ENABLED_ROLES as
select urp.granted_role role,
sum(distinct decode(rrp.granted_role,
   'ORAFORMS$OSC',2,
   'ORAFORMS$BGM',4,
   'ORAFORMS$DBG',1,0)) flag
from  sys.user_role_privs urp, role_role_privs rrp
where urp.granted_role = rrp.role (+)
  and urp.granted_role not like 'ORAFORMS$%'
group by urp.granted_role;

create public synonym FRM50_ENABLED_ROLES for system.FRM50_ENABLED_ROLES;

create role ORAFORMS$OSC;
create role ORAFORMS$DBG;
create role ORAFORMS$BGM;

Le script frm60drp.sql supprime les objets comme suit :

drop table FRM50__OBJECT;
drop table FRM50__BUFFER;
drop table FRM50__BINDVAR;
drop table FRM50__GRP;
drop view  FRM50_ENABLED_ROLES;
drop public synonym FRM50_OBJECT;
drop public synonym FRM50_BUFFER;
drop public synonym FRM50_BINDVAR;
drop public synonym FRM50_GRP;
drop public synonym FRM50_ENABLED_ROLES;
drop role ORAFORMS$OSC;
drop role ORAFORMS$DBG;
drop role ORAFORMS$BGM;

Le script frm60grt.sql accorde les privilèges select, insert, delete et update sur les

objets créés précédemment, comme suit :

accept uname char prompt 'Grant access to user: ';

set verify off;
grant select, insert, delete, update on FRM50_OBJECT       to &uname; 
grant select, insert, delete, update on FRM50_BUFFER       to &uname;
grant select, insert, delete, update on FRM50_BINDVAR      to &uname;
grant select, insert, delete, update on FRM50_GRP          to &uname;
grant select                         on FRM50_ENABLED_ROLES to &uname;

le script frm60rvk.sql révoque ces privilèges comme suit :

accept uname char prompt 'Revoke access from user: ';

set verify off;

revoke all on FRM50_OBJECT           from &uname; 
revoke all on FRM50_BUFFER           from &uname;
revoke all on FRM50_BINDVAR          from &uname;
revoke all on FRM50_GRP              from &uname;
revoke all on FRM50_ENABLED_ROLES    from &uname;

REMARQUE : si vous ne voulez pas installer les tables de base de données, vous pouvez copier et coller

les scripts ci-dessus dans le Bloc-notes et les enregistrer dans un fichier .sql.

2) Connectez-vous à la base de données en tant que system et exécutez le script frm60bld.sql pour créer

les objets mentionnés ci-dessus.

3) Une fois le script exécuté, vous pouvez lancer Forms Builder et

définir l'accès sur la base de données plutôt que sur les fichiers. Pour cela, vous

devez procéder comme suit :

a. Ouvrez le menu Tools de Forms Builder

b. Allez dans Preferences

c. Allez dans l'onglet Access

d. Cochez la case Database.

Une fois l'accès défini sur la base de données, lorsque vous enregistrez le formulaire avec "Save As", vous

êtes invité à l'enregistrer dans la base de données. Vous pouvez désormais l'enregistrer dans la base de données

sans problème. Vous n'auriez pas pu enregistrer le formulaire dans la

base de données sans exécuter d'abord le script mentionné ci-dessus.

REMARQUE : assurez-vous de n'obtenir aucune erreur lorsque vous exécutez le script frm60bld.sql.

Si vous rencontrez des erreurs, vérifiez que ces objets n'existent pas déjà dans

la base de données.