TClientDataSet/firebird perte de valeur apres appel de Delete()
Bonjour
j'ai une appli qui me fait souffrir.....
je m'explique lorsque sur mon composant TClientDaset je fais :
Code:
DataModule1->CDSPers->Delete();
et que par la suite je veux valider définitivement le suppression dans la base
j'ai un erreur :
Citation:
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:
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:
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:
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