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;
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. –
Vous devez ajouter tous les champs dont vous avez besoin, y compris les champs calculés, avant d'appeler 'CreateDataSet'. – MartynA
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'). –