Le guide Oracle Forms 9i/10g
Date de publication : Juin 2005
Les alertes
Définition
Concept
Mise en oeuvre
Techniques avancées
Les alertes
Définition
Une alerte est une boite de dialogue munie d'un titre et affichant un message. Elle dispose de un à trois boutons configurables afin de récupérer un choix utilisateur.
Elle est utilisée pour présenter un message (d'erreur ou d'avertissement) auquel l'utilisateur doit répondre, car une alerte est modale.
Concept
Ce type de boite de dialogue est utilisé pour transmettre une information à l'utilisateur. Comme il s'agit d'une fenêtre modale, l'utilisateur doit cliquer sur l'un des boutons pour fermer cette fenêtre. Il ne peut naviguer sur aucune autre fenêtre.
L'affichage d'une boite d' alerte est réalisé pendant l'exécution en utilisant la fonction native :
Integer := Show_Alert( nom_alerte | id_alerte )
Selon sa configuration, une alerte peut afficher de un à trois boutons et l'une des trois icônes suivantes :
- Stop
- Avertissement
- Remarque
Le titre de l'alerte, le message (maxi 255 caractères) ainsi que le nombre et le libellé de chaque bouton de réponse sont configurables.
La fonction retourne le numéro du bouton cliqué par l'utilisateur.
Ce numéro prend l'une des trois constantes numériques suivantes:
- ALERT_BUTTON1
- ALERT_BUTTON2
- ALERT_BUTTON3
Il n'y a pas de limite au nombre d'alertes pouvant être créées dans un module.
Mise en oeuvre
Création d'une alerte
Cliquer sur le nud : Alertes dans le navigateur d'objets puis sur l'icône 
Une nouvelle boite d'alerte est créée avec un nom attribué par le système.
Faire un double-clic sur le nud de la nouvelle alerte pour afficher la palette de propriétés.
Dans cet exemple, nous avons besoin d'une alerte munie de deux boutons : Oui et Non, avec Oui par défaut
Renommons l'alerte en : AL_OUI_NON et ajoutons les propriétés nécessaires
La propriété : Type d'alerte permet de choisir le type d'icône qui apparaîtra dans la boite.
Fixons le libellé des deux premiers boutons et indiquons que le bouton par défaut sera le premier (Oui).
Dupliquer une Alerte
Pour dupliquer une alerte existante, cliquez l'alerte que vous voulez dupliquer et taper Ctrl-D au clavier. (ou menu : Edition->Dupliquer)
Modifier les propriétés d'une alerte à l'exécution
Vous pouvez modifier les propriétés suivantes en cours d'exécution:
Titre
Set_Alert_Property( nom_alerte | id_alerte, TITLE, nouveau_titre ) ;
Texte
Set_Alert_Property( nom_alerte | id_alerte, ALERT_MESSAGE_TEXT, nouveau_texte ) ;
Libellé d'un bouton
Set_Alert_Button_Property( nom_alerte | id_alerte, numéro_bouton, LABEL, nouveau_libellé ) ;
numéro_bouton vaut au choix:
- ALERT_BUTTON1
- ALERT_BUTTON2
- ALERT_BUTTON3
L'identifiant interne d'un alerte peut être récupéré avec la fonction :
ALERT := Find_Alert( nom_alerte ) ;
Cela permet de vérifier que le nom d'une alerte existe bien dans la forme.
Declare
Al_id ALERT ;
LI$Bouton pls_integer ;
Begin
Al_id := Find_Alert( 'mon_alerte' ) ;
If Id_Null( Al_id ) Then
Message('la boite d''alerte mon_alerte n''existe pas dans la forme');
Raise Form_Trigger_Failure ;
Else
LI$Bouton := Show_Alert( 'mon_alerte' ) ;
If LI$Bouton := ALERT_BUTTON1 Then
...
Elseif LI$Bouton := ALERT_BUTTON2 Then
...
Else
...
End if ;
End if ;
End ;
Techniques avancées
Couplée à une table de messages, la boite d'alerte devient un système d'affichage particulièrement souple et puissant.
Puisque tous les libellés de la boite d'alerte sont modifiables à l'exécution, il est facile (et conseillé) de ne coder aucun message applicatif "en dur" dans les modules, mais de les lire dans une table de messages.
Cela apporte les avantages suivants:
- Inutile d'ouvrir le module pour modifier un message (pas assez explicite pour l'utilisateur, faute d'orthographe, etc.).
- Externalisation des messages applicatifs (les message sont saisis/modifiés en table à l'aide d'un écran Forms ou d'un insert/update direct en table).
- Utilisation de messages paramétrés (les valeurs exactes sont transmises à la fonction d'affichage) permettant de réduire le nombre de messages de base.
- Facilité de traduction (votre système de messagerie peut tenir compte de la langue de l'utilisateur et d'afficher les libellés dans la bonne traduction).
Cette fonctionnalité est mise en oeuvre à travers l'écran de démonstration TEST_ALERTES_MESSAGES.FMB.
Celui-ci permet de tenir à jour la table des messages et de vérifier le fonctionnement des alertes qui leur sont associées
L'écran est basé sur la table MESSAGES créée dans le script d'installation tuto_forms_install.sql

Comme il est visible dans le champ : Texte, chaque message accepte de 0 à 3 paramètres (%1, %2 et %3) qui seront remplacés à l'affichage par les textes que vous fournirez aux fonctions Affiche_Message() et Question().
Le champ : Alerte permet de spécifier dans quelle boite d'alerte sera affichée le message (les alertes AL_ERREUR, AL_MSG_OUI_NON, AL_MSG_NON_OUI sont disponibles dans la bibliothèque d'objets OBJ_TUTO_FORMS.OLB).
Le champs : Stop indique si le message sera bloquant, c'est à dire qu'il sera suivi d'une instruction : Raise Form_Trigger_Failure
Le caractère "pipe" (Alt+124) dans le champ : Texte permet de placer des retours ligne à l'intérieur du message. (testez le message n° : 40)
Le bloc en bas d 'écran permet de tester chaque message en indiquant le numéro ainsi que les paramètres de remplacement.
Chaque message est affiché via la procédure : Affiche_Message() stockée dans la librairie PL/SQL : TUTO_FORMS.PLL
PROCEDURE Affiche_message
(
PN$Code in Number,
PC$Rep1 In Varchar2 Default Null,
PC$Rep2 In Varchar2 Default Null,
PC$Rep3 In Varchar2 Default Null,
PB$Arret In Boolean Default NULL
) IS
LR$MESSAGE MESSAGES%ROWTYPE ;
LC$Text Varchar2(300);
LN$But Number ;
Al_id Alert ;
BEGIN
Select
*
Into
LR$Message
From
MESSAGES
Where
CODE = PN$Code
;
LC$Text := LR$Message.TEXTE ;
LC$Text := Replace( LC$Text, '|', CHR(10) ) ;
If PC$Rep1 is not null Then
LC$Text := Replace( LC$Text, '%1', PC$Rep1 ) ;
End if ;
If PC$Rep2 is not null Then
LC$Text := Replace( LC$Text, '%2', PC$Rep2 ) ;
End if ;
If PC$Rep3 is not null Then
LC$Text := Replace( LC$Text, '%3', PC$Rep3 ) ;
End if ;
Al_id := Find_Alert(LR$Message.ALERTE);
IF Not Id_Null(al_id) THEN
If LR$Message.TITRE is not null Then
Set_Alert_Property(LR$Message.ALERTE, TITLE, LR$Message.TITRE ) ;
End if ;
Set_Alert_Property(LR$Message.ALERTE, ALERT_MESSAGE_TEXT, LC$Text ) ;
LN$But := Show_Alert(LR$Message.ALERTE);
Else
Message('Alerte ' || LR$Message.ALERTE || ' non présente dans la forme');
Message(LC$TExt);
End if ;
If PB$Arret is not null Then
If PB$Arret = TRUE Then
Raise form_trigger_failure ;
End if ;
Elsif LR$Message.STOP = 'O' Then
Raise form_trigger_failure ;
End if ;
Exception
When no_data_found Then
Al_id := Find_Alert('AL_ERREUR');
IF Not Id_Null(al_id) THEN
Set_Alert_Property('AL_ERREUR', TITLE, 'Messages applicatifs' );
Set_Alert_Property('AL_ERREUR', ALERT_MESSAGE_TEXT, 'Message : '
|| To_char(PN$Code) || ' non trouvé');
LN$But := Show_Alert('AL_ERREUR' ) ;
Else
Message('Alerte AL_ERREUR non présente dans la forme');
Message('Message : ' || To_char(PN$Code) || ' non trouvé');
End if ;
Raise Form_trigger_failure ;
When Form_trigger_failure Then
Raise ;
When others Then
Null ;
END;
Les boites d'alerte sont également utilisées, dans la librairie TUTO_FORMS.PLL par la fonction Question() qui retourne le numéro du bouton pressé par l'utilisateur.
Conseils pratiques
Dans la plupart des cas, vous n'aurez besoin que de trois boites d'alerte.
- Une alerte générique sans choix utilisateur et qui ne nécessite qu'un seul bouton (Ok).
- Une alerte interactive avec choix utilisateur de type Oui/Non (Oui par défaut).
- Une alerte interactive avec choix utilisateur de type Oui/Non (Non par défaut).
Ces trois types d'alerte sont accessibles depuis la bibliothèque d'objets : OBJ_TUTO_FORMS.OLB
Créez les alertes nécessaires à toute votre application, glissez-les dans votre forme de référence ou dans votre librairie d'objets et faites-en hériter chacun de vos modules.
Il deviendra alors facile de stocker en librairie PL/SQL (.PLL) une ou deux procédures d'affichage de vos alertes pour une gestion centralisée de toute la messagerie de votre application.
|