2017-08-04 5 views
1

J'ai un ensemble de données TclientDataSet où les champs sont créés par code. J'ai besoin que l'utilisateur ajoute ces champs avec des champs supplémentaires tout en préservant les données existantes.Comment ajouter un nouveau champ à l'ensemble de données sans CreateDataset?

`MYclientDataSet.FieldDefs.Add(s, ftString, 20); 
MYclientDataSet.CreateDataset; 
MYclientDataSet.Open; 
MYclientDataSet.edit; 
MYclientDataSet.FieldByName(s).AsString := 'Test'; 
MYclientDataSet.post;` 

Cela fonctionne mais CreateDataset efface toutes les données. Y a-t-il un moyen d'ajouter le nouveau champ à l'ensemble de données?

J'ai essayé beaucoup d'autres solutions, mais aucun ne semble fonctionner

merci beaucoup

+0

Pourriez-vous ajouter un peu de détails sur les autres solutions que vous avez essayé déjà? –

Répondre

1

Si vous demandez sur les champs de type fkData, à savoir ceux qui seraient inclus dans les CDS de données sauvegardées, vous ne pouvez pas ajouter ces champs une fois que le CDS est déjà ouvert.

La façon la plus simple que je connaisse pour obtenir l'effet équivalent est à

  1. Enregistrer les données de la CDS à XML.

  2. Modifiez les métadonnées dans le fichier XML qui définit les champs fkData, pour ajouter celles que vous voulez.

  3. Enregistrez le fichier XML.

  4. Rechargez le CDS à partir du fichier XML.

Je pense que j'ai posté un exemple de la façon de le faire dans une réponse à un SO q il y a un certain temps. Si je peux le trouver, j'ajouterai un lien plus tard.

4

Vous pouvez y parvenir avec le code suivant, qui enregistre essentiellement les données actuelles, crée la nouvelle structure du champ et copie les données enregistrées en arrière:

var 
    cds: TClientDataSet; 
begin 
    cds := TClientDataSet.Create(nil); 
    try 
    cds.Data := MyClientDataSet.Data; 
    MyClientDataSet.Close; 
    MyClientDataSet.FieldDefs := cds.FieldDefs; 
    MyClientDataSet.FieldDefs.Add('Note', ftString, 20); 
    MyClientDataSet.CreateDataSet; 
    cds.First; 
    while not cds.Eof do begin 
     MyClientDataSet.Append; 
     MyClientDataSet.CopyFields(cds); 
     MyClientDataSet.FieldByName('Note').AsString := 'Test'; 
     MyClientDataSet.Post; 
     cds.Next; 
    end; 
    finally 
    cds.Free; 
    end; 
end; 
+0

Cela fonctionne très bien. Lors de l'inspection du contenu du fichier XML, 'MyClientDataSet.Post;' était en train d'insérer une ligne de données supplémentaire depuis que j'ai utilisé savetofile avant de fermer l'application. Donc, le message a été supprimé –