Bonjour
j'ai une appli qui me fait souffrir.....

je m'explique lorsque sur mon composant TClientDaset je fais :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
DataModule1->CDSPers->Delete();
et que par la suite je veux valider définitivement le suppression dans la base
j'ai un erreur :

Le projet AnnuaireOfficiel.exe a provoqué une classe d'exception EDatabaseError avec le message 'CDSPers: Champ 'ID' non trouvé'.
Pour valider mes données j'appelle ces deux procedures :
je tiens a dire que j'ai testé coté FireBird et aussi en câblant en dur l' ID et dans ces deux cas cela fonctionne

Premiere procedure :

Code : 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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
bool  __fastcall TDataModule1::ApplyUpdatePers()
{
        //TODO: Ajoutez votre code ici
 
          /*
    procedure qui permet la mise a jour en cache OK
 
    methode pour pallier l'evenemant applyupdate
    qui est compliqué a gerer
  */
 
TClientDataSet *pCdsDelta = new TClientDataSet(CDSPers);
 
 
try{
 
  // ATTENTION un exeption est levée si l'historique est vide
  // compenser par des controle
   try{
   pCdsDelta->Data= DataModule1->CDSPers->Delta;
   }
   catch(EDBClient &E)  {
     return false;
   }
 
   try{
 
      if(!DataModule1->IBDatabase->DefaultTransaction->InTransaction){
       DataModule1->IBDatabase->DefaultTransaction->StartTransaction();
      }
 
 
      pCdsDelta->First();
 
      int ID=0;
 
      while(!pCdsDelta->Eof) {
 
 
 
        switch(pCdsDelta->UpdateStatus())  {
 
            case usUnmodified:{
 
            break;
            }
 
            case usInserted: {
 
                 _INSERT_PERSONNE(pCdsDelta); // ok c'est bon
 
                break;
 
 
            }
 
            case usModified :{
 
 
            _UPDATE_PERSONNE(DataModule1->CDSPers); // ok c'est bon
 
 
 
            //ShowMessage("modif"); // modify
            break;
            }
 
            case usDeleted: {
            //plantage
                  _DELETE_PERSONNE(DataModule1->CDSPers) ;
 
 
 
            break;
            }
 
        }  // fin switch
 
        pCdsDelta->Next();
 
 
 
      } //fin boucle
 
      DataModule1->IBDatabase->DefaultTransaction->Commit() ;
      // refraichit le jeux de données
      DataModule1->CDSPers->Active=false;
      DataModule1->CDSPers->Active=true;
 
   }catch(...){
 
         ; // on annule la transaction
       DataModule1->IBDatabase->DefaultTransaction->Rollback();
 
   }
 
 
}__finally{
 
    delete pCdsDelta;
 
 }
 
 
}
ma seconde procedure

Code : 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
bool __fastcall TDataModule1::_DELETE_PERSONNE(TClientDataSet * pCds)
{
             /* TODO 1 -oo_live : suppresion de personne finir de deboger */
TParams *Param=new TParams();
bool succes=false;
 
  try{
     try{
 
        DataModule1->IBStoredProc1->StoredProcName="DELETE_PERSONNE"  ;
        TParams *Param=new TParams();
 
           Param->CreateParam(ftInteger,"ID",ptInput);
 
    Param->ParamByName("ID")->AsInteger=pCds->FieldByName("ID")->AsInteger; // cle primaire PLANTAGE sur ligne dessus ?
 
        DataModule1->IBStoredProc1->Params=Param;
        DataModule1->IBStoredProc1->Prepare();
        DataModule1->IBStoredProc1->ExecProc();
 
         // ne lit le param de retour
      //  int a=Param->ParamByName("ID")->AsInteger;
//        AnsiString nom=Param->ParamByName("NOM")->AsString;
 
      //  ShowMessage(IntToStr(a)+"" + nom);
        succes=true;
 
      }
      catch(...){
         succes=false;
      }
   }
   __finally{
    DataModule1->IBStoredProc1->UnPrepare();
    delete Param;
    return succes;
   }
 
}

Je pensais trouver l'enregistrement supprimé dans le journal d'enregistrement du TClientDataset , j'ai essaye de des methodes
Code : Sélectionner tout - Visualiser dans une fenêtre à part
pCds->FieldByName("ID")->OldValue
sans succés



Ma question est simple comment aller lire ceci dans le journal(Data)
sans passer par des variable ou tableau (cas de plusieurs enreg)
avant de supprimer definitivement ?

merci