Как найти имя поля "внешний ключ" на вложенном TClientDataSet?
Учитывая вложенный TClientDataSet, как я могу найти имя поля ссылки на детали TClientDataSet?
Я копирую данные из одного TClientDataSet в другой (запись за записью) и хотел бы автоматически игнорировать поле ссылки.
Я также мог бы скопировать данные, используя свойство TClientDataSet.Data, но мне все равно нужно очистить поля ссылки и ключа.
1 ответ
Вы можете проверить свойство "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 года спустя я не верю, что этот ответ поможет автору вопроса, но, возможно, может помочь другим, которые ищут ту же тему.