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

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 nœud 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' ); -- Effacement de la liste -- CLEAR_LIST('BLOC2.LISTE1'); -- Alimentation de la liste -- 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

-- Pré-affichage de la 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

TEST_LISTES.FMB
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 -- Mise à jour de la liste des semaines -- errcode := Populate_Group( 'RG_SEMAINES' ); CLEAR_LIST('BLOC2.LISTE2'); POPULATE_LIST('BLOC2.LISTE2', 'RG_SEMAINES' ); -- Pré-sélection de la première valeur -- :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 -- Mise à jour de la liste des jours -- 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 ; -- Pré-sélection de la première valeur -- :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é.



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.