Bonjour,
j'essaie de mettre les donnes venant d'un autre composant
TIBQuery d'une base de donnees FireBird 1.5
Je veux lister les champs et les données en dynamique en fonction
du résultat de la requête SQL
J'ai un problème avec la methode AppendRecord() de TIBClientDataSet
1-Sur le clic du bouton
Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 IbSgbd->IBQuery1->Close(); IbSgbd->IBQuery1->SQL->Clear(); IbSgbd->IBQuery1->SQL->Add(" select ID,NOM,PRIX,STOCKACTUEL,STOCKMINIMUN from articles") ; IbSgbd->ToCache(IbSgbd->IBClientDataSet,IbSgbd->IBQuery1);
2- Méthode qui permet de lire un requete SQL est exécuter est ok
je retourne un pointeur sur un DataSet*
Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
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 TDataSet * __fastcall TIbSgbd::GetQueryResult(TIBQuery *pQuery) { try{ pQuery->Transaction=IBTransaction1; //preparation et optimisation de la requête if(!pQuery->Prepared){ pQuery->Prepare(); pQuery->Prepared=true; } pQuery->Open(); TDataSet &Ds=*pQuery; //ShowMessage(Ds.FieldByName("NOM")->AsString); return (TDataSet*)(&Ds); } catch(...) { return NULL; } }
3 Méthode qui met en cache
Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88 bool __fastcall TIbSgbd::ToCache(TIBClientDataSet * pCache, TIBQuery * pQuery) { //on met en cache les donnes provenenant de requete SQL type select TDataSet * pDs=GetQueryResult(pQuery); if(!pDs){ return false; } if(pDs->Eof){ return false; } // a finir pCache->Close(); pCache->FieldDefs->Clear(); int FieldsCount=pDs->FieldCount; //ajout de champs avec types for(int i= 0;i<FieldsCount;i++){ /* if(pDs->Fields->Fields[i]->DataType==ftInteger) { // GetData ShowMessage( pDs->Fields->Fields[i]->DisplayLabel); } */ pCache->FieldDefs->Add(pDs->Fields->Fields[i]->DisplayLabel, pDs->Fields->Fields[i]->DataType, pDs->Fields->Fields[i]->Size); } pCache->CreateDataSet(); /* for (int i=0;i<FieldsCount ;i++) { ShowMessage(pCache->Fields->Fields[i]->DisplayLabel); } */ TVarRec *pEnreg=new TVarRec[FieldsCount]; /*for( int i=0;i<FieldsCount;i++){ pEnreg[i].VType= pDs->Fields->Fields[i]->DataType; } */ // Arrayofconst p; pDs->First(); // pEnreg[0]=pDs->Fields->Fields[0]->Value; // pEnreg[1]=pDs->Fields->Fields[1]->Value; while(!pDs->Eof){// on parcours les enreg // liste les champs for(int i=0;i<FieldsCount;i++){ // ShowMessage(pDs->Fields->Fields[i]->CurValue); pEnreg[i]=pDs->Fields->Fields[i]->CurValue; } /// debug for(int i=0;i<FieldsCount;i++){ // ShowMessage(*pEnreg[i].VString); // } pCache->AppendRecord(pEnreg,FieldsCount-1); //plantage et bug ! ShowMessage(pCache->FieldByName("NOM")->AsString); // ShowMessage(pCache->Fields->Fields[1]->AsString); pDs->Next(); } delete []pEnreg; }
J'ai plusieurs questions:
-1-:Je voudrais mettre en cache le DataSet tout en gardant le même type de variable est ce possible ?
-2-:Est ce que TVarRec est bien utilisé et déclaré ?
-3- :Comment ajouter correctement un enregistrement a travers la méthode AppendRecord ? (j'ai essaye avec la macro ARRAYOFCONST sans succès)
-4-Faut il utiliser un autre méthode si oui laquelle ?
Je vous remercie de m'aider.
Partager