AddConstraint (selector)

De Wiki1000

version800-32x32.png

function AddConstraint(iParent:TSelectorConstraint; const iClassName:string; const iRightName:string; const iLeftName:string; const iWhere:string; const iArgs:Array of variant):TSelectorConstraint;

Cette méthode définit une contrainte matérialisée par une jointure.

Paramètre Usage
Result Un objet de type TSelectorConstraint matérialisant la contrainte
iParent Contrainte parente
iClassName Classe liée
iLeftName Attribut gauche
iRightName Attribut droit
iWhere Clause Where de la jointure
iArgs Paramètres de la clause Where
  • iParent
Une contrainte parente matérialisant la classe de droite
nil pour faire porter la contrainte sur la classe du sélecteur
  • iClassName
Une classe sur laquelle porte la contrainte
  • iLeftName
Un attribut de la classe de la contrainte (iClassName) portant la contrainte
  • iRightName
Un attribut de la classe de droite, du parent ou du sélecteur, portant la contrainte
  • iWhere
Clause where de la contrainte, la clause where est exprimée par rapport à la classe de la contrainte (iClassName). Les rôles NE sont pas évalués, il faut passer impérativement par AliasOf au besoin. Voir ci-dessous.
  • iArgs
Arguments de la contrainte
Exclam-20px.png Attention : Les clauses Where sur les jointures ne sont pas évaluées en objet, en général ces clauses correspondent à des filtres sur les relations. Ceci peut avoir un effet de bord lorsque le sélecteur est utilisé pour générer une liste, parce qu'il peut exister en mémoire des objets qui seront inclus dans le résultat malgré le fait que les conditions de jointures ne sont pas remplies. Pour éviter cet effet de bord, utilisez le sélecteur pour générer un curseur qui ne synchronise pas le résultat avec les objets en mémoire.

Exemple :

function doSelector(const iCodeA:string; const iCodeB:string):Integer;
var selA:TSelector; obj:TSelectorConstraint;
begin
  selA := ClassA.CreateSelector('unCodeA=%1','unCodeA',True,[iCodeA]);
  obj  := selA.AddConstraint(nil, 'ClassB','oid','refB','unCodeB=%1',[iCodeB]); // obj.Name='S1'
  Result := selA.Count;
end;

Cette contrainte va générer le code SQL suivant :

  select * from CLASSA t0 
  join CLASSB t1 on (t1.oid=t0.refB) and (unCodeB='iCodeB')


Voir aussi :

Selecteur (tech)Développement DSM

Outils personnels