Listes d'objets (tech)

De Wiki1000

Sommaire

Introduction

Utilisez un TObjectList pour manipuler une liste d'objets. TObjectList fournit des propriétés et méthodes pour ajouter, supprimer, réorganiser, trouver, trier et accéder aux objets contenus dans la liste.

Info-20px.png Note : Les listes d'objets peuvent être utilisé comme attribut non persistant

Une liste d'objet charge ses objets en une seule requête et les conservent en mémoire. Ce fonctionnement à des avantages et des incovénients :

  • Une fois l'ordre de chargement exécuté il ni a plus d'interactions base de données.
  • Les objets sont maintenus en mémoire se qui interdit le traitement de grande quantité d'objet.
Info-20px.png Note : Grande est une notion relative, vous pouvez charger des milliers d'objet dans une liste sans problèmes mais vous aurez certainement des problèmes si vous essayer de charger des centaines de milliers ou des millions d'objets dans une liste.

Déclaration d'une variable liste d'objet

Les listes d'objets doivent être déclarée avant d'être utilisées, lorsque la classe de la liste est connue au moment de la déclaration la forme préfixé du nom de la classe métier peut être utilisée :

var ls:NomDeClassList;

Cette forme de déclaration permet au compilateur de connaitre la classe des objets de la liste.

Création d'une liste d'objet

Utilisation du ClassManager

Le ClassManager expose une fonction pour créer des listes d'objets d'une classe donnée :

function CreateObjectList(const iClassName :string) :TObjectList;

iClassName représente le nom de la classe des objets contenus dans la liste.

Exemple

var ls:TEcritureList;
begin
  ls := ClassManager.CreateObjectList('TEcriture');
end;

Utilisation du constructeur de liste d'une classe métier

Les classes métiers exposent un constructeur de liste permettant de créer une liste d'objet de la classe :

class function TObjectClass.CreateList:TObjectClassList;

Exemple

var ls:TEcritureList;
begin
  ls := TEcriture.CreateList;
end;
Info-20px.png Note : Les deux formes de code sont équivalentes, la seconde est plus claire et évite les erreurs de frappe du nom des classes

Propriétés

Nom Type Usage
ACLASSNAME String Nom de la classe des objets contenu dans la liste.
COUNT Integer Renvoie le nombre d'objets dans la liste.
ORDERBY String Indique l'attribut triant la liste ; positionner OrderBy déclenche le tri des objets présents dans la liste et l’insertion triée des nouveaux objets.
DUPLICATES Enum Permet d'indiquer le comportement de la liste sur doublon :
  • dupIgnore  : L'objet n'est pas inséré, aucune erreur.
  • dupAccept  : L'objet est inséré.
  • dupError  : Une exception est déclenchée.

Par défaut Duplicates = dupAccept

Info-20px.png Note : Le changement de la propriété Duplicates n'a pas d'effet sur les éléments déjà présents dans la liste.

Méthodes

OIDS [ INDEX ]
property OIDs[index:Integer]:TOID;
Renvoie le oid de l'objet situé à la position indiquée par index dans la liste. Index spécifie la position de l'objet, 0 indique le premier objet, 1 le second, etc.
REFS [ INDEX ]
property Refs[index:Integer]:TitObject;
Renvoie la référence de l'objet située à la position indiquée par index dans la liste. Index spécifie la position de l'objet, 0 indique le premier objet, 1 le second, etc.
ORDERVALUES [ INDEX ]
property OrderValues[index:Integer]:variant;
Renvoie la value de l'attribut triant la liste (ORDERBY) de l'objet situé à la position indiquée par Index dans la liste. Si la propriété ORDERBY est non spécifiée, ORDERVALUES renvoie OID. Index spécifie la position des attributs, 0 indique le premier attribut, 1 le second, etc.
INDEXOF
function IndexOf (const iOID :TOID) :Integer;
Renvoie la position d'objet ayant l'oid iOID dans la liste.
INDEXBYORDER
function IndexByOrder (const V :Variant):Integer;
Recherche l'élément de valeur V ; si la liste n'est pas triée, cette fonction provoque une exception.
ADDOID
function AddOid(const iOID:TOID):Integer;
Ajoute dans la liste l'objet ayant l'oid iOID.
ADDREF
function AddRef(iInst:TitObject):Integer;
Ajoute dans la liste l'objet iInst.
INSERT
function Insert(iIndex :Integer; iInst :TitObject):Integer;
Insère l'objet iInst dans la liste à la position spécifiée par iIndex.

Insert insère l'élément à la position indiquée et décale vers le bas l'élément occupant préalablement l'emplacement ainsi que tous ceux le suivant.

REMOVEOID
procedure RemoveOid(const iOID :TOID);
Supprime l'objet ayant l'oid iOID de la liste. Une fois l'objet supprimé, tous les objets suivants remontent dans la liste.
REMOVEREF
procedure RemoveRef (iInst :TitObject);
Supprime l'objet iInst de la liste.
DELETE
procedure Delete(iIndex :Integer);
Supprime l'objet à une position spécifiée par iIndex de la liste
ASSIGN
procedure Assign(iList:TObjectList);
Affecte la liste avec les objets d'une autre liste. iList peut être TObjectList or TRoleList.
CLEAR
procedure Clear;
Supprime tous les objets de la liste.
ADDWHERE
function AddWhere(const iWhereSQL: string;  
                   const iWhereObject: string;  
                   const iOrderBy : string;  
                   iDescendants: Boolean; 
                   iMaxInstances: Integer;   
                   iArgs :Variant):Integer;
Ajoute dans la liste les objets vérifiant la condition iWhere.

Vous pouvez spécifier la clause iWhere en deux expressions, la première étant SQL et la seconde étant objet. La seconde est évaluée sur les objets retournés par la requête.

Vous avez aussi la possibilité de spécifier le nombre maximum d'instances à ajouter dans la liste.

iWhereSQL Filtre SQL utilisé pour la sélection des objets
iWhereObj Filtre Objet utilisé pour la sélection des objets
iOrderBy Ordre de tri de la liste
iDescendants Inclure les objets descendants de la classe persistante
iMaxInstances Numéro maxime d'instances ajoute dans la liste
iArgs Paramètres des filtres.

Les paramètres sont indiqués dans iWhereSQL et iWhereObject par %n (n = 1..x) et leurs valeurs sont écrites dans iArgs en respectant l'ordre.

Tip-20px.png Tip : Dans iWhereObj on peut utiliser des conditions sur les attributs dérivés de la classe.
REMOVEWHERE
function RemoveWhere(const iExpression: string;
                     iArgs: Array of variant):Integer;
Supprime les objets de la liste pour lesquels la condition iExpression est satisfaite.
iExpression Expression.
iArgs Paramètres des filtres.
COUNTWHERE
function CountWhere(const iExpression: string;
                    iArgs: Array of variant):Integer;
Renvoie le nombre des objets de la liste pour lesquels la condition iExpression est satisfaite.
iExpression Expression.
iArgs Paramètres des filtres.
FINDFIRST
function FindFirst(const iWhere: string;
                     iArgs: Array of Variant):Integer;
Recherche le premier objet vérifiant la condition iWhere.
FINDNEXT
function FindNext(const iWhere: string; 
                     iArgs: Array of Variant;
                     iIndex: Integer):Integer;
Recherche l'objet suivant iIndex vérifiant la condition iWhere.

Exemples

Chargement d'une liste

procedure TExercice.doPeriodes;
var vListePeriode :TPeriodeList;
begin
  // Liste des périodes d'un exercice ordonnée par date de début de période.
  vlistePeriode := TPeriodeList.CreateList;
  vlistePeriode.AddWhere('oidExercice=%1','','dateDebut',FALSE,1000,[instanceOid]);
  ...
end;

Utilisation d'une condition objet

procedure TMyProcessus.doEcritures;
var EcritureList:TEcritureList; idx:Integer;
begin
  // Liste des 1000 premières écritures au débit d'une tranche de compte trié par libellé.
  //
  // Utilise un filtre objet pour estDebit qui est un attribut dérivé de la classe TEcriture
  //
  EcritureList := ClassManager.CreateObjectList('TEcriture');
  EcritureList.AddWhere('(CompteGeneral.Code >= %1) and (CompteGeneral.Code <= %2)','(estDebit = %3)', 'Caption',TRUE,1000,
[borne_inferieure,borne_superieure,True]);
  for idx :=0 to EcritureList.Count-1 do
   ProgressMessage(EcritureList.Refs[idx].Caption)
  end;
end;


Code métierDéveloppement DSM





Whos here now:   Members 0   Guests 0   Bots & Crawlers 1
 
Outils personnels