ネストされた TClientDataSet が与えられた場合、詳細 TClientDataSet でリンク フィールド名を見つけるにはどうすればよいですか?
ある TClientDataSet から別の TClientDataSet に (レコードごとに) データをコピーしていますが、リンク フィールドを自動的に無視したいと考えています。
TClientDataSet.Data プロパティを使用してデータをコピーすることもできますが、それでもリンクとキー フィールドをクリアする必要があります。
ネストされた TClientDataSet が与えられた場合、詳細 TClientDataSet でリンク フィールド名を見つけるにはどうすればよいですか?
ある TClientDataSet から別の TClientDataSet に (レコードごとに) データをコピーしていますが、リンク フィールドを自動的に無視したいと考えています。
TClientDataSet.Data プロパティを使用してデータをコピーすることもできますが、それでもリンクとキー フィールドをクリアする必要があります。
詳細/ネストされたデータセットの「DataSetField」プロパティを確認するか、マスター データセットの「NestedDataSet」プロパティにアクセスできます。
「リンク」フィールド名を取得するサンプル コード:
function GetCDSDLinkFieldName(cds: TClientDataSet): string;
var
i: Integer;
cdsDetail: TClientDataSet;
begin
Result := EmptyStr;
cdsDetail := nil;
if Assigned(cds.DataSetField) then
cdsDetail := cds;
if not Assigned(cdsDetail) and (cds.FieldCount > 0) then
begin
i := 0;
while not Assigned(cdsDetail) and (i < cds.FieldCount) do
begin
if cds.Fields[i].DataType = ftDataSet then
cdsDetail := TClientDataSet(TDataSetField(cds.Fields[i]).NestedDataSet);
Inc(i);
end;
end;
if Assigned(cdsDetail) then
Result := cdsDetail.DataSetField.FieldName;
end;
呼び出し例:
procedure ...
begin
ShowMessage(GetCDSDLinkFieldName(cdsMaster));
ShowMessage(GetCDSDLinkFieldName(cdsDetail));
end;
PS:2年後、この回答が質問の作成者に役立つとは思いませんが、同じ主題を検索する他の人には役立つかもしれません。