Bonjour à tous,
Est-il possible de modifier directement un type de données sur un champ déjà créé ? (CreateDataSet)
Exemple :
MerciCode:
1
2
3
4 ClientDataSet.close; ClientDataSet.FieldDefs[0].DataType := ftInteger; ClientDataSet.Open;
Version imprimable
Bonjour à tous,
Est-il possible de modifier directement un type de données sur un champ déjà créé ? (CreateDataSet)
Exemple :
MerciCode:
1
2
3
4 ClientDataSet.close; ClientDataSet.FieldDefs[0].DataType := ftInteger; ClientDataSet.Open;
Et sur un ClientDataSet fermé, le problème c'est la source de données, liaison via SetProvider/ProviderName ?
Quand tu ouvres le ClientDataSet, il est vide sauf si il y a une source, as-tu une erreur pour poser la question, que donnes ton essai ?
Cela dépend la façon de le créer
Par champ persistent, soit via IDE soit via Code - La Réponse est NON
Par Champ défini ainsi - la réponse est OUICode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 with TIntegerField.Create(CDS)do begin FieldName := 'SensorID'; FieldKind := fkData; DataSet := CDS; end; with TFloatField.Create(CDS)do begin FieldName := 'MetricValue'; FieldKind := fkData; DataSet := CDS; end; with TStringField.Create(CDS) do begin FieldName := 'Concatened'; FieldKind := fkInternalCalc; DataSet := CDS; ReadOnly := True; end; CDS.CreateDataSet();
Les deux méthodes étant purement et simplement incompatiblesCode:
1
2
3
4
5 CDS.FieldDefs.Add('SensorID', TFieldType.ftString, 10); CDS.FieldDefs.Add('MetricValue', TFieldType.ftFloat); CDS.FieldDefs[0].DataType := TFieldType.ftInteger; CDS.FieldDefs.Add('Concatened', TFieldType.ftString, 30); CDS.CreateDataSet();
Tu ne peux pas modifier un ClientDataSet ouvert, une colonne calculée pourrait faire office de paliatif.
Voir le sujet Résultat de Query de 2 Query dans un DBGrid qui pourrait être inspirant pour créer par code une colonne calculée.
Bonjour ShaiLeTroll,
Effectivement, il n'est pas possible de modifier la structure d'un champ déjà créé.
Il y a sûrement possibilité de faire une bidouille, créer un nouveau dataset avec les modifications de champ, puis d'apporter les données dans les nouveaux champs de données.
Ce qui pourrait poser problème, c'est de passer d'un champ type ftString à un champ type numérique, cela poserait problème lors de l'importation des données.
En fait l'idée était de créer un simple gestionnaire de données, avec une structure de base fixe
TabName : ftString
TabPassword : ftString
TabData: ftWideString // Ensemble de données compressé
TabFilter : ftWideString // Ensemble de données compressé
Chaque enregistrement correspond à un ensemble de données (Table & Filtre).
J'avais espoir qu'il était possible de modifier la structure déjà créée, Rien n'est impossible :D.
Pièce jointe 660951
Pièce jointe 660952
Pièce jointe 660953
Pièce jointe 660954
Après mûre réflexion je pense m'orienter vers le composant Absolute Database, qui serait, je pense, beaucoup adapté.
Après avoir lu je ne comprends pas le sens de la question.
Modifier la structure de données n'est pas la responsabilité du ClientDataSet
Si tu dois le faire c'est au niveau de la base de données qu'il faut agir, par exemple par SQL avec la commande ALTER TABLE xxx MODIFY COLUMN yyyy VARCHAR(X) NULL DEFAULT NULL
Au niveau du ClientDataSet tu peux faire du transtypage de données, par exemple si une colonne de type Texte contient des valeurs numériques dans la table (ce qui n'est pas bien normalement mais ça arrive) :
Value:=MonDataSet.FieldByName('NomDuChamp').AsInteger;