12

提供するデータに新しいフィールドを作成できるカスタムTDatasetProviderがあります。

したがって、元のデータセットに次のフィールドがあるとします。

  • 顧客ID
  • 名前

また、ビットマップの表示を使用してDBGridで選択する必要があります。私のDSPはデータセットデータに呼び出されるブールフィールドを追加できるので、そうすることができSelectedます。

私が今それをする方法:

  1. 2つのTClientDatasetオブジェクト(オリジンとターゲット)を作成します
  2. Originで、InternalGetRecordsメソッドのパラメーターから取得したデータをロードします(オーバーライドします)
  3. Targetでは、Originデータセットから定義されたfielddefを作成し、開発者が設計時に作成したfielddefを追加します。
  4. ターゲットでCreateDatasetを実行します
  5. そして、行ごと(およびフィールドごと)に、OriginデータベースからTargetデータセットにデータをコピーします
  6. 最後に、InternalGetRecordsからの戻り値としてDataバリアントを返します。

それを行うためのよりエレガントな(そしてより速い)方法があるかどうかは本当にわかりません。その結果を得る別の(より速くおよび/またはエレガントな)方法はありますか?

4

4 に答える 4

13

IDSBase.AddFieldソースデータセットからデータを読み込んだ後、呼び出してフィールドを追加できるようです。

uses
  DB, DBCommon, DBClient, DSIntf;

type
  THackClientDataSet = class(TClientDataSet);

procedure EncodeFieldDesc(var FieldDesc: DSFLDDesc;
  const Name: string; DataType: TFieldType; Size, Precision: Integer;
  Calculated: Boolean; Attributes: TFieldAttributes);
begin
  // ... copied from TClientDataSet.EncodeFieldDesc
end;

//...
var
  FldDesc: DSFLDDesc;
begin
  FillChar(FldDesc, SizeOf(FldDesc), 0);
  EncodeFieldDesc(FldDesc, 'SELECTED', ftBoolean, 0, 0, False, []);
  with THackClientDataSet(DataSet) do
    Check(DSBase.AddField(@FldDesc));
  // now you can create a second client dataset and assign it DataSet.Data directly:
  // DataSet2.Data := DataSet.Data;
  // DataSet2 now contains the new field (with empty values in all existing records)
end;

徹底的にテストしませんでしたが、上記の簡単な例は期待どおりに機能し、2番目のクライアントデータセットをナビゲートして、通常どおりすべてのフィールドの値を編集できました。

于 2012-05-01T14:59:55.613 に答える
1

最速の方法はを使用することCloneCursorです。このようなもの:

  1. 2つのTClientDatasetオブジェクト(オリジンとターゲット)を作成します
  2. Originで、InternalGetRecordsメソッドのパラメーターから取得したデータをロードします
  3. Targetで、Originデータセットから定義されたfielddefを作成し、開発者が設計時に作成したfielddefを追加します。
  4. Target.CloneCursor(Origin); //there are more params than this, but this is the basic idea
  5. Targetには、Originと同じデータの新しいビューが含まれるようになりますが、Targetに存在するフィールド、フィルターなどによって制限されます。(フィールドを定義していなかった場合は、Originのフィールドがコピーされます。フィールドを定義した場合は、指定した内容に準拠します。)
  6. ターゲットからデータをコピーします。これがまさにあなたが探しているものです。
于 2012-04-19T22:25:51.443 に答える
0

個々のフィールドの計算に匿名の方法を使用して、CDSにフィールドを動的に追加し、柔軟性を高めるサンプルがあります。CDSを開く前に、計算フィールドを追加します。それを開くよりも。

これはあなたが探しているものですか?質問はあまり明確ではありません...

于 2012-04-27T20:14:33.363 に答える
-1

TClientDatasetのDataプロパティを使用して、データセット全体、メタデータ、およびデータをコピーできます。これは、あるTClientDatasetを別のTClientDatasetにコピーするための最速の方法であると考えられています。

http://docwiki.embarcadero.com/RADStudio/en/Assigning_Data_Directlyを参照してください

于 2012-04-19T19:26:36.250 に答える