Question

Scenerio:

Je veux ajouter un champ calculé à ensemble de données (tout) lors de l'exécution. Je ne connais pas d'autre moyen d'obtenir une structure d'ensemble de données autres que l'exécution de la méthode DataSet.Open.

Mais la méthode Open fait que atleast une ligne de données doivent être transférées du serveur au client. Ensuite, je dois fermer le DataSet, ajouter le champ et le rouvrir. Ceci est une surcharge unnecessery à mon avis. Existe-t-il une meilleure façon de le faire? S'il vous plaît pas que je veux être en mesure d'ajouter un champ calcuated à un ensemble de données et je ne sais pas sa structure avant l'ouverture.

Dans ce pseudocode ressemble à ceci:

DataSet.Open;
DataSet.Close;
RecreateFieldsStructure;
AddCalculatedField;
DataSet.Open;

Merci pour votre temps.

Était-ce utile?

La solution

Vous pouvez utiliser la méthode DataSet.FieldDefs.Update. Cela implique encore un certain transfert de données, mais aucune ligne ne sera tiré par les cheveux. Vous pouvez appeler cette méthode en cas BeforeOpen du TDataSet et ajoutez également les champs calculés là.

Voici un court exemple qui fonctionne pour moi:

procedure TDataModule.cdsExampleBeforeOpen(DataSet: TDataSet);
var I: Integer;
    TmpField: TDateTimeField;
begin
  // Get field definitions from the server
  DataSet.FieldDefs.Update;

  // Add calculated field
  TmpField := TDateTimeField.Create(DataSet);
  with TmpField do
  begin
    Name := 'Date';
    FieldName := 'Date';
    DisplayLabel := 'Date';
    DisplayFormat := 'ddd ddddd';
    Calculated := True;
  end;
  TmpField.DataSet := DataSet;

  // Create fields from field definitions
  for I := 0 to DataSet.FieldDefs.Count - 1 do
    DataSet.FieldDefs[I].CreateField(DataSet);
end;

Autres conseils

Si je comprends bien votre question; vous voulez voir / connaître la structure des tables avant d'appeler la méthode ADOQuery (ouverte). si ce que vous voulez, vous pouvez utiliser les méthodes de ADOConnection comme (GetFieldNames) et voici un exemple de la façon d'obtenir les noms des champs de la table (EMP):

procedure TForm2.Button1Click(Sender: TObject);
var
  lstFields: TStringList;
begin
  lstFields := TStringList.Create;
  try
    ADOConnection1.GetFieldNames('EMP', lstFields);
  finally
    lstFields.Free;
  end;
end;

alors tous les noms des champs sont maintenant sur (lstFields). J'espère que cela vous aidera.

Cordialement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top