2010-07-01 12 views
3

중첩 된 TClientDataSet이 주어지면 세부 TClientDataSet에서 링크 필드 이름을 어떻게 찾을 수 있습니까?중첩 된 TClientDataSet에서 "외래 키"필드 이름을 찾는 방법은 무엇입니까?

하나의 TClientDataSet에서 다른 레코드로 레코드를 복사하는 중입니다. 링크 필드를 자동으로 무시하고 싶습니다.

TClientDataSet.Data 속성을 사용하여 데이터를 복사 할 수도 있지만 링크와 키 필드를 지울 필요가 있습니다.

답변

0

세부/중첩 된 데이터 집합의 "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 년 후 나는이 대답은의 저자 도움이 될 것입니다 생각하지 않는다 질문을하지만 다른 사람들이 동일한 주제를 검색하는 것을 도울 수 있습니다.

+0

답안에 대해 3 년 동안 의견을 말하면 죄송합니다. 하지만 _DataSetField_ 필드 이름 자체가 아니라 링크 필드의 이름을 찾고있었습니다. 예를 들어 _ID가있는 마스터 - 세부 관계에서 PARENT_ID_ 세부 정보 _DataSet_ _PARENT_ID_ 필드 이름을 찾고 싶습니다. – Valdir