marcod59
Messages postés170Date d'inscriptionvendredi 16 janvier 2004StatutMembreDernière intervention13 juin 2010
-
7 avril 2007 à 20:42
marcod59
Messages postés170Date d'inscriptionvendredi 16 janvier 2004StatutMembreDernière intervention13 juin 2010
-
9 avril 2007 à 23:17
Bonjour,
J'ai un programme qui affiche dans une listview 13 colonnes remplies par une base de donnée acces. Pour faire des tris par colonne j'ai mis des textbox qui font évoluer la listview à chaque frappe (voir le code un peu plus bas). Mon problème est que tant que la base n'est pas trop remplie, cela va relativement vite. Par contre, lorsqu'elle commence à se remplir (plus de 2000 entrée) ça commence à ramer un peu. Le problème étant que cette base va recevoir énormément de données, donc mon prog va ramer un max. Si quelqu'un avait une astuce pour que ça rame moins ça m'arrangerait. Voilà le code mis dans les textbox (ici 2 exemples, il y en a 4 dans le prog) :
Private Sub TXTCode_Change()
Critère = TXTcode.Text & "*" 'ne pas oublier de mettre .Text
monSQL = "SELECT releve.a, releve.b, releve.c, releve.d, releve.e, releve.f, releve.g, releve.h, releve.i, releve.j, releve.k, releve.l, releve.m FROM releve " _
& "WHERE releve.a Like '" & Critère & "'" _
& "ORDER BY releve.a;"
Set maBD = OpenDatabase(strConnection)
Set rst = maBD.OpenRecordset(monSQL)
leNbre = rst.RecordCount
If leNbre = 0 Then
MsgBox "Le ou les 1er chiffres du code" & vbLf _
& "que vous avez introduit" & vbLf _
& "n'existe pas dans la base de données." & vbLf & vbLf _
& "Vous pouvez re-formuler votre demande.", vbCritical, "Erreur codes"
TXTcode = ""
TXTcode.SetFocus
Lstview1.ListItems.Clear
Exit Sub
End If
Lstview1.ListItems.Clear
Set ObjListe = Lstview1.ListItems.Add(, , rst!a) ' 1ere colonne
ObjListe.SubItems(1) = IIf(IsNull(rst!mtg.Value), "", rst!b.Value) ' 2eme colonne
ObjListe.SubItems(2) = "" & (rst!c.Value) '3éme colonne
ObjListe.SubItems(3) = "" & (rst!d.Value) '4éme colonne
ObjListe.SubItems(4) = "" & (rst!e.Value) '5éme colonne
ObjListe.SubItems(5) = "" & (rst!f.Value) '6éme colonne
ObjListe.SubItems(6) = "" & (rst!g.Value) '7éme colonne
ObjListe.SubItems(7) = "" & (rst!h.Value) '8éme colonne
ObjListe.SubItems(8) = "" & (rst!i.Value) '9éme colonne
ObjListe.SubItems(9) = "" & (rst!j.Value) '10éme colonne
ObjListe.SubItems(10) = "" & (rst!k.Value) '11éme colonne
ObjListe.SubItems(11) = "" & (rst!l.Value) '12éme colonne
ObjListe.SubItems(12) = "" & (rst!m.Value) '13éme colonne
Lstview1.FullRowSelect = True
Lstview1.View = lvwReport
If rst.RecordCount > 0 Then
rst.MoveFirst
Do While Not rst.EOF ' Set ObjListe Nothing
Set ObjListe = Lstview1.ListItems.Add(, , rst!a) ' 1ere colonne
ObjListe.SubItems(1) = IIf(IsNull(rst!mtg.Value), "", rst!b.Value) ' 2eme colonne
ObjListe.SubItems(2) = "" & (rst!c.Value) '3éme colonne
ObjListe.SubItems(3) = "" & (rst!d.Value) '4éme colonne
ObjListe.SubItems(4) = "" & (rst!e.Value) '5éme colonne
ObjListe.SubItems(5) = "" & (rst!f.Value) '6éme colonne
ObjListe.SubItems(6) = "" & (rst!g.Value) '7éme colonne
ObjListe.SubItems(7) = "" & (rst!h.Value) '8éme colonne
ObjListe.SubItems(8) = "" & (rst!i.Value) '9éme colonne
ObjListe.SubItems(9) = "" & (rst!j.Value) '10éme colonne
ObjListe.SubItems(10) = "" & (rst!k.Value) '11éme colonne
ObjListe.SubItems(11) = "" & (rst!l.Value) '12éme colonne
ObjListe.SubItems(12) = "" & (rst!m.Value) '13éme colonne
'==============================
rst.MoveNext
Loop
End If
Set rst = Nothing
Set maBD = Nothing
End Sub
Private Sub Txtmtg_Change()
If Critère = "" Then
msg = MsgBox("Il faut renseigner le champ OP", vbCritical)
Exit Sub
End If
Critèrem = Txtmtg.Text & "*" 'ne pas oublier de mettre .Text
monSQL = "SELECT releve.a, releve.b, releve.c, releve.d, releve.e, releve.f, releve.g, releve.h, releve.i, releve.j, releve.k, releve.l, releve.m FROM releve " _
& "WHERE releve.a Like '" & Critère & "' And releve.b Like '" & Critèrem & "'" _
& "ORDER BY releve.b;"
Set maBD = OpenDatabase(strConnection)
Set rst = maBD.OpenRecordset(monSQL)
leNbre = rst.RecordCount
If leNbre = 0 Then
MsgBox "Le ou les 1er chiffres du code" & vbLf _
& "que vous avez introduit" & vbLf _
& "n'existe pas dans la base de données." & vbLf & vbLf _
& "Vous pouvez re-formuler votre demande.", vbCritical, "Erreur codes"
Txtmtg = ""
Txtmtg.SetFocus
Lstview1.ListItems.Clear
Exit Sub
End If
Lstview1.ListItems.Clear
Set ObjListe = Lstview1.ListItems.Add(, , rst!a) ' 1ere colonne
ObjListe.SubItems(1) = IIf(IsNull(rst!mtg.Value), "", rst!b.Value) ' 2eme colonne
ObjListe.SubItems(2) = "" & (rst!c.Value) '3éme colonne
ObjListe.SubItems(3) = "" & (rst!d.Value) '4éme colonne
ObjListe.SubItems(4) = "" & (rst!e.Value) '5éme colonne
ObjListe.SubItems(5) = "" & (rst!f.Value) '6éme colonne
ObjListe.SubItems(6) = "" & (rst!g.Value) '7éme colonne
ObjListe.SubItems(7) = "" & (rst!h.Value) '8éme colonne
ObjListe.SubItems(8) = "" & (rst!i.Value) '9éme colonne
ObjListe.SubItems(9) = "" & (rst!j.Value) '10éme colonne
ObjListe.SubItems(10) = "" & (rst!k.Value) '11éme colonne
ObjListe.SubItems(11) = "" & (rst!l.Value) '12éme colonne
ObjListe.SubItems(12) = "" & (rst!m.Value) '13éme colonne
Lstview1.FullRowSelect = True
Lstview1.View = lvwReport
If rst.RecordCount > 0 Then
rst.MoveFirst
Do While Not rst.EOF ' Set ObjListe Nothing
Set ObjListe = Lstview1.ListItems.Add(, , rst!a) ' 1ere colonne
ObjListe.SubItems(1) = IIf(IsNull(rst!mtg.Value), "", rst!b.Value) ' 2eme colonne
ObjListe.SubItems(2) = "" & (rst!c.Value) '3éme colonne
ObjListe.SubItems(3) = "" & (rst!d.Value) '4éme colonne
ObjListe.SubItems(4) = "" & (rst!e.Value) '5éme colonne
ObjListe.SubItems(5) = "" & (rst!f.Value) '6éme colonne
ObjListe.SubItems(6) = "" & (rst!g.Value) '7éme colonne
ObjListe.SubItems(7) = "" & (rst!h.Value) '8éme colonne
ObjListe.SubItems(8) = "" & (rst!i.Value) '9éme colonne
ObjListe.SubItems(9) = "" & (rst!j.Value) '10éme colonne
ObjListe.SubItems(10) = "" & (rst!k.Value) '11éme colonne
ObjListe.SubItems(11) = "" & (rst!l.Value) '12éme colonne
ObjListe.SubItems(12) = "" & (rst!m.Value) '13éme colonne
'==============================
rst.MoveNext
Loop
End If
Set rst = Nothing
Set maBD = Nothing
End Sub
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 9 avril 2007 à 10:38
Tu verra, une fois essayé, tu ne pourra plus t'en passer :p
Perso, je faisais comme toi avant de connaître le DataGrid puis le SCGrid, et je me demandais comment faisant les développeurs pour avoir des contrôles qui se chargeaient aussi vite !
Puis j'ai découvert le DataGrid : très rapide en chargement, mais extrêment limité !!!
Et à force de chercher sur le net un ocx equivalent au DataGrid, freeware, et avec plus de fonctionnalités, je suis tombé sur le SCGrid qui me permet de faire des choses incroyable ! J'arrive à faire des tableaux de plusieurs dizaines de milliers de lignes avec une rapidité incroyable, et une personnalisation de chaque cellule qui est la bienvenue !
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 7 avril 2007 à 21:00
Dès qu'on accède à des données liées, le listView devient bien trop lent !
Je te conseille d'utiliser des contrôles qui sont bien plus adaptés pour le databinding, tel que le DataGrid, ou mieux, le SCGrid (téléchargeable librement sur internet) qui t'apportera les possibilité du dataGrid niveau databinding tout en ayant à peu près les mêmes fonctionnalités que le listView, et même plus !
chaibat05
Messages postés1883Date d'inscriptionsamedi 1 avril 2006StatutMembreDernière intervention20 novembre 20072 8 avril 2007 à 02:40
Bonsoir,
le problème réside aussi dans le fait que tu exécutes
ton code dans TXTCode_Change.
Tu te rends compte que pour Critère="Test", le code s' éxécutera 4 fois !
Glisses ton code plutôt dans KeyUp. Tu test si KeyCode=VbKeyReturn (Entree)
Là, ta procédure ne s' exécutera qu' une seule fois
ça marche aussi bien dans TXTCode_Validate...
Tu peux aussi placer un Boutton (cmdGo) et tu places ton code dans cmdGo_Click.
Autre chose : dans
If leNbre = 0 Then
MsgBox "Le ou les 1er chiffres du code" & vbLf _
& "que vous avez introduit" & vbLf _
& "n'existe pas dans la base de données." & vbLf & vbLf _
& "Vous pouvez re-formuler votre demande.", vbCritical, "Erreur codes"
TXTcode = ""
TXTcode.SetFocus
le TXTcode = "" changes le TXTCode ce qui a pour effet
de réenclencher encore ine fais TXTCode_Change.
Enfin, essaies avec ListView1.Visible=False au début du remplissage
et ListView1.Visible=True.. (pas sûr de l' effet, mais on ne sait jamais)
marcod59
Messages postés170Date d'inscriptionvendredi 16 janvier 2004StatutMembreDernière intervention13 juin 2010 8 avril 2007 à 11:45
Salut,
Merci pour vos réponses.
Je suis conscient qu'en mettant le code dans TXT_Change cela réduit la vitesse, mais l'effet de tri immédiat me plaît assez. Il est bien évident que si rien ne peut améliorer la vitesse je mis prendrais autrement. Sinon, je vais faire l'essai avec DataGrid ou SCGrid s'il est vraiment mieux.
Joyeuses Pâques
@+++
marcod59
Vous n’avez pas trouvé la réponse que vous recherchez ?
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 9 avril 2007 à 01:13
salut,
le plus long est surtout l'affichage.
un simple visible false avant et true après peut suffir.
et si graphiquement tu ne peux pas te le permettre, reste l'api LockWindowUpdate
++
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 9 avril 2007 à 08:56
Comme je l'ai dit : l'utilisation du DataGrid ou du SCGrid résoudront le problème vu que ce sont des contrôles qui sont fait spécifiquement pour le databinding => le temps de chargement des données est quasi-immédiat, et ca facilite grandement la programmation !
J'utilise le SCGrid dans mes projets, et je peux te dire que j'en suis très très content : il t'apporte les avantages du DataGrid (databinding surtout => rapidité de chargement des données !), tout en lui enlevant tout ses inconvénients (personnalisation de toutes les cases, possibilité de remplir le tableau à la main comme le listview, cellules personnalisable, etc.).
marcod59
Messages postés170Date d'inscriptionvendredi 16 janvier 2004StatutMembreDernière intervention13 juin 2010 9 avril 2007 à 09:43
PCPT, il est vrai que lorsque l'on fait un simple .visible=false puis true,on gagne du temps. Par contre s'il y a mieux, je ne suis pas contre.
DARKSIDIOUS, j'ai essayé de trouver de la doc sur le databinding dont tu me parles à chaque fois. A chaque fois, je tombe sur de la programmation en .NET, cela fonctionne bien en VB6 ? Si tu avais un exemple en VB6 avec SCGrid à me fournir, cela me permettrait de voir comment ça fonctionne. Je n'ai pas trouvé de correspondance dans tes codes.
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 9 avril 2007 à 09:49
Le databinding est un terme qui est apparut avec .net il me semble, mais ca marche aussi avec vb : il s'agit de lier un composant avec une source de données afin que celui-ci effectue son affichage à partir de la source de données.
Il existe plusieurs contrôles standard de vb qui gèrent le databinding : les labels, les textboxes, les listbox, les combo, etc. En fait, tout les contrôles qui ont des propriétés DataSource et DataMember.
Ex : tu crée un recordset, tu le lie à ton SCGrid (par le DataSource) et il afficher automatiquement les données de ta table (en un temps record car il ne charge que ce qu'il a besoin à partir du recordset, et non tout les enregistrements !).
Ensuite, tu n'as plus qu'à définir le nom des colonnes, et tu as un contrôle remplit sans avoir fait la moindre lecture dans la base de données, ni a remplir la grille par une quelconque boucle !
Je n'ai pas vraiment d'exemple à te proposer car la principale difficulté est de formuler la requête SQL pour obtenir le recordset, après c'est le SCGrid qui s'occupe de tout.
marcod59
Messages postés170Date d'inscriptionvendredi 16 janvier 2004StatutMembreDernière intervention13 juin 2010 9 avril 2007 à 11:39
Je viens d'essayer en vitesse juste pour déjà remplir la grille. J'ai fait l'essai avec un datagrid, pas de problème. Par contre avec le SCGrid j'ai ce message d'erreur : Error : 3704 Cette opération n'est pas autorisée si l'objet est fermé.
J'ai cherché un exemple sur le net, et j'en ai trouvé un sur le site de SCGrid. J'ai la même erreur, de quoi cela peut-il venir.
cs_DARKSIDIOUS
Messages postés15814Date d'inscriptionjeudi 8 août 2002StatutMembreDernière intervention 4 mars 2013130 9 avril 2007 à 13:51
Cela vient sûrement de la fermeture du recordset ou de la connection à la base de données : il faut que le recordset et la connection à la base de données reste ouverts pour que le SCGrid (ou même le datagrid) puisse fonctionner, sinon, il ne peux pas afficher les données, d'où ce message d'erreur.
chaibat05
Messages postés1883Date d'inscriptionsamedi 1 avril 2006StatutMembreDernière intervention20 novembre 20072 9 avril 2007 à 15:42
salut,
j' ai déjà eu l' occasion d' utiliser le scgrid (4.5.05) comme tableur,
mais sans pouvoir utiliser le databinding. Je ne trouve nulle part
de propriété DataSource
S' agit - il du même ?
Pouvez-vous me préciser ce point ?
marcod59
Messages postés170Date d'inscriptionvendredi 16 janvier 2004StatutMembreDernière intervention13 juin 2010 9 avril 2007 à 16:32
Pour ne pas tout effacer dans mon prog j'ai fait un petit prog pour faire un test du SCGrid. J'ai toujours le même problème avec l'error 3704. Voilà ce que je fais, dis-moi ce qui ne va pas S.T.P., merci.
j'ai mis sur une form le SCGrid et un Adodc (apparemment ça ne marche pas s'il n'y en a pas, ou je n'ai pas réussi à le programmer). Dans Form_Load voilà ce que j'ai mis :
Adodc.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\RDS.mdb"
Adodc.RecordSource = "select * from releve"
Adodc.Refresh
Si je lance l'application comme ça, comme je l'ai dit j'ai l'error 3704. Par contre, si dans la propriété de Adodc je renseigne les champs ConnectionString et RecordSource, ça marche !!!
Pourquoi ne veut-il pas prendre la propriété de l'Adodc en prog ?
marcod59
Messages postés170Date d'inscriptionvendredi 16 janvier 2004StatutMembreDernière intervention13 juin 2010 9 avril 2007 à 17:53
Dans l'autre prog j'avais programmé avec du DAO que SCGrid n'avait pas voulu. Je vais essayer de programmer en ADO pour voir ce que ça dit.
Pour celui qui se tape des autres, je ne vois pas ce qu'il fait ici !!!