Yo hago lo siguiente, un formulario con un Radiogroup para capturar lo que quiere el usuario:
Código Delphi
[-]procedure TfrDlgProductos.spbConsultaClick(Sender: TObject);
begin
Case RdgProductos.ItemIndex of
0:cListado:='Productos en Venta entre ' +DateToStr(DtpkIni.Date)+' y '+DateToStr(DtpkFin.Date);
1:cListado:='Productos Reservados entre '+DateToStr(DtpkIni.Date)+' y '+DateToStr(DtpkFin.Date);
2:cListado:='Productos Vendidos entre ' +DateToStr(DtpkIni.Date)+' y '+DateToStr(DtpkFin.Date);
3:cListado:='Productos Devueltos entre ' +DateToStr(DtpkIni.Date)+' y '+DateToStr(DtpkFin.Date);
4:cListado:='Productos en Venta entre ' +DateToStr(DtpkIni.Date)+' y '+DateToStr(DtpkFin.Date)+' de '+DmProveedores.IBDtsProvNOMBRE.Value;
5:cListado:='Productos Reservados entre '+DateToStr(DtpkIni.Date)+' y '+DateToStr(DtpkFin.Date)+' de '+DmProveedores.IBDtsProvNOMBRE.Value;
6:cListado:='Productos Vendidos entre ' +DateToStr(DtpkIni.Date)+' y '+DateToStr(DtpkFin.Date)+' de '+DmProveedores.IBDtsProvNOMBRE.Value;
7:cListado:='Productos Devueltos entre ' +DateToStr(DtpkIni.Date)+' y '+DateToStr(DtpkFin.Date)+' de '+DmProveedores.IBDtsProvNOMBRE.Value;
8:cListado:='Productos en venta que han superado la fecha tope.';
end;
Application.CreateForm(TfrConProductos, frConProductos);
frConProductos.ShowModal;
end;
Y luego en el formulario de consulta armo el SQL, según la opción seleccionada:
Código Delphi
[-]procedure TfrConProductos.FormActivate(Sender: TObject);
var
Sql1,Sql2:String;
begin
frConProductos.Caption:=cListado;
sql1:='select p.numero, p.codigo, p.descripcion, p.pvp, p.fventa, p.estado, P.pfinal,P.observaciones,'+
' R.numero, R.fentrega, R.codProveedor, R.Ftope, R.observaciones'+
' from productos P, Recepcion as R'+
' where P.numero = R.numero And Fentrega Between :F1 And :F2';
DmProveedores.IBDtsConProd.Close;
DmProveedores.IBDtsConProd.SelectSql.Clear;
Case frDlgProductos.RdgProductos.ItemIndex of
0:sql2:=' And Estado = 1';
1:sql2:=' And Estado = 2';
2:sql2:=' And Estado = 3';
3:sql2:=' And Estado = 4';
4:sql2:=' And Estado = 1 And CodProveedor = '+DmProveedores.IBDtsProvCODIGO.Value;
5:sql2:=' And Estado = 2 And CodProveedor = '+DmProveedores.IBDtsProvCODIGO.Value;
6:sql2:=' And Estado = 3 And CodProveedor = '+DmProveedores.IBDtsProvCODIGO.Value;
7:sql2:=' And Estado = 4 And CodProveedor = '+DmProveedores.IBDtsProvCODIGO.Value;
8:sql2:=' And Estado = 1 And fEntrega > :F3 ';
end;
if frDlgProductos.RdgProductos.ItemIndex < 8 then
begin
DmProveedores.IBDtsConProd.SelectSql.Text:=Sql1+sql2;
DmProveedores.IBDtsConProd.ParamByName('F1').AsDate:=frDlgProductos.DtpkIni.Date;
DmProveedores.IBDtsConProd.ParamByName('F2').AsDate:=frDlgProductos.DtpkFin.Date;
end
else
begin
sql1:='select p.numero, p.codigo, p.descripcion, p.pvp, p.fventa, p.estado, P.pfinal,P.observaciones,'+
' R.numero, R.fentrega, R.codProveedor, R.Ftope, R.observaciones'+
' from productos P, Recepcion as R'+
' where P.numero = R.numero And Ftope < :F3 ';
DmProveedores.IBDtsConProd.SelectSql.Text:=Sql1;
DmProveedores.IBDtsConProd.ParamByName('F3').AsDate:=Date;
end;
DmProveedores.IBDtsConProd.Open;
DmProveedores.IBDtsConProd.Last;
lbRegistros.Caption:='Número de registros:'+FormatFloat(',0',DmProveedores.IBDtsConProd.RecordCount);
end;
Un Saludo