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.