IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Le guide Oracle Forms 9i/10g

Date de publication : Juin 2005




L'appel d'une forme
Définition
Concept
Mise en oeuvre
Techniques avancées


L'appel d'une forme


Définition

L 'appel d'une forme consiste à charger un fichier pseudo-exécutable (.FMX) en mémoire.

Ce chargement peut être commandé depuis une ligne de commande du système d'exploitation, une url saisie dans le navigateur ou depuis une forme préalablement chargée en mémoire.

Des arguments ou paramètres peuvent être transmis à la forme durant l'appel.


Concept

Passons en revue les différents mécanismes d'appel d'une forme

Depuis la ligne de commande du système d'exploitation

Il suffit de créer sur le bureau un raccourcis pointant sur votre navigateur
Par exemple, avec Internet Explorer, entrez le code suivant dans votre raccourcis:
"C:\Program Files\Internet Explorer\IEXPLORE.EXE" http://nom_host:port/forms90/f90servlet?form=D:\Cours\tutoforms10g\ALBUM_PHOTO.fmx&userid=TUTOFORMS/TUTO@dbtest

Cette méthode permet de lancer une forme sans passer par le fichier de configuration : formsweb.cfg

Si vous avez configuré une section particulière du fichier de configuration formsweb.cfg, indiquez-le dans la ligne de commande:
"C:\Program Files\Internet Explorer\IEXPLORE.EXE" http://nom_host:port/forms90/f90servlet?config=tuto&form=D:\Cours\tutoforms10g\ALBUM_PHOTO.fmx


Depuis une url saisie dans le navigateur

L'url à saisir dans le navigateur est la même que celle indiquée dans la ligne de commande:
http://nom_host:port/forms90/f90servlet?form=D:\Cours\tutoforms10g\ALBUM_PHOTO.fmx&userid=TUTOFORMS/TUTO@dbtest
ou
http://nom_host:port/forms90/f90servlet?config=tuto&form=D:\Cours\tutoforms10g\ALBUM_PHOTO.fmx

Il s'agit dans tous les cas de l'url d'accès au serveur d'applications (nom_host :port)

Le numéro du port d'écoute de Forms peut être retrouvé dans le fichier <DEVSUITE_HOME>/install/portlist.ini


Depuis une autre forme déjà chargée en mémoire

Lorsqu'une forme est chargée en mémoire, la gestion d'une application multi formes est réalisée avec les fonctions natives suivantes:

  • NEW_FORM()
  • OPEN_FORM()
  • CALL_FORM()
New_Form() remplace la forme présente en mémoire par une autre
Open_Form() ouvre une nouvelle forme indépendante de la forme appelée
Call_Form() ouvre une nouvelle forme dépendante de la forme appelante

Ces fonctions peuvent être appelées depuis une forme, un menu ou une bibliothèque PL/SQL.


Mise en oeuvre

Remplacer la forme en mémoire par une autre

Il faut utiliser la fonction New_Form()

Cette fonction termine la forme appelante et charge en mémoire la forme appelée.
Si la forme appelante était elle-même fille d'une autre forme, cette dernière reste active.

Syntaxes de la fonction New_Form():

NEW_FORM(formmodule_name VARCHAR2);
NEW_FORM(formmodule_name VARCHAR2,rollback_mode NUMBER);
NEW_FORM(formmodule_name VARCHAR2,rollback_mode NUMBER,query_mode NUMBER);
NEW_FORM(formmodule_name VARCHAR2,rollback_mode NUMBER,query_mode NUMBER,data_mode NUMBER);
NEW_FORM(formmodule_name VARCHAR2,rollback_mode NUMBER,query_mode NUMBER,paramlist_id PARAMLIST);
NEW_FORM(formmodule_name VARCHAR2,rollback_mode NUMBER,query_mode NUMBER,paramlist_name VARCHAR2);
NEW_FORM(formmodule_name VARCHAR2,rollback_mode NUMBER,query_mode NUMBER,data_mode NUMBER,paramlist_id PARAMLIST);
NEW_FORM(formmodule_name VARCHAR2,rollback_mode NUMBER,query_mode NUMBER,data_mode NUMBER,paramlist_name VARCHAR2);

formmodule_name est le nom de la forme appelée (sans extension) et doit être entre quotes
rollback_mode peut prendre l'une des trois valeurs suivantes:

  • TO_SAVEPOINT (défaut) Forms annule (rollback) tous les changements non validés (y compris ceux pré-validés par l'instruction POST()).
  • NO_ROLLBACK Forms quitte la forme sans exécuter de rollback (et donc de libération des enregistrements éventuellement verrouillés).
  • FULL_ROLLBACK Forms annule (rollback) tous les changements non validés (y compris ceux pré validés par l'instruction POST()) durant la session. Il n'est pas possible de spécifier cette valeur si la forme en mémoire est en mode POST-ONLY. (le mode POST-ONLY est activé lorsqu'un forme est appelée alors que la forme appelante contient des enregistrements non validés).
query_mode:

  • NO_QUERY_ONLY (défaut) La forme appelée est modifiable (Insert, Update, Delete)
  • QUERY_ONLY La forme appelée n'est pas modifiable. L'utilisateur pourra interroger mais ne pourra ni insérer, ni modifier, ni supprimer.
data_mode:

  • NO_SHARE_LIBRARY_DATA (défaut) les variables situées en librairies PL/SQL ne sont pas partagées.
  • SHARE_LIBRARY_DATA Les variables situées en librairies PL/SQL sont visibles. C'est un excellent moyen de contourner la limitation des variables globales, toujours de type CHAR et limitées à 255 caractères.
paramlist_id représente l'identifiant d'une liste de paramètres qui sera transmise à la forme appelée.
paramlist_name représente le nom d'une liste de paramètres qui sera transmise à la forme appelée.

Quelques exemple d'appels

-- Forme factures, rollback jusqu'au dernier savepoint, mode non modifiable -- NEW_FORM( 'factures', to_savepoint, query_only); -- Forme factures, rollback jusqu'au dernier savepoint, mode modifiable -- -- partage des variables de librairie -- NEW_FORM( 'factures', to_savepoint, no_query_only, share_library_data); -- Forme factures, rollback jusqu'au dernier savepoint, mode modifiable -- -- partage des variables de librairie, passage d'une liste de paramètres -- NEW_FORM( 'factures', no_rollback, no_query_only, share_library_data, id_param_list);
New_Form() peut être utilisé pour remplacer un écran d'accueil par la première forme vraiment fonctionnelle d'une application.


Ouvrir une nouvelle forme en parallèle et indépendante

Il faut utiliser la fonction Open_Form()

Cette fonction charge la forme appelée en laissant la forme appelante active.

Syntaxes de la fonction Open_Form():

OPEN_FORM(formmodule_name VARCHAR2);
OPEN_FORM(form_name VARCHAR2,activate_mode NUMBER);
OPEN_FORM(formmodule_name VARCHAR2,activate_mode NUMBER,session_mode NUMBER);
OPEN_FORM(formmodule_name VARCHAR2,activate_mode NUMBER,session_mode NUMBER,data_mode NUMBER);
OPEN_FORM(formmodule_nameVARCHAR2,activate_mode NUMBER,session_mode NUMBER,paramlist_name VARCHAR2);
OPEN_FORM(formmodule_name VARCHAR2,activate_mode NUMBER,session_mode NUMBER,paramlist_id PARAMLIST);
OPEN_FORM(formmodule_name VARCHAR2,activate_mode NUMBER,session_mode NUMBER,data_mode NUMBER,paramlist_name VARCHAR2); PROCEDURE OPEN_FORM(formmodule_name VARCHAR2,activate_mode NUMBER,session_mode NUMBER,data_mode NUMBER,paramlist_id PARAMLIST);

formmodule_name est le nom de la forme appelée (sans extension) et doit être entre quotes
activate_mode:

  • ACTIVATE (défaut) donne le focus à la forme appellée
  • NO_ACTIVATE laisse le focus à la forme appelante
session_mode:

  • NO_SESSION (défaut) indique que la nouvelle forme s'exécutera dans la même session
  • SESSION indique que la nouvelle forme s'exécutera dans une nouvelle session
data_mode:

  • NO_SHARE_LIBRARY_DATA (défaut) les variables situées en librairies PL/SQL ne sont pas partagées.
  • SHARE_LIBRARY_DATA Les variables situées en librairies PL/SQL sont visibles. C'est un excellent moyen de contourner la limitation des variables globales, toujours de type CHAR et limitées à 255 caractères.
paramlist_id représente l'identifiant d'une liste de paramètres qui sera transmise à la forme appelée.
paramlist_name représente le nom d'une liste de paramètres qui sera transmise à la forme appelée.

Open_Form() est particulièrement indiqué pour construire des applications multi formes indépendantes et dans une session différente ou identique.
Il est alors possible de naviguer dans les différentes formes avec la fonction Go_Form().

Remarques:
Si le paramètre session_mode est positionné à SESSION, vous ne pouvez pas positionner le mode data_mode à SHARE_LIBRARY_DATA.
En effet, le partage des variables n'est valable qu'au sein d'une même session.


Ouvrir une nouvelle forme dépendante de la forme appelante

Il faut utiliser la fonction Call_Form()

Cette fonction charge la forme appelée en laissant la forme appelante présente mais inactive.

Syntaxes de la fonction Call_Form():

CALL_FORM(formmodule_name VARCHAR2);
CALL_FORM(formmodule_name VARCHAR2,display NUMBER);
CALL_FORM(formmodule_name VARCHAR2,display NUMBER,switch_menu NUMBER);
CALL_FORM(formmodule_name VARCHAR2,display NUMBER,switch_menu NUMBER,query_mode NUMBER);
CALL_FORM(formmodule_name VARCHAR2,display NUMBER,switch_menu NUMBER,query_mode NUMBER,data_mode NUMBER);
CALL_FORM(formmodule_name VARCHAR2,display NUMBER,switch_menu NUMBER,query_mode NUMBER,paramlist_id PARAMLIST);
CALL_FORM(formmodule_name VARCHAR2,display NUMBER,switch_menu NUMBER,query_mode NUMBER,paramlist_name VARCHAR2);
CALL_FORM(formmodule_name VARCHAR2,display NUMBER,switch_menu NUMBER,query_mode NUMBER,data_mode NUMBER,paramlist_id PARAMLIST);
CALL_FORM(formmodule_name VARCHAR2,display NUMBER,switch_menu NUMBER,query_mode NUMBER,data_mode NUMBER,paramlist_name VARCHAR2);

formmodule_name est le nom de la forme appelée (sans extension) et doit être entre quotes
Display:

  • HIDE (défaut) la forme appelante est masquée
  • NO_HIDE la forme appelante reste visible
switch_menu:

  • NO_REPLACE (défaut) la forme appelée hérite du menu de la forme appelante
  • DO_REPLACE le menu de la forme appelante est remplacé par celui défini dans la forme appelée
query_mode:

  • NO_QUERY_ONLY (défaut) La forme appelée est modifiable (Insert, Update, Delete)
  • QUERY_ONLY La forme appelée n'est pas modifiable. L'utilisateur pourra interroger mais ne pourra ni insérer, ni modifier, ni supprimer.
data_mode:

  • NO_SHARE_LIBRARY_DATA (défaut) les variables situées en librairies PL/SQL ne sont pas partagées.
  • SHARE_LIBRARY_DATA Les variables situées en librairies PL/SQL sont visibles. C'est un excellent moyen de contourner la limitation des variables globales, toujours de type CHAR et limitées à 255 caractères.
paramlist_id représente l'identifiant d'une liste de paramètres qui sera transmise à la forme appelée.
paramlist_name représente le nom d'une liste de paramètres qui sera transmise à la forme appelée.

Remarques
Forms ignore le paramètre query_mode si la forme appelante est déjà en QUERY_ONLY
Une liste de paramètres transmise à la forme appelée ne doit pas contenir de paramètre de type DATA_PARAMETER.

Une partie de la mémoire allouée à l'instruction Call_Form() n'est pas totalement désalouée tant que la session n'est pas terminée. (attention aux applications utilisant largement cette fonction).

Lorsque vous exécutez Call_Form() dans les déclencheurs Pre-Logon, On-Logon ou Post-Logon, spécifiez toujours DO_REPLACE dans le paramètre switch_menu. En effet, la valeur NO_REPLACE dans un de ces déclencheurs provoque l'affichage d'un menu vide.
Une alternative, dans ce cas précis, est d'utiliser ensuite la fonction Replace_Menu() dans le déclencheur When-New-Form-Instance de la forme appelée.

Exemples d'utilisation de Call_Form():

BEGIN CALL_FORM('factures', no_hide, no_replace, query_only); END; DECLARE pl_id PARAMLIST; BEGIN /* Transmission d'une liste de paramètres */ pl_id := GET_PARAMETER_LIST('tempdata'); IF ID_NULL(pl_id) THEN CALL_FORM('factures'); ELSE CALL_FORM('factures', hide, no_replace, no_query_only, pl_id); END IF; CALL_FORM('ventes', no_hide, do_replace, query_only); END;
L'utilisation de Call_Form() génère une pile de type FIFO.
Il faut quitter la forme appelée pour revenir à la forme appelante.
Les formes sont donc intimement liées entre elles.

Soit la forme A appelant la forme B appelant la forme C:

A et B sont inactives.
Exit_Form() dans la forme C revient à la forme B.
Exit_Form() dans la forme B revient à la forme A.


Techniques avancées

Lorsque les formes s'exécutent dans la même session, toute instruction Commit_Form() validera l'ensemble des modifications apportées dans toutes les formes partageant cette session.

Cas particulier de Call_Form()

Il n'est pas possible d'appeler une nouvelle forme avec Call_Form() si les modifications de la forme appelante ne sont pas enregistrées.
Il existe donc 3 possibilités:

  • La forme appelante ne contient aucune modification
  • La forme appelante contient des modifications que vous enregistrez complètement (Commit)
  • La forme appelante contient des modifications que vous enregistrez partiellement (Post)
L'utilisation de Commit() ou de Post() dépend du résultat que vous attendez

Vous souhaiter enregistrer les modifications de la forme appelante, que les modifications générées par la forme appelée soient enregistrées ou non.
Utiliser Commit() dans la forme appelante

Vous souhaitez valider l'ensemble des modifications apportées à l'ensemble des formes.
Utilisez Post() dans la forme appelante et chargez la forme appelée. Dans la forme appelée, vous avez encore plusieurs solutions:
Vous souhaitez ne pas valider les modifications
Utilisez l'instruction Exit_Form( NO_VALIDATE, TO_SAVEPOINT ) ;
Dans ce cas, seules les modifications de la forme B sont annulées.

Vous souhaitez valider partiellement les modifications
Utilisez l'instruction Post() et Exit_Form( NO_COMMIT, NO_ROLLBACK ) ;
Dans cas, les modifications de la forme B sont postées.
De retour dans la forme initiale, vous pouvez tout valider avec Commit_Form() ou rien avec Exit_Form( NO_VALIDATE, FULL_ROLLBACK ).


Navigation dans les formes

Pour naviguer à travers les différentes formes de l'application, utilisez la fonction Go_Form():

GO_FORM(form_id FORMMODULE);
GO_FORM(form_name VARCHAR2);

form_id est l'identifiant unique de la forme. Cet identifiant peut être récupéré avec la fonction Find_Form()
form_name est le nom de la forme entre cotes

Begin Form_id FORMMODULE ; Declare Form_id := Find_Form( 'factures' ) ; If not id_null( Form_id ) Then Go_Form( Form_id ) ; End if ; End ;
Remarque:
Go_Form() ne peut pas être utilisé pour naviguer dans une pile générée par l'instruction Call_Form() car les formes appelantes ne redeviennent actives que lorsque la forme appelée est quittée.

Attention:
Si votre serveur d'application se trouve sur une machine UNIX ou LINUX, prenez garde à la casse
Go_Form( 'factures') et Go_Form( 'FACTURES' ) sont différents.


Lancement d'une nouvelle application dans une nouvelle fenêtre du navigateur

Il est possible de charger une autre application (ou la même) dans une autre fenêtre du navigateur en utilisant la fonction Web.Show_Document()

L'url à transmettre est la même que celle utilisée dans l'exemple : Depuis une url saisie dans le navigateur

Declare LC$Url Varchar2(256) ; Begin LC$Url := 'http://nom_host:port/forms90/f90servlet?config=tuto&form=D:\Cours\tutoforms10g\ALBUM_PHOTO.fmx' ; Web.Show_Document( LC$Url, '_blank' ) ; End ;



Copyright © 2005 SheikYerbouti. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.