Le guide Oracle Forms 9i/10g
Date de publication : Juin 2005
Les items liste
Définition
Concept
Mise en oeuvre
Techniques avancées
Les items liste
Définition
Un item de type Liste permet d'afficher une liste de valeurs.
Communément appelé liste déroulante, un item Liste permet la sélection d'une valeur à l'intérieur d'une liste prédéfinie.
Un item de ce type laisse généralement apparaître une seule valeur. L'affichage des autres valeurs s'effectuant en cliquant soit directement dans la zone de la liste, soit dans l'icône de défilement.
Concept
Sous Forms 9i/10g, une liste de valeurs correspond toujours à un groupe d'objets composés de deux colonnes.
- La première colonne contient le libellé associé qui apparaîtra dans la liste.
- La deuxième contient la valeur qui sera stockée en base.
Forms 9i distingue 3 types de liste:
- Liste instantanée
- Liste de sélection
- Zone de liste déroulante

- La liste instantanée est la plus simple. Il faut la développer (en cliquant) pour faire apparaître les autres valeurs
- La liste de sélection ne se développe pas. La sélection des valeurs se fait soit avec les touches Haut/Bas du clavier, soit avec l'icône de déplacement
- La zone de liste déroulante est semblable à la liste instantanée, mais permet également l'ajout (par saisie dans l'item) d'une nouvelle valeur.
Le contenu d'un item Liste peut être statique ou dynamique.
Contenu statique:
Les valeurs de la liste sont définies au moment de la conception de l'écran via la propriété : Fonctionnel -> Eléments dans la liste
Contenu dynamique:
Les valeurs de la liste sont attribuées dynamiquement au cours de l'exécution, soit par l'intermédiaire d'un groupe d'enregistrements, soit via la fonction Add_List_Element().
Un item Liste standard de Forms est de type mono sélection.
Pour sélectionner plusieurs valeurs simultanément, il faut utiliser un composant java.
Mise en oeuvre
Créer un item Liste
Depuis le navigateur d'objet:
Pointer le nud Eléments du bloc désiré puis sur le bouton 
La propriété Type d'élément doit être valorisée à Elément liste
Depuis l'éditeur de présentation:
Sélectionner le canevas et le bloc de réception de l'item.
Cliquer l'icône
Dessiner sur le canevas un rectangle avec la souris pour délimiter les dimensions de l'item
Propriétés spécifiques de l'item Liste:
Type de liste permet de sélectionner l'un des trois types possibles
Eléments dans la liste permet d'initialiser les éléments de la liste

La zone supérieure permet de saisir les libellés tels qu'il apparaîtront à l'utilisateur.
La zone inférieure permet d'indiquer la valeur qui sera stockée dans l'item
Cela permet de stocker des "codes" dans la base tel que 1, 2, 'O', 'N' mais de présenter à l'utilisateur des libellés compréhensibles.
Correspondance d'autres valeurs indique la valeur à stocker dans l'item lorsque la valeur lue depuis la base ou saisie par l'utilisateur ne correspond à aucune valeur prédéfinie.
Alimentation dynamique de la liste
Au cours de l'exécution, une liste peut être alimentée dynamiquement de deux façons distinctes:
- En lui associant le résultat d'un groupe d'enregistrements
- En définissant "manuellement" chacune des valeurs
Utilisation d'un groupe d'enregistrements
Chaque valeur d'une liste est composé de deux éléments. Un code, stocké dans l'item (et donc en base), un libellé affiché à l'utilisateur.
Pour alimenter un item Liste à partir d'un groupe d'enregistrements, la requête devra donc retourner deux colonnes (LIBELLE et CODE).
Il est possible d'utiliser un groupe d'enregistrements défini au moment de la conception ou d'en créer un dynamiquement à l'exécution .
Soit le groupe d'enregistrements statique RG_MOIS alimenté par la requête suivante :
Select 'Janvier', '1' From dual
UNION
Select 'Février', '2' From dual
UNION
Select 'Mars', '3' From dual
UNION
Select 'Avril', '4' From dual
ORDER BY 2
L'item Liste BLOC2.LISTE1 peut être valorisé à l'exécution via le code suivant:
Declare
errcode NUMBER ;
Begin
errcode := Populate_Group( 'RG_MOIS' );
CLEAR_LIST('BLOC2.LISTE1');
POPULATE_LIST('BLOC2.LISTE1', 'RG_MOIS' );
End;
Alimentation "manuelle" de la liste
Il est possible d'ajouter manuellement un élément à une liste avec l'instruction:
Add_List_Element( nom_liste | id_liste, index, libelle, valeur ) ;
index désigne l'index de la liste et commence au numéro 1
libelle désigne le libellé tel qu'il apparaîtra dans la liste
valeur représente la valeur stockée dans l'item
Lecture des éléments d'une liste
Le nombre d'éléments d'une liste s'obtient avec l'instruction:
Get_List_Element_Count( nom_liste | id_liste ) ;
Declare
LN$Nbre pls_integer ;
Begin
LN$Nbre := Get_List_Element_Count( 'BLOC2.LISTE1' ) ;
End;
Ce nombre est utilisé pour connaître le dernier indice de la liste afin de la parcourir dans une boucle.
Le libellé d'un élément de la liste s'obtient avec l'instruction:
Get_List_Element_Label( nom_liste | id_liste, index ) ;
Cette instruction est utilisée pour récupérer le libellé de la valeur sélectionnée
DECLARE
LC$Liste Varchar2(61) := :system.cursor_item ;
LC$Valeur Varchar2(30) := Name_In( LC$Liste ) ;
LN$Nbre Pls_integer ;
BEGIN
LN$Nbre := Get_List_Element_Count( LC$Liste ) ;
For i IN 1 .. LN$Nbre Loop
If Get_List_Element_Value( LC$Liste, i ) = LC$Valeur Then
:BLOC2.LABEL := Get_List_Element_Label( LC$Liste, i ) ;
Exit ;
End if ;
End loop ;
END;
La valeur d'un élément de la liste s'obtient avec l'instruction:
Get_List_Element_Value( nom_liste | id_liste, index ) ;
Cette dernière instruction est pratique pour initialiser une liste à sa première valeur
:BLOC2.LISTE2 := Get_List_Element_Value('BLOC2.LISTE2', 1 ) ;
Un élément peut être retiré d'une liste avec l'instruction:
Delete_List_Element ( nom_liste | id_liste, index ) ;
Remarque:
Il n 'est pas possible de supprimer un élément correspondant à la valeur par défaut éventuellement attribuée à l'item.
Il n'est pas permis non plus de supprimer un élément d'une liste si le bloc a le statut QUERY ou CHANGED et si la valeur est spécifiée dans la propriété Correspondance autres valeurs
Si la propriété Obligatoire est positionnée à OUI et qu'il existe des enregistrements dont la valeur est NULL ou si dans la base il existe des enregistrements ayant des valeurs n'appartenant pas à la liste, ils ne sont pas ramené dans le bloc.
Une liste peut être entièrement vidée avec l'instruction:
Clear_List ( nom_liste | id_liste, index ) ;
Liste des déclencheurs liés aux listes:
When-List-Changed
Se déclenche dès que la valeur d'une liste change
When-List-Activated
Se déclenche lors d'un double clic sur une liste de type Zone déroulante
Techniques avancées
La technique de l'alimentation dynamique d'un item Liste est intéressante lorsque le contenu d'une liste doit être mis à jour en fonction de la valeur d'un autre item de la forme.
L'écran de test TEST_LISTES.FMB livré avec l'article met en oeuvre l'ajustement de listes entre elles
La première liste (:BLOC2.LISTE1) est alimentée depuis un groupe d'enregistrement RG_MOIS
Select 'Janvier', '1' From dual
UNION
Select 'Février', '2' From dual
UNION
Select 'Mars', '3' From dual
UNION
Select 'Avril', '4' From dual
ORDER BY 2
Lorsque l'utilisateur change le mois, la liste des semaines (:BLOC2.LISTE2) est dynamiquement mise à jour dans un déclencheur When-List-Changed.
Déclencheur : When-List-Changed Init_Liste2 ;
Procédure : Init_Liste2() PROCEDURE Init_liste2 IS
errcode NUMBER ;
BEGIN
errcode := Populate_Group( 'RG_SEMAINES' );
CLEAR_LIST('BLOC2.LISTE2');
POPULATE_LIST('BLOC2.LISTE2', 'RG_SEMAINES' );
:BLOC2.LISTE2 := Get_List_Element_Value('BLOC2.LISTE2', 1 ) ;
Init_Liste3 ;
END;
La liste des semaine est d'abord vidée avec la fonction : Clear_List()
Puis elle est valorisé depuis le groupe d'enregistrements RG_SEMAINES avec : Populate_List()
Enfin, le premier élément est pré-sélectionné.
Le groupe d'enregistrements RG_SEMAINES utilise la valeur de la liste des mois pour s'ajuster.
Voici le code du groupe d'enregistrements gérant la liste des semaines:
SELECT 'Semaine ' || to_char( To_date('01/0' || :BLOC2.LISTE1 ||'/2005', 'DD/MM/YYYY' ), 'IW' ),
to_char( To_date('01/0' || :BLOC2.LISTE1 ||'/2005', 'DD/MM/YYYY' ), 'IW' )
FROM dual
UNION
SELECT 'Semaine ' || to_char( To_date('01/0' || :BLOC2.LISTE1 ||'/2005', 'DD/MM/YYYY' ) + 7, 'IW' ),
to_char( To_date('01/0' || :BLOC2.LISTE1 ||'/2005', 'DD/MM/YYYY' ) + 7, 'IW' )
FROM dual
UNION
SELECT 'Semaine ' || to_char( To_date('01/0' || :BLOC2.LISTE1 ||'/2005', 'DD/MM/YYYY' ) + 14, 'IW' ),
to_char( To_date('01/0' || :BLOC2.LISTE1 ||'/2005', 'DD/MM/YYYY' ) + 14, 'IW' )
FROM dual
UNION
SELECT 'Semaine ' || to_char( To_date('01/0' || :BLOC2.LISTE1 ||'/2005', 'DD/MM/YYYY' ) + 21, 'IW' ),
to_char( To_date('01/0' || :BLOC2.LISTE1 ||'/2005', 'DD/MM/YYYY' ) + 21, 'IW' )
FROM dual
UNION
SELECT 'Semaine ' || to_char( To_date('01/0' || :BLOC2.LISTE1 ||'/2005', 'DD/MM/YYYY' ) + 28, 'IW' ),
to_char( To_date('01/0' || :BLOC2.LISTE1 ||'/2005', 'DD/MM/YYYY' ) + 28, 'IW' )
FROM dual
ORDER BY 2
La troisième liste (BLOC2.LISTE3) affiche les jours de la semaine (et du mois) sélectionnée.
Lorsque la semaine change, cette liste est rafraîchie, toujours depuis un déclencheur When-List-Changed
Déclencheur : When-List-Changed PROCEDURE Init_Liste3 IS
LC$J Varchar2(12) ;
LC$Jour Varchar2(20) ;
BEGIN
LC$J := '01/01/2005' ;
Clear_List( 'BLOC2.LISTE3' );
For i IN 0..6 Loop
SELECT
to_char( To_date(LC$J, 'DD/MM/YYYY' ) + (i + ((To_number(:BLOC2.LISTE2)-1) * 7)), 'FMDay DD Month' )
Into
LC$Jour
FROM dual ;
Add_List_Element('BLOC2.LISTE3', i + 1, LC$Jour, LC$Jour ) ;
End loop ;
:BLOC2.LISTE3 := Get_List_Element_Value('BLOC2.LISTE3', 1 ) ;
Exception
When Others then
Null ;
END;
Les jours sont ajoutés manuellement à la liste avec l'instruction Add_List_Element()
En bas du canevas sont affichés la dernière valeur sélectionnée pour chaque liste ainsi que le libellé associé.
|