[FireBird BCB] probleme avec TVarRec et AppendRecord
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:
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:
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:
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.