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

VB 6 et antérieur Discussion :

Problème affichage données dans listview


Sujet :

VB 6 et antérieur

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2007
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 58
    Points : 31
    Points
    31
    Par défaut Problème affichage données dans listview
    Alors voilà, j'ouvre une nouvelle discussion pour un problème que j'avais déjà cité aupravant mais comme le titre de ma précédente discussion ne correspondait pas à mon problème, je prefère reprendre la conversation ici...

    J'ai crée une listview, qui m'affiche très bien les données de ma table ACCESS si elle ne contient pas trop d'enregistrement. Mais lorsque j'essaye de faire la meme chose avec une table qui contient 200.000 enregistrements, ça prend un temps fou, pendant lequel mon pc est bloqué, je ne sais plus rien faire....

    Est-ce que qqu'un a déjà rencontré ce problème? Comment améliorer ça?


    Voilà mon code pour l'affichage de ma listview:

    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
     
    Public Sub RemplirListView(MaListview As ListView, Optional NomLigne As String, Optional NomColonne As String)
     
     
        Dim I       As Long
        Dim j       As Long
        Dim Itmx    As ListItem
     
        With MaListview
            .FullRowSelect = True
            .GridLines = False
            .HideSelection = False
            .LabelEdit = lvwManual
            .MultiSelect = False
            .AllowColumnReorder = False
            .ListItems.Clear
            .ColumnHeaders.Clear
            .Visible = False
        End With
     
        If rsADO.Fields.Count > 0 Then
                If MaListview.Tag > 0 Then
                    MaListview.ColumnHeaders.Add , , NomLigne & "/" & NomColonne
                    I = 1
                    MaListview.GridLines = True
                Else
                    I = 0
                End If
                For N = I To rsADO.Fields.Count - 1 
                     MaListview.ColumnHeaders.Add , , rsADO.Fields(N).Name
                Next N
     
                If rsADO.RecordCount > 0 Then
                     While Not rsADO.EOF
                        Set Itmx = MaListview.ListItems.Add(, , CStr(rsADO.Fields(0).Value))
                            For j = 1 To rsADO.Fields.Count - 1
                               Itmx.SubItems(j) = IIf(LenB(rsADO.Fields(j).Value) > 0, rsADO.Fields(j).Value, vbNullString)
                               DoEvents
                            Next j
     
                      rsADO.MoveNext
                      Wend
     
                    On Error GoTo Err
               End If
        End If
     
    MaListview.Visible = True
    Exit Sub
    Err:
        MsgBox ("Erreur: Impossible de charger les données")
     
    End Sub

  2. #2
    Expert éminent sénior
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 097
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 097
    Points : 16 606
    Points
    16 606
    Par défaut
    200.000 enregistrements a mettre dans listview ?
    Blizard, blizad
    Si tu ne remplis pas tous ton listview avec chaque ligne de ta table, ouvres là avec un Where pour ne recuperer que les enregistrement utiles.

    Pour
    ça prend un temps fou, pendant lequel mon pc est bloqué
    Trois doevents
    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
                For N = I To rsADO.Fields.Count - 1
                     DoEvents '<--------------
                     MaListview.ColumnHeaders.Add , , rsADO.Fields(N).Name
                Next N
     
                If rsADO.RecordCount > 0 Then
                     While Not rsADO.EOF
                        DoEvents '<--------------
                        Set Itmx = MaListview.ListItems.Add(, , CStr(rsADO.Fields(0).Value))
                            For j = 1 To rsADO.Fields.Count - 1
                               DoEvents '<--------------
                               Itmx.SubItems(j) = IIf(LenB(rsADO.Fields(j).Value) > 0, rsADO.Fields(j).Value, vbNullString)
                               DoEvents
                            Next j
     
                      rsADO.MoveNext
                      Wend
    permetraient de laisser periodiquement la main a d'autre programme, c'est toujours sa de gagné.

  3. #3
    Expert éminent
    Avatar de ThierryAIM
    Homme Profil pro
    Inscrit en
    Septembre 2002
    Messages
    3 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2002
    Messages : 3 673
    Points : 8 524
    Points
    8 524
    Par défaut
    Peut-être bloquer aussi le rafraichissement de la fenêtre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
                                        (ByVal hWnd As Long, ByVal wMsg As Long, _
                                         ByVal wParam As Long, ByVal lParam As Any) As Long
    Public Const WM_SETREDRAW = &HB
     
            SendMessage ListView1.hWnd, WM_SETREDRAW, False, vbNullString    '-- Bloque le rafraichissement de la liste
     
    'le traitement ici
     
            SendMessage ListView1.hWnd, WM_SETREDRAW, True, vbNullString    '-- Redessine la liste
    Mais je suis comme ProgElecT, 200 000 items dans une listview, hummm...

  4. #4
    Nouveau membre du Club
    Inscrit en
    Mars 2007
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 58
    Points : 31
    Points
    31
    Par défaut
    Merci pour vos réponses....
    Je changerais bien de contrôle, ce serait p't plus facile :-)
    Est-ce que je risque d'avoir le meme problème avec une flexgrid ou pas?
    Pcque je n'ai jamais utilisé ça alors si je change tout pour une flexgrid et me retrouve au même point, je v peter un cable

  5. #5
    Expert éminent sénior
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 097
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 097
    Points : 16 606
    Points
    16 606
    Par défaut
    Pas de reponse, mais 2 questions
    200 000 items, pas possible de n'en rapatrier moins ?
    ça prend un temps fou, en seconde, sa fait a peut pres combien ?

    Un Flexgrid ou un MSHFlexgrid est moins graphique il peuvent être alimentés directement par un RecordSource (pas de code a ecrire pour les remplire, donc plus direct), donc il est possible que le chargement soit un peu moins long.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Mars 2007
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 58
    Points : 31
    Points
    31
    Par défaut
    Et bien, j'ai justement fait le calcul avec un collègue, ça a pris 1min30 (90 secondes, quoi (pour répondre précisement à ta question )
    Quand on attend derrière que qque chose se passe, c'est trèèèès long... surtout que, ok c'est affiché mais une fois que je descens la scrollbar, pour voir la suite, c'est lent...

    Oui, je pourrais éventuellement n'afficher que les 100 premieres lignes par exemple et créer des boutons suivant et précédent, mais bon, je préfère une autre solution parce que par la suite, je donne une option d'exporter les données de la listviex vers excell...

  7. #7
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    Citation Envoyé par Alixe80 Voir le message
    ....
    Oui, je pourrais éventuellement n'afficher que les 100 premiers par exemple et créer des boutons suivant et précédent, mais bon, je préfère une autre solution parce que par la suite, je donne une option d'exporter les données de la listviex vers excell...
    et tu va mettre 200 000 lignes dans ton fichier excel

  8. #8
    Nouveau membre du Club
    Inscrit en
    Mars 2007
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 58
    Points : 31
    Points
    31
    Par défaut
    lol, ok, je viens de faire une recherche et j'ai constaté que Excel ne peut contenir que maximum 65536 lignes et 256 colonnes...
    Je vais sans doute opter pour le fractionnement dans mon affichage dans la Listview...
    Mais quand même, personne ne sait me dire si avec une flexgrid ça irait plus vite? (juste pour savoir)

  9. #9
    Membre expert
    Avatar de Delbeke
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    2 675
    Détails du profil
    Informations personnelles :
    Âge : 70
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 2 675
    Points : 3 696
    Points
    3 696
    Par défaut
    Non, çà n' ira pas plus vite. Tout tes infos devraient être chargées en mémoire centrale. donc windows devra swapper sur le disque dur.
    Pour quoi n'utilise tu pas un Grid, genre datagrid ou dbgrid. Le grid se chargeant de ne mettre en memoire qu'une centaine d'enregistrements à la fois, chargeant et déchargeant au fur et à mesure des besons d'affichage.

  10. #10
    Nouveau membre du Club
    Inscrit en
    Mars 2007
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 58
    Points : 31
    Points
    31
    Par défaut
    Ah, c'est bon à savoir ça...
    Mais en fait, je ne peux pas l'utiliser pcque c'est un exercice que mon prof a donné et dans son énoncé il a indiqué que pour l'affichage on devait utiliser une flexgrid ou une listview... C'est lui qui a donné la base de donnée aussi .
    Il y a plusieurs tables et jusque là tout allait bien jusqu'au moment ou j'ai testé sa derniere table et que je me suis rendue compte qu'elle contient 200.000 enregistrements lol Je sens là un petit piège...

    PS: Félicitation pour votre mariage

  11. #11
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Argentine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 173
    Points : 1 418
    Points
    1 418
    Par défaut
    de toute façon ça n'a aucun sens d'afficher 200k enregistrements.

  12. #12
    Nouveau membre du Club
    Inscrit en
    Mars 2007
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 58
    Points : 31
    Points
    31
    Par défaut
    Voilà le genre de commentaire super constructif et très utile que j'adore!!

    Le fait est que ce n'est pas à moi de juger si c'est interessant pour l'utilisateur ou pas. Mon programme doit savoir ouvrir toute base de données access proposée, quelque soit son nombre d'enregistrements. Et puis on ne connait pas forcément la grandeur de chaque table à l'avance.

    Après l'utilisateur peut traiter toutes les données par des filtres, analyse,ect...
    Mais si mon programme plante dés le simple affichage des données c'est vraiment null...

  13. #13
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Argentine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 173
    Points : 1 418
    Points
    1 418
    Par défaut
    Ca n'a aucun sens d'afficher 200 000 enregistrements, si tu ne trouves pas ça constructif c'est ton problème.

    Un humain ne peut pas traiter tant d'infos d'un seul coup.

    Donc tu n'as qu'à afficher systématiquement les X premiers, avec en + tous les filtres dont l'utilisateur pourrait avoir besoin pour réduire son champ d'action et bien sûr, un grand "selectionner tout"

Discussions similaires

  1. Problème Affichage données dans requete synthèse
    Par Sebastien1977 dans le forum Access
    Réponses: 1
    Dernier message: 21/02/2012, 11h06
  2. Réponses: 3
    Dernier message: 17/02/2012, 12h28
  3. Réponses: 4
    Dernier message: 25/11/2011, 09h12
  4. Réponses: 5
    Dernier message: 23/01/2009, 11h12
  5. [SQL] Moteur de recherche problème affichage donnée dans select
    Par vincedjs dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 07/04/2006, 20h27

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