Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-11-2013
Avatar de santiago14
santiago14 santiago14 is offline
Miembro
 
Registrado: sep 2003
Ubicación: Cerrillos, Salta, Argentina
Posts: 583
Poder: 21
santiago14 Va por buen camino
Wink

He estado conversando con gente del equipo donde trabajo respecto a la solución que plantea ecfisa; la verdad que a mí me parece muy buena y pone punto final a un problem que es recurrente.

Uno de los chicos del grupo argumenta que "podría ser una solución algo lenta" cuando se trate de llenar, en este caso un Combo, con muchos datos que vienen de la BD. Digamos 5.000 registros.

Yo la verdad que no creo, pero... ¿Alguien a hecho esa medición?

Gracias.

Santiago.
__________________
Uno es responsable de lo que hace y de lo que omite hacer.
Responder Con Cita
  #2  
Antiguo 05-11-2013
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
santiago14,

Cita:
Empezado por santiago14
..."podría ser una solución algo lenta" cuando se trate de llenar, en este caso un Combo, con muchos datos que vienen de la BD. Digamos 5.000 registros...
Pregunto: ¿Es práctico llenar un ComboBox con 5000 registros de una BD?, quizás en estos casos otras soluciones deban ser exploradas.

Espero sea útil

Nelson.
Responder Con Cita
  #3  
Antiguo 05-11-2013
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por santiago14 Ver Mensaje
Yo la verdad que no creo, pero... ¿Alguien a hecho esa medición?
Hola santiago14.

La verdad es que no, por que no utilizo esa solución. Pero no nos vamos a quedar con la duda...
Código Delphi [-]
function LoadComboBox(QY: TIBQuery; CB: TComboBox): string;
var
  freq, start, stop: Int64;
  i: Integer;
begin
  QY.Close;
  QY.SQL.Text := 'SELECT ID, NOMBRE FROM PACIENTES';
  QY.DisableControls;
  QueryPerformanceFrequency(freq);
  QueryPerformanceCounter(start);
  QY.Open;
  while not QY.Eof do
  begin
    CB.AddItem(QY.FieldByName('NOMBRE').AsString,
      TObject(QY.FieldByName('ID').AsInteger));
    QY.Next;
  end;
  QueryPerformanceCounter(stop);
  Result := FormatFloat('0,', (stop - start) * 1000000 div freq) + ' µs.';
  QY.EnableControls;
end;
Resultados:
Código:
Registros |  Tiempo
----------+--------------
 5000     |   426225 µs
10000     |   869611 µs
15000     |  1311832 µs
20000     |  1826615 µs
25000     |  2220191 µs
30000     |  2634683 µs
Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #4  
Antiguo 05-11-2013
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.052
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por nlsgarcia Ver Mensaje
Pregunto: ¿Es práctico llenar un ComboBox con 5000 registros de una BD?
NO .
Responder Con Cita
  #5  
Antiguo 05-11-2013
Avatar de santiago14
santiago14 santiago14 is offline
Miembro
 
Registrado: sep 2003
Ubicación: Cerrillos, Salta, Argentina
Posts: 583
Poder: 21
santiago14 Va por buen camino
Thumbs up

Coincido con Uds. no tiene sentido llenar un combo con 5000 registros. En realidad son menos, pero no quería ir a discutir sin saber bien el tema.

La cosa es así, se selecciona una localidad de un combo (habrá mas o menos 30); con esto se habilita otro con los barrios de esa localidad (algo así como 100 a 200); luego se habilita el combo con las calles de ese barrio, que si es grande tiene muchas (ahí podrían ser mas o menos 800 a 1000).

Estuve viendo los registros y para llenar 30000 registro se necesitan 2634683 !microsegundos!, o sea, poco mas de 2 segundos. No hay problema...
__________________
Uno es responsable de lo que hace y de lo que omite hacer.
Responder Con Cita
  #6  
Antiguo 06-11-2013
Avatar de santiago14
santiago14 santiago14 is offline
Miembro
 
Registrado: sep 2003
Ubicación: Cerrillos, Salta, Argentina
Posts: 583
Poder: 21
santiago14 Va por buen camino
Question

Siguiendo con el tema de los combos...
Cuando quiero recuperar el ItemIndex de uno a través del texto que está en .text hago:
Código Delphi [-]
 indice_combo:=combo1.items.IndexOf('hola');
Ahora bien, tengo datos en el Object de este combo, el cual se asocia con el combo a través de justamente el itemIndex.
¿Cómo hago para recuperar el índice asociado, en este caso al objeto, teniendo a la mano el dato que está dentro del object?

Yo hice algo, pero quisiera que lo vean:
Código Delphi [-]
function obtener_ItemIndex_segun_codigo(codigo:string; TS: TStrings):integer ;
var
  i: Integer;
  objeto:string;
begin
  Result:=-1;
  for i := (TS.Count - 1) downto 0 do
  begin
    objeto:=string(ts[i]);
    if codigo = objeto then
    begin
      Result:=i;
    end;
  end;
end;

Y se invoca:
Código Delphi [-]
indice:=obtener_ItemIndex_segun_codigo('ES001', cbxTipoSolicitud.Items);

¿Estoy mas o menos encaminado o no?

Gracias.
__________________
Uno es responsable de lo que hace y de lo que omite hacer.
Responder Con Cita
  #7  
Antiguo 06-11-2013
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola santiago14.

Una buena alternativa es usar un TDBLookupComboBox.

Tomando el caso anterior quedaría:
Código Delphi [-]
...
procedure TForm1.FormCreate(Sender: TObject);
begin
  with DBLookupComboBox1 do
  begin
    ListSource := DataSource1;
    ListField  := 'NOMBRE';
    KeyField   := 'ID';
    ListSource.DataSet.Last;
    ListSource.DataSet.First;
  end;
end;

procedure TForm1.DBLookupComboBox1Click(Sender: TObject);
begin
  with DBLookupComboBox1.ListSource.DataSet do
    Caption := Format('%s %d',[FieldByName('NOMBRE').AsString,
      FieldByName('ID').AsInteger])
end;

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #8  
Antiguo 06-11-2013
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola santiago14.

Según interpreto de tu mensaje #11:
Código Delphi [-]
indice:=obtener_ItemIndex_segun_codigo('ES001', cbxTipoSolicitud.Items);
El campo código es de tipo string.

Si es así, a diferencia de un valor entero, no es posible hacerlo en forma directa mediante el método AddItem (o AddObject), tendrías que hacer algo como:
Código Delphi [-]
...
implementation

type
  TClase = Class
    Codigo: string;
  end;

var
  Cl : TClase;

function GetIndexObjFromStr(LB: TComboBox; const Value:string): Integer;
var
  i: Integer;
begin
  Result := -1;
  for i:= 0 to LB.Items.Count-1 do
    if Value = TClase(LB.Items.Objects[i]).Codigo then
      Result := i;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  while not IBQuery.Eof do
  begin
    Cl := TClase.Create;
    Cl.Codigo := IBQuery.FieldByName('COD_CLIENTE').AsString;
    ComboBox1.AddItem(IBQuery.FieldByName('NOMBRE_CLIENTE').AsString,
      TObject(Cl));
    IBQuery.Next;
  end;
end;

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  with ComboBox1 do
    ShowMessage(Format('%s %s',[Items[ItemIndex],
      TClase(Items.Objects[ItemIndex]).Codigo]));
end;


{ Obtener el índice a partir de la cadena almacenada 
   en la propiedad vectorial Objects }
procedure TForm1.Button1Click(Sender: TObject);
begin
  ComboBox1.ItemIndex := GetIndexObjFromStr(ComboBox1, 'ES001');
end;
...

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
Respuesta



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
Copiar el valor de vario campo en un ComboBox NISOTO Firebird e Interbase 10 09-08-2012 23:55:00
Asignar el valor de un campo aggregate a un campo de la base TrUnkS Conexión con bases de datos 1 23-02-2010 05:17:42
Como pasarle un valor a un Combobox desde un campo Arturo Varios 2 02-10-2006 23:52:14
UPDATE de un campo dependiendo del valor de un campo de otra tabla Javi2 SQL 5 18-04-2005 16:35:05
Mas de un campo clave en IB. BECERRA Firebird e Interbase 7 28-05-2003 11:46:48


La franja horaria es GMT +2. Ahora son las 16:52:02.


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