BCB6/FireBird/TClientDataSet/SQL perte de valeur dans mise a jour
Bonjour,
lorsque je fais une insertion avec ce code je n'ai pas de problème.
Un problème surviens lors de la mise a jour.
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
| bool __fastcall TDataModule1::ApplyUpdatePers()
{
/* procedure qui permet la mise a jour en cache OK */
TClientDataSet *pCdsDelta = new TClientDataSet(CDSPers);
//CDSPERS est un TClientDataSet contenu un DataModule
try{
// ATTENTION une exception est levée si l'historique est vide
// compenser par des contrôle
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);
break;
}
case usModified :{
_UPDATE_PERSONNE(pCdsDelta);
break;
}
case usDeleted: {
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;
}
} |
Cependant lorsque je modifie un enregistrent je perds le valeur sauf la ou j'ai fais la modification dans un champ( la procédure d'insertion est quasiment la même a par que j'appelle une autre PS)
voici comment je modifie:
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
| bool __fastcall TDataModule1::_UPDATE_PERSONNE(TClientDataSet * pCds)
{
//TODO: mise a jour d'un enreg table personne
try
{
IBStoredProc1->StoredProcName="UPDATE_PERSONNE";
TParams *Param=new TParams();
Param->CreateParam(ftInteger,"ID_PERS",ptInput);
Param->CreateParam(ftString,"NOM",ptInput);
Param->CreateParam(ftString,"PRENOM",ptInput);
Param->CreateParam(ftString,"ADRESSE",ptInput);
Param->CreateParam(ftString,"VILLE",ptInput);
Param->CreateParam(ftString,"CODE_POSTAL",ptInput);
Param->CreateParam(ftString,"ENTREPRISE",ptInput);
// regardez si on lit
//ShowMessage(pCdsDelta->FieldB&yName("NOM")->AsString);
Param->ParamByName("ID_PERS")->AsInteger=pCds->FieldByName("ID_PERS")->AsInteger;
Param->ParamByName("NOM")->AsString=pCds->FieldByName("NOM")->AsString;
Param->ParamByName("PRENOM")->AsString=pCds->FieldByName("PRENOM")->AsString;
Param->ParamByName("ADRESSE")->AsString=pCds->FieldByName("ADRESSE")->AsString;
Param->ParamByName("VILLE")->AsString=pCds->FieldByName("VILLE")->AsString;
Param->ParamByName("CODE_POSTAL")->AsString=pCds->FieldByName("CODE_POSTAL")->AsInteger;
Param->ParamByName("ENTREPRISE")->AsString=pCds->FieldByName("ENTREPRISE")->AsString;
DataModule1->IBStoredProc1->Params=Param;
DataModule1->IBStoredProc1->ExecProc();
delete Param;
return true;
}
catch(...)
{
return false; // en cas d'erreur
}
} |
la procédure stockée coté serveur
Code:
1 2 3 4 5 6 7 8 9 10 11
| BEGIN
/* MISE A JOUR D'UNE PERSONNE */
UPDATE PERSONNE
SET NOM=:NOM,PRENOM=:PRENOM,ADRESSE=:ADRESSE,
CODE_POSTAL=:CODE_POSTAL ,ENTREPRISE=:ENTREPRISE
WHERE ID_PERS=:ID_PERS ;
END |
Ou est l'erreur ?
Comment se fait il que je perde des valeurs ? (j'ai uniquement celle ou les champs sont modifie)
je ne comprends pas, qui peut m'expliquer?
merci et bonnes fêtes a vous tous et touteS :)