2010-07-01 15 views
3

Étant donné un TClientDataSet imbriqué, comment puis-je trouver le nom du champ de lien dans le détail TClientDataSet?Comment trouver le nom de champ "clé étrangère" sur un TClientDataSet imbriqué?

Je copie des données d'un TClientDataSet à un autre (enregistrement par enregistrement) et je voudrais ignorer automatiquement le champ de lien.

Je pourrais également copier les données en utilisant la propriété TClientDataSet.Data mais je devrais toujours effacer les champs de lien et de clé.

Répondre

0

Vous pouvez vérifier la propriété "DataSetField" du jeu de données detail/imbriqué ou accéder à la propriété "NestedDataSet" de l'ensemble de données maître.

Exemple de code pour obtenir le nom du champ "lien":

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; 

Invoquer exemple:

procedure ... 
begin 
    ShowMessage(GetCDSDLinkFieldName(cdsMaster)); 
    ShowMessage(GetCDSDLinkFieldName(cdsDetail)); 
end; 

PS: 2 ans plus tard, je ne crois pas que cette réponse aidera l'auteur du question, mais peut-être peut aider les autres qui cherchent le même sujet.

+0

Désolé de prendre trois ans pour commenter votre réponse. Mais je cherchais le nom du champ de lien, pas le nom du champ _DataSetField_ lui-même. Par exemple, dans une relation maître-détail avec _ID, PARENT_ID_ dans le détail _DataSet_ je voudrais trouver le nom de champ _PARENT_ID_. – Valdir