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

Langage Delphi Discussion :

ProgressBar requête sql


Sujet :

Langage Delphi

  1. #1
    Membre habitué Avatar de sondo
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Août 2004
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Service public

    Informations forums :
    Inscription : Août 2004
    Messages : 540
    Points : 162
    Points
    162
    Par défaut ProgressBar requête sql
    Bonjour à tous,

    Je veux faire fonctionner un ProgressBar en même temps que la progression de la requête sql. Mais quand je j'exécute la ProgressBar ne suis pas le pas de la boucle, elle va se remplie automatiquement quand je clique sur le bouton, alors que le traitement se poursuit. Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
          Idx := 1;
          ProgressBar1.Max := Query_Excel.FieldCount-1;
          ProgressBar1.Position := 0;
          while not Query_Excel.Eof do
                begin
                  Inc(Idx);
                  for Cpt :=0 to Query_Excel.FieldCount-1 do
                  vWorksheet.cells.item[Idx, Cpt+1].value:=Query_Excel.Fields[Cpt].AsString;
                  Query_Excel.Next;
                  Application.ProcessMessages;
                  Label2.Caption := IntToStr(Idx) + ' ' + 'Abonnés.';
                  Progressbar1.Position := Progressbar1.Position + 1;
                end;
    Merci pour toute aide.

  2. #2
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    Citation Envoyé par sondo Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
          Idx := 1;
          ProgressBar1.Max := Query_Excel.FieldCount-1;
          ProgressBar1.Position := 0;
          while not Query_Excel.Eof do
                begin
                  Inc(Idx);
                  for Cpt :=0 to Query_Excel.FieldCount-1 do
                  vWorksheet.cells.item[Idx, Cpt+1].value:=Query_Excel.Fields[Cpt].AsString;
                  Query_Excel.Next;
                  Application.ProcessMessages;
                  Label2.Caption := IntToStr(Idx) + ' ' + 'Abonnés.';
                  Progressbar1.Position := Progressbar1.Position + 1;
                end;
    Merci pour toute aide.
    Salut,
    C'est normale vu que tu as utilisé FieldCount au lieu de RowCount ou RecordCount.
    Car supposons que tu as 10 champs ou colonne si tu veux, le step max doit être atteint après 10 boucles.
    A+
    On progresse .....

  3. #3
    Membre habitué Avatar de sondo
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Août 2004
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Service public

    Informations forums :
    Inscription : Août 2004
    Messages : 540
    Points : 162
    Points
    162
    Par défaut
    Salut Andry,

    J'ai fait avec RecordCount à la place de FieldCount, mais cela plante la requête. Cette requête exporte des données sous excel. Si j'utilise RecordCount, une seule ligne est exportée et le programme se plante impossible de l'arrêter si ce n'est avec Ctrl-Alt-Supr.

  4. #4
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    Alors, c'est quoi le composant utilisé ?
    Sinon, pourquoi ne pas exécuter une requête pour compter d'abord le nombre d'enregistrement.
    On progresse .....

  5. #5
    Membre habitué Avatar de sondo
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Août 2004
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Service public

    Informations forums :
    Inscription : Août 2004
    Messages : 540
    Points : 162
    Points
    162
    Par défaut
    La requête compte déjà le nombre d'enrégistrement par le moyen de la boucle. Le compteur Idx est incrémenter pour chaque ligne exporter dans excel.
    Faire une autre boucle qui compte le nombre d'enrégistrement va ralentir le traitement à mon idée, pourquoi ne pas le faire dans une seule boucle?.

  6. #6
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 668
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 668
    Points : 7 008
    Points
    7 008
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ProgressBar1.Max := Query_Excel.RecordCount-1;
    Ca ne corrige pas le problème ?

    Sinon, si tu fais un export excel, au lieu d'écrire cellule par cellule, pourquoi ne pas passer par un fichier texte ?
    Moi, depuis que je fais un export dans un fichier texte avec séparateur (genre csv) que j'ouvre avec excel, mon temps d'export est devenu quasi instantané.
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

  7. #7
    Membre habitué Avatar de sondo
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Août 2004
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Service public

    Informations forums :
    Inscription : Août 2004
    Messages : 540
    Points : 162
    Points
    162
    Par défaut
    Salut Lung,

    J'ai déjà essayer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ProgressBar1.Max := Query_Excel.RecordCount-1;
    mais ce ne marche pas.
    Exporter directement dans excel est le mieux pour moi. Je n'ai pas montrer tout mon code. Je met des formules en place au cours de l'exportation. Si les données sont exporter dans un fichier texte, il faut encore faire un travail manuel dans Excel, c'est à dire paramétrer les colonnes, mettre les formules etc... Pourquoi ne pas le faire par programmation?, c'est plus simple, surtout que le résultat est utilisé par un profane...

  8. #8
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 173
    Points
    4 173
    Par défaut
    Si tu veux que ton export soit plus performant (et peut-être suffisamment pour te passer de la progressbar ), tu as différentes possiblités :
    • Evite de faire les traitements cellule par cellule. A la place, crée un VarArray et utilise le pour définir la valeur de plusieurs cellules excel à la fois. De même, tu peux formater des colonnes entières avant de définir les valeurs des cellules.
    • Limite les rafraichissement de l'écran au maximum :
      • Ne fait pas un ProcessMessages à chaque ligne, mais plutôt une ligne sur 100 (à ajuster selon la vitesse du traitement).
      • Fait très attention à ce que Excel ne redessine pas le classeur à chaque fois que tu modifies une cellule. Pour celà, tu peux cacher Excel pendant la génération du fichier. Tu disposes également de la propriété Application.ScreenUpdating (attention, je parle de l'application Excel) que tu peux passer à False au début du traitement, et la remetre à True à la fin.


    Rien qu'avec ça, tu peux surement accélérer les traitements d'un facteur 100 !

  9. #9
    Membre habitué Avatar de sondo
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Août 2004
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Service public

    Informations forums :
    Inscription : Août 2004
    Messages : 540
    Points : 162
    Points
    162
    Par défaut
    Salut Franck SORIANO,

    Merci pour vos indications. Je débute dans l'utilisateur d'Excel avec delphi. Ce qui fait que j'utilise ce traitement que j'ai trouvé dans ce forum et qui fait mon affaire.
    Ne fait pas un ProcessMessages à chaque ligne, mais plutôt une ligne sur 100 (à ajuster selon la vitesse du traitement).
    Si vous pouvez me donner un exemple cela me fera plaisir.
    Merci.

  10. #10
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 173
    Points
    4 173
    Par défaut
    Et bien c'est simple, tu fais un truc du genre :

    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
     
    while not Query_Excel.Eof do
    begin
      Inc(Idx);
      for Cpt :=0 to Query_Excel.FieldCount-1 do
        vWorksheet.cells.item[Idx, Cpt+1].value:=Query_Excel.Fields[Cpt].AsString;
      Query_Excel.Next;
     
      // On ne rafraichit l'écran que toutes les 100 lignes
      if idx mod 100 = 0 
      then begin
        Label2.Caption := IntToStr(Idx) + ' ' + 'Abonnés.';
        Progressbar1.Position := Progressbar1.Position + 1;
        Application.ProcessMessages;
      end;
    end;
    D'ailleurs je n'avais pas fait gaffe, mais tu ferais mieux de passer par un objet Range pour manipuler les cellules, plutôt que de passer par Worksheet.Cells.Item en boucle :

    Il faut bien avoir consience que lorsque tu manipules Excel en Ole, c'est de l'out-of-process. Autrement dit, à chaque "appel" d'Excel, il faut commencer par synchroniser le processus de ton application avec celui d'Excel. C'est fait automatiquement par le marshalling OleAutomation (donc toi tu n'as rien à faire), mais c'est très lent.
    Donc il faut faire le moins d'appels (en nombre) à excel que possible !

  11. #11
    Membre habitué Avatar de sondo
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Août 2004
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Burkina Faso

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Service public

    Informations forums :
    Inscription : Août 2004
    Messages : 540
    Points : 162
    Points
    162
    Par défaut
    Ma ProgressBar marche à présent avec l'ajout de la ligne en bleu. Merci à vous tous pour vos éclaircissements.
    Bon courage à tous.
    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
    while not Query_Excel.Eof do
    begin
      Inc(Idx);
      for Cpt :=0 to Query_Excel.FieldCount-1 do
        vWorksheet.cells.item[Idx, Cpt+1].value:=Query_Excel.Fields[Cpt].AsString;
      Query_Excel.Next;
     
      // On ne rafraichit l'écran que toutes les 100 lignes
      if idx mod 100 = 0 
      then begin
        Label2.Caption := IntToStr(Idx) + ' ' + 'Abonnés.';    
        Application.ProcessMessages;
        if ProgressBar1.Max <= Query_Excel.RecordCount-1 then
        Progressbar1.Position := Progressbar1.Position + 1;
      end;
    end;

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

Discussions similaires

  1. [ DB2 ] [ AS400] requête sql
    Par zinaif dans le forum DB2
    Réponses: 6
    Dernier message: 23/08/2008, 19h42
  2. Utilisation de MAX dans une requête SQL
    Par Evil onE dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/06/2004, 18h38
  3. A propos d'une requête SQL sur plusieurs tables...
    Par ylebihan dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/09/2003, 16h26
  4. PB requète SQL avec Interbase
    Par missllyss dans le forum InterBase
    Réponses: 2
    Dernier message: 15/07/2003, 11h37
  5. Requête SQL
    Par Leludo dans le forum Langage SQL
    Réponses: 2
    Dernier message: 17/02/2003, 16h44

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