Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 05-10-2008
Avatar de mightydragonlor
[mightydragonlor] mightydragonlor is offline
Miembro Premium
 
Registrado: Feb 2007
Ubicación: Medellín-Colombia
Posts: 587
Poder: 12
mightydragonlor Va por buen camino
Exclamation Problemas con DB + ListView

Hola a todos, espero me puedan ayudar, mi problema es el siguiente:
Estoy intentando cargar datos desde una DB a un TListView a travez de un Query, el problema radica en que tengo muchos registros en la tabla de la DB y el proceso se ralentiza enormemente, les dejo un fragmento del código para que me ayuden a arreglar este problema.
Código Delphi [-]
procedure TMaetro.FormCreate(Sender: TObject);
var
  AItem: TListItem;
begin
If UnitStart.ClienteNQ.Consultar(CronosDB,ClienteQR,'SP_CLIENTE_SELECT') then
begin
  ListView1.Clear;
  ClienteQR.First;
  While not ClienteQR.Eof do
  begin
    AItem := ListView1.Items.Add;
    AItem.Caption := ClienteQR.Fields[0].AsString;
    AItem.SubItems.Add(ClienteQR.Fields[1].AsString);
    AItem.SubItems.Add(ClienteQR.Fields[2].AsString);
    ClienteQR.Next
  end;
end
else
MessageBox(Application.Handle,
             PChar('No es posible consultar a la Base de Datos'),
             PChar('Error de Conexion'),
             MB_OK + MB_ICONSTOP + MB_DEFBUTTON1 + MB_APPLMODAL);
end;
Responder Con Cita
  #2  
Antiguo 06-10-2008
Avatar de mightydragonlor
[mightydragonlor] mightydragonlor is offline
Miembro Premium
 
Registrado: Feb 2007
Ubicación: Medellín-Colombia
Posts: 587
Poder: 12
mightydragonlor Va por buen camino
Hola a todos, aquí dejo el código que he logrado optimizar, pero aún me anda muy lento, en este momento tengo 1000 registros en la tabla que estoy consultando, les agradezco cualquier ayuda.
Código Delphi [-]
procedure TMaster.ListarTabla( DB: TIBDatabase; sTabla: String; Listado: TListView );
var
  Campos: TStringList; i: Integer; Consulta: TIBQuery;
begin
  if DB = nil then Exit;
  Campos := TStringList.Create;
  DB.GetFieldNames( sTabla, Campos );
  Consulta := TIBQuery.Create( nil );
  Consulta.Transaction := CronosTR;
  Consulta.SQL.Add( 'SELECT * FROM ' + sTabla );
  try
   Consulta.Open;
  except
   CronosTR.Rollback;
   raise;
  end;
  Listado.Columns.Clear;
  Listado.Columns.Add;
  Listado.Columns[0].Width := 0;
  for i := 0 to Campos.Count - 1 do
  begin
   Listado.Columns.Add;
   Listado.Columns[i+1].Caption := Campos[i];
   Listado.Columns[i+1].Width := 100;
  end;
  Listado.Clear;
  Listado.AllocBy := Consulta.RecordCount;
  Listado.Items.BeginUpdate;
  Consulta.DisableControls;
  while not Consulta.Eof do
  begin
   Listado.Items.Add;
   for i := 0 to Campos.Count - 1 do
    Listado.Items[Listado.Items.Count-1].SubItems.Add(Consulta.FieldByName(Campos[i]).AsString);
    Consulta.Next;
  end;
  Consulta.EnableControls;
  Listado.Items.EndUpdate;
  FreeAndNil( Campos );
  FreeAndNil( Consulta );
end;
Responder Con Cita
  #3  
Antiguo 06-10-2008
Avatar de enecumene
[enecumene] enecumene is offline
Miembro de Oro
 
Registrado: May 2006
Ubicación: Santo Domingo, Rep. Dom.
Posts: 3.040
Poder: 16
enecumene Va por buen camino
Hola, a ver, no creo que vaya a cargarse más rápidos con tanto registros, mi consejo sería que pusieras una especie de progressbar o un Gauge mientras se carga la lista.

Saludos.
__________________

Mi BLOG - ¡Joder, leanse la guia de estilo!
Las Palabras son enanas, los ejemplos gigantes.
Responder Con Cita
  #4  
Antiguo 06-10-2008
Avatar de mightydragonlor
[mightydragonlor] mightydragonlor is offline
Miembro Premium
 
Registrado: Feb 2007
Ubicación: Medellín-Colombia
Posts: 587
Poder: 12
mightydragonlor Va por buen camino
Gracias enecumene por responder tan rápido, ps ojalá se pueda cargar mas rápido, por que acabo de testear la conexion para saber cuanto tiempo se demora en ejecutarse y estos son los datos:
Código:
64 ms para consultar 1000 registros
19902 ms para cargar los 1000 registros en el listview
Como podemos ver, el problema se origina en el algoritmo de carga en el TListview, alguien conoce un método mejor para la carga de estos datos?
Responder Con Cita
  #5  
Antiguo 07-10-2008
Avatar de roman
roman roman is offline
Moderador
 
Registrado: May 2003
Ubicación: Ciudad de México
Posts: 20.172
Poder: 10
roman Tiene un aura espectacularroman Tiene un aura espectacular
Cita:
Empezado por mightydragonlor
alguien conoce un método mejor para la carga de estos datos?
Sí, yo

En tu caso particular yo usaría el ListView en modo virtual. En este modo, el ListView no carga todos los datos sino sólo los que se requiere mostrar en un momento dado.

Los pasos para ello son muy sencillos:
  1. Pones la propiedad OwnerData del ListView en true.

  2. Al momento de leer los datos, en lugar de cargar los elementos del ListView como hasta ahora, simplemente le indicas cuántos elementos hay:

    Código Delphi [-]
    ListView.Items.Count := DataSet.RecordCount;
  3. Los elementos en sí, los cargas en el evento OnData del ListView

    Código Delphi [-]
    DataSet.RecNo := Item.Index; // Item es el parámetro del evento
    Item.Caption := DataSet.FieldByName(...).AsString;
    Item.SubItems(0) := DataSet.FieldByName(...).AsString;
    Item.SubItems(1) := DataSet.FieldByName(...).AsString;
    
    ...

Aquí DataSet es el data set que estés usando, query, table, etc. Eso sí, es necesario que este data set pueda recorrerse aleatoriamente (que estén implementadas las propiedades RecordCount y RecNo). De no ser así, puedes factorizar por un ClientDataSet:

Código:
TuDataSet -> DataSetProvider -> ClientDataSet -> ListView
// Saludos
Responder Con Cita
  #6  
Antiguo 07-10-2008
Avatar de mightydragonlor
[mightydragonlor] mightydragonlor is offline
Miembro Premium
 
Registrado: Feb 2007
Ubicación: Medellín-Colombia
Posts: 587
Poder: 12
mightydragonlor Va por buen camino
Hola roman, gracias por tu aporte, pero hay un problema, ¡¡No entendí!!, lamento no haberte entendido muy bien, en este momento lo estoy intentando, pero no logro agregar los datos del TIBQuery al TListview, agradeceria me pudieras dar mas detalles.
Responder Con Cita
  #7  
Antiguo 09-10-2008
Avatar de mightydragonlor
[mightydragonlor] mightydragonlor is offline
Miembro Premium
 
Registrado: Feb 2007
Ubicación: Medellín-Colombia
Posts: 587
Poder: 12
mightydragonlor Va por buen camino
Hola a todos, les cuento que por mas que he tratado, no he podido cargar mas de 1 registro en el listview, no se en donde tengo el error, agradecería si alguien me muestra cual es la solución a mi torpeza.
__________________
mas confundido que Garavito el día del Niño.
Responder Con Cita
  #8  
Antiguo 09-10-2008
Avatar de enecumene
[enecumene] enecumene is offline
Miembro de Oro
 
Registrado: May 2006
Ubicación: Santo Domingo, Rep. Dom.
Posts: 3.040
Poder: 16
enecumene Va por buen camino
Creo que Roman se refería a esto:

Código Delphi [-]
procedure TMaetro.FormCreate(Sender: TObject);
var
  AItem: TListItem;
begin
If UnitStart.ClienteNQ.Consultar(CronosDB,ClienteQR,'SP_CLIENTE_SELECT') then
begin
  ListView1.Clear;
  ClienteQR.First;
  While not ClienteQR.Eof do
  begin
    ClienteQR.RecNo := AItem.Index;
    AItem.Caption := ClienteQR.Fields[0].AsString;
    AItem.SubItems(0) := ClienteQR.Fields[1].AsString;
    AItem.SubItems(1) := ClienteQR.Fields[2].AsString;
    ClienteQR.Next
  end;
end
else
MessageBox(Application.Handle,
             PChar('No es posible consultar a la Base de Datos'),
             PChar('Error de Conexion'),
             MB_OK + MB_ICONSTOP + MB_DEFBUTTON1 + MB_APPLMODAL);
end;

Saludos.

PD. Creo
__________________

Mi BLOG - ¡Joder, leanse la guia de estilo!
Las Palabras son enanas, los ejemplos gigantes.
Responder Con Cita
  #9  
Antiguo 09-10-2008
Avatar de roman
roman roman is offline
Moderador
 
Registrado: May 2003
Ubicación: Ciudad de México
Posts: 20.172
Poder: 10
roman Tiene un aura espectacularroman Tiene un aura espectacular
Cita:
Empezado por enecumene
PD. Creo
Pues no

Si lo haces así, queda igual que como lo estaba haciendo el compañero. El chiste es no cargar todos los datos de un sólo golpe, sino solo conforme se necesiten, esto es, conforme el usuario se va desplazando por el ListView.

Aquí les pongo un ejemplo que funciona de ambos modos: normal o virtual. En modo normal, el ListView carga los datos (+/- 4000) tal como lo hacen ustedes.

Para usar el modo virtual basta que pongan la propiedad OwnerData del ListView en true. Háganlo y verán la diferencia.
Archivos Adjuntos
Tipo de Archivo: zip DBListView.zip (68,2 KB, 40 visitas)
Responder Con Cita
  #10  
Antiguo 09-10-2008
Avatar de roman
roman roman is offline
Moderador
 
Registrado: May 2003
Ubicación: Ciudad de México
Posts: 20.172
Poder: 10
roman Tiene un aura espectacularroman Tiene un aura espectacular
Aquí hay otro ejemplo, pero en ese caso lo que se muestra son los archivos de un directorio. Una mitad del ejemplo (SysIcons) carga en modo normal y la otra (VirtualSysIcons) en modo virtual. Pruébenlos abriendo un directorio grande (como C:\Windows\System32) y verán la diferencia.

// Saludos
Responder Con Cita
  #11  
Antiguo 09-10-2008
Avatar de enecumene
[enecumene] enecumene is offline
Miembro de Oro
 
Registrado: May 2006
Ubicación: Santo Domingo, Rep. Dom.
Posts: 3.040
Poder: 16
enecumene Va por buen camino
¡Vaya!, cada día se aprende algo nuevo

Saludos.
__________________

Mi BLOG - ¡Joder, leanse la guia de estilo!
Las Palabras son enanas, los ejemplos gigantes.
Responder Con Cita
  #12  
Antiguo 10-10-2008
Avatar de mightydragonlor
[mightydragonlor] mightydragonlor is offline
Miembro Premium
 
Registrado: Feb 2007
Ubicación: Medellín-Colombia
Posts: 587
Poder: 12
mightydragonlor Va por buen camino
muchas gracias roman, te agradezco enormemente tu colaboración, la verdad es que me ha quedado muy claro tu ejemplo, de nuevo gracias por ayudarme.
__________________
mas confundido que Garavito el día del Niño.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Problemas con ListView ZayDun Varios 2 24-10-2007 22:14:56
Listview... con ADO Victor Vega SQL 10 08-09-2007 05:43:35
Uso de ListView lucero_chivas C++ Builder 3 27-09-2006 17:38:00
Problemas con el TreeView y el ListView quake2420 Varios 5 11-08-2005 20:57:48
Iconos en ListView Tangela Varios 2 02-07-2003 23:26:32


La franja horaria es GMT +2. Ahora son las 19:09:59.


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