Entwickler-Ecke

Datenbanken - CalcFields


Bulvaye - Mi 21.07.04 14:28
Titel: CalcFields
Hallo zusammen,

ich habe noch nie mit CalcFields gearbeitet und komme da irgendwie nicht weiter. Ich habe folgende Problemstellung:

1. Es sollen zur Laufzeit CalcFields erzeugt werden.
2. Für die CalcFields existiert keine Repräsentation in der Datenbank, d.h. die Felder sollen nur im TDataset-Objekt vorhanden sein, nicht aber in der Datenbank gespeichert werden.

Wie kann ich CalcFields zur Laufzeit erzeugen? Dieser Code funktioniert leider nicht:


Quelltext
1:
2:
3:
4:
5:
  Field := TStringField.Create(nil);
  Field.FieldKind := fkInternalCalc; // oder auch fkCalculated
  Field.FieldName := 'TEST';
  Field.Size := 255;
  Field.DataSet := MeinDataset;


Mit fkCalculated wird das Feld nicht angefügt und mit fkInternalCalc laufe ich auf den Fehler, dass "Test" nicht gefunden wurde. Was mache ich hier grundsätzlich falsch?

Danke für jeden Hinweis.


Udontknow - Mi 21.07.04 14:44

Also, bei mir klappt´s:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
procedure TForm1.Button1Click(Sender: TObject);
var Field:TStringfield;
begin
  Field := TStringField.Create(nil);
  Field.FieldKind := fkCalculated;
  Field.FieldName := 'TEST';
  Field.Size := 255;
  Field.DataSet := Clientdataset1;
  Clientdataset1.OnCalcFields:=ClientDataSet1CalcFields;

  Clientdataset1.CreateDataSet;
  Clientdataset1.Insert;
  Clientdataset1.FieldByName('text').AsString:='Hallo,';
  Clientdataset1.Post;

  ShowMessage(Clientdataset1.FieldByName('Test').AsString);
end;

procedure TForm1.ClientDataSet1CalcFields(DataSet: TDataSet);
begin
  Clientdataset1.FieldByName('Test').AsString:=Clientdataset1.FieldByName('Text').AsString+' Welt!';
end;


Cu,
Udontknow


Bulvaye - Mi 21.07.04 21:55

Danke - aber das Problem war, dass, sobald ein TField zur Laufzeit erzeugt wird, das Dataset auch nur dieses eine Feld kennt. Also müssen zusätzlich alle Felder aus dem FieldDefs als TFields erzeugt werden - dann klappt's auch.