2017-09-06 20 views
1

fieldDefs.addで作成された既存のデータセットに計算フィールドを追加しようとしましたが、スタックオーバーフローを含むいくつかのサイトで多数のバリエーションがあります。計算フィールドをclientdatasetに追加できません

fieldDefs行またはdataSet行によって作成されたfieldDefsは、更新時にFieldDefs.countによって失われます。

Fields.counts XMLファイルには保存されませんが、保存されません。

例外は発生しません。

誰もここで何が起こっているか考えていませんか? おかげ

MYclientDataSet.CreateDataSet; 
MYclientDataSet.open; 
MYclientDataSet.FieldDefs.Update; 
MYclientDataSet.Active := False; 
for i := 0 to MYclientDataSet.FieldDefs.Count - 1 do 
    MYclientDataSet.FieldDefs[i].CreateField(MYclientDataSet); 
fld := TStringField.Create(MYclientDataSet); 
with fld do begin 
    FieldName := 'PartSummary'; 
    FieldKind := fkCalculated; 
    Calculated := True; 
    Name := cds.Name + FieldName; 
    DataSet := MYclientDataSet; 
    MYclientDataSet.FieldDefs.Add('PartSummary', ftString, 30, false); 
    MYclientDataSet.FieldDefs.update; 
end; 
MYclientDataSet.active := true; 
MYclientDataSet.open; 
MYclientDataSet.edit; 
+0

なぜ2回開く必要がありますか?それは問題ではないかもしれませんし、必要でも無害かもしれません。しかし、それは奇妙に見えます。 –

+1

'CreateDataSet'を呼び出す前に、計算したものを含め、必要なすべてのフィールドを追加する必要があります。 – MartynA

+0

計算されたフィールドを追加した後で 'update'をもう一度呼び出すことはありません。' update'がテーブルを開き、それを閉じてしまうので、このルーチンではテーブルを3回開きます。あなたの完了。 'active:= true'と' open'は同じことをしますので、どちらかを選んでください(私は 'open'を好む)。 –

答えて

0

はキャリージェンセンによると、Delphiの教育リンクDefining a Clientdataset's Structure...にあなたはFieldDefsを用いて算出し、検索、集計フィールドを作成することはできません。代わりにTFieldsを使用する必要があります。

+0

確かに。 FieldDefsを使いこなす価値があり、常にDataSetのFieldsコレクションで作業する価値があることは決してありませんでした。 FieldDefsを使用するだけで、Fieldsの定義との同期を外すことができます。 – MartynA

関連する問題