2017-09-06 5 views
1

J'essaie d'ajouter un champ de calcul à un ensemble de données existant créé avec fieldDefs.add en utilisant le code ci-dessous avec de nombreuses variantes que j'ai trouvées sur plusieurs sites, y compris le débordement de pile.Impossible d'ajouter un champ de calcul à clientdataset

Mais le fieldDefs créé par la ligne fieldDefs ou par la ligne dataSet est perdu à la mise à jour par FieldDefs.count.

Fields.counts persistent mais ne sont pas enregistrés dans les fichiers XML.

Aucune exception n'est soulevée.

Quelqu'un a-t-il une idée de ce qui se passe ici? Merci

MYclientDataSet.CreateDataSet; 
MYclientDataSet.open; 
MYclientDataSet.FieldDefs.Update; 
MYclientDataSet.Active := False; 
for i := 0 to MYclientDataSet.FieldDefs.Count - 1 do 
    MYclientDataSet.FieldDefs[i].CreateField(MYclientDataSet); 
fld := TStringField.Create(MYclientDataSet); 
with fld do begin 
    FieldName := 'PartSummary'; 
    FieldKind := fkCalculated; 
    Calculated := True; 
    Name := cds.Name + FieldName; 
    DataSet := MYclientDataSet; 
    MYclientDataSet.FieldDefs.Add('PartSummary', ftString, 30, false); 
    MYclientDataSet.FieldDefs.update; 
end; 
MYclientDataSet.active := true; 
MYclientDataSet.open; 
MYclientDataSet.edit; 
+0

Pourquoi avez-vous besoin d'ouvrir deux fois? Ce n'est peut-être pas le problème, et cela pourrait être nécessaire ou inoffensif. Mais cela semble étrange. –

+1

Vous devez ajouter tous les champs dont vous avez besoin, y compris les champs calculés, avant d'appeler 'CreateDataSet'. – MartynA

+0

Je n'ai jamais appelé 'update' à nouveau après avoir ajouté un champ calculé .. Je crois que' update' ouvre la table et la ferme, donc dans cette routine, vous ouvrez la table trois fois ... ne l'ouvrez pas jusqu'à ce que tu es fini. et 'active: = true' et' open' font la même chose, alors choisissez-en une (je préfère 'open'). –

Répondre

0

Selon Cary Jensen dans le lien de l'éducation Delphi Defining a Clientdataset's Structure... vous ne pouvez pas créer un calcul, la recherche, le champ global à l'aide FieldDefs. Vous devez utiliser TFields à la place.

+0

En effet. Je n'ai jamais trouvé que ça valait la peine de jouer avec FieldDefs et de toujours travailler avec la collection Fields de DataSet à la place. L'utilisation de FieldDefs leur fournit simplement une opportunité de désynchroniser les définitions des champs. – MartynA