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

 Delphi Discussion :

Afficher une fiche lors d'un traitement long


Sujet :

Delphi

  1. #1
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2008
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 666
    Points : 643
    Points
    643
    Par défaut Afficher une fiche lors d'un traitement long
    Bonjour,

    J'ai une application de gestion. Dans ma BDD, il y a un TTable qui contient des millions d'enregistrements.
    ça prend du temps pour les charger, alors, je veux afficher une fiche pour renseigner l'utilisateur que les enregistrements sont en train de se charger (voir l'image jointe). Après que la table soit ouverte, je ferme cette form2

    Nom : 330r2te.jpg
Affichages : 436
Taille : 19,6 Ko

    Le code du bouton de la Form1:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Form2.Showmodal;
    Table1.open;
    Sleep(1000);
    Form2.Close;
    La Form2 s'affiche mais la Table1 ne s'ouvre pas et la Form2 reste tout le temps affichée.

    J'ai testé après :

    Le code du bouton de la Form1:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Form2.Showmodal;
    Table1.open;
    Et dans la Form2, j'ai mis un TTimer qui vérifie si la Table1 est déjà ouverte, si c'est le cas, on ferme la Form2.

    Delphi XE5 + Firebird 2.5.

    J'ignore si je vous ai bien expliqué ce soucis.
    Merci pour votre aide.

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    Lors de l'appui sur le bouton de la Form1, son code affiche la Form2 modale et attend qu'elle soit fermée pour continuer l'exécution du code. Donc Tabl1.Open n'est exécuté qu'après fermeture de Form2, qui n'intervient que lorsque la table est ouverte, cad jamais !

    En remplaçant le ShowModal par un Show, l'inconvénient serait levé, mais sans avoir l'avantage du Modal...

    En déplaçant le code d'ouverture de la table dans le OnShow de Form2, tu devrais t'en sortir !
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    Membre expérimenté
    Avatar de retwas
    Homme Profil pro
    Développeur Java/Delphi
    Inscrit en
    Mars 2010
    Messages
    698
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Java/Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 698
    Points : 1 608
    Points
    1 608
    Billets dans le blog
    4
    Par défaut
    Utilise une Task pour afficher la form et charger les données, puis utilisent le WaitForAll pour la cacher.

    En revanche il faut un Delphi XE7 minimum.

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 036
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    un Task n'existe peut être pas pour les versions antérieurs mais qu'est-ce sinon une encapsulation d'un Thread voir FAQ

    La vraie bonne question cependant est pourquoi charger toute une table de, je cite, "des millions d'enregistrements". Il est évident qu'un utilisateur ne lira jamais tout et un écran ne peut qu'en afficher quoi ? une trentaine à tout casser !
    Bref tout dépend des composants utilisés mais récupérer tout les enregistrements me semble inadéquat.

    Par exemple , avec un TZTable il y a une propriété FetchRow (=0 par défaut) si tu mets 100 seuls les 100 premiers enregistrements seront récupérés dans un premier temps, le reste (100 par 100) sera récupéré au fur et à mesure des besoins
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2008
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 666
    Points : 643
    Points
    643
    Par défaut
    Bonjour,
    Merci de vos réponse.

    @ tourlourou, j'ai testé ce que tu m'a conseillé (dans le OnShow), le résultat c'est que le Form2 reste invisible et ne s'affiche qu'après que Table soit ouverte .

    @ Serge:

    La vraie bonne question cependant est pourquoi charger toute une table de, je cite, "des millions d'enregistrements". Il est évident qu'un utilisateur ne lira jamais tout et un écran ne peut qu'en afficher quoi ? une trentaine à tout casser !
    L'application tourne sous réseau. L'utilisateur de chaque poste client ajoute plus de 1500 enregistrements par jour.
    On a besoin de faire des recherches sur tels records, des filtres,...

    Si je mets dans la propriété "Fetch" (comme avec la bdd MsAccess,...) de ZTable 1000 par exemple, ça se charge rapidement, mais l'inconvénient c'est quand on veut ajouter un nouvel enregistrement à la Table, les données doivent êtres chargées. C'est ça mon soucis.

  6. #6
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    Pardon, le OnShow se produit juste avant l'affichage...

    Mets le code dans le OnActivate, qui se situe juste après.
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  7. #7
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2008
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 666
    Points : 643
    Points
    643
    Par défaut
    Hello,
    J'ai mis e code dans le OnActivate, la Form2 reste figée (freeze).

  8. #8
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    Citation Envoyé par NABIL74 Voir le message
    L'application tourne sous réseau. L'utilisateur de chaque poste client ajoute plus de 1500 enregistrements par jour.
    On a besoin de faire des recherches sur tels records, des filtres,...

    Si je mets dans la propriété "Fetch" (comme avec la bdd MsAccess,...) de ZTable 1000 par exemple, ça se charge rapidement, mais l'inconvénient c'est quand on veut ajouter un nouvel enregistrement à la Table, les données doivent êtres chargées. C'est ça mon soucis.
    Je suis pas spécialiste, mais je ne vois pas ce qui gêne dans ce cas. Depuis quand il faut charger une table pour y ajouter un enregistrement ?

  9. #9
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 036
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par NABIL74 Voir le message
    Si je mets dans la propriété "Fetch" (comme avec la bdd MsAccess,...) de ZTable 1000 par exemple, ça se charge rapidement, mais l'inconvénient c'est quand on veut ajouter un nouvel enregistrement à la Table, les données doivent êtres chargées. C'est ça mon soucis.
    mais c'est parce que tu utilises un ZTable alors que avec un ZQuery (lié à un TZUpdateSQL) tu n'aurais pas ce soucis. De plus je dirais que tu devrais séparé l'affichage d'un ensemble d'enregistrements (ZReadonlyQuery) de la saisie (un ZQuery sur un seul enregistrement) il ne faut plus raisonner en terme de table quand il y a tant d'enregistrements et qu'en plus c'est en réseau. (Fini le temps de Paradox) .

    Sinon : voici une solution qui réglera ton problème et ce sans forme supplémentaire.

    Utilise un TPageControl avec un volet (tab) masqué (celui de l'attente) avant l'ouverture de la table tu bascules le pagecontrol sur ce volet, à la fin de l'ouverture tu rebascule sur le volet contenant le reste de ton application
    autre solution, si ta table est dans un datamodule c'est plus simple, tu peux encore passer par un forme modale (en gérant sa cloture quand même : impossible de fermer la fenêtre tant que la table n'est pas ouverte) et c'est cette forme, à la création qui ouvre la table contenue dans le datamodule donc accessible par les autres formes après
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  10. #10
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    OK... donc solution déjà suggérée par retwas et Serge = mise en thread du chargement

    Pour la BDD, plusieurs millions d'enregistrements, ajout de plus de 1500 enregistrements par utilisateur et par jour : à quel moment ça va péter, compte tenu des technologies et techniques de codage employées ?
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  11. #11
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 036
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    Pour la BDD, plusieurs millions d'enregistrements, ajout de plus de 1500 enregistrements par utilisateur et par jour : à quel moment ça va péter, compte tenu des technologies et techniques de codage employées ?
    AMHA assez vite si Nabil utilise une table, en multi utilisateurs il va falloir gérer les rafraichissements de chaque poste à chaque ajout, et je ne parle même pas des problèmes de transaction !
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  12. #12
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2008
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 666
    Points : 643
    Points
    643
    Par défaut
    Citation Envoyé par guillemouze Voir le message
    Je suis pas spécialiste, mais je ne vois pas ce qui gêne dans ce cas. Depuis quand il faut charger une table pour y ajouter un enregistrement ?
    @ guillemouze: Supposons que j'ai mis "Fetch" à 1000. Quand on veut ajouter un nouvel enregistrement(avec un append) dans un TTable, on va se pointer sur le dernier enregistrement de TTable non? Donc, tous les enregistrements (dans mon cas c'est quelques millions) seront chargés, j'ai déjà fait ce teste avant de poster sur le forum.

    @ Serge :
    mais c'est parce que tu utilises un ZTable alors que avec un ZQuery (lié à un TZUpdateSQL) tu n'aurais pas ce soucis. De plus je dirais que tu devrais séparé l'affichage d'un ensemble d'enregistrements (ZReadonlyQuery) de la saisie (un ZQuery sur un seul enregistrement) il ne faut plus raisonner en terme de table quand il y a tant d'enregistrements et qu'en plus c'est en réseau. (Fini le temps de Paradox) .
    Oui, c'est un bon raisonnement.
    Utilise un TPageControl avec un volet (tab) masqué (celui de l'attente) avant l'ouverture de la table tu bascules le pagecontrol sur ce volet, à la fin de l'ouverture tu rebascule sur le volet contenant le reste de ton application
    Je vais testé cela . J'ai fait un teste avec un Tlabel (chargement des données...)+ JvWaitingGradient, l'application reste figée.


    Pour la BDD, plusieurs millions d'enregistrements, ajout de plus de 1500 enregistrements par utilisateur et par jour : à quel moment ça va péter, compte tenu des technologies et techniques de codage employées ?
    @ tourlourou : ça pète lors du lancement de l'application et sur le rafraichissement des données.

    Pour les threads, j'ai pas travaillé avec avant...

  13. #13
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 036
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par NABIL74 Voir le message
    Quand on veut ajouter un nouvel enregistrement(avec un append) dans un TTable, on va se pointer sur le dernier enregistrement
    la question est alors mais pourquoi diable un append ! un insert est bien mieux
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  14. #14
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2008
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 666
    Points : 643
    Points
    643
    Par défaut
    Bonsoir,

    Oui Serge, j'ai testé avec un insert, c'est bien. Le soucis, c'est que lors d'une recherche (locate par exemple), ça prend du temps(parcourir tout le TTable).

  15. #15
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 036
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    mais ton erreur est là
    c'est que lors d'une recherche (locate par exemple), ça prend du temps(parcourir tout le TTable).
    faire une recherche dans une table aussi grosse sera rapide avec une Query (pour peu que les colonnes de recherche soient indexées cela le sera encore plus).
    Tu es encore trop "Paradox" dans ta logique
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  16. #16
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2008
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 666
    Points : 643
    Points
    643
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Bonjour,

    mais ton erreur est là

    faire une recherche dans une table aussi grosse sera rapide avec une Query (pour peu que les colonnes de recherche soient indexées cela le sera encore plus).
    Tu es encore trop "Paradox" dans ta logique
    Bonjour,
    Merci pour tes conseilles Serge .
    - Voilà, j'ai remplacé "locate" par une recherche D'un TQuery et c'est beaucoup plus rapide!!
    - J'ai mis la propriété "fetchrow" à 1000 et au lancement de l'application, ça se passe sans soucis...

    Merci à tous pour votre aide .

    Bonne journée.

    Nabil

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

Discussions similaires

  1. Afficher une fenetre d'attente pendant un long traitement (Swing)
    Par JavaBienOuMal dans le forum EDT/SwingWorker
    Réponses: 5
    Dernier message: 15/06/2007, 14h13
  2. Afficher une image lors du boot
    Par log2n dans le forum Programmation d'OS
    Réponses: 8
    Dernier message: 25/10/2005, 20h24
  3. Comment afficher une fiche dans une autre fiche ?
    Par psidonio dans le forum Composants VCL
    Réponses: 4
    Dernier message: 01/10/2005, 23h22
  4. Afficher une image lors du survol d'une autre
    Par StarMusic dans le forum Composants VCL
    Réponses: 5
    Dernier message: 22/06/2005, 12h19
  5. Afficher une dropdownlist lors de modif dans une DataGrid
    Par MiJack dans le forum C++Builder
    Réponses: 2
    Dernier message: 08/11/2004, 17h42

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