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

Grupo de Teaming del ClubDelphi

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: 18
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: 18
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: 21
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: 18
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.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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: 18
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
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 17:16:29.


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