IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

[base de données]FireBird-TIBClientDataSet-ApplyUdapte()-PB mise a jour en double


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    218
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 218
    Par défaut [base de données]FireBird-TIBClientDataSet-ApplyUdapte()-PB mise a jour en double
    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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    _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

    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
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Fichiers attachés Fichiers attachés

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    218
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 218
    Par défaut
    bonsoir,
    Est ce que il y a des options a régler au niveau du TIBClientDataSet ?

    merci

Discussions similaires

  1. compresser une base de données firebird
    Par QAYS dans le forum Administration
    Réponses: 4
    Dernier message: 12/05/2007, 12h05
  2. Compacter une base de données Firebird
    Par defluc dans le forum Débuter
    Réponses: 1
    Dernier message: 01/03/2007, 09h20
  3. Comment on connecte un programme Java avec une base de données FireBird?
    Par Gomez dans le forum Connexion aux bases de données
    Réponses: 1
    Dernier message: 16/02/2007, 10h21
  4. Event sur base de donnée Firebird et programmation delphi
    Par seb8810 dans le forum Connexion aux bases de données
    Réponses: 5
    Dernier message: 16/03/2006, 17h06
  5. Création d'une base de données Firebird
    Par richard038 dans le forum Bases de données
    Réponses: 7
    Dernier message: 30/11/2005, 17h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo