Autor Tema: Cargar mas rapido en ListView  (Leído 11885 veces)

0 Usuarios y 1 Visitante están viendo este tema.

E N T E R

  • Petabyte
  • ******
  • Mensajes: 1062
  • Reputación: +57/-13
  • www.enterpy.com
    • Ver Perfil
    • www.enterpy.com
Cargar mas rapido en ListView
« en: Abril 02, 2012, 06:39:43 pm »
Hola amigos, tengo una tabla con 1300 registros uso el control ListView para mostrar los registros es muy lento para mostrar esos 1300 me tarda 1,5 segundos en cargar.

Hay algún método para cargar mas rápido.

Este es mi código.


Código: (VB) [Seleccionar]
Private Sub Form_Load()
   
    '+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-+
    '// Conectar la Base Datos con ADO
        Call ConectarADO
    '+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-+
       
        StrSQL = "SELECT * FROM articulos ORDER BY nombre"
        rsADO.Open StrSQL, cnADO, adOpenStatic, adLockOptimistic, adCmdText

        Do Until rsADO.EOF
           
            Set Lv = LReportes.ListItems.Add()
           
            With rsADO
               
                Lv.Text = .Fields("codigo") & ""
                Lv.SubItems(1) = .Fields("codinterno") & ""
                Lv.SubItems(2) = .Fields("codbarra") & ""
                Lv.SubItems(3) = .Fields("nombre") & ""
                Lv.SubItems(4) = Format(.Fields("costo"), "##,###0") & ""
               
                If InStr(.Fields("stock"), ",") Then
                    Lv.SubItems(5) = Format(.Fields("stock"), "##,###0.000") & ""
                Else
                    Lv.SubItems(5) = Format(.Fields("stock"), "##,###0") & ""
                End If
               
                Lv.SubItems(6) = Format(.Fields("precio1"), "##,###0") & ""
                Lv.SubItems(7) = Format(.Fields("precio2"), "##,###0") & ""
                Lv.SubItems(8) = .Fields("tipoiva") & ""
                Lv.SubItems(9) = .Fields("seccion") & ""
                Lv.SubItems(10) = .Fields("ramo") & ""
                Lv.SubItems(11) = .Fields("marca") & ""
                Lv.SubItems(12) = .Fields("codprov") & ""
                Lv.SubItems(13) = .Fields("nomprov") & ""
                Lv.SubItems(14) = .Fields("memox") & ""
                Lv.SubItems(15) = .Fields("foto") & ""
               
                rsADO.MoveNext
                               
            End With
        Loop
   
    '+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-+
    '// Cerrar la base de datos y liberar la memoria
        Call CerrarADO
    '+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-+
   
End Sub
CIBER GOOGLE - CONCEPCIÓN PARAGUAY
www.enterpy.com
Primera regla de la programacion, para que vas a hacerlo complicado si lo puedes hacer sencillo

ADONAIRAFA

  • Gigabyte
  • ****
  • Mensajes: 291
  • Reputación: +37/-1
  • Que bien se siente al terminar un programa !!!
    • Ver Perfil
Re:Cargar mas rapido en ListView
« Respuesta #1 en: Abril 02, 2012, 07:28:04 pm »
Hola ENTER !!! ;D

Me imagino que ese form no es el único, y forma parte de varios forms para integrar el programa principal, ¿No?

Si es así, en el Form principal (supongamos que es un MDI u otro que actúa como principal) Abre la conexión con la BD, para esto creas la conexión y desconexión en un módulo .bas (quizás lo tengas así, y entonces estoy hablando de más !!! ::)).

De esta forma, la conexión estará abierta, mientras la aplicación esté en ejecución, de esta forma, todos los forms dependientes (o hijos, si es que existen), tendrán acceso a la BD de manera inmediata, sin necesidad de abrir o cerrar por cada form. Esto quizás te ahorre algunos milisegundos al tiempo de cargar el Listview. Es mi humilde opinión.

Espero que te pueda servir de algo.

Saludos !!!


Manuel F. Borrego S. 8)
Barcelona, Venezuela.
Hay dos tipos de personas: Los que siguen un camino... y los que hacen camino al avanzar !!!

E N T E R

  • Petabyte
  • ******
  • Mensajes: 1062
  • Reputación: +57/-13
  • www.enterpy.com
    • Ver Perfil
    • www.enterpy.com
Re:Cargar mas rapido en ListView
« Respuesta #2 en: Abril 02, 2012, 08:18:13 pm »
No es tema de conexión se que no tengo que abrir y cerrar así mi conexión pero no es eso el problema.

Yo agregue ahora solo 1 columna y concatene todos los campos de la tabla y carga super rapido.

Ejemplo:

Código: (VB) [Seleccionar]
Private Sub Form_Load()
       
    LReportes.ListItems.Clear
    StrSQL = "SELECT * FROM articulos;"
           
    '+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-+
    '// Conectar la Base Datos con ADO
        Call ConectarADO
    '+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-+
       
        rsADO.Open StrSQL, cnADO, adOpenStatic, adLockOptimistic, adCmdText
       
        Do Until rsADO.EOF
           
            Set lV = LReportes.ListItems.Add()
           
            With rsADO
                   
                lV.Text = .Fields("codigo") & .Fields("codinterno") & .Fields("codbarra") & .Fields("nombre") & Format(.Fields("costo"), "##,###0") & Format(.Fields("precio1"), "##,###0") & Format(.Fields("precio2"), "##,###0")
                rsADO.MoveNext
                               
            End With
           
        Loop
   
    '+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-+
    '// Cerrar la base de datos y liberar la memoria
        Call CerrarADO
    '+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-+

End Sub

Cuanto mas columna tenga ya es mas lento.
CIBER GOOGLE - CONCEPCIÓN PARAGUAY
www.enterpy.com
Primera regla de la programacion, para que vas a hacerlo complicado si lo puedes hacer sencillo

raul338

  • Terabyte
  • *****
  • Mensajes: 894
  • Reputación: +62/-8
  • xD fan!!!!! xD
    • Ver Perfil
    • Raul's Weblog
Re:Cargar mas rapido en ListView
« Respuesta #3 en: Abril 02, 2012, 08:32:56 pm »
Puedes usar WM_SETREDRAW para acelerar la carga

También te recomiendo que en lugar de format, uses FormtarNumber$(.Fields(...), 2) :)

Ademas, ya que solo usas el recordset para rellenar y lo cerras, te recomiendo usar estos parámetros:

Código: (vb) [Seleccionar]
rsADO.Open StrSQL, cnADO, adOpenForwardOnly, adLockReadOnly, adCmdText
Si no te acelera con eso, hay algo de magia negra que estas haciendo  ;D ;D ;D
« última modificación: Abril 02, 2012, 08:53:22 pm por raul338 »

Bazooka

  • Terabyte
  • *****
  • Mensajes: 951
  • Reputación: +31/-20
  • El pibe Bazooka
    • Ver Perfil
    • Desof sistemas
Re:Cargar mas rapido en ListView
« Respuesta #4 en: Abril 02, 2012, 08:46:04 pm »
Yo te recomiendo Ariel que utilizes algun metodo de paginación para solo cargar un grupo que son en definitiva los que estan visibles! eso es mucho más razonable y rapido!.
Si te interesa te puedo buscar un buen ejemplo que habia descargado de Planet Source creo que era de un filipino!!!
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

79137913

  • Megabyte
  • ***
  • Mensajes: 185
  • Reputación: +21/-4
  • 4 Esquinas
    • Ver Perfil
    • Eco.Resumen Resumenes Cs. Economicas
Re:Cargar mas rapido en ListView
« Respuesta #5 en: Abril 03, 2012, 08:09:28 am »
HOLA!!!

Podes probar colocar toda la info concatenada como haces en una variable, luego split y luego a una matriz.

De ahi pasas al listview creo que eso te acelerara las cosas.

GRACIAS POR LEER!!!
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!"
"La peor de las ignorancias es no saber corregirlas"

 79137913                          *Shadow Scouts Team*                                                          Resumenes Cs.Economicas

seba123neo

  • Terabyte
  • *****
  • Mensajes: 763
  • Reputación: +88/-5
    • Ver Perfil
Re:Cargar mas rapido en ListView
« Respuesta #6 en: Abril 03, 2012, 11:45:03 am »
Hola, es como dijo raul, es por la forma en que abris el recordset, tenes que usar adOpenForwardOnly, de esa forma aumenta muchisimo la velocidad. igualmente te comento que usar recordset con listview con miles de registros es super lento, hasta con el ucListView es lento, lo mas rapido y que yo uso, es el MsHFlexgrid, eso me carga 7 mil registros en 1 segundo.

saludos.

javierjava

  • Kilobyte
  • **
  • Mensajes: 69
  • Reputación: +6/-0
    • Ver Perfil
Re:Cargar mas rapido en ListView
« Respuesta #7 en: Abril 07, 2012, 02:21:50 pm »
Que tal con este control cargo 7000 registros  muy bien no se tarda casi nada  y tiene un aspecto muy bueno




http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=70425&lngWId=1

E N T E R

  • Petabyte
  • ******
  • Mensajes: 1062
  • Reputación: +57/-13
  • www.enterpy.com
    • Ver Perfil
    • www.enterpy.com
Re:Cargar mas rapido en ListView
« Respuesta #8 en: Abril 07, 2012, 03:02:36 pm »
Si javierjava estoy usando también ese control pero no noto tanta diferencia.

Este es el mejor que encontré pero no se como implementar con la base datos. 100.000 registro carga ante de 1 segundo es como. en un listview tarda eso como 20 sg.
http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=65746&lngWId=1

HOLA!!!

Podes probar colocar toda la info concatenada como haces en una variable, luego split y luego a una matriz.

De ahi pasas al listview creo que eso te acelerara las cosas.

GRACIAS POR LEER!!!

Esto seria bueno algún ejemplito por ahi.
CIBER GOOGLE - CONCEPCIÓN PARAGUAY
www.enterpy.com
Primera regla de la programacion, para que vas a hacerlo complicado si lo puedes hacer sencillo

seba123neo

  • Terabyte
  • *****
  • Mensajes: 763
  • Reputación: +88/-5
    • Ver Perfil
Re:Cargar mas rapido en ListView
« Respuesta #9 en: Abril 08, 2012, 11:40:20 am »
no bueno, una cosa es cargar 7 mil registros, eso es pasable y la otra es cargar 100 mil, eso ya es una locura, en ningun sistema te carga 100 mil registros y si lo hace esta mal, para el usuario eso es totalmente inservible eso, una lista con 100 mil reigstros no la podes recorrer ni en broma, para eso tenes que tener filtros al costado para que el usuario vaya filtrando segun lo que quiera buscar. ese ejemplo del link es bueno, pero es un lio implementarlo, lo veo muy engorroso para algo que no es mas que cargar una lista.

Bazooka

  • Terabyte
  • *****
  • Mensajes: 951
  • Reputación: +31/-20
  • El pibe Bazooka
    • Ver Perfil
    • Desof sistemas
Re:Cargar mas rapido en ListView
« Respuesta #10 en: Abril 11, 2012, 09:03:15 am »
Sigo sosteniendo que no tiene sentido cargar mas registros que los que se pueden ver en pantalla (max 50) y para cargar una nueva pantalla con otros 50 puede llevar milisegundos!!! .
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

ssccaann43

  • Terabyte
  • *****
  • Mensajes: 970
  • Reputación: +97/-58
    • Ver Perfil
    • Sistemas Nuñez, Consultores y Soporte, C.A.
Re:Cargar mas rapido en ListView
« Respuesta #11 en: Abril 11, 2012, 10:17:06 am »
Hola amigos, tengo una tabla con 1300 registros uso el control ListView para mostrar los registros es muy lento para mostrar esos 1300 me tarda 1,5 segundos en cargar.

Hay algún método para cargar mas rápido.

Lo mas sencillo y practico es paginar. Bazooka ha acertado en ello. No puedes darle al usuario que visualice 1000 registros en un grid porque eso cansa la vista y es engorroso buscar alguno. Lo más recomendable es que realices una paginación y puedas mover los registros sin problemas. Aparte de ubicar solo los que paginas o muestras en el grid.
Miguel Núñez.

raul338

  • Terabyte
  • *****
  • Mensajes: 894
  • Reputación: +62/-8
  • xD fan!!!!! xD
    • Ver Perfil
    • Raul's Weblog
Re:Cargar mas rapido en ListView
« Respuesta #12 en: Abril 11, 2012, 07:54:52 pm »
Agrega como maximo 5000 elementos y de ahi le das la opcion al usuario de buscar y filtrar n.n