Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Consulta SQL lenta con 10 000 registros (https://www.clubdelphi.com/foros/showthread.php?t=76700)

ethangio 19-11-2011 18:31:15

Consulta SQL lenta con 10 000 registros
 
Hola buen dia a todos.

En mi programa realizo una consulta que me devuelve toda una tabla que contiene 10 000 registros y los coloco en 3 listbox pero se torna muy lento. Uso mysql como motor de base de datos y uso los componentes Zeos Lib

Mi codigo es este:

Código Delphi [-]
ZQuery1.Close;
  ZQuery1.SQL.Clear;
  ZQuery1.SQL.Add('SELECT * FROM productos ORDER BY nombre ASC');
  ZQuery1.Open;
  ZQuery1.First;
  while not ZQuery1.Eof do
  begin
     ListBox1.Items.Add(ZQuery1.FieldByName('id').AsString);
     ListBox2.Items.Add(ZQuery1.FieldByName('nombre').AsString);
     ListBox3.Items.Add(FloatToStrF(ZQuery1.FieldByName('precio').AsFloat, ffNumber, 4, 2));
     ZQuery1.Next;
  end;

Mi consulta mediante phpmyadmin tarda 0.5 seg entonces creo que el problema esta al llenar los listbox pero no tengo idea de como optimizarlo ...

Gracias por su tiempo .

ecfisa 19-11-2011 19:21:12

Hola.

¿ Y no te sirve usar el equivalente Zeos del TDBLookupComboBox ? De ese modo te estarías ahorrando la carga de los ListBox.

Un saludo.

ethangio 19-11-2011 19:49:23

ecfisa .. voy a checar si carga mas rapido y comento :D gracias ...

ethangio 19-11-2011 20:02:01

ecfisa .. Disculpa pero como se usa el TDBLookupComboBox .. no encuentro ejemplos :S ... gracias

Casimiro Noteví 19-11-2011 20:33:47

Y pregunto: ¿para qué se puede necesitar tener 10000 registros en un listbox o un combobox o un... lo que sea? :confused:

ethangio 19-11-2011 20:58:40

Pues mira el programa es para una tienda de abarrotes entonces tengo una base de datos con 10 000 articulos, entonces cuando el programa se inicia en el formCreate pues lleno los 3 listbox.

Y si por ejemplo agrego un nuevo articulo, modifico o elimino un articulo de la base de datos el form principal pues lo tengo que refrescar con los nuevos datos ..

Casimiro Noteví 19-11-2011 21:09:41

Y si en lugar de 10000, tuviera por ejemplo 1000000000000000000000, ¿cómo lo harías?

olbeup 19-11-2011 21:11:56

Cita:

Empezado por ecfisa (Mensaje 418908)
Hola.

¿ Y no te sirve usar el equivalente Zeos del TDBLookupComboBox ? De ese modo te estarías ahorrando la carga de los ListBox.

Un saludo.

Y que ganas con los 10.000 artículos cargados en el ListBox, aparte de consumir memoria innecesariamente, Cuando el cliente elija un artículo de tu ListBox en el 7501, ¿que tienes que leer tú? los 7500 restantes para localizar tal artículo, nose pero creo que la solución que te ha dado ecfisa, creo que es la correcta.

Por que no realizar una búsqueda con una SQL por medio de un Edit, el resultado seria 10.000 veces más rápido que la de tu ListBox, o cómo dice casimiro notevi: Y si en lugar de 10000, tuviera por ejemplo 1000000000000000000000, ¿cómo lo harías?


Un saludo.

ethangio 19-11-2011 22:03:03

Si tienen razon, tengo que rediseñar eso, voy a buscar la manera de optimizar y no cargar muchos datos.

Mi idea era esta.

Que el vendedor tuviera a la mano el catalogo de sus articulos, por que pasa que saben qué articulo quieren, pero no saben el codigo de barras, ni el nombre exacto como se dio de alta el articulo ni el precio, entonces si empieza a escribir el codigo de barras en el evento onChange pues se ORDENAn los articulos por codigo, si es por nombre se ordenan por Nombre de articulo ascendente y el precio igual, y como relacioné los 3 listbox, al seleccionar un item en cualquiera de los 3 listbox en los demas tambien se selecciona su correspondiente informacion, ojalá que me haya explicado.



Se me acaba de ocurrir no cargar los datos si no una parte y conforme al evento onchange hacer la consulta y listar los registros necesarios ...

Voy a probar a ver que tal me va ... Gracias ..

Cualquier opinion se agradece ... :D

Caminante 19-11-2011 22:45:15

Bueno eso no justifica el uso de los listbox en tal caso podrias usar un DBGrid pero igual no es muy util llenar tantos datos. Dificilmente el usuario se pondra a recorrer toda esa lista.

ethangio 19-11-2011 23:26:19

Gracias a todos, ecfisa, Casimiro Notevi, olbeup, Caminante, gracias por sus consejos y opiniones.

La solucion sin despegarme de la idea, es que en el evento OnChange haga la consulta
Ejemplo.

Código SQL [-]
Select * from productos where nombre like 'coca%' order by nombre asc limit 0,50

y me traiga solo 50 registros que coincidan con el patron coca.

Quiza este necio con lo mismo, pero según yo es más fácil que en los TEdit que estan arriba de cada listbox sea la busqueda y se carguen los datos semejantes al patron de busqueda por que en las tienditas pues ya ven que no todo tiene codigo de barra
o tienen que pasar el producto al vendedor para que el vendedor pase el codigo de barra y diga cuanto vale el producto. y
las personas pues dicen que cuanto vale esto, y cuanto vale lo otro, y los niños para que me alcanza.

Creo que asi tienen a la mano los nombres y precios de manera rapida.

Casimiro Noteví 20-11-2011 01:39:51

Verás qué diferencia tan enorme :)

ethangio 20-11-2011 03:49:06

Casimiro Notevi ..... Gracias ya quedo listo solo cargar los registros necesarios ... espero mas adelante poder ayudar a alguien mas ... como me han ayudado ..

Saludos ..


La franja horaria es GMT +2. Ahora son las 12:15:31.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi