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

Le guide Oracle Forms 9i/10g

Date de publication : Juin 2005




Les groupes d'enregistrements
Définition
Concept
Mise en oeuvre
Techniques avancées


Les groupes d'enregistrements


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 oeuvre également pour manipuler en mémoire des jeux d'enregistrements.


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.


Mise en oeuvre

Ajouter un groupe d'enregistrements dès la conception

Dans le navigateur d'objets, cliquer le noeud Groupes d'enregistrements puis l'icône

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


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.

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;



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.