Developpez.com

Plus de 2 000 forums
et jusqu'à 5 000 nouveaux messages par jour

Le guide Oracle Forms 9i/10g


précédentsommairesuivant

XXXI. L'appel d'une forme

XXXI-A. Définition

L 'appel d'une forme consiste à charger un fichier pseudoexé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.

XXXI-B. 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.

XXXI-C. Mise en œuvre

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

 
Sélectionnez

-- 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 PostLogon, 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():

 
Sélectionnez

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.

XXXI-D. 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

 
Sélectionnez

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

 
Sélectionnez

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 ;

précédentsommairesuivant

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

Copyright © 2005 SheikYerbouti. Aucune reproduction, même partielle, ne peut être faite de ce site et 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.