Créer des User Exits dans Forms 11G sous Unix
S'APPLIQUE À :
Oracle Forms - version 11.0.0 et ultérieures
Les informations de ce document s'appliquent à toutes les plateformes.
PORTÉE
Développeurs
DÉTAILS
Depuis Forms 11G, la mise en œuvre des User Exits a changé et a été simplifiée. L'édition de liens dynamique des bibliothèques est désormais prise en charge sur les plateformes Unix, et il n'est plus nécessaire de relier de nouveau l'exécutable Forms. Dans les versions précédentes, la table iapxtb servait à conserver les pointeurs vers les user exits, et le fichier ue_xtb.c était mis à jour avec la liste des user exits. Avec l'édition de liens dynamique, le mécanisme iapxtb[] est toutefois déprécié : on utilise maintenant le paramètre FORMS_USEREXITS pour pointer vers la bibliothèque partagée. Voici les étapes pour mettre en place un exemple de User Exit sous Unix. L'exemple de code additionne deux nombres et renvoie leur somme.
1) Pour mettre en place l'exemple de user exit sous Unix, les fichiers suivants doivent tous être copiés dans le même répertoire :
UE.H
UE_SAMP.PC
UE_SAMP.FMB
ue.h est le fichier d'en-tête; il définit les codes de retour d'échec et de réussite (FATAL_ERR, FAILURE et SUCCESS) que renvoie le user exit.
ue_samp.pc contient l'exemple de code du user exit, soit une fonction qui prend deux nombres du formulaire, les additionne et renvoie le résultat.
ue_samp.fmb est le formulaire d'exemple du user exit.
Ces fichiers peuvent être téléchargés depuis OTN à cet emplacement :
Fichiers User Exit 11g
2) Précompilez et compilez le code du user exit.
REMARQUE : la version du précompilateur proc utilisée doit correspondre à la version des Required Support Files (RSF) de Forms. Pour 11gR1 et 11gR2, il s'agit de la version 11.1.0.7. Le précompilateur proc approprié pour Forms se trouve dans le répertoire ORACLE_HOME/bin de Forms.
Exemples de commandes pour précompiler et compiler sous Linux 32 bits :
proc ue_samp.pc
-- Crée le fichier ue_samp.c, qui doit ensuite être compilé
gcc -c ue_samp.c
-- Crée le fichier ue_samp.o
Exemples de commandes pour précompiler et compiler sous Linux 64 bits :
proc ue_samp.pc
-- Crée le fichier ue_samp.c, qui doit ensuite être compilé
gcc -c -fPIC -o ue_samp.o ue_samp.c
-- Crée le fichier ue_samp.o
3) Créez la bibliothèque partagée.
Exemple de commande pour créer la bibliothèque partagée sous Linux 32 bits :
ld -shared -o ue_samp.so ue_samp.o
-- Crée la bibliothèque partagée ue_samp.so
Exemple de commande pour créer la bibliothèque partagée sous Linux 64 bits :
gcc -shared -o ue_samp.so -L. ue_samp.o
-- Crée la bibliothèque partagée ue_samp.so
4) Réglez le paramètre FORMS_USEREXITS dans default.env pour qu'il pointe vers la bibliothèque partagée ue_samp.so.
5) Compilez UE_SAMP.FMB et exécutez le formulaire.
--Le fichier UE_SAMP.FMB contient, dans le déclencheur POST-TEXT-ITEM, du code qui appelle la fonction 'addtwo'.
Saisissez un nombre dans le premier item, passez au deuxième avec la touche Tab, saisissez un nombre, puis passez au troisième item avec Tab pour obtenir la somme des deux nombres.
Remarque : lors de la mise à niveau d'un code ancien, il n'est plus possible d'utiliser sqliem; l'édition de liens échouera : oraSQX11.LIB(sqliem.obj) :error LNK2001: unable to resolve symbol _exiterr
Utilisez plutôt l'instruction EXEC TOOLS MESSAGE pour transmettre un message d'un user exit à Oracle Forms. Le message s'affiche sur la ligne de message d'Oracle Forms une fois que le user exit a rendu le contrôle au formulaire. Pour coder l'instruction EXEC TOOLS MESSAGE, utilisez la syntaxe
EXEC TOOLS MESSAGE message_text [severity_code];
où message_text est une chaîne entre guillemets ou une variable hôte de type caractère (précédée d'un deux-points), et où severity_code, facultatif, est une constante entière ou une variable hôte entière (précédée d'un deux-points). L'instruction MESSAGE n'accepte pas les variables indicatrices. Dans les exemples suivants, votre user exit transmet des messages d'erreur à Oracle Forms :
.../...
exec sql begin declare section;
.../...
static char MsgToForms [ 200 ];
exec sql end declare section;
.../...
strcpy(:MsgToForms , "A Message" );
EXEC TOOLS MESSAGE :MsgToForms;
EXEC TOOLS MESSAGE 'Another message';
.../...