Autor Tema: Cargar tabla en un mshflexgrid con progressbar  (Leído 8091 veces)

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

pepino

  • Bytes
  • *
  • Mensajes: 45
  • Reputación: +0/-4
    • Ver Perfil
Cargar tabla en un mshflexgrid con progressbar
« en: Julio 15, 2015, 03:41:44 pm »
tengo 1000 registros en una tabla de mysql el problema es que tarda como 10 segundos en mostrarlos por completo uso el siguiente codigo:
Código: (VB) [Seleccionar]
        rs.Open "SELECT * FROM pacientes", cn, adOpenDynamic, adLockBatchOptimistic
        Set Frm_Pacientes.MshPacientes.DataSource = rs
DoEvents
       
crei que si ponia un formulario antes de precarga con una progress bar estaria mejor, o alguien tiene algun codigo mas agil para cargarlos.


YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Cargar tabla en un mshflexgrid con progressbar
« Respuesta #1 en: Julio 15, 2015, 05:03:07 pm »
10 segundos es una eternidad. Prueba con esto:

rs.Open "SELECT * FROM pacientes", cn, 1, 1

También seria bueno que no uses * sino que nombres los campos pero encima de todo eso revisa el rendimiento de la consulta, mira los indices y revisa el plan.

Saludos
Me encuentras en YAcosta.com

pepino

  • Bytes
  • *
  • Mensajes: 45
  • Reputación: +0/-4
    • Ver Perfil
Re:Cargar tabla en un mshflexgrid con progressbar
« Respuesta #2 en: Julio 15, 2015, 05:48:56 pm »
Sigue con el mismo problema Yacosta, me empieza a desesperar  :'( tu que conoces bien el mshflexgrid que metodo utilizas para la carga? Saludos!

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Cargar tabla en un mshflexgrid con progressbar
« Respuesta #3 en: Julio 15, 2015, 10:04:42 pm »
Utilizo el metodo que te expuse.

Vamos por partes.

Primero veamos la consulta. Olvídate de VB6 y ve a tu manejador de base de datos y ejecuta el query:

SELECT * FROM pacientes

Y evalúa cuanto tarda en ejecutarse. Si tarda mucho el problema está en la tabla, falta crear indices seguramente. Incluso con * debería tardar menos de 1 segundo. Cuentanos como te fue hasta aqui
Me encuentras en YAcosta.com

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Cargar tabla en un mshflexgrid con progressbar
« Respuesta #4 en: Julio 16, 2015, 01:32:18 pm »
Acabo de percatarme que mencionaste sobre el progressbar (ando despistado)... y me pregunto ¿Para que quieres usar el progressbar? y ¿como?. Es decir, el control MSHFlexgrid es un control enlazable a datos, no creo que sea practico intervenir en la carga (tampoco se como se haria o si eso fuese posible) de datos entre el control y el recordset.

Salvo que no halla entendido en que punto quieres usar el progressbar.
Me encuentras en YAcosta.com

E N T E R

  • Petabyte
  • ******
  • Mensajes: 1062
  • Reputación: +57/-13
  • www.enterpy.com
    • Ver Perfil
    • www.enterpy.com
Re:Cargar tabla en un mshflexgrid con progressbar
« Respuesta #5 en: Julio 16, 2015, 02:59:20 pm »
Una forma posible es , obtener el numero de registros que hay en la tabla que se va a cargar , con la propiedad "Recordcount"
Ejemplo:

Código: (VB) [Seleccionar]
total_registros = rstable.RecordCount

Progressbar1.maxvalue = total_registros
Progressbar1.Value = 0
Progressbar1.Visible = True
valor = 0

While Not rstable.EOF
    valor = valor + 1
    Progressbar1.Value = valor
    rstable.MoveNext
Wend
Progressbar1.Visible = False
CIBER GOOGLE - CONCEPCIÓN PARAGUAY
www.enterpy.com
Primera regla de la programacion, para que vas a hacerlo complicado si lo puedes hacer sencillo

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Cargar tabla en un mshflexgrid con progressbar
« Respuesta #6 en: Julio 16, 2015, 03:25:48 pm »
Claro asi se usa para mostrar el progreso de carga SIMULADO porque en realidad el rs ya lo cargo y no lo veo adecuado para un MshFlexgrid, y ademas que dibujar eso haria mas lenta toda la operacion. Al margen de eso en lo personal prefiero un For Next en vez de un While pero ya es cuestion de gusto quiza, con For Next seria asi:
 
Código: (VB) [Seleccionar]
Progressbar1.maxvalue = rs.recordcount
Progressbar1.Value = 0
Progressbar1.Visible = True
 
For i = 1 to rs.recordcount
    Progressbar1.Value = i
    rs.MoveNext
Next i
Progressbar1.Visible = False

Me encuentras en YAcosta.com

E N T E R

  • Petabyte
  • ******
  • Mensajes: 1062
  • Reputación: +57/-13
  • www.enterpy.com
    • Ver Perfil
    • www.enterpy.com
Re:Cargar tabla en un mshflexgrid con progressbar
« Respuesta #7 en: Julio 16, 2015, 04:19:10 pm »
Si asi es amigo como dices, yo solo postee por que el pidio eso. Ademas ya aprendi la leccion de cargar al pedo un una grilla miles de registros por que por una parte no sirve para nada nadie se va a poner a leer cada registro.

Lo ideal seria buscar y mostrar solo lo que se necesita.

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

pepino

  • Bytes
  • *
  • Mensajes: 45
  • Reputación: +0/-4
    • Ver Perfil
Re:Cargar tabla en un mshflexgrid con progressbar
« Respuesta #8 en: Julio 17, 2015, 03:39:52 pm »
Desde su punto de vista cual es mejor y mas practico:
este:
Código: (VB) [Seleccionar]
Set rs = cn.Execute("SELECT * FROM pacientes")
        Set Frm_Pacientes.MshPacientes.DataSource = rs

o este:
Código: (VB) [Seleccionar]
rs.Open "SELECT * FROM expediente", cn, 1, 1
                Set Frm_Expedientes.MsExpedientes.DataSource = rs
rs.close

Albertomi

  • Gigabyte
  • ****
  • Mensajes: 281
  • Reputación: +153/-0
    • Ver Perfil
Re:Cargar tabla en un mshflexgrid con progressbar
« Respuesta #9 en: Julio 19, 2015, 01:18:16 am »
Estimado pepino

Es un grave error y una muy mala práctica hacer lo más práctico, debes de hacer lo adecuado (lo correcto) para el caso que se te presenta. Por ello, es importante que tenga antes muy claro el requerimiento del cliente o el caso que se te presenta. Y siempre, primero, parte o apóyate en el fundamento teórico. En ese sentido paso a tratar de darte respuesta a tu pregunta.
 
Tú preguntas ¿Cuál es el mejor? y, la respuesta es relativa porque estas invocando desde un lenguaje anfitrión (VB6) a un lenguaje invitado (Transact-SQL).
 
Así que analicemos brevente lo que pasa en cada lengua:
1. En el lenguaje anfitrión:
1.1 Haciendo uso del método Execute del objeto Connection de ADO (estoy asumiendo que estas usando ADO).
Cuando invocas el método Excute, este implícitamente te retorna un objeto Recordset de solo lectura hacia adelante, por ello es muy rápido. Por ejemplo lo puedes usar para retornar los valores de un Combox.

Ahora, si este código lo estas invocando desde dentro el mismo Form (Frm_Pacientes) no es necesario que lo invoques
Set rs = cn.Execute("SELECT * FROM pacientes")
Set MshPacientes.DataSource = rs

 
1.2. Haciendo uso del método Open del objeto Recordset de ADO.
Cuando necesites tener un mayor control sobre el objeto Recordset, lo más adecuado es invocar al método Open del objeto Recordset. Por ejemplo quieres mostrar los datos paginados en un Grid.

Para este código, aplica el mismo comentario anterior para el Form, pero adicionalmente estoy usando With para invocar solo 2 veces al objeto Recordset, cuanto menos veces lo invoques es más óptimo.
With rs
  .Open "SELECT * FROM expediente", cn, 1, 1
  Set MsExpedientes.DataSource = rs
  .Close
End With

 
2. En el lenguaje invitado
Es aquí donde hay grande HORRORES “errores”, basándote en la teoría de base de datos el llamar a una sentencia SQL como esta SELECT * FROM expediente  tiene un costo de ejecución muy alto.
Cuando estés desarrollando sentencias SQL siempre revisa su plan de ejecución y busca alternativas para hacer que el costo del plan de ejecución sea el menor. Hasta con tablas de no más de 2000 registro puedes encontrar mejoras sustanciales en los tiempos de respuesta cuando recompones tu sentencia SQL, como hacerlo una forma es evitando usar el * en la composición del query SQL, en su lugar pon el nombre del o los campos que necesitas invocar y asegúrate de crear los índices adecuados y necesario, no te excedas en crear índices puesto que le pegaras al plan de ejecución. Recuerda que debes refrescar las estadísticas de la base de datos antes de volver a revisar el plan de ejecución.

 
Saludos, desde algún lugar de Lima-Perú
Saludos, desde algún lugar de Lima-Perú

aedEric

  • Megabyte
  • ***
  • Mensajes: 211
  • Reputación: +20/-0
    • Ver Perfil
Re:Cargar tabla en un mshflexgrid con progressbar
« Respuesta #10 en: Julio 19, 2015, 03:07:36 pm »
woow Albertomi muy buena explicación amigo se agradece  ;) saludos
No he fracasado. He encontrado 10000 soluciones que no funcionan.

Waldo

  • Gigabyte
  • ****
  • Mensajes: 264
  • Reputación: +22/-0
    • Ver Perfil
Re:Cargar tabla en un mshflexgrid con progressbar
« Respuesta #11 en: Julio 21, 2015, 11:52:25 pm »
Como dijo Albertomi, si el recorset se va a cargar solo para mostrar datos, o por ej cargar un combo, es mucho mas rapido si es tipo ForwardOnly, que es el default del rs.Open, o del connection.execute. No tiene sentido usar otro.

Lo que podes hacer es cargar el grid 'a mano', linea x linea con un while., y con cada movenext, incrementar el progressbar. El max de la barra seria el recordcount.
Ah para que funcione el recordcount el cursor tiene que estar del lado cliente


Enviado desde mi XT1068
« última modificación: Julio 21, 2015, 11:56:11 pm por Waldo »