Tutoriel Oracle Forms : manipulations dynamiques 2ème partie


précédentsommairesuivant

2. L'écran de LOV générique

Image non disponible

Le titre de la LOV est affiché dans le libellé de la fenêtre
Le champ de saisie des caractères en haut à gauche a toujours le focus, permettant à l'utilisateur d'ajouter des lettres à chaque frappe au clavier et de réduire la liste
La colonne sur laquelle s'effectue la recherche est matérialisée par un fond gris (Colonne Nom dans l'exemple ci-dessus)
La navigation dans la liste de valeurs se fait soit avec la souris dans une des lignes affichées, soit en activant l'ascenseur vertical, soit avec les touches du clavier (UP, DOWN, SCROLL_UP, SCROLL_DOWN)
La sélection d'une ligne dans la liste se fait soit par un double clic sur la ligne, soit via le bouton OK

Possibilités de personnalisation

  • Redimentionnement des colonnes

Pour redimentionner une colonne, il faut d'abord la sélectionner par un clic gauche sur la colonne. Ensuite, un clic droit fait apparaître un menu popup
Dans ce menu, choisir l'option Dimensions

Image non disponible

Sous la colonne sélectionnée apparaissent alors deux boutons permettant de réduire (-) ou d'augmenter (+) la largeur de la colonne

Image non disponible

Les tailles minimum et maximum pour une colonne sont respectivement de 20 à 700 points.

Une fois la bonne dimension réglée, un clic sur n'importe quelle région de l'écran fait disparaître les deux boutons

  • Changement de la colonne de recherche

Il est possible de sélectionner n'importe quelle colonne de la LOV pour effectuer la recherche.
La colonne de recherche est soulignée par un fond gris.

Pour changer la colonne de recherche, sélectionnez la colonne désirée par un clic gauche puis afficher le menu popup avec un clic droit

Clic gauche sur la colonne Fonction puis clic droit

Image non disponible

Clic sur le sous menu Colonne de recherche

Image non disponible

La colonne de recherche est désormais Fonction.
D'ailleurs la frappe du caractère C dans le champs de saisie ramène bien les lignes dont la colonne Fonction commence par C

  • Permutation des colonnes

Pour permuter les colonnes entre-elles, sélectionner la colonne par un clic gauche puis afficher le menu popup avec un clic droit.

Sélectionner l'option de menu Déplacement, puis la sous option Déplacer à droite ou Déplacer à gauche.


Dans l'exemple, nous choisissons de déplacer la colonne Fonction vers la gauche

Image non disponible

La colonne Fonction a été permutée sur la gauche avec la colonne Nom

Image non disponible


Le mode Recherche globale

Si le développeur a pris soin de définir une table principale sur cette LOV, la case à cocher Recherche Multi-colonnes est activable.
Ce mode permet de rechercher une occurrence dans toutes les colonnes de la table définie par le développeur (à l'exception des colonnes de type LONG, LONG RAW, RAW, BLOB et BFILE)

Pour activer le mode Recherche globale il suffit de cocher la case Recherche Multi-colonnes, de saisir l'occurrence dans le champ de saisie et de valider par la touche Tab ou Enter

Ce mode est pratique lorsque les colonnes affichées ne permettent pas à l'utilisateur d'identifier la ligne voulue, alors que ce dernier " se souvient " par contre d'une information saisie dans une autre colonne

Image non disponible

Dans cet exemple (peu vraisemblable, mais c'est pour l'exemple) l'utilisateur a " oublié " le nom mais se souvient que le salaire est de 1215 euros.
Il clique donc sur la case Recherche Multi-colonnes, saisi 1215 dans le champ de saisie et presse la touche Tab du clavier.


Enregistrement des réglages

Si l'utilisateur souhaite conserver les réglages qu'il vient d'effectuer, afin de les retrouver automatiquement à la prochaine ouverture de cette LOV, il clique sur le bouton Sauver réglages
Suivant le même principe que la gestion des couleurs, ces nouveaux réglages ne sont valables que pour cet utilisateur. Tout autre utilisateur n'ayant pas modifié ses préférences verra cette LOV affichée avec les réglages par défaut.


Comment ça marche ?

Ouvrons le fichier source de l'écran et analysons le contenu

  • Le canvas
Image non disponible

Contenu du bloc associé au canvas

Image non disponible

9 colonnes sont définies dans le bloc BLOC2 afin de supporter toute LOV possible de 2 à 9 colonnes.

Les items COL1 à COL9 sont de type Elément texte Char d'une longueur maxi de 512 caractères

Au chargement de la LOV seuls les items nécessaires seront affichés et disposés dans la fenêtre

Afin de pouvoir gérer la sélection des données depuis n'importe quelle requête dynamique, le bloc BLOC2 est basé sur une Interrogation de clause FROM

Voyons comment le bloc BLOC2 est configuré pour être alimenté par une Interrogation de clause FROM

Image non disponible

La propriété Type de source de données est renseignée à Interrogation de clause FROM
La propriété Nom de source de données est valorisée avec la requête virtuelle : select '1','2','3','4','5','6','7','8' from dual
La propriété Colonnes de source de données permet de définir les items de réception

Image non disponible



Le champ de saisie (P1), la boite à cocher (Recherche Multi-colonnes) ainsi que tous les boutons sont contenus dans le bloc CTRL

Image non disponible

Le champs P1 reçoit la frappe de l'utilisateur
Le champs RECHERCHE permet de basculer en mode Recherche globale
Le bouton BT_OK valide la sélection dans la liste, retourne les valeurs et quitte la forme
Le bouton BT_QUITTER quitte la forme sans retour de valeur
Le bouton BT_SAUVE permet de sauvegarder en base les réglages de l'utilisateur
Les boutons PLUS et MOINS permettent le redimensionnement des colonnes


Comment faire défiler avec le clavier la liste des enregistrements ramenés alors que le focus est constamment sur le champ de saisie P1 ?

Regardons le contenu des triggers KEY-DOWN, KEY-UP, KEY-SRCDOWN et KEY-SCRUP définis sur l'item P1 et analysons le premier -- Trigger KEY-DOWN -- Go_Block( 'BLOC2' ) ; -- déplacement sur le bloc BLOC2 Down ; Go_Item( 'CTRL.P1' ) ; -- retour dans l'item :CTRL.P1 Simple, non ?


Mécanisme général du fonctionnement de l'écran GEN_LOV

La procédure Init_form() est appelée depuis le trigger WHEN-NEW-FORM-INSTANCE dès le chargement de l'écran

Elle commence par masquer les 9 items du bloc BLOC2 -- Masquage des champs -- For I in 1..9 Loop Set_Item_Property( 'BLOC2.COL' || Ltrim( To_char( I ) ), VISIBLE, PROPERTY_FALSE ) ; End loop ; - Positionne l'indicateur de modification à zéro -- Indicateur de modification -- :CTRL.MODIF := 0 ; - Désactive la case à cocher de la Recherche globale si aucune table n'est transmise via le paramètre :PARAMETER.PM$TABLE -- Table en paramètre pour recherche globale ? -- If :PARAMETER.PM$TABLE Is null Then Set_Item_Property( 'CTRL.RECHERCHE', ENABLED, PROPERTY_FALSE ) ; End if ; - Positionne la fenêtre en coordonnées X,Y selon les paramètres fournis -- Position X,Y -- If Nvl( :PARAMETER.POSX, 0 ) > 0 Then Set_Window_Property( 'FENETRE1', X_POS, :PARAMETER.POSX ) ; End if ; If Nvl( :PARAMETER.POSY, 0 ) > 0 Then Set_Window_Property( 'FENETRE1', Y_POS, :PARAMETER.POSY ) ; End if ; - Lit dans la table LOV_ELEMENT_COLONNE les informations nécessaires à la gestion de la LOV -- Lecture des colonnes de la LOV en table -- init_bloc_bl_col ; Cette procédure permet de retrouver les colonnes, leur libellé, position et largeur

- Dimensionne, ordonne et affiche les colonnes nécessaires -- Affichage des colonnes -- dessine_colonnes ; PROCEDURE Dessine_colonnes IS LN$PosX PLS_INTEGER := :CTRL.POS_X ; LN$Long PLS_INTEGER ; LC$Item VARCHAR2(30); LN$TCan PLS_INTEGER := 0; LN$Max PLS_INTEGER ; LN$larg PLS_INTEGER ; LN$Taille PLS_INTEGER ; BEGIN ---------------------------------- -- Affiche les colonnes de la lov -- et dimensionne la fenêtre ---------------------------------- LN$TCan := 325 ; -- Taille minimum du canvas LN$Max := LN$PosX ; -- Largeur maxi du canvas go_block( 'BL_COL' ) ; First_record ; -- première colonne Loop -- pour chaque colonne LC$ITEM := 'BLOC2.' || :BL_COL.COLONNE ; LN$Long := :BL_COL.Taille ; -- largeur de la colonne LN$Max := LN$Max + LN$Long ; -- largeur canvas avec colonne -- Ajuster la largueur du Canvas ? -- If LN$Max > LN$TCan Then LN$TCan := LN$Max + 20 ; Set_Canvas_Property( 'CV_LOV', WIDTH, LN$TCan ) ; -- agrandissement du canvas End if ; Set_Item_Property(LC$Item, VISIBLE, PROPERTY_TRUE); -- affichage de la colonne Set_Item_Property(LC$Item, ENABLED, PROPERTY_TRUE); Set_Item_Property(LC$Item, NAVIGABLE, PROPERTY_TRUE); Set_Item_Property(LC$Item, UPDATE_ALLOWED, PROPERTY_TRUE); Set_Item_Property(LC$Item, WIDTH, :BL_COL.Taille); -- largeur de la colonne Set_Item_Property(LC$Item, NEXT_NAVIGATION_ITEM, :BL_COL.Suivant); -- item suivant Set_Item_Property(LC$Item, PREVIOUS_NAVIGATION_ITEM, :BL_COL.Precedent); -- item précédent -- Coordonnée X de la colonne sur le canvas -- Set_Item_Property(LC$Item, X_POS, LN$PosX); LN$PosX := LN$PosX + LN$Long ; If :system.last_record = 'TRUE' Then exit ; End if ; Next_record ; End loop ; If LN$Tcan < 325 Then LN$Larg := 325 ; Elsif LN$Tcan > 600 Then LN$Larg := 600 ; Else LN$Larg := LN$Tcan ; End if ; -- Adaptation de la largeur de la vue -- Set_View_Property( 'CV_LOV', WIDTH, LN$TCan ) ; Set_View_Property( 'CV_LOV', VIEW_SIZE, LN$TCan, 324 ) ; -- Adaptation de la largeur de la fenêtre (maxi 600 points) -- If LN$TCan < 600 Then Set_Window_Property( 'FENETRE1', WIDTH, LN$TCan ) ; Else Set_Window_Property( 'FENETRE1', WIDTH, LN$Larg ) ; End if ; END; - Met en relief la colonne de recherche -- Mise en relief de la colonne de recherche -- Colore_colonne ; PROCEDURE COLORE_COLONNE IS BEGIN -- Colore la colonne de recherche -- If :GLOBAL.ANCCOLONNE is not null Then -- dé-grise l'ancienne colonne de recherche -- Set_Item_Property( :GLOBAL.ANCCOLONNE, VISUAL_ATTRIBUTE, 'VA_COL_NOSELECT' ); End if ; -- grise la nouvelle colonne de recherche -- Set_Item_Property( :CTRL.COL_RECH, VISUAL_ATTRIBUTE, 'VA_COL_SELECT' ); END; La colorisation des items s'effectue via la définition d'un attribut visuel

- Active le temporisateur -- Init du timer -- Init_timer ; Le temporisateur est utilisé pour lancer l'exécution de la requête (execute_query) à une intervalle de temps exprimée en millisecondes, lue depuis la variable de package (PKG_GESTION_LOV.GN$Duree_Timer) afin de pouvoir être adaptée au plus juste de votre configuration.
Par défaut elle est de 800 millisecondes, ce qui permet à l'utilisateur de saisir plusieurs caractères avant le déclenchement du query
Le timer reste actif tant que le focus se trouve dans le champ de saisie (:CTRL.P1) et désactivé dès que l'on en sort

Lorsque le temporisateur est actif, le trigger de niveau forme WHEN-TIMER-EXPIRED se déclenche et exécute le code suivant : Begin If :CTRL.P1 is not null Then if :CTRL.P1 <> nvl(:CTRL.PSAUV,'_') Then :CTRL.PSAUV := :CTRL.P1; Execute_recherche ; End if ; End if ; End; Pour lancer la recherche on vérifie que le champ de saisie n'est pas NULL et que sa valeur a été modifiée depuis le précédent query

Il faut noter que lorsque que l'on enclenche le mode Recherche globale, le temporisateur est désactivé puisque le query est déclenché manuellement par l'utilisateur lors de la frappe de la touche Tab ou Enter

Voici le code du trigger (WHEN-CHECKBOX-CHANGED) attaché à la boite à cocher : If :CTRL.RECHERCHE = 1 Then -- recherche multi-colonnes -- Init_timer( FALSE ) ; -- désactivation du timer -- :CTRL.P1 := '' ; -- on vide le champ de saisie -- :CTRL.ACTION := 'W' ; -- word index -- Else -- recherche mono-colonnes -- :CTRL.P1 := :CTRL.PSAUV ; -- on réalimente le champ de saisie avec l'ancienne valeur-- :CTRL.ACTION := 'N' ; -- recherche approchée -- Init_timer( TRUE ) ; -- réactivation du timer -- End if ; go_item('CTRL.P1'); - Pré-renseigne le champ de saisie en fonction du paramètre transmis et se positionne -- Item de sélection des valeurs -- If :PARAMETER.AUTO_SELECT = 'O' Then :CTRL.P1 := '%' ; End if ; Go_item('CTRL.P1'); Si le développeur a configuré cette LOV pour afficher la sélection dès l'apparition de l'écran, on pré-renseigne le champ de saisie avec le caractère %, sinon l'écran attend que l'utilisateur frappe un caractère pour lancer la recherche


Dimentionnement d'une colonne

Le choix de l'option Dimension du menu popup exécute la fonction Redim_colonne().
Celle-ci positionne (Set_Item_Property( …, X_POS/Y_POS) )et rend visible les boutons + et - en bas de la colonne concernée (Set_Item_Property ( …, VISIBLE, PROPERTY_TRUE ) ;)

Si l'utilisateur décide d'agrandir la colonne, un clic sur le bouton + exécute le code suivant : Declare LN$T PLS_INTEGER := Get_Item_Property( :GLOBAL.COLONNE, WIDTH ); LC$Col VARCHAR2(30); Begin -- redimensionnement de la colonne -- -- plus 10 pixels -- If LN$T < 300 Then LN$T := LN$T + 10 ; Set_Item_Property( :GLOBAL.COLONNE, WIDTH, LN$T ) ; LC$Col := Substr( :GLOBAL.COLONNE, instr( :GLOBAL.COLONNE, '.' ) + 1, 30 ) ; Maj_Taille_Colonne( LC$Col, LN$T ) ; Dessine_colonnes ; End if ; End ; La taille de l'item est augmentée de 10 points, la procédure Maj_Taille_Colonnes() est invoquée pour mettre à jour les infos de la colonne sauvegardées dans le bloc caché BL_COL, puis l'écran est redessiné via la procédure Dessine_colonnes()

Lorsque l'utilisateur clique à l'extérieur d'un des deux boutons, ceux-ci sont masqués via le trigger de niveau forme WHEN-MOUSE-CLICK -- Effacer les boutons de dimensionnement -- If Nvl(:system.mouse_item,'_') not in ('CTRL.MOINS','CTRL.PLUS') Then Set_Item_Property( 'CTRL.PLUS', VISIBLE, PROPERTY_FALSE ) ; Set_Item_Property( 'CTRL.MOINS', VISIBLE, PROPERTY_FALSE ) ; End if ;


Sélection d'une valeur et retour à l'écran d'appel

Pour sélectionner une valeur, l'utilisateur clique sur la ligne de la liste puis sur le bouton Ok ou double clique sur la ligne, déclenchant l'appel de la procédure Selection_valeur(), dont voici le code : PROCEDURE Selection_valeur IS LR_COL_LOV PKG_GESTION_LOV.TYPE_REC_LOV ; Begin -- Ligne selectionnee -- Go_block( 'BLOC2' ) ; If :system.record_status = 'QUERY' Then -- si la ligne n'est pas vide -- RAZ des variables de retour -- PKG_GESTION_LOV.RAZ_Valeurs_LOV ; LR_COL_LOV.COl1 := :BLOC2.COL1 ; LR_COL_LOV.COl2 := :BLOC2.COL2 ; LR_COL_LOV.COl3 := :BLOC2.COL3 ; LR_COL_LOV.COl4 := :BLOC2.COL4 ; LR_COL_LOV.COl5 := :BLOC2.COL5 ; LR_COL_LOV.COl6 := :BLOC2.COL6 ; LR_COL_LOV.COl7 := :BLOC2.COL7 ; LR_COL_LOV.COl8 := :BLOC2.COL8 ; LR_COL_LOV.COl9 := :BLOC2.COL9 ; -- Mise à jour des variables de retour -- PKG_GESTION_LOV.MAJ_Valeurs_LOV( LR_COL_LOV ) ; Exit_form( NO_VALIDATE ) ; Else Go_Item( 'CTRL.P1' ) ; End if ; End ; Les variables de retour, stockées dans le package sont d'abord effacées, puis valorisées avec celles de la ligne sélectionnée, permettant à l'écran d'appel de les traiter.


précédentsommairesuivant

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

Cet article s'applique à la version 9i et 10g d'Oracle Forms