Developpez.com

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

Le guide Oracle Forms 9i/10g


précédentsommairesuivant

XXIV. Les items liste

XXIV-A. 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.

XXIV-B. 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
Image non disponible

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

XXIV-C. Mise en œuvre

Créer un item Liste

Depuis le navigateur d'objet:

Pointer le nœud Eléments du bloc désiré puis sur le bouton Image non disponible
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 Image non disponible
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

Image non disponible

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 :

 
Sélectionnez

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:

 
Sélectionnez

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 ) ;

 
Sélectionnez

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

 
Sélectionnez

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

 
Sélectionnez

  -- 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

XXIV-D. 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 œuvre 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

 
Sélectionnez

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
Sélectionnez

Init_Liste2 ;
Procédure : Init_Liste2()
Sélectionnez

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:

 
Sélectionnez

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
Sélectionnez

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é.


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.