TClientDataSetへのデータのコピー

解決


サトウ  2013-09-12 20:57:09  No: 45251  IP: 192.*.*.*

TClientDataSetの動作で、次の動作は仕様どうりなのでしょうか?

TempProvider := TDataSetProvider.Create(Self);
TempProvider.DataSet := SourceDataSet;
ClientDataSet1.Data := TempProvider.Data

でSourceDataSetのレコードの位置づけがLastになっているとClentDatSet1に
Dataがコピーされません。位置づけがFirstだと、データがコピーされることは確認しましが、FirstとLastの間での動作は確認していません。

仕様どおりだと言われればそれきりですが、これが分からず3時間×3日間悩んでしまいました。(笑)

delphiはXE3です。

編集 削除
ありい  2013-09-17 18:02:07  No: 45252  IP: 192.*.*.*

サトウさん、こんにちは。

> でSourceDataSetのレコードの位置づけがLastになっているとClentDatSet1に
Dataがコピーされません。

  D7で試して見ましたが、同じ動きをしましたので仕様通りかと(^^;

> FirstとLastの間での動作は確認していません。

  試してみましたが、その行から先がコピーされました。

  例えば、

(1)
ClientDataSet1.ProviderName := TempProvider;

...と、しておいて、

ClientDataSet1.Close;
ClientDataSet1.Open;

...ではダメですか?

  または、SourceDataSetがTClientDataSetなら、端的に

(2)
ClientDataSet1.Data := SourceDataSet.Data;

...で済むと思います。

#(1)の場合、TClientDataSet同士で試した所、先にClientDataSet1.Openしていないと「1回目」だけ何故か問題の挙動になったので、(2)をお勧めします。

  以上、ご参考まで。

編集 削除
サトウ  2013-09-22 00:22:01  No: 45253  IP: 192.*.*.*

ありいさん  こんにちは。

折角、Replyをあげて頂いたのに応答が遅く、申し訳ありませんでした。

この問題に、突きあったのは、TIBTableのレコードの主キーを再採番する為に、一時的にレコードを別Datasetに保存しておきたい為にその方法をDelphiV7の開発者ガイドP28-14の例を参考にしたことに始まりました。

DelphiのHelpを参照すると、「Data プロパティは,すべてのレコードが入ったデータパケットへのアクセスを提供する読み出し専用のプロパティです」と記述されているので、全てのレコードが無条件にコピーされるものと思い、SourceDatasetのレコード位置に配慮しなかったことが元で随分と悩んでしまいました。

実際には、現レコード位置から後方のレコードしかコピーされないと判明すしたことで、Datasetの最初のレコード位置へ位置づければいいだけでした。
TempProvider := TDataSetProvider.Create(Self);
SourceDataSet.First; //  これがないと現レコードから後方しかコピーされない
TempProvider.DataSet := SourceDataSet;
ClientDataSet1.Data := TempProvider.Data;
これで解決しました。

私が悩んだことが、少しでも他の人に役立てられればとの思いで、この掲示板に掲載しました(いつも当掲示板でお世話いただいていますので)。

ありいさん  これからもどうぞよろしくお願いいたします。

編集 削除
サトウ  2013-09-23 23:21:21  No: 45254  IP: 192.*.*.*

申し訳ありません。解決マークを付け忘れていました。

編集 削除