Как найти имя поля «внешний ключ» на вложенном TClientDataSet? - PullRequest
3 голосов
/ 01 июля 2010

С учетом вложенного TClientDataSet, как я могу найти имя поля ссылки на подробном TClientDataSet?

Я копирую данные из одного TClientDataSet в другой (запись за записью) и хочу автоматически игнорировать поле ссылки.

Я также мог бы скопировать данные, используя свойство TClientDataSet.Data, но мне все равно нужно очистить поля ссылки и ключа.

1 Ответ

0 голосов
/ 01 июня 2012

Можно проверить свойство «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 года спустя я не верю, что этот ответ поможет автору вопроса, но, возможно, может помочь другим, которые ищут ту же тему.

...