Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 5 sur 5
  1. #1
    Membre du Club
    Inscrit en
    juin 2002
    Messages
    210
    Détails du profil
    Informations forums :
    Inscription : juin 2002
    Messages : 210
    Points : 47
    Points
    47

    Par défaut 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 :

    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
    Outils utilisés : FireBird 2.1 - IbExert Free - C++ Builder 6 Pro Update 4- Windows Xp pro Sp3

  2. #2
    Membre du Club
    Inscrit en
    juin 2002
    Messages
    210
    Détails du profil
    Informations forums :
    Inscription : juin 2002
    Messages : 210
    Points : 47
    Points
    47

    Par défaut

    Ok j'ai trouvé

    premiere erreur

    Code :
    Param->ParamByName("ID")->AsInteger=pCds->FieldByName("ID")->AsInteger
    corrigée en :

    Code :
    Param->ParamByName("ID")->AsInteger=pCds->FieldByName("ID_PERS")->AsInteger
    seconde erreur :

    Code :
    Param->ParamByName("ID")->AsInteger=pCds->FieldByName("ID_PERS")->AsInteger
    corrigée en

    Code :
    Param->ParamByName("ID")->AsInteger=pCds->FieldByName("ID_PERS")->OldValue

    voila

    merci
    Outils utilisés : FireBird 2.1 - IbExert Free - C++ Builder 6 Pro Update 4- Windows Xp pro Sp3

  3. #3
    Expert Confirmé Sénior Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    juillet 2006
    Messages
    10 045
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2006
    Messages : 10 045
    Points : 14 250
    Points
    14 250

    Par défaut

    La Structure de Delta est un peu particulière
    Fait un SaveToFile(XML) de Delta pour voir ce qu'il contient vraiment, ton ID porte peut-être un autre nom
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Membre du Club
    Inscrit en
    juin 2002
    Messages
    210
    Détails du profil
    Informations forums :
    Inscription : juin 2002
    Messages : 210
    Points : 47
    Points
    47

    Par défaut

    Ok j’essaierais cela si cela plante sur autre chose merci encore a toi
    et meilleur Voeux....même si c'est un peu tard
    Outils utilisés : FireBird 2.1 - IbExert Free - C++ Builder 6 Pro Update 4- Windows Xp pro Sp3

  5. #5
    Expert Confirmé Sénior Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    juillet 2006
    Messages
    10 045
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2006
    Messages : 10 045
    Points : 14 250
    Points
    14 250

    Par défaut

    lol, j'avais pas vu que tu avais répondu à ta propre question, c'est ça de faire plusieurs choses à la fois, on n'est pas efficace pour tout !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •