|
|
|
|
||||||
![]() |
|
|
LinkBack | Outils de la discussion |
|
|
#1 |
|
Messages: n/a
Hébergeur: |
Ayant un dérivé quelconque deTDataSet (par exemple un TAdoQuery), je
voudrais à l'exécution ajouter des champs calculés en fonction du contexte. Comment faire cela ? Dans le même ordre d'idée, je voudrais tout aussi dynamiquement, rendre visibles ou invisibles des champs d'un TDataSet affichées dans une TDBGrid. Comment faire cela ? Dans un cas comme dans l'autre, j'ai une TDBGrid liée à une TDataSource liée au TDataSet. Je n'ai pas de contrôle sur les requêtes ni les result-set du TDataSet. Il n'y a aucun champ défini au design time. Les champs sont tous déterminés par ce que retourne le serveur qui exécute la requête du TDataSet. Merci d'avance. -- francois.piette@overbyte.be Auteur du freeware ICS - Internet Component Suite Auteur du freeware MidWare - Multi-tiers framework http://www.overbyte.be |
|
|
|
#2 |
|
Messages: n/a
Hébergeur: |
Plusieures solutions :
intégrer le champ dans la requête SQL : Select *, cast(null as MonType) as MonChampEn Plus from MaTable... ou l'ajouter à la liste des champs (voir note ci-dessous) : procedure AddField(UnDataSet : TDataset; UnNomChamp : string; UnTypeChamp : TFieldType; UneTaille : Integer; UnFormat : string); {ajout d'un champ à une table } var UnChamp : TField; begin with UnDataSet, FieldDefs.AddFieldDef do begin Name := UnNomChamp; DataType := UnTypeChamp; if UnTypeChamp = ftString then Size := UneTaille; UnChamp := CreateField(UnDataSet); if UnFormat <> '' then case UnTypeChamp of ftInteger, ftFloat : TNumericField(UnChamp).DisplayFormat := UnFormat; ftDateTime, ftDate, ftTime : TDateTimeField(UnChamp).DisplayFormat := UnFormat; end; end; end; Puis sur le OnBeforeOpen : 1> appel à SetFieldDefs pour récupérer la liste des champs 2>si ajout dynamique appel à AddField 3>modif des propriétés du champ : MonChamp.Calculated := True; MonDataset.OnCalcFields := MonDatasetCalcFields; // ou c'est qu'il y a mon code Je fais ça avec des IBQuery, tables mémoire, etc.. Ca devrait marcher avec tout descendant de Dataset. Pour les grilles je prends dxDBGrid, bref je ne sais pas répondre à la deuxième partie de ta question. Bonne route et bonne année à tous ceux qui lisent ce post. "Francois Piette" <francois.piette@overbyte.be> a écrit dans le message de news: fm7mnp$if$1@sd-6498.dedibox.fr... > Ayant un dérivé quelconque deTDataSet (par exemple un TAdoQuery), je > voudrais à l'exécution ajouter des champs calculés en fonction du > contexte. > Comment faire cela ? > > Dans le même ordre d'idée, je voudrais tout aussi dynamiquement, rendre > visibles ou invisibles des champs d'un TDataSet affichées dans une > TDBGrid. > Comment faire cela ? > > Dans un cas comme dans l'autre, j'ai une TDBGrid liée à une TDataSource > liée > au TDataSet. Je n'ai pas de contrôle sur les requêtes ni les result-set du > TDataSet. Il n'y a aucun champ défini au design time. Les champs sont tous > déterminés par ce que retourne le serveur qui exécute la requête du > TDataSet. > > Merci d'avance. > -- > francois.piette@overbyte.be > Auteur du freeware ICS - Internet Component Suite > Auteur du freeware MidWare - Multi-tiers framework > http://www.overbyte.be > > |
|
|
|
#3 |
|
Messages: n/a
Hébergeur: |
Bonjour,
J'ai un vague souvenir d'un (gros) livre de John Colibri Delphi <-> DBase qui donnait des indications à ce sujet. Sans avoir de réponse formelle à ce sujet, c'est peut être le bout d'un fil qu'il suffirait de tirer ... -- Phil "RESO / Claude GUTH" <cl.guth@free.fr> a écrit dans le message de news: fm7t8q$499$1@sd-6498.dedibox.fr... > Plusieures solutions : > > intégrer le champ dans la requête SQL : > > Select *, cast(null as MonType) as MonChampEn Plus from MaTable... > > ou l'ajouter à la liste des champs (voir note ci-dessous) : > > procedure AddField(UnDataSet : TDataset; UnNomChamp : string; > UnTypeChamp : TFieldType; UneTaille : Integer; > UnFormat : string); > {ajout d'un champ à une table } > var UnChamp : TField; > begin > with UnDataSet, FieldDefs.AddFieldDef do > begin > Name := UnNomChamp; > DataType := UnTypeChamp; > if UnTypeChamp = ftString then Size := UneTaille; > UnChamp := CreateField(UnDataSet); > if UnFormat <> '' then case UnTypeChamp of > ftInteger, ftFloat : TNumericField(UnChamp).DisplayFormat := > UnFormat; > ftDateTime, ftDate, ftTime : TDateTimeField(UnChamp).DisplayFormat > := UnFormat; > end; > end; > end; > > > > Puis sur le OnBeforeOpen : > > 1> appel à SetFieldDefs pour récupérer la liste des champs > 2>si ajout dynamique appel à AddField > 3>modif des propriétés du champ : > > MonChamp.Calculated := True; > MonDataset.OnCalcFields := MonDatasetCalcFields; // ou c'est qu'il y a > mon code > > Je fais ça avec des IBQuery, tables mémoire, etc.. Ca devrait marcher avec > tout descendant de Dataset. > > Pour les grilles je prends dxDBGrid, bref je ne sais pas répondre à la > deuxième partie de ta question. > > Bonne route et bonne année à tous ceux qui lisent ce post. > > > > > > > "Francois Piette" <francois.piette@overbyte.be> a écrit dans le message de > news: fm7mnp$if$1@sd-6498.dedibox.fr... >> Ayant un dérivé quelconque deTDataSet (par exemple un TAdoQuery), je >> voudrais à l'exécution ajouter des champs calculés en fonction du >> contexte. >> Comment faire cela ? >> >> Dans le même ordre d'idée, je voudrais tout aussi dynamiquement, rendre >> visibles ou invisibles des champs d'un TDataSet affichées dans une >> TDBGrid. >> Comment faire cela ? >> >> Dans un cas comme dans l'autre, j'ai une TDBGrid liée à une TDataSource >> liée >> au TDataSet. Je n'ai pas de contrôle sur les requêtes ni les result-set >> du >> TDataSet. Il n'y a aucun champ défini au design time. Les champs sont >> tous >> déterminés par ce que retourne le serveur qui exécute la requête du >> TDataSet. >> >> Merci d'avance. >> -- >> francois.piette@overbyte.be >> Auteur du freeware ICS - Internet Component Suite >> Auteur du freeware MidWare - Multi-tiers framework >> http://www.overbyte.be >> >> > > |
|
![]() |
| Outils de la discussion | |
|
|