Champs calculés et champs d'agrégation (FireDAC)

De RAD Studio
Aller à : navigation, rechercher

Remonter à Utilisation des ensembles de données (FireDAC)


FireDAC fournit certains types de champs calculés.

Informations générales

Les champs calculés sont des champs virtuels dont les valeurs ne sont pas récupérées / stockées dans la base de données. Au lieu de cela, elles sont calculées côté client. FireDAC supporte les champs calculés de tous les types TField.FieldKind :

  • fkCalculated -- champ calculé simple. La valeur est calculée dans le gestionnaire d'événement TDataSet.OnCalcFields.
  • fkInternalCalc -- champ calculé avancé. La valeur peut être assignée à des champs réguliers et est stockée dans le cache des enregistrements d'ensembles de données. La valeur est calculée dans le gestionnaire d'événement TDataSet.OnCalcFields ou en utilisant des expressions spécifiées par TField.DefaultExpression.
  • fkLookup -- champ de référence. La valeur est calculée automatiquement, en fournissant une valeur issue d'un ensemble de données de recherche comme valeur clé dans cet ensemble de données.
  • fkAggregate -- champ de calcul d'agrégation. La valeur est calculée en utilisant une expression spécifiée par TAggregateField.Expression, qui inclut les fonctions d'agrégation COUNT, SUM, MIN, MAX, AVG.

Seuls les champs fkInternalCalc et fkAggregate peuvent être utilisés dans les opérations de filtrage, de tri ou de localisation. Par ailleurs, ils sont stockés avec d'autres champs ensemble de données dans des flux persistants ou des fichiers. Les valeurs des champs calculés ne peuvent pas être validées dans une base de données en mode automatique.

Notez qu'en mode Fenêtre Données dynamiques, TFDTable ne supporte pas les champs d'agrégation.

Champs calculés standard

Les valeurs des champs calculés fkCalculated et fkInternalCalc peuvent être assignées par le gestionnaire d'événement TDataSet.OnCalcFields. Un champ calculé peut être défini :

  • En mode conception, en utilisant l'élément de menu Editeur de champs ... de l'ensemble de données.
  • Lors de l'exécution, en utilisant le code. Par exemple, pour créer un champ calculé contenant un nom en majuscules, utilisez le code suivant :
procedure TForm1.Form1CalcFields(ADataSet: TDataSet);
begin
  ADataSet.FieldByName('UName').AsString := UpperCase(ADataSet.FieldByName('Name').AsString);
end;

var
  oField: TField;
  i: Integer;
...
FDQuery1.FieldDefs.Updated := False;
FDQuery1.FieldDefs.Update;
for i := 0 to ADQuery1.FieldDefs.Count - 1 do
  FDQuery1.FieldDefs[i].CreateField(Self);

oField := TStringField.Create(FDQuery1);
oField.Size := 50;
oField.FieldName := 'UName';
oField.FieldKind := fkInternalCalc; // or fkCalculated
oField.DataSet := FDQuery1;

FDQuery1.OnCalcFields := Form1CalcFields;
FDQuery1.Open;

Champs calculés par une expression

Les champs fiInternalCalc peuvent être calculés automatiquement via une expression spécifiée par TField.DefaultExpression. Le gestionnaire d'événement TDataSet.OnCalcFields et l'assignation d'une valeur explicite ne sont alors pas requis. L'expression ne peut pas être modifiée lorsque l'ensemble de données est actif. Par exemple :

var
  oField: TField;
  i: Integer;
...
FDQuery1.FieldDefs.Updated := False;
FDQuery1.FieldDefs.Update;
for i := 0 to FDQuery1.FieldDefs.Count - 1 do
  FDQuery1.FieldDefs[i].CreateField(Self);

oField := TStringField.Create(FDQuery1);
oField.Size := 50;
oField.FieldName := 'UName';
oField.FieldKind := fkInternalCalc;
oField.DefaultExpression := 'UPPER(Name)';
oField.DataSet := FDQuery1;

FDQuery1.Open;

Champs d'agrégation

La gestion des champs d'agrégation fkAggregate est similaire à celle des champs calculés par une expression. FireDAC calcule les champs d'agrégation lorsque TFDDataSet.AggregatesActive est défini sur True (par défaut, sa valeur est définie sur False). L'expression d'agrégation ne peut pas être modifiée lorsque l'ensemble de données est actif. Par exemple, pour créer un champ d'agrégation, procédez de la manière suivante :

var
  oField: TAggregateField;
  i: Integer;
...
FDQuery1.FieldDefs.Updated := False;
FDQuery1.FieldDefs.Update;
for i := 0 to FDQuery1.FieldDefs.Count - 1 do
  FDQuery1.FieldDefs[i].CreateField(Self);

oField := TAggregateField.Create(FDQuery1);
oField.FieldName := 'Total';
oField.Expression := 'SUM((ItemPrice + ItemTaxes) * ItemCount)';
oField.DataSet := FDQuery1;

FDQuery1.AggregatesActive := True;
FDQuery1.Open;

Un champ d'agrégation peut définir un regroupement. Dans ce cas, c'est la valeur des enregistrements ayant les mêmes valeurs de champ index qui est calculée, plutôt que celle de tous les enregistrements. Pour définir le regroupement, effectuez les étapes suivantes :

  • Définissez TAggregateField.IndexName sur le nom de l'index à utiliser pour le regroupement. Par défaut, l'index en cours est utilisé.
  • Définissez TAggregateField.GroupingLevel sur le nombre de champs indexés à utiliser pour le regroupement. Par défaut, sa valeur est définie sur 0 (aucun champ et aucun regroupement).

Notez que le champ d'agrégation retourne toujours Null lorsqu'un ensemble de données est dans l'état dsInsert.

Valeurs d'agrégation

Par ailleurs, l'application FireDAC peut utiliser la collection TFDDataSet.Aggregates pour définir des valeurs d'agrégation. Celles-ci sont plus légères que les champs et peuvent être définies à tout moment, y compris lorsque l'ensemble de données est actif. Par exemple :

with FDQuery1.Aggregates.Add do begin
  Name := 'Total';
  Expression := 'SUM((ItemPrice + ItemTaxes) * ItemCount)';
  Active := True;
end;
FDQuery1.AggregatesActive := True;
...
Label1.Caption := VarToStr(FDQuery1.Aggregates[0].Value);

Voir aussi

Exemples