PHWinfo banniere

Titres
PORTAIL ANNUAIRE ARTICLES COMPARATEUR HÉBERGEURS DEVIS FORUMS RÉDUCTEUR D'URL
Précédent   PHWinfo > Autres forums > Forum Programmation & Conception > nzn.fr.delphi > Changer dynamiquement les champs d'un TDataSet
S'inscrire FAQ Membres Recherche Messages du jour Marquer les forums comme lus
Changer dynamiquement les champs d'un TDataSet

Réponse
 
LinkBack Outils de la discussion
Vieux 11/01/2008, 12h16   #1
Francois Piette
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Changer dynamiquement les champs d'un TDataSet

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


  Réponse avec citation
Vieux 11/01/2008, 14h08   #2
RESO / Claude GUTH
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Changer dynamiquement les champs d'un TDataSet

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
>
>



  Réponse avec citation
Vieux 11/01/2008, 21h16   #3
sheep
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Changer dynamiquement les champs d'un TDataSet

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
>>
>>

>
>



  Réponse avec citation
Réponse


Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are oui
Pingbacks are oui
Refbacks are oui


Fuseau horaire GMT +1. Il est actuellement 05h59.


Édité par : vBulletin® version 3.7.3
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.2.0 RC5 Tous droits réservés.
Version française #16 par l'association vBulletin francophone
PHWinfo est un site Éducation Sans Frontières ©2000-2008
Ad Management by RedTyger
©Tous droits réservés par les parties respectives
Page generated in 0,12756 seconds with 11 queries