Bonjour,
J'essaie de faire une application qui teste le composant TIBClientDataSet
le problème est que j'ai en double les mise a jours.
Je me suis inspiré des exemples livré avec BCB6 : "CachedUp"
dans Examples\DBTasks
Pour l'instant j'ajoute des enreg dans une table par la suite je voudrais faire des ajout /suppression/ insertion en cascade
J'ai un sgbd "annuaire" qui a un table 3 champs de type string et une cle primaire ID qui est auto-incrémenté de 1 via un trigger
voici ce que fais :
sur l' évènement create de mon form
1 2 3 4 5 6 7 8 9 10 11 12
| void __fastcall TForm1::FormCreate(TObject *Sender)
{
//pointeur sur l'ensemble de donnees en cache clientdataset1
// déclaration dans le .h : TCustomClientDataSet *_FClientDs;
// la prorpiete CommandText contient la requete suivante
//select ID, NOM, PRENOM, TEL from ANNUAIRE
_FClientDs=dynamic_cast<TIBClientDataSet*>(DataMod->IBClientDataSet1);
_FClientDs->Open();
} |
Pour ajouter un enreg dans le cache je fais :
1 2 3 4 5 6 7 8 9 10
| void __fastcall TForm1::BtAjoutClick(TObject *Sender)
{
_FClientDs->AppendRecord( ARRAYOFCONST((
NULL, //cle primaire
EdNom->Text,
EdPRenom->Text,
EdTel->Text
))
);
} |
Pour valider le les mise a jour je fais
_FClientDs->ApplyUpdates(1);
Un évènement OnUpdateData se déclenche .
Je lis dans le journal de modification (proriete Delta) et j'appelle ma procédure stockée "INSERT_ANNUAIRE" via un composant IBStoredProc1
J'écris les mise a jour comme ceci
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
| void __fastcall TDataMod::IBClientDataSet1UpdateData(TObject *Sender,
TCustomClientDataSet *pDataSet)
{
if(!IBDatabase->DefaultTransaction->InTransaction){
IBDatabase->DefaultTransaction->StartTransaction();
}
try{
pDataSet->First();
while(!pDataSet->Eof){
switch (pDataSet->UpdateStatus())
{
case usUnmodified:{
ShowMessage("nom modifié");
break;
}
case usModified :{
ShowMessage("Modifié");
break;
}
case usInserted :{
IBStoredProc1->StoredProcName="INSERT_ANNUAIRE";
TParams *Param=new TParams();
Param->CreateParam(ftString,"NOM",ptInput);
Param->CreateParam(ftString,"PRENOM",ptInput);
Param->CreateParam(ftString,"TEL",ptInput );
Param->ParamByName("NOM")->AsString=pDataSet->FieldByName("NOM")->AsString;
Param->ParamByName("PRENOM")->AsString=pDataSet->FieldByName("PRENOM")->AsString;
Param->ParamByName("TEL")->AsString=pDataSet->FieldByName("TEL")->AsString;
IBStoredProc1->Params=Param;
IBStoredProc1->ExecProc();
delete Param;
ShowMessage("ajouté");
break;
}
case usDeleted :{
ShowMessage("suuprimé");
break;
}
} // fin swicth
pDataSet->Next();
}
IBDatabase->DefaultTransaction->Commit(); // on valide
}catch(...){
IBDatabase->DefaultTransaction->Rollback();
}
} |
Lors de l'ajout j'ai des ajout en double avec différente valeur de cle primaire
-Comment faire ceci pour utiliser les requête SQL sur un table ?
-Comment faire ceci pour utiliser les requête SQL sur plusieurs table ?
Je ne vois pas ou est mon erreur ?
Dans la demo CacheUp , il y a cette instruction qui dit que le mise a jour se font via le composant UpdateSQL
FDataSet->UpdateObject = CacheData->UpdateSQL;
Est ce que il y a l'équivalent via un ClientDataSet ou un TIBClientDataSet ?
Je mets en fichier joint le projet + la base si quelqu'un pouvait me débloquer
j'en serais ravi 
Je vous remercie par avance d'aider un débutant qui galère pas mal sur le mise a jour en cache
Partager