Bonjour
j'ai une appli qui me fait souffrir.....
je m'explique lorsque sur mon composant TClientDaset je fais :
et que par la suite je veux valider définitivement le suppression dans la base
Code : Sélectionner tout - Visualiser dans une fenêtre à part DataModule1->CDSPers->Delete();
j'ai un erreur :
Pour valider mes données j'appelle ces deux procedures :Le projet AnnuaireOfficiel.exe a provoqué une classe d'exception EDatabaseError avec le message 'CDSPers: Champ 'ID' non trouvé'.
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 :
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
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; } }
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
sans succés
Code : Sélectionner tout - Visualiser dans une fenêtre à part pCds->FieldByName("ID")->OldValue
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
Partager