GRATUIT

Vos offres d'emploi informatique

Développeurs, chefs de projets, ingénieurs, informaticiens
Postez gratuitement vos offres d'emploi ici visibles par 4 000 000 de visiteurs uniques par mois

emploi.developpez.com

Le guide Oracle Forms 9i/10g


précédentsommairesuivant

XVI. Les groupes d'enregistrements

XVI-A. Définition

Un groupe d'enregistrements est un tableau PL/SQL d'enregistrements chargé en mémoire.
Il est utilisé le plus souvent pour alimenter un item de type liste ou une LOV mais peut être mis en œuvre également pour manipuler en mémoire des jeux d'enregistrements.

XVI-B. Concept

Deux types de groupes d'enregistrements sont utilisables

  • Statique
  • Dynamique

Le groupe statique est configuré manuellement. Il faut déclarer les colonnes constituant un enregistrement ainsi que le type des colonnes.
Ce type de groupe n'est pas modifiable dans sa structure à l'exécution, mais il peut être alimenté à partir d'une requête SQL.

Le groupe dynamique prend sa structure d'une requête SQL. Sa structure peut donc être modifiée dynamiquement puisqu'elle dépend alors de la requête associée.

Un groupe d'enregistrements peut être créé dès la conception dans Forms Builder, mais également à l'exécution.

Un groupe d'enregistrements peut être partagé entre plusieurs formes dans la même session.

XVI-C. Mise en œuvre

Ajouter un groupe d'enregistrements dès la conception

Dans le navigateur d'objets, cliquer le nœud Groupes d'enregistrements puis l'icône Image non disponible

Un boite de dialogue permet d'indiquer si le groupe est statique ou dynamique.
Lorsque l'option dynamique est choisie, entrez le code de la requête SQL qui alimentera le groupe.

rg_01


Si vous avez sélectionné l'option statique, une boite de dialogue apparaît afin de définir les colonnes ainsi que les valeurs associées

rg_02


Affichez la fenêtre de propriétés du groupe (F4)

Général
Nom permet de nommer le groupe

Fonctionnel
Type de groupe d'enregistrements prend l'une des deux valeurs suivantes

  • Interrogation
  • Statique

Interrogation associée au groupe permet de saisir/modifier la requête SQL de création et d'alimentation du groupe
Taille d'extraction du groupe permet de définir le nombre d'enregistrements qui seront ramenés de la base à chaque fetch
Spécifications de colonnes permet de nommer et typer chaque colonne du groupe

Ce groupe d'enregistrements sera alors disponible pour alimenter un item de type liste ou une liste de valeurs (LOV)


Gestion d'un groupe d'enregistrements à l'exécution

Création d'un groupe sans requête

Pour créer dynamiquement un groupe sans requête associée, utiliser l'instruction:
Create_Group( 'nom_groupe', scope, nb_rec_ramenes ) ;

nom_groupe est le nom donné au groupe d'enregistrements (il doit être unique dans une même forme)
scope désigne le domaine de visibilité du groupe

  • FORM_SCOPE (défaut) le groupe n'est visible que dans la forme en cours
  • GLOBAL_SCOPE le groupe est visible par toutes les formes de l'application

nb_rec_ramenes permet d'indiquer combien d'enregistrements seront ramenés depuis la base à chaque fetch. La valeur par défaut est : 20.
Si vous constituez des groupes ramenant un nombre important d'enregistrements, adaptez cette valeur en conséquence afin de réduire le trafic réseau.
Si vous positionnez cette valeur à 0 (zéro) Forms décidera de la meilleur valeur possible pour cette option.


Définitions des colonnes du groupe

Après cette instruction, le groupe est créé, mais il ne possède encore aucune structure car les colonnes qui doivent le particulariser ne sont pas encore définies.
Pour définir les colonnes qui constitueront le groupe, utilisez l'instruction:
GROUP_COLUMN := Add_Group_Column( 'nom_groupe' | id_groupe, 'nom_colonne', type_colonne [, largeur_colonne] ) ;

La fonction retourne une variable de type GROUP_COLUMN
nom_groupe désigne le nom du groupe
id_groupe désigne l'identifiant interne pouvant être retrouvé avec la fonction Find_Group().
nom_colonne représente le nom de la colonne du groupe
type_colonne désigne le type de la colonne

  • CHAR_COLUMN
  • DATE_COLUMN
  • LONG_COLUMN
  • NUMBER_COLUMN

largeur_colonne doit être spécifié lorsque le type de la colonne est CHAR et représente la longueur maximum de la chaîne (2000 maxi)

Restrictions:
Le groupe doit exister pour pouvoir lui ajouter des colonnes
Le groupe doit être vide pour pouvoir lui ajouter des colonnes
Vous ne pouvez pas ajouter de colonne à un groupe créé avec l'instruction Create_Groupe_Form_Query()
Si la colonne CHAR représente une colonne d'une table, sa taille doit être identique à celle de la table
Il ne peut y avoir qu'une colonne de type LONG dans un groupe

Exemple:

Add_Group_Column()
Sélectionnez

Declare
   rg_nom VARCHAR2(15) := 'RG_EMP'; 
   rg_id RecordGroup; 
   gc_id GroupColumn; 
Begin
   -- Le groupe existe t-il ? --
   rg_id := Find_Group( rg_nom ); 
   
   -- création uniquement si le groupe n'existe pas --
   If Id_Null(rg_id) THEN 
      rg_id := Create_Group( rg_nom ); 
      gc_id := Add_Group_Column(rg_id, 'Empno',NUMBER_COLUMN); 
      gc_id := Add_Group_Column(rg_id, 'Ename',CHAR_COLUMN,15); 
   End if ; 
End ;


Ajout d'enregistrements au groupe

Le groupe étant maintenant constitué, nous pouvons lui ajouter des enregistrements.
Deux méthodes sont possible

  • Ajout manuel des enregistrements
  • Ajout depuis une requête

- ajout manuel d'enregistrements
Pour ajouter manuellement un enregistrement au groupe, utilisez l'instruction:
Add_Group_Raw( 'nom_groupe' | id_groupe, nbre_lignes ) ;

nbre_ligne représente le nombre d'enregistrements que vous souhaitez ajouter.
Pour ajouter une ligne en fin de groupe, utilisez la variable END_OF_GROUP

L'enregistrement ajouté est vide. Il faut encore l'alimenter en données avec l'instruction Set_Group_xx_Cell()

Set_Group_Char_Cell( 'nom_groupe" | id_groupe, index, valeur ) ;
Set_Group_Date_Cell( 'nom_groupe" | id_groupe, index, valeur ) ;
Set_Group_Number_Cell( 'nom_groupe" | id_groupe, index, valeur ) ;

index représente l'index du tableau (début = 1)


- ajout dynamique d'enregistrements
Pour ajouter dynamiquement des enregistrements au groupe, utilisez l'instruction:
Populate_Groupe_With_Query( 'nom_groupe' | id_groupe, requete ) ;

requete représente le texte de la requête SQL. Le nombre et le type de chaque colonne de la requête doit être en adéquation avec les colonnes définies dans le groupe d'enregistrements.


Création d'un groupe avec requête

La création d'un groupe d'enregistrements avec requête est beaucoup plus rapide à mettre en œuvre puisque c'est la requête SQL fournie qui détermine le nombre et le type des colonnes.

La syntaxe est la suivante:
RECORDGROUP := Create_Group_Form_Query( 'nom_groupe', requete [,scope ] [, nbre_rec_ramenés] ) ;

Le groupe ainsi créé est alimenté en enregistrements avec l'instruction:
NUMBER := Populate_Group( 'nom_groupe' | id_groupe ) ;

Exemple:

Populate_Group()
Sélectionnez

Declare
  LC$Req Varchar2(512) ;
  RG_NAME Varchar2(15) := 'RG_GROUP' ;
  rg_id RecordGroup ;
  errcode NUMBER ;
Begin

  -- texte de la requête --
  LC$Req := 'Select EMPNO, ENAME From EMP Order by ENAME' ;

  -- recherche existence du groupe --
  rg_id := Find_Group( rg_name );
  IF Id_Null(rg_id) THEN
    -- création du groupe --
    rg_id := Create_Group_From_Query( rg_name, LC$Req ) ;
  End if ;

  -- alimentation du groupe --
  errcode := Populate_Group( rg_id );

End;



Autres fonctions liées aux groupes d'enregistrements

Suppression d'un groupe
Delete_Group( 'nom_groupe' | id_groupe ) ;

Remarque:
Cette instruction ne peut pas être utilisée sur un groupe créé dès la conception dans Forms Builder

Suppression d'un enregistrement dans le groupe
Delete_Group_Raw( 'nom_groupe' | id_groupe, index ) ;
Supprime du groupe l'enregistrement n° index

Affichage du nombre d'enregistrements
NUMBER := Get_Group_Raw_Count( 'nom_group' | id_groupe ) ;

Récupération de la valeur d'une colonne
NUMBER := Get_Group_Number_Cell( 'nom_colonne' | id_colonne, index ) ;
DATE := Get_Group_Date_Cell( 'nom_colonne' | id_colonne, index ) ;
VARCHAR2 := Get_Group_Char_Cell( 'nom_colonne' | id_colonne, index ) ;


nom_colonne représente le nom de la colonne dans le groupe sous la forme : nom_groupe.nom_colonne
index désigne le numéro de l'enregistrement

récupération du premier n° d'enregistrement correspondant à la recherche
Get_Group_Record_Number('nom_colonne' | id_colonne, valeur ) ;

Get_Group_Record_Number()
Sélectionnez

Declare
   rg_id RecordGroup; 
   match NUMBER := 2212; -- valeur a rechercher
   status NUMBER; 
   num_record NUMBER; 
Begin
   rg_id := Create_Group_From_Query('QGROUP', 'SELECT ENAME,EMPNO FROM EMP ORDER BY SAL DESC'); 
   status := Populate_Group( rg_id ); 
   -- si status = 0 alors alimentation OK --
   IF status = 0 THEN
      num_record :=Get_Group_Record_Number('QGROUP.ENAME',match);
      Message( 'Premier enregistrement trouvé : ' || to_CHAR(num_record) );
   Else
      Message( 'Erreur de création du groupe d''enregistrements' ); 
      RAISE Form_Trigger_Failure; 
   End if ;
End;


Marquage d'un enregistrement
Set_Group_Selection( 'nom_groupe' | id_groupe, num_rec ) ;
Cette instruction permet de « marquer » un enregistrement particulier dans un groupe

Récupération du nombre d'enregistrements « marqués »
NUMBER := Get_Group_Selection_Count( 'nom_groupe' | id_group ) ;

Récupération du numéro de séquence d'un enregistrement marqué
NUMBER := Get_Group_Selection( 'nom_groupe' | id_group, num_selection ) ;
Lorsque plusieurs enregistrements sont marqués dans un groupe, cette fonction permet de récupérer l'index des enregistrements marqués.

Exemple

Get_Group_Selection()
Sélectionnez

Declare
  Num_rec  NUMBER ;
Begin
   -- nombre d'enregistrements marqués --
   Num_rec := Get_Group_Selection_Count( 'RG_EMP' ) ;

   -- index den enregistrements marqués --
   For i in 1..Numrec Loop
      Message( 'enregistrement marqué : ' || to_char( Get_Group_Selection ( 'RG_EMP', i ) ) ;
   End loop ;
End ;



Voir les groupes d'enregistrements assignés aux item listeMise en oeuvre

Voir les groupes d'enregistrements assignés aux LOV

XVI-D. Techniques avancées

Les groupes d'enregistrements dynamiques sont pratiques lorsque vous souhaitez alimenter un item liste ou une LOV dont les enregistrements (et donc la requête) changent en fonction du contexte.

Comme il est possible d'assigner un groupe d'enregistrements à une LOV à l'exécution, il est facile de modifier dynamiquement le contenu de la LOV.

 
Sélectionnez

Declare
  LC$Req Varchar2(512) ;
  RG_NAME Varchar2(15) := 'RG_GROUP' ;
  rg_id RecordGroup ;
  errcode NUMBER ;
BEGIN
  -- Requête adaptée --
  If :Bloc.item = 1 Then
     LC$Req := 'Select col1, col2 From table_1' ;
  ElsIf :Bloc.item = 2 Then
     LC$Req := 'Select col1, col2 From table_2' ;
  Else 
     LC$Req := 'Select col1, col4 From table_3' ;
  End if ;

  -- Création du groupe --
  rg_id := Find_Group( rg_name );
  IF Id_Null(rg_id) Then
    rg_id := Create_Group_From_Query( rg_name, LC$Req ) ;
  End if ;
  
  -- Alimentation du groupe --
  errcode := Populate_Group( rg_id );

  -- Attachement du groupe à la LOV --
  Set_Lov_Property( 'LOV_1', RECORD_GROUP, rg_name ) ;

End;

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.