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 :

Pb Update AdoTable


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Octobre 2002
    Messages
    343
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 343
    Par défaut Pb Update AdoTable
    Hello

    J'ai trois fiches : la première permettant d'ajouter un client, la seconde permettant d'ajouter une conso à un client, la troisième étant le menu pour passer d'une fiche à l'autre. Sur chacune des deux fiches (ormis le menu) j'ai un composant TADOTable connecté sur ma table Client (Access), et un autre composant TADOTable connecté sur la même table Client.

    Le pb est le suivant, lorsque j'ajoute un client depuis la fiche Client puis l'utilisateur veut ajouter une conso pour ce client, le nouveau client n'apparait pas, je dois fermer l'application pour que le nouveau client soit bien enregistré.

    J'enregistre mon client "convenablement" par des ->Insert(), ->Post(). J'ai même essayé de faire à chaque fois qu'un événement FormShow() se produit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ClientConso->Active = false;
    ClientConso->Active = true;
    J'ai essayé la méthode Update() aussi, mais j'ai des plantages lors du FormShow. Bref, pas moyen de faire une mise à jour entre deux tables ADO pointant sur la même table Access.

    En espérant que qq'un pourra m'aider, a bientôt.

  2. #2
    Membre expérimenté
    Avatar de Djob
    Inscrit en
    Août 2002
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 215
    Par défaut
    essaye avec 1 Requery() au niveau de l'evenement AfterPost de chacune de tes tables sur la table jumelle.

    ex pour la table1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void __fastcall TForm1::ADOTable1AfterPost(TDataSet *DataSet)
    {
            ADOTable2->Requery();
    }
    Par curiosité : Question annexe si j'ai bien compris tu as 2 composants AdoTable pointant sur la table reelle, quelle contrainte t'oblige à avoir ce doublon ?

  3. #3
    Membre éclairé
    Inscrit en
    Octobre 2002
    Messages
    343
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 343
    Par défaut Pourquoi doublon ?
    Ok je vais essayer le Requery je dirai ca plus tard (chez moi il est déjà 22h avec le décallage).

    Voilà pourquoi j'ai un doublon, voir des doublons car j'ai plusieurs fiches avec plusieurs table. Le pb est que j'ai commencé à programmer les bd seulement depuis cette application.

    Donc j'aurai preferé avoir une seule table mais je ne sais pas comment faire apparaitre une table d'une fiche sur une autre fiche. Je viens de lire que Dieu à inventé les Modules de Données, ce serait une solution je pense, mais là c'est trop tard.

    Par contre; s'il existe une solution pour éviter d'avoir plusieurs doublons (et comme il s'agit de gérer des abonnements, des inscriptions, des consos, des statistiques) j'ai bcp bcp de tables en doublons, malheur!

    Si tu peux m'aider, ce serait super pour rattraper mon erreur, sans modifier trop de code.

  4. #4
    Membre expérimenté
    Avatar de Djob
    Inscrit en
    Août 2002
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 215
    Par défaut
    oui pour les datamodule c'est pas trop tard....
    fais une copie de ton projet d'abord...puis

    fichier nouveau DataModule, nomme le DM, enregistre l'unité sous par uDm.cpp

    fait :

    - un #include "uDM.h" dans les unités de toutes les fiches qui utilisent les tables

    - un couper coller de tes tables et datasource qui sont sur les fiches vers ce DM
    de sorte à ne pas avoir de doublons....

    dans Project1.cpp ( ton ficher principal) arrange toi pour que DM soit crée en premier, après initialize:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        Application->Initialize();
        Application->CreateForm(__classid(TDM), &DM);
    - enleve les références de table et datasource en double restée sur les fiches

    - Corrige ensuite les Datasource de tes DbGrid et autres Datacontrols ( DM->Datasource1 ) t'est proposé si tu as bien fais l' include cité avant.

    -Corrige ensuite ton code :

    devient
    ou bien redefini simplement Table1 avant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      TADOTable* Table1 =DM->Table1;
     
      //si Table1 est defini avant , le reste ne bouge pas
      Table1->Requery();
    et voilà c fini

  5. #5
    Membre éclairé
    Inscrit en
    Octobre 2002
    Messages
    343
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 343
    Par défaut Oulala
    Je vais tenter de mettre mon code à jour, de toute façon si j'ai bien compris je n'ai pas trop le choix puisque les requery ne mettent pas à jour mes tables doublons. En tout cas merci pour ton aide, je vais tenter de voir... Par contre, je ne sais pas si c'est normal ou c'est du aux tables, mais ça rame énormément lorsque j'effectue une requête... On dirait que mon appli tourne au ralenti, peut-être du au fait que je charge 30 tables au démarrage...

    En attendant, je me pose la question, pourquoi la méthode Update() ne met pas à jour les tables ? Elle est faite pour ça non ? Sinon à quoi elle sert, puisqu'après une opération telle que Insert(), Delete(), Edit() les tables sont mises à jour automatiquement.

    Merci encore...

  6. #6
    Membre expérimenté
    Avatar de Djob
    Inscrit en
    Août 2002
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 215
    Par défaut
    décidement j'ai de plus en plus l'impression de travailler avec des composants differents de tout le monde ces temps ci...

    je n'ai trouvé trouvé aucune methode Update() pour TADOTable.....


    NB : En plus pour le Requery cela fonctionne chez moi avec aussi une base access... (bien sur que dans le cas d'un nouveau enregistrement car le Requery n'avait été mis que dans l'évenement AfterPost et pas AfterDelete, Afteredit...etc ).

    Testé simplement avec 1 ADOConnection 2 ADOTable (pointant sur une meme table ) sur une meme fiche, 2 datasources 2 DBGrids et 2 Db Navigator...

    Le cas ou ça ne marche pas :

    ... C'est quand on ne configure pas les ADoTable sur une seule et même SQLConnection ...

    si on s'amuse par exemple à mettre directement une connection String dans chaque TADOTable, ou alors on met plusieurs TADOConnection dans le programme.. mais bon je suppose que personne n'aurait l'idée de faire un truc aussi ... bizarre.
    ...surtout que ça ralentirait sacrement les performances ....

  7. #7
    Membre éclairé
    Inscrit en
    Octobre 2002
    Messages
    343
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 343
    Par défaut Dur dur
    Non non, comme tu dis, j'ai pas eu la bonne idée de mettre plusieurs connection. En fait, après reflexion suite à ton mail, c'est étrange que les données n'apparaissent pas sur différentes tables (contrairement à toi, j'ai plusieurs fiches, ça change peut-être qq chose) vu que j'ai la même connection.

    J'utilise beaucoup les champs calculés, c'est vraiment domage que je n'ai pas su utilisé les DM avant, j'aurai évité les copier coller.

    Donc une dernière question : si je ne change pas du tout mon code, c'est à dire que je n'efface pas mes composants TTable mais au constructeur je fais cette opération :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Table1 =DM->Table1;
    sachant que Table1 à été défini pas BCB en variable private, à priori j'aurai une seule table ? En fait, je me demande s'il n'est pas mieux de procéder ainsi plutot que de changer toutes les occurences de Table1 apparaissant dans le prog (je vois déjà venir les buggs).

    Par contre je ne sais pas quelle version de BCB tu utilises pour ne pas avoir les Update() mais tu vois, ça ne me sert pas à grand chose

    A plus tard, et je ne l'aurai jamais assez dit sur ce forum, encore merci.

  8. #8
    Membre expérimenté
    Avatar de Djob
    Inscrit en
    Août 2002
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 215
    Par défaut
    J'utilise BCB6 Entreprise +Update Pack 4: aucun update meme pas dans l'aide ( j'ai bien UpdateRecord...)

    sachant que Table1 à été défini pas BCB en variable private
    ...c'est vrai qu'on a pas la même version chez moi tout ce qui est mis automatiquement est dans __published:

    si je ne change pas du tout mon code, c'est à dire que je n'efface pas mes composants TTable mais au constructeur je fais cette opération :
    ... je pense qu'il faudrait quand meme les supprimer de la fiche, en revanche l'idée (pour ne pas corriger tout le code ta fiche)c'est de déclarer en variable private ou public un pointeur sur TADOTable ....
    ...à initialiser dans le contructeur pour qu'il pointe sur l'unique Composant TADOTable de ton application ,située dans le DM:

    En Résumé :

    Utiliser le DM , c'est juste organisationnel (pour pas surcharger visuellement la fiche principale Form1), mais tu pourrais juste mettre tous les composants ado sur la fiche principale ça reviendrait au même..

    Ensuite, quand tu as, sur une autre fiche (Form2) une DBGrid,
    dans la propriété DataSource du DBGrid , on te donne le choix entre plusieurs DataSource...
    là , au lieu de choisir par ex DataSource2 (le doublon posé actuellement sur ta Form2) , tu choisis Form1->DataSource1,
    un peu comme tu as été obligé de faire pour Configurer la propriété Connection de ton doublon DataSource2 afin qu'il aille chercher Form1->ADOConnection...

  9. #9
    Membre éclairé
    Inscrit en
    Octobre 2002
    Messages
    343
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 343
    Par défaut Merchiche kebbab
    Merci Djob, je vais suivre tes conseils. Je viens de faire un tour sur le forum, je n'ai vu que ton pseudo. En tout cas, merci beaucoup d'être autant présent pour nous. De mon côté, je vais mettre un petit résolu, car je pense avoir toutes les infos pour débloquer mon programme, se sera long et délicat d'ailleurs.

    The End.

    PS: j'ai fait une erreur, il est clair que BCB met les composants en published

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

Discussions similaires

  1. Requête update à partir d'une autre table
    Par amiral thrawn dans le forum Langage SQL
    Réponses: 5
    Dernier message: 15/02/2024, 11h40
  2. Pb d'update dans une DataGrid
    Par bidson dans le forum XMLRAD
    Réponses: 11
    Dernier message: 27/05/2003, 14h11
  3. [dBase]il y a mieux que la commande sql UPDATE ?
    Par sana72 dans le forum Autres SGBD
    Réponses: 4
    Dernier message: 12/12/2002, 11h59
  4. Réponses: 3
    Dernier message: 10/11/2002, 11h03
  5. update et virgule
    Par Delph dans le forum Bases de données
    Réponses: 8
    Dernier message: 27/08/2002, 14h40

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