Bonjour,
J'essaie en vain de créer par le code plutôt qu'en les posant sur un fiche la grappe des 3 composants :
TSQLDataSet <- TDataSetProvider <- TClientDataSet
Il y a des trucs particuliers à faire pour que cela fonctionne ?
Version imprimable
Bonjour,
J'essaie en vain de créer par le code plutôt qu'en les posant sur un fiche la grappe des 3 composants :
TSQLDataSet <- TDataSetProvider <- TClientDataSet
Il y a des trucs particuliers à faire pour que cela fonctionne ?
Inspire toi de ma réponse dans Kbmmemtable / DisableControls / DbGrid
Un code que j'ai dans mon projet actuel, si cela peut t'inspirer
C'est un cas particulier où je recopie les données d'un TSQLQuery dans un TClientDataSet, sachant que le TSQLQuery sera libéré avant même que l'on affiche le TClientDataSet dans des TDBEdit, TDBCheckBox ...
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 //--------------------------------------------------------------------------- /*constructor*/__fastcall T****HardwareAbstractEntity::T****HardwareAbstractEntity(T*****HardwareAbstractModel* AModel) { FModel = AModel; // J'hésite à gérer le CDS et DSP en Lazy Loading (surtout pour le mode Use qui ne les utilise pas) ! FProviderDS = new TDataSetProvider(NULL); // FProviderDS n'a pas de DataSet pour le Moment ! // Fourni un cache d'édition avec les Composants DB car on ne pas modifier le contenu d'un TSQLQuery // Par Défaut LogChanges est à true, ainsi les modifications restent en mémoire et cela ne tente pas d'altérer le TSQLQuery en Lecture Seule sans un appel explicite à ApplyUpdates FClientDS = new TClientDataSet(NULL); // Je préfère SetProvider par rapport à ProviderName et sa bidouille avec le Owner ! FClientDS->SetProvider(FProviderDS); inherited::DataSet = FClientDS; }
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 //--------------------------------------------------------------------------- /*override*/void __fastcall T*****HardwareAbstractEntity::SetDataSet(TDataSet* Value) { FClientDS->Close(); // Je préfère SetProvider par rapport à ProviderName et sa bidouille avec le Owner ! FClientDS->SetProvider(FProviderDS); FClientDS->PacketRecords = -1; // garanti la copié des données ! FProviderDS->DataSet = Value; if (Value) FClientDS->Open(); // Copie les Données d'un seul coup ! FClientDS->SetProvider(NULL); FProviderDS->DataSet = NULL; // on détache, on ne conserve que la copie en mémoire }
Code:
1
2
3
4
5
6
7 //--------------------------------------------------------------------------- void __fastcall T*****ORPersistent::SetDataSet(TDataSet* Value) { FDataSet = Value; if (DataSource) DataSource->DataSet = FDataSet; }
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 //--------------------------------------------------------------------------- int T*****HardwareAbstractEntity::InternalLoadByLinkedHardwareID(int ALinkedHardwarePrimaryID, bool KeepCacheForEdit/* = false*/) { int Result = -1; try { TSQLQuery *InternalTmpDataSet; if (ALinkedHardwarePrimaryID) InternalTmpDataSet = SelectByLinkedHardwareID(ALinkedHardwarePrimaryID, MetaData->PublishedFields->CommaText); else InternalTmpDataSet = SelectWhere("0 = 1", MetaData->PublishedFields->CommaText); // Clause Toujours Fausse donc Empty ! try { // RecordCount ne doit pas être utilisé sur un TSQLQuery if (ALinkedHardwarePrimaryID) Result = InternalTmpDataSet->IsEmpty() ? -1 : 1; else Result = InternalTmpDataSet->IsEmpty() ? 0 : -1; DataSet = NULL; if (KeepCacheForEdit) DataSet = InternalTmpDataSet; // Le DataSet est dupliqué en mémoire else Assign(InternalTmpDataSet); // Copie des Données dans les propriétés publiées } __finally { delete InternalTmpDataSet; } } catch(const Exception &e) { T*****HardwareAbstractProvider::GetProvider()->Util*****->Trace(*****FormatException("%0:s::InternalLoadByLinkedHardwareID : %2:s [%1:s]", this, e), "", true, true); throw; } return Result; }
Salut
En ce qui concerne la grappe, tu peux répartir les grains TSQLDataSet et TDataSetProvider dans un Datamodule et le dernier grain ClientDataSet sur la fiche, ça soulage déjà pas mal.
Cdlt