Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Tablas planas (https://www.clubdelphi.com/foros/forumdisplay.php?f=20)
-   -   Cargar combobox con datos de tabla (https://www.clubdelphi.com/foros/showthread.php?t=61688)

loadminds 18-11-2008 13:42:30

Cargar combobox con datos de tabla
 
Hola, soy nuevo por aca y estoy empezando con delphi y bases de datos, tengo una tabla y necesito cargar un combobox con un campo de la tabla, he leido por ahi del DBLookupComboBox pero este necesita que la tabla tenga una primary key definida no?, es decir tengo un campo categoria, y necesitaria agregar de la tabla las categorias sin que se repitan, alguien podria darme una mano? muchas gracias!!

BlueSteel 18-11-2008 14:01:18

Cita:

Empezado por loadminds (Mensaje 326602)
Hola, soy nuevo por aca y estoy empezando con delphi y bases de datos, tengo una tabla y necesito cargar un combobox con un campo de la tabla, he leido por ahi del DBLookupComboBox pero este necesita que la tabla tenga una primary key definida no?, es decir tengo un campo categoria, y necesitaria agregar de la tabla las categorias sin que se repitan, alguien podria darme una mano? muchas gracias!!


Hola loadminds..

Bienvenido a este Club....

con respecto a lo que preguntas, te puedo dar un ejemplo de un ComboBox...usando delphi 7

Código Delphi [-]

//la sgte es un Query de Interbase donde selecciona los datos de una tabla
     Datos.IBQ_Edit.Close;
     Datos.IBQ_Edit.SQL.Clear;
     Datos.IBQ_Edit.SQL.Add('Select * From "Medida"');
     Datos.IBQ_Edit.Open;
     Datos.IBQ_Edit.First;

     vUni.Clear; // Aquí limpo el ComboBox

     While Not Datos.IBQ_Edit.Eof Do  // Realizar mientras no sea fin de archivo
     Begin
          vUni.Items.Add(Datos.IBQ_Edit['Med_Detalle']);  // Agrego el dato al ComboBox
          Datos.IBQ_Edit.Next;  // Avanzo un registro en la Tabla
     End;

y con respecto al DBLookupComboBox no lo he usado, pero si he utilizado el DBLookupListBox, es muy sencillo de utilizar, pero lo que debes tener en cuenta que no deben existir duplicados, si bien no es por que no lo permite... es por que cuando selecciones un Item no sabrás a que código corresponde realmente...

Salu2:p:D

loadminds 18-11-2008 15:09:28

gracias bluesteel x la pronta respuesta, acabo de hacerlo andar con un combobox desplazandome en la dbgrid y cargandolo de a uno, funciona bien, pero no logro evitar que muestre los repetidos, hay formas de preguntar si el item ya existe dentro del combobox?el codigo me quedo mas asi:
procedure TForm1.CcatChange(Sender: TObject);
begin
With dbgrid1.datasource.dataset do begin
First;
While not eof do begin
{aca seria posible preguntar si el codigo ya esta en el combobox?}
Ccat.Items.Add(FieldByName('Categoria').AsString);
Next;
end;
end;
end;

funcionar funciono, no se si sea la forma correcta de hacerlo xq estoy arrancando recien, pero el problema es solo mostrar 1 vez cada categoria, es decir no ver repetidos, se me ocurrio preguntar x cada valor que agrego a items, pero no se como hacer la comparacion, Gracias!!

Caro 18-11-2008 15:18:57

Hola loadminds, puedes utilizar la función IndexOf de tu ComBoBox,

Código Delphi [-]
 With dbgrid1.datasource.dataset do begin
  First;
  While not eof do begin
   if Ccat.Items.IndexOf(FieldByName('Categoria').AsString)=-1 then
    Ccat.Items.Add(FieldByName('Categoria').AsString);   
   Next;
  end;

Si recorres el DataSet que esta enlazado a tu DBGrid, también deberías utilizar EnableCOntrol y DisableControl, para que no veas como se mueve entre registros.

Otra cosita estas cargando en el evento OnChange del COmboBox, deberías hacerlo en otro lado, donde solo se ejecute una vez.

También podrías haber hecho otra consulta sobre esa tabla con distinct sobre el campo categoría.

Saluditos

loadminds 18-11-2008 16:13:58

mil gracias caro, anduvo joya, cargue en el OnActivate del Form y lo carga al ejecutar, lo unico no noto el movimiento entre registros quizas por que son pocos verdad?y no me quedo muy en claro a que hacias referencia con el distinct, gracias de nuevo!!!

Caro 18-11-2008 16:22:53

Cita:

Empezado por loadminds (Mensaje 326624)
cargue en el OnActivate del Form y lo carga al ejecutar, lo unico no noto el movimiento entre registros quizas por que son pocos verdad?y no me quedo muy en claro a que hacias referencia con el distinct, gracias de nuevo!!!

Yo lo haría en el OnShow del formulario, con el OnActivate, se llenara cada vez que tu formulario se active, no notas el movimiento entre registros porque supongo que lo estas cargando en el OnActivate o el OnShow, ademas como dices son pocos, pero fijate a que registro esta apuntando tu DBGrid seguro que es al ultimo.

Sobre el distinct me refería a hacer otra consulta, en otro Query. La consulta sería "Select distinct categoria from tabla".

Saluditos

loadminds 18-11-2008 17:37:09

claro claro me queda apuntando al ultimo, voy a probar en el Onshow, muchas gracias!!!,la verdad la mejor de las ondas aca, me veran seguido jej saludos!!

Caro 18-11-2008 17:43:42

Cita:

Empezado por loadminds (Mensaje 326646)
claro claro me queda apuntando al ultimo, voy a probar en el Onshow, muchas gracias!!!

El OnShow no te va a solucionar que no apunte al ultimo registro, es solo para que se ejecute una vez tu codigo. Para que no apunte al ultimo cuando recorres tu DataSet debes utilizar EnableControl y DisableControl.

Código Delphi [-]
  
  With dbgrid1.datasource.dataset do begin
  DisableControls; //Deshabilitamos los controles asociados a ese DataSet 
  First;
  While not eof do begin
   if Ccat.Items.IndexOf(FieldByName('Categoria').AsString)=-1 then
    Ccat.Items.Add(FieldByName('Categoria').AsString);   
   Next;
  end;
  EnableControls;//habilitamos nuevamente los controles

Saluditos

Lepe 18-11-2008 17:51:59

Ya sé que el código es sólo un ejemplo, no siempre tenemos que seguirlo a pies juntillas, pero como tendemos a hacer copy & paste, mejor así:
Código Delphi [-]
  
  With dbgrid1.datasource.dataset do begin
  try 
    DisableControls; //Deshabilitamos los controles asociados a ese DataSet 
    First;
    While not eof do begin
     if Ccat.Items.IndexOf(FieldByName('Categoria').AsString)=-1 then
      Ccat.Items.Add(FieldByName('Categoria').AsString);   
     Next;
    end;
  finally
    EnableControls;//habilitamos nuevamente los controles
  end;
Si ocurre un fallo al recorrer todos los registros (una excepción) ya no volvería a mostrarse los registros en los controles DBAware. Con un try... finally se asegura el código.

Saludos

Caro 18-11-2008 18:02:20

Cita:

Empezado por Lepe (Mensaje 326653)


Si ocurre un fallo al recorrer todos los registros (una excepción) ya no volvería a mostrarse los registros en los controles DBAware. Con un try... finally se asegura el código.

Yo lo hago con el Try Finally, como dices solo le estaba dando la idea, pero mejor ponerlo completo ;), ya que el amiguito esta empezado con delphi .

Saluditos

loadminds 18-11-2008 19:16:47

gracias x la data lepe, saludos!!


La franja horaria es GMT +2. Ahora son las 00:20:04.

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