Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   DbCombobox (https://www.clubdelphi.com/foros/showthread.php?t=87720)

The Cid James 17-02-2015 04:16:58

DbCombobox
 
Bueno abro un nuevo hilo dado que tengo problemas con dbcombobox, estoy tratando de hacer un query a una tabla de datos para listar paises, estados, etc ahora bien una vez enlazado el dataset a una query simple
Código SQL [-]
SELECT 
pais.nombre
FROM
  pais

Una vez echo esto completo los campos de dbcombobox con el dataset y el campo del cual se toma la consulta pero cuando ejecuto el codigo solo me sale el primer pais y no me enlista los demas.
Ademas de esto quisiera que una vez seleccionado el pais me filtre el siguiete dbcombobox el estado o provincia de cada pais tomando como referencia el id del pais

Saludos y gracias por la colaboracion

Casimiro Notevi 17-02-2015 10:02:49

Bienvenido a clubdelphi, como siempre aconsejamos a los nuevos, no olvides leer nuestra guía de estilo, gracias por tu colaboración :)

Ya te lo he comentado en otras ocasiones. Pero parece que no lo has leido.
Recuerda poner títulos descriptivos a tus preguntas.
Gracias.

ecfisa 17-02-2015 10:45:12

Hola
Cita:

Empezado por The Cid James (Mensaje 488878)
Ademas de esto quisiera que una vez seleccionado el pais me filtre el siguiete dbcombobox el estado o provincia de cada pais tomando como referencia el id del pais

Para lo que comentas resulta mas simple usar dos TComboBox:
Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
begin
  // Pais
  with tuQuery1 do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT ID, NOMBRE FROM PAIS');
    SQL.Add('ORDER BY NOMBRE');
    Open;
    while not Eof do
    begin
      ComboBox1.Items.AddObject(FieldByname('NOMBRE').AsString,
        Pointer(FieldByName('ID').AsInteger));
      Next;
    end;
    First;
    ComboBox1.ItemIndex:= 0;
  end;
end;

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  // Provincia
  with tuQuery2 do
  begin
    Close;
    SQL.Text:= 'SELECT ID, NOMBRE FROM PROVINCIA WHERE REF_PAIS = :PID';
    ParamByName('PID').AsInteger:= Integer(ComboBox1.Items.Objects[ComboBox1.ItemIndex] );
    Open;
    ComboBox2.Clear;
    while not Eof do
    begin
      ComboBox2.Items.AddObject(FieldByname('NOMBRE').AsString,
        Pointer(FieldByName('ID').AsInteger));
      Next;
    end;
    First;
    ComboBox2.ItemIndex:= 0;
  end;
end;

Pero mas eficiente es usar dos TDBLookupComboBox, ejemplo:
Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
begin
  // Pais
  with tuQuery1 do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT ID, NOMBRE FROM PAIS');
    SQL.Add('ORDER BY NOMBRE');
    Open;
  end;
  with DBLookupComboBox1 do
  begin
    ListSource:= DataSource1; // -> tuQuery1
    ListField := 'NOMBRE';    // a mostrar: nombre país
    KeyField  := 'ID'         // id pais
  end;
end;

procedure TForm1.DBLookupComboBox1Exit(Sender: TObject);
begin
  // Provincia
  with tuQuery2 do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT ID, NOMBRE, REF_PAIS');
    SQL.Add('FROM PROVINCIA WHERE REF_PAIS = :PID');
    SQL.Add('ORDER BY NOMBRE');
    ParamByName('PID').AsInteger:= DBLookupComboBox1.KeyValue;
    Open;
  end;
  with DBLookupComboBox2 do
  begin
    ListSource:= DataSource2; // -> tuQuery2
    ListField := 'NOMBRE';    // a mostrar: nombre provincia
    KeyField  := 'ID'         // id provincia
  end;
end;

Saludos :)

The Cid James 17-02-2015 11:02:08

Cita:

Empezado por Casimiro Notevi (Mensaje 488881)
Bienvenido a clubdelphi, como siempre aconsejamos a los nuevos, no olvides leer nuestra guía de estilo, gracias por tu colaboración :)

Ya te lo he comentado en otras ocasiones. Pero parece que no lo has leido.
Recuerda poner títulos descriptivos a tus preguntas.
Gracias.

Lo lei en cuanto vi el post anterior, que "descritivo" sea amplio y pueda tener muchas interpretaciones es distinto ;), a mi me parece bastante descritivo el titulo dado que es el nombre del componente del cual tengo dudas.

Mmm estoy trabajando con zeos y sus query, probe el TDBLookupComboBox pero no encontre manera de configurarlo, por el codigo que me pasaste, y corregime si me equivoco ¿no se puede trabajar con las query diectas (es decir hacer la query y llamarla por medio del dataset)?

Casimiro Notevi 17-02-2015 11:10:57

Cita:

Empezado por The Cid James (Mensaje 488884)
... a mi me parece bastante descritivo el titulo ...

Sí, muy descriptivo, al ver el título se entiende perfectamente que preguntas la manera de cambiar el color de un dbcombobox. O crear un dbcombobox en tiempo de ejecución. O cómo asignar un datasource de un dataset alojado en un datamodule a un dbcombobox. O para qué sirve un dbcombobox...

The Cid James 17-02-2015 11:29:33

Cita:

Empezado por Casimiro Notevi (Mensaje 488885)
Sí, muy descriptivo, al ver el título se entiende perfectamente que preguntas la manera de cambiar el color de un dbcombobox. O crear un dbcombobox en tiempo de ejecución. O cómo asignar un datasource de un dataset alojado en un datamodule a un dbcombobox. O para qué sirve un dbcombobox...

Para eso esta el cuerpo del mensaje?, el que ve el hilo ya sabe que estoy hablando o teniendo problemas con dbcombobox y obviamente no es una guia en fin son puntos de vista y no vienen al caso no soluciono nada discutiendo contigo, peor hubiera sido poner de titulo "ayuda urgente".

Casimiro Notevi 17-02-2015 11:36:37

Mira al final de esta misma página, abajo del todo, ¿ves los títulos tan descriptivos que han usado otros como tú?
Para eso sirve poner títulos descriptivos. Si alguien quiere cambiar de color un dbcombobox y hace una búsqueda con los términos "cambiar color dbcombobox" aparecerán los hilos cuyos títulos tengan esas palabras. Si ve un título que pone "dbcombobox" ¿cómo sabe de qué trata ese hilo? ¿revisa los miles de hilos para ver si es el que está buscando?
Para eso sirve poner títulos descriptivos.
Gracias por tu colaboración.

ecfisa 18-02-2015 01:46:05

Cita:

Empezado por The Cid James (Mensaje 488884)
...Mmm estoy trabajando con zeos y sus query, probe el TDBLookupComboBox pero no encontre manera de configurarlo, por el codigo que me pasaste...

El código funciona correctamente con los componentes IBX y aunque no he usado los ZEOS, tengo entendido que tendría que hacerlo del mismo modo.

Cita:

Empezado por The Cid James (Mensaje 488884)
... y corregime si me equivoco ¿no se puede trabajar con las query diectas (es decir hacer la query y llamarla por medio del dataset)?.

Si, se puede establecer la relación de forma directa, pero si usas TComboBox o DBComboBox es inevitable recorrer la consulta obtenida para cargar las filas obtenidas cada vez que el contenido del primero cambia.




Es totalmente correcta la observación que te hace Casimiro. También estás planteando dos cuestiones distintas en un mismo hilo:
1)
Cita:

Bueno abro un nuevo hilo dado que tengo problemas con dbcombobox, estoy tratando de hacer un query a una tabla de datos para listar paises, estados, etc ahora bien una vez enlazado el dataset a una query simple
...
Una vez echo esto completo los campos de dbcombobox con el dataset y el campo del cual se toma la consulta pero cuando ejecuto el codigo solo me sale el primer pais y no me enlista los demas.
2)
Cita:

Ademas de esto quisiera que una vez seleccionado el pais me filtre el siguiete dbcombobox el estado o provincia de cada pais tomando como referencia el id del pais
Lo que hace mas difícil poner un título que represente el problema...

Saludos :)

The Cid James 24-02-2015 23:58:12

Cita:

Empezado por ecfisa (Mensaje 488883)
Hola

Para lo que comentas resulta mas simple usar dos TComboBox:
Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
begin
  // Pais
  with tuQuery1 do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT ID, NOMBRE FROM PAIS');
    SQL.Add('ORDER BY NOMBRE');
    Open;
    while not Eof do
    begin
      ComboBox1.Items.AddObject(FieldByname('NOMBRE').AsString,
        Pointer(FieldByName('ID').AsInteger));
      Next;
    end;
    First;
    ComboBox1.ItemIndex:= 0;
  end;
end;

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  // Provincia
  with tuQuery2 do
  begin
    Close;
    SQL.Text:= 'SELECT ID, NOMBRE FROM PROVINCIA WHERE REF_PAIS = :PID';
    ParamByName('PID').AsInteger:= Integer(ComboBox1.Items.Objects[ComboBox1.ItemIndex] );
    Open;
    ComboBox2.Clear;
    while not Eof do
    begin
      ComboBox2.Items.AddObject(FieldByname('NOMBRE').AsString,
        Pointer(FieldByName('ID').AsInteger));
      Next;
    end;
    First;
    ComboBox2.ItemIndex:= 0;
  end;
end;

Pero mas eficiente es usar dos TDBLookupComboBox, ejemplo:
Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
begin
  // Pais
  with tuQuery1 do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT ID, NOMBRE FROM PAIS');
    SQL.Add('ORDER BY NOMBRE');
    Open;
  end;
  with DBLookupComboBox1 do
  begin
    ListSource:= DataSource1; // -> tuQuery1
    ListField := 'NOMBRE';    // a mostrar: nombre país
    KeyField  := 'ID'         // id pais
  end;
end;

procedure TForm1.DBLookupComboBox1Exit(Sender: TObject);
begin
  // Provincia
  with tuQuery2 do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT ID, NOMBRE, REF_PAIS');
    SQL.Add('FROM PROVINCIA WHERE REF_PAIS = :PID');
    SQL.Add('ORDER BY NOMBRE');
    ParamByName('PID').AsInteger:= DBLookupComboBox1.KeyValue;
    Open;
  end;
  with DBLookupComboBox2 do
  begin
    ListSource:= DataSource2; // -> tuQuery2
    ListField := 'NOMBRE';    // a mostrar: nombre provincia
    KeyField  := 'ID'         // id provincia
  end;
end;

Saludos :)

Osea que con DbCombobox no hay forma de hacerlo? :confused:

ecfisa 25-02-2015 00:45:50

Hola The Cid James.
Cita:

Empezado por The Cid James (Mensaje 489279)
Osea que con DbCombobox no hay forma de hacerlo? :confused:

Si claro que hay forma de hacerlo, es el mismo código que para el TComboBox usado en el mensaje #3.

Con una salvedad, que en lugar de usar el evento OnChange del ComboBox1 tendrías que usar el evento OnExit del DBComboBox1. Eso sucede por que el evento OnChange se dispara ante diferentes situaciones tratándose de un TComboBox o de un TDBComboBox.

De allí que te aconsejé el usar el TComboBox por parecerme mas simple y por que el uso de un TDBComboBox no reporta mayor beneficio para este caso en particular .

Saludos :)


La franja horaria es GMT +2. Ahora son las 07:44:38.

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