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

Bases de données Delphi Discussion :

Probleme Refresh Firebird et DBGRID


Sujet :

Bases de données Delphi

  1. #1
    Membre régulier
    Inscrit en
    Avril 2010
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 138
    Points : 113
    Points
    113
    Par défaut Probleme Refresh Firebird et DBGRID
    Bonjour,
    Je développe une application Gestion de stock en réseau sous delphi 7 et firebird 2.1
    Toujours avec le probleme de refresh que j'ai resoulu à l'insertion d'un nouvel enregistrement en utilisant le locate.

    J'ai une fiche qui utilise deux tables :
    * une TableBon
    * une autre TableDetailsBon: qui a le master source SourceTableBon
    Sur ma fiche j'utilise DBnavigateur et j'affiche des données concernant la tablebon(en utilisant des DBedit) Et Un DBGrid Qui affiche les données de tableDetailsBon Et comme mon application est sous reseau j'ai besoin de raffraichir les données (en utilisant un timer qui fait TableDetailsBon.refresh et tablebon.refresh). Seulement Mon problème est le suivant:
    à chaque execution de refresh le dbnavigateur clignote et le Scroll du dbgrid Bouge et c'est le dernier enregistrement du Dbgrid qui est seléctionné .

    Remarque: j'utilisais la même fiche avec les tables Paradox mais n'y avait pas ce problème . le refresh passait inaperçu (fiche stable).

    Merci pour votre aide.

    Mina24.

  2. #2
    Membre actif
    Inscrit en
    Décembre 2004
    Messages
    390
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 390
    Points : 288
    Points
    288
    Par défaut
    Je n'ai pas bien ton problème.
    Pourquoi veux-tu faire un refresh ??

    Sinon, pour éviter le clignotement, utilises le couple d'instruction : DisableControls et EnableControls. Consulte l'aide de Delphi pour voir comment ces instructions fonctionnnennt !

    Pour retrouver le même enregistrement, tu sauvegardes la clé avant de faire le refresh et tu fait un Locate sur la clé après.

    Je répète, Pourquoi veux-tu faire un refresh ??

  3. #3
    Membre régulier
    Inscrit en
    Avril 2010
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 138
    Points : 113
    Points
    113
    Par défaut
    Merci pour votre réponse!

    Je répète, Pourquoi veux-tu faire un refresh ??
    J'utilise le refresh parce que mon application est sous réseau donc par exemple mettre à jour le stock pour les autres utilisateur!
    Remarque: le refresh est utilisé dans le timer chaque seconde il l'exécute.

    Sinon, pour éviter le clignotement, utilises le couple d'instruction : DisableControls et EnableControls. Consulte l'aide de Delphi pour voir comment ces instructions fonctionnnennt !
    Je vais essayer de faire ça ! et je vous rendrais la réponse.

    Pour retrouver le même enregistrement, tu sauvegardes la clé avant de faire le refresh et tu fait un Locate sur la clé après.
    Donc je comprends bien que le refresh avec firebird nécessite toujours l'utilisation de locate et ce n' était pas le cas avec paradox!

    Merci.

  4. #4
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par mina24 Voir le message
    J'utilise le refresh parce que mon application est sous réseau donc par exemple mettre à jour le stock pour les autres utilisateur!
    Remarque: le refresh est utilisé dans le timer chaque seconde il l'exécute.
    Et quand ta base de données va contenir 20000 ou 30000 enregistrements et que cela va prendre 3 ou 4 secondes pour rafraichir ?

    Je pense que tu devrais changer de méthode de fonctionnement.

    1- Passer par des requêtes (Largement plus rapide que d'ouvrir une table complète)
    2- faire un refresh à la demande
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  5. #5
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    Citation Envoyé par Rayek Voir le message
    1- Passer par des requêtes (Largement plus rapide que d'ouvrir une table complète)


    Citation Envoyé par Rayek Voir le message
    2- faire un refresh à la demande
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  6. #6
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par edam Voir le message
    Précise un peu, car juste des smiley c'est pas terrible comme réponse.

    Sinon je vais préciser le refresh à la demande :

    - Refresh auto quand on sélectionne un des articles que l'on veut voir
    - Un bouton pour remettre à jour les données affichées car, je le rappel, une requête n'est qu'une vue des tables à un instant donné.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  7. #7
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    j'ai crus que tu parle d'un ré-friche (dataset.refrech)
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  8. #8
    Membre actif
    Inscrit en
    Décembre 2004
    Messages
    390
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 390
    Points : 288
    Points
    288
    Par défaut
    Donc je comprends bien que le refresh avec firebird nécessite toujours l'utilisation de locate et ce n' était pas le cas avec paradox!
    Tous les SGBD ont besoin d'un refresh !

    Si tu as l'habitude de travailler avec des TTables en Paradox, avec Firebird c'est une autre politique de programmation ! Au lieu des TTables utilises plutôt des TQuery c'est plus adapté pour la programmation en client/serveur ! Les TTables ramènent tout le contenu et si on a des milliers de records, c'est pas évident sous réseau. Il faut lire les tutos pour te familiariser avec cette technique de programmation et tu as le forum pour le reste.

    Au fait, quels composants tu utilises pour accéder la base Firebird ?

  9. #9
    Membre régulier
    Inscrit en
    Avril 2010
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 138
    Points : 113
    Points
    113
    Par défaut
    Citation Envoyé par akli_agha Voir le message

    Au fait, quels composants tu utilises pour accéder la base Firebird ?
    J'utilise MDO Pour y accéder!
    Je n'utilise vraiment pas les Querry vous avez de la documentation à me conseiller??
    Merci

    Mina24.

  10. #10
    Membre actif
    Inscrit en
    Décembre 2004
    Messages
    390
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 390
    Points : 288
    Points
    288
    Par défaut
    Je ne connais pas ces composants ! Moi, j'utilise, plutôt, les composants Zeos 6.6
    Ils ressemblent beaucoup à ceux du BDE et fonctionnent trés bien avec Firebird.

    Pour la Doc, il faut lire sur le principe des transactions, particulièrement, celles de Firebird. Il faut essayer de comprendre le comportement du Client/serveur qui n'a rien à voir avec la gestion des tables à la Paradox.

    Tu cherches sur le net, il y a un tas de lecture.
    Pour Zeos, tu télécharges les composants et tu suis la procédure d'installation qui vient avec. Ce n'est pas difficile à installer et ..

    Bon courage !

  11. #11
    Membre actif
    Inscrit en
    Décembre 2004
    Messages
    390
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 390
    Points : 288
    Points
    288

  12. #12
    Membre régulier
    Inscrit en
    Avril 2010
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 138
    Points : 113
    Points
    113
    Par défaut
    Merci pour vos réponses.
    pour le site que vous m'avez donné je le trouve bien et il m'a beaucoup aidé pour comprendre à utiliser firebird en client/serveur.
    j'ai essayé mon application sous réseau bien sur j'ai installé firebird client sur le poste client et firebird serveur sur le poste serveur et effectivement j'ai remarqué que le refresh ne fonction que sur le poste en cours (c'est à dire les modifications apportées sur un poste ne s'affichent pas sur les autres jusqu'à ce qu'on quitte l'application et on la relance que les modification s'affichent sur l'autre poste )
    aussi j'utilise toujours les tables et non pas les query pour le moment je veux continuer comme ça car j'ai commencé par ce principe sur ça et je peux pas tout refaire pour le moment !
    Pouvez vous m'aider à mettre cette application sous réseau sans migrer vers les query ???

    Merci beaucoup.
    Mina24.

  13. #13
    Membre actif
    Inscrit en
    Décembre 2004
    Messages
    390
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 390
    Points : 288
    Points
    288
    Par défaut
    Il est très difficile de faire du client serveur avec des tables d'autant que je ne connais pas les composants (MDO ??) avec les quels tu travailles.
    Si c'était avec les composants Zeos, j'aurais pu te donner un grand coup de main.

    L'idée du Refresh est de savoir quand une table est modifiée. Dans Zeos, il y a un composant, TZEventAlerter, qui t'informe qu'une table est mise à jour et dans ce cas tu exécutes ton refresh. Avec un timer ce n'est pas la même chose.

    Regardes si tu peux migrer vers Zeos.

    Petite question : T'es dans quelle ville ?

    Bon courage.

  14. #14
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 447
    Points : 24 849
    Points
    24 849
    Par défaut
    Utilise un équivalent MDO du FlushBuffers du TTable, en paradox cela résolvait ce phénomène !
    Un peu comme une Transaction permanente !
    Close\Open a le même effet !

    Voir aussi ApplyUpdates du TMDOCustomDataSet
    et AutoCommit et Commit de TMDOTransaction

    Fort pratique Koders, on a tout le code de MDO !
    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

  15. #15
    Membre régulier
    Inscrit en
    Avril 2010
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 138
    Points : 113
    Points
    113
    Par défaut
    Citation Envoyé par akli_agha Voir le message

    L'idée du Refresh est de savoir quand une table est modifiée. Dans Zeos, il y a un composant, TZEventAlerter, qui t'informe qu'une table est mise à jour et dans ce cas tu exécutes ton refresh. Avec un timer ce n'est pas la même chose..
    même avec MDO il y'a un composant qui s'appelle TMDOEVENTS il possède un évènement OnEventAlert je suis entrain d'essayer de voir comment l'utiliser ??
    Pouvez vous me guider à comprendre son principe d'utilisation?

    Citation Envoyé par akli_agha Voir le message
    Petite question : T'es dans quelle ville ?
    Petite réponse: Je suis d'Algérie (Sidi Bellabes)

    Citation Envoyé par ShaiLeTroll Voir le message

    Voir aussi ApplyUpdates du TMDOCustomDataSet
    et AutoCommit et Commit de TMDOTransaction
    J'ai essayé aussi cette méthode mais j'ai pas su ou l'utiliser exactement par exemple j'ai essayé de l'utiliser AfterInsert d'une table mais ça ne donne pas le résultat voulu .Et meme j'ai cherché sur des forum je n'ai pas trouvé d'aide sur ça!!!

    Merci pour vos réponses


    Mina24.

  16. #16
    Membre actif
    Inscrit en
    Décembre 2004
    Messages
    390
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 390
    Points : 288
    Points
    288
    Par défaut
    Pour que ton eventAlerter t'informe d'une mise à jour, il faut créer dans ta base de de données un trigger (déclencheur) AIUD (After Insert, Update, Delete) sur la table en question et dans le corps du trigger, tu mettra :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      POST_EVENT 'TABLE_ART UPDATED';
    Et dans ton OnEventAlert, tu fais le test si l'event = 'TABLE_ART UPDATED' tu fais le refresh sur ta table ou tu fais autre chose.

    Bon courage, Mina

  17. #17
    Membre régulier
    Inscrit en
    Avril 2010
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 138
    Points : 113
    Points
    113
    Par défaut
    bonjour,

    j'essaye de faire comme vous me l'avez dit mais je trouve des problèmes c'est aléatoire des fois ça marche et des fois non !!

    *
    je pense que je ne sais pas ou mettre registerEvent et UnregisterEvent ? j'ai mis registerEvent juste après base.connected:=True et UnregisterEvent juste avant de fermer l'application! je ne sais pas si c'est la bonne démarche?

    * j'ai crée un trigger sous IBExpert ou j'ai coché after (delete/insert/update) et donc quand je fais une suppression d'un enregistrement il me fais le message suivant ' Transaction is active' sachant que la transaction est en auto commit et en readcommited.

    Remarque :

    j'ai essayé EventAlert avec une base de données qui a une seule table et ça marche bien seulement avec ma base qui a plusieurs tables elle me fais les problèmes cités précédemment!

    Merci pour votre aide

    Mina24

  18. #18
    Membre actif
    Inscrit en
    Décembre 2004
    Messages
    390
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 390
    Points : 288
    Points
    288
    Par défaut
    Bonsoir Mina,

    Tout d'abord, moi je travaille avec AutoCommit à False. Je gère moi-même mes transactions. Donc je ne connais pas le comportement des EventAlerts avec AutoCommit à True !

    Pour ce qui est du RegisterEvent et UnregisterEvent, je les place respectivement à la création et à la fermeture de la fiche qui a besoin du refresh. Pas nécessairement au Connect.

    N'oublies pas de gérer l'événement OnEventAlert pour rafraichir ta table. C'est là qu'il faut ordonner le refresh !


    Je serai à Oran cette semaine, tu peux venir si tu veux, on verra tes soucis de plus près !

    Bon courage.

  19. #19
    Membre régulier
    Inscrit en
    Avril 2010
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 138
    Points : 113
    Points
    113
    Par défaut
    Bonjour,
    Citation Envoyé par akli_agha Voir le message
    N'oublies pas de gérer l'événement OnEventAlert pour rafraichir ta table. C'est là qu'il faut ordonner le refresh !
    C'est ce que j'ai fais Pour ça!

    Citation Envoyé par akli_agha Voir le message
    moi je travaille avec AutoCommit à False. Je gère moi-même mes transactions. Donc je ne connais pas le comportement des EventAlerts avec AutoCommit à True
    Ok je pense c'est la meilleur procédure à suivre je vais essayer de faire ainsi, je vous donnerais une suite...

    Citation Envoyé par akli_agha Voir le message
    Je serai à Oran cette semaine, tu peux venir si tu veux, on verra tes soucis de plus près
    Merci beaucoup c'est très gentil de votre part, Pour cette fois ci je ne pense pas venir!

    Mina24.

  20. #20
    Membre régulier
    Inscrit en
    Avril 2010
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 138
    Points : 113
    Points
    113
    Par défaut
    Citation Envoyé par akli_agha Voir le message
    moi je travaille avec AutoCommit à False. Je gère moi-même mes transactions. Donc je ne connais pas le comportement des EventAlerts avec AutoCommit à True
    C'est bon moi aussi je fais Autocommit à false, et je gère moi même les transactions Et donc pour le moment ça marche bien et les events fonctionnent parfaitement

    Merci bcp Pour votre aide, Vous m'avez bien éclairci les choses!

    Mina24

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Erreur firebird et dbgrid
    Par BXDSPORT dans le forum Bases de données
    Réponses: 2
    Dernier message: 27/09/2008, 08h17
  2. Probleme plantage Firebird
    Par panpan033 dans le forum Firebird
    Réponses: 20
    Dernier message: 19/06/2007, 11h52
  3. Probleme refresh fichier joint
    Par princenamor dans le forum Struts 1
    Réponses: 1
    Dernier message: 26/02/2007, 17h59
  4. problème de refresh sur une DBGrid
    Par lidouka dans le forum Bases de données
    Réponses: 4
    Dernier message: 20/12/2005, 17h12
  5. Probleme Refresh
    Par lemagicien dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 21/11/2005, 11h16

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