Frage

Szenerio:

Ich möchte während der Laufzeit ein berechnetes Feld zu einem (beliebigen) Datensatz hinzufügen. Ich kenne keinen anderen Weg, um eine andere Datensatzstruktur als die Ausführung zu erhalten DataSet.Open Methode.

Aber die Open Die Methode bewirkt, dass mindestens eine Zeile einer Daten vom Server zum Client übertragen werden muss. Dann muss ich das Datensatz schließen, das Feld hinzufügen und wieder eröffnen. Dies ist meiner Meinung nach ein unnötiger Overhead. Gibt es eine bessere Möglichkeit, dies zu tun? Bitte nicht, dass ich in der Lage sein möchte, einem Datensatz ein berechnetes Feld hinzuzufügen, und ich kenne seine Struktur vor dem Öffnen nicht.

In Pseudocode sieht es so aus:

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

Vielen Dank für Ihre Zeit.

War es hilfreich?

Lösung

Sie können DataSet.fieldDefs.Update -Methoden verwenden. Dies beinhaltet weiterhin eine Datenübertragung, aber es werden keine Zeilen abgerufen. Sie können diese Methode im vorOpen -Ereignis des TDatasets aufrufen und dort auch die berechneten Felder hinzufügen.

Hier ist ein kurzes Beispiel, das für mich funktioniert:

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;

Andere Tipps

Wenn ich Ihre Frage gut verstehe; Sie möchten die Tabellenstruktur sehen/kennen, bevor Sie die Adoquery (Open) -Methode aufrufen. Wenn das, was Sie wollen, können Sie die Adoconnection -Methoden wie (getfieldnames) und hier ein Beispiel dafür verwenden, wie die Feldnamen der Tabelle (EMP) erhalten:

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

Dann sind alle Feldernamen jetzt (LSTFields). Ich hoffe, das wird helfen.

Grüße.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top