Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Como puedo relacionar un combobox y una grid? (https://www.clubdelphi.com/foros/showthread.php?t=94379)

Navegante 08-01-2020 17:51:23

Como puedo relacionar un combobox y una grid?
 
Hola.

Necesito relacionar la selección de un combobox con una grid. Es decir, cuando el valor el combobox cambie, debe cambiar los registros mostrados en la grid.

Tengo una conexión a base de datos SQL Server usando FireDAC. La conexión funciona sin problema
Cree un FDQuery para llenar el combobox y funciona (use LiveBinding)
Cree un FDQuery para llenar la grid y funciona.

Ahora lo que necesito es que si cambia el valor del combobox, cambien los resultados mostrados en la grid.

En el combobox están los nombres de los vendedores
En la grid se muestra las ventas de los vendedores. La idea es que al seleccionar un vendedor se muestren únicamente las ventas de ese vendedor

El vendedor tiene un código de identificación (Id) y un Nombre. En el combobox debo mostrar el nombre, pero cuando se seleccione un nombre de vendedor, el valor que debe devolver es el ID para que pueda ejecutarse el query de la grid basado en el ID del vendedor.

Alguien podría indicarme como puedo lograr eso?

De antemano gracias.

Casimiro Notevi 08-01-2020 18:02:06

En el "change" del combobox tomas el número del vendedor y haces la consulta:
Código Delphi [-]
qry.close;
qry.params[0].asinteger := valor tomado del combobox;
qry.open;
En el qry tienes select campos from ventas where vendedor=:vendedor
Obviamente, el qry está enlazado mediante un datsource al dbgrid donde muestras las ventas.

ecfisa 08-01-2020 18:09:16

Hola.

Código Delphi [-]
procedure TForm1.ComboBox1Change(Sender: TObject);
var
  cb : TComboBox;
begin
  cb := TComboBox(Sender);
  if cb.ItemIndex <> -1 then
  begin
    FDQuery1.Close;
    FDQuery1.SQL.Text := 'SELECT * FROM VENTAS WHERE VENDEDOR = :NOMBRE';
    FDQuery1.ParamByName('NOMBRE').AsString := cb.Items[cb.ItemIndex];
    FDQuery1.Open;
  end;
end;

Saludos :)

Navegante 08-01-2020 18:14:02

Gracias a ambos por su respuesta.

En el caso del TComboBox se muestran los nombres de los vendedores, pero necesito que cuando seleccionen un nombre de vendedor lo que devuelva es el ID del vendedor, pues en el detalle de ventas está el ID del vendedor y no el nombre. En el TComboBox para facilidad del usuario se debe mostrar el nombre pero internamente debe manejarse con el ID.

Se puede hacer?

Saludos,


Cita:

Empezado por ecfisa (Mensaje 535123)
Hola.

Código Delphi [-]
procedure TForm1.ComboBox1Change(Sender: TObject);
var
  cb : TComboBox;
begin
  cb := TComboBox(Sender);
  if cb.ItemIndex <> -1 then
  begin
    FDQuery1.Close;
    FDQuery1.SQL.Text := 'SELECT * FROM VENTAS WHERE VENDEDOR = :NOMBRE';
    FDQuery1.ParamByName('NOMBRE').AsString := cb.Items[cb.ItemIndex];
    FDQuery1.Open;
  end;
end;

Saludos :)


ecfisa 09-01-2020 18:04:46

Hola.

Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
var
  cb: TComboBox;
begin
  FDQuery1.Close;
  FDQuery1.SQL.Text := 'SELECT ID, NOMBRE FROM VENTAS';
  FDQuery1.Open;
  cb := ComboBox1;
  // Recorrer tabla y guardar nombre e id en el combo
  while not FDQuery1.Eof do
  begin
    cb.Items.AddObject(FDQuery1.FieldByName('MARCA').AsString,
      TObject(FDQuery1.FieldByName('ID').AsInteger));
    FDQuery1.Next;
  end;
end;

procedure TForm1.ComboBox1Change(Sender: TObject);
var
  cb : TComboBox;
  id: Integer;
begin
  cb := TComboBox(Sender);
  id := Integer(cb.Items.Objects[cb.ItemIndex]); // Aquí se obtiene el valor del ID

  ShowMessageFmt('El ID es: %d', [id]);

  if cb.ItemIndex <> -1 then
  begin
    FDQuery1.Close;
    FDQuery1.SQL.Text := 'SELECT * FROM VENTAS WHERE VENDEDOR = :NOMBRE';
    FDQuery1.ParamByName('NOMBRE').AsString := cb.Items[cb.ItemIndex];
    FDQuery1.Open;
  end;
end;

Saludos :)


La franja horaria es GMT +2. Ahora son las 19:01:40.

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