Comment puis-je ajouter des champs à un clientdataset au moment de l'exécution?
J'ai un TClientDataSet
, qui est fourni par un TTable
’dataset.
Le jeu de données comporte deux champs: code postal (string, 5) et de la rue (string, 20)
Au moment de l'exécution, je veux afficher un troisième champ (string, 20). La routine de ce champ est de mettre le code postal en tant que paramètre et donne en retour, la ville appartient à ce code postal.
Le problème est uniquement sur l'ajout d'un champ calculé à celles qui existent déjà. Le remplissage de la donnée en elle-même n'est pas le problème.
J'ai essayé:
cds.SetProvider(Table1);
cds.FieldDefs.Add('city', ftString, 20);
cds.Open;
cds.Edit;
cds.FieldByName('city').AsString := 'Test'; // --> errormessage (field not found)
cds.Post;
cd est mon clientdataset, Table1
est un paradoxe de la Table, mais le problème est le même avec d'autres bases de données.
Merci d'avance
OriginalL'auteur CloudyMarble | 2011-02-08
Vous devez vous connecter pour publier un commentaire.
Si vous souhaitez ajouter des champs supplémentaires, autres que celles qui existent dans les données sous-jacentes, vous devez également ajouter des champs existants à la main. Le jeu de données doit être fermé lorsque vous ajoutez des champs, mais vous pouvez avoir les métadonnées nécessaires à
FieldDefs.Update
si vous ne voulez pas suivre tous les détails des champs manuellement. Fondamentalement, quelque chose comme ceci:Également voir ce excellent article par Cary Jensen.
OriginalL'auteur Sertac Akyuz
Eh bien j'ai trouvé une solution plus simple, comme je l'ai 24 champs dans mon sql, je n'ai pas voulu ajouter manuellement tous j'ai donc ajouté un mannequin domaine de l'instruction sql à la place comme:
qui je peux modifier dans mon programme OnAfterOpen événement.
Bien j'ai eu à définir dans le sql combien de temps que le champ doit être en laissant suffisamment d'espace, par exemple 5 espaces vides pour 5 personnages, donc je dois savoir combien de temps le nom de la ville pourrait être.
OriginalL'auteur CloudyMarble
Aimerais partager plus précis de la Requête pour non-existante champs. Je parie que c'est mieux d'utiliser cast, ni des espaces!
par exemple
| Marc'O | Polo | <NULL> |
C'est plus précise, on peut vraiment voir la taille du champ, compréhensible, facile, sûr!
OriginalL'auteur xoxn-- 1'w3k4n
Vous devez utiliser
CreateDataset
après ajout de champ:OriginalL'auteur Morteza Esmizadeh
si vous souhaitez combiner déjà existant "dynamique" champs de données (à partir du fournisseur de côté) avec des côté client champs persistants (calculé, de recherche, de internalcalc, agrégation), vous devez sous-classe de la CDS. juste introduire davantage de propriété booléenne CombineFields et supplanter BindFields (dans les nouvelles versions de delphi) ou de l'ensemble de la InternalOpen (comme je l'ai fait dans d2006/2007) avec la ligne suivante
si DefaultFields ou CombineFields puis CreateFields; { TODO -ovavan -cSIC : si CombineFields est vrai, alors les champs persistants va coexister avec ceux par Défaut }
qui vous permettra d'éviter tout ce qui runtime mess avec FieldDefs/CreateField
OriginalL'auteur vavan