Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Filtrar un resultado en DBGRID desde dos combobox (https://www.clubdelphi.com/foros/showthread.php?t=73511)

ZiriusB 27-04-2011 18:02:35

Filtrar un resultado en DBGRID desde dos combobox
 
Buenas,

Tengo un problema, tengo una base de datos con un campo MES que me guarda el nombre del mes en curso, eje.: Marzo, Abril, Agosto.

Tengo un formulario con un DBGRID donde quiero mostrar un resultado, el hecho es que tengo dos combobox "CMBDESDE" y "CMBHASTA" quiero que en el DBGRID se me filtren los resultados que seleccione en los dos combobox, es decir; Coloco en CMBDESDE: Enero y en CMBHASTA: Abril, en el dbgrid me mostraria todos los resultados que esten entre Enero y Abril (Enero, Febrero, Marzo, Abril)

Sera posible una mano para eso...estoy algo parado en este paso!

Gracias

droguerman 27-04-2011 18:09:04

en el evento onChange de los combos:

Código Delphi [-]
with dbgrid.datasource.dataset do
begin
  filter := 'mes>='+IntToStr(cmbdesde.itemIndex+1)+ ' AND mes<='+IntToStr(cmbhasta.itemIndex+1);
filtered := true;
end;

ZiriusB 27-04-2011 18:48:13

No me muestra resultado alguno en el dbgrid!

oscarac 27-04-2011 19:16:48

me parece que en lugar de filtrar por el nombre del mes debes hacer un artificio para filtrar por el "numero" del mes

ecfisa 27-04-2011 19:17:13

Hola.

Código Delphi [-]
....
procedure TForm1.FormShow(Sender: TObject);
begin
  ComboBox1.ItemIndex:= 0;
  ComboBox2.ItemIndex:= ComboBox2.Items.Count -1;
end;

procedure TForm1.ComboBoxChange(Sender: TObject);
begin
  with DBGrid1.DataSource do
  begin
    DataSet.Filtered:= False;
    DataSet.Filter:= 'MES >= '+QuotedStr(ComboBox1.Items[ComboBox1.ItemIndex])+
                   ' AND MES <= '+QuotedStr(ComboBox2.Items[ComboBox2.ItemIndex]);
    DataSet.Filtered:= True;
  end; 
end;
...
Por supuesto funciona si en los combos tenés los nombres de los meses y asignas ComboBoxChange al evento OnChange de los dos combos...

Un saludo.

ZiriusB 27-04-2011 20:48:22

Muchas gracias por su ayuda, hice exactamente lo que me dijiste...le asigne Comboboxchange a ambos comobox, y ajuste el codigo a mi proyecto...Sin embargo los resultados no se ajustan a lo que quiero! Explico:

Si Selecciono ENERO y DICIEMBRE no me muestra resultados...

Si selecciono ENERO y NOVIEMBRE me muestra solo algunos resultados (ENERO, FEBRERO, MARZO, MAYO, JULIO, JUNIO, NOVIEMBRE) aun cuando también tengo ABRIL, DICIEMBRE en mis registros...

¿A que podría deberse?

oscarac 27-04-2011 20:54:01

no lo se no he podido hacer pruebas
pero me parece que deberias hacer el filtro por numero de mes en lugar de nombre de mes salvo error u omision

ecfisa 28-04-2011 00:43:43

Hola ZiriusB.

Es realmente extraño, a mí me funciona correctamente esté o no la columna ordenada alfabéticamente...
La prueba la realizé sobre Firebird, pero para estar seguro que trabajemos sobre los mismos datos y no sé que BD estás usando,
el código lo ajusté a la tabla Country (DBDDEMOS) ya que viene con Delphi.

Te adjunto la prueba para que puedas realizar las comprobaciones necesarias y si encontras algún caso en que no se cumpla la condición
del filtro, lo vemos en concreto.

Un saludo.

JoseAntonio 28-04-2011 07:47:03

es un problema de mal diseño, si quieres hacer un filtro por mes, debes definir dicho campo (en tu base de datos) como entero, si lo defines como cadena, el filtro no funcionara por que al hacer el filtro el componente dataset no sabra que 'MARZO' < 'ABRIL' puesto que el componente hace la comparacion por orden alfabetico cuando se trata de cadenas, suerte, salu2

Neftali [Germán.Estévez] 28-04-2011 10:29:30

Aquí tienes un ejemplo de cómo realizar filtros sobre un Grid. Es ente caso se usa un exto de un Edit, pero la mecánica es la misma si el valor sale de un combo.

ecfisa 28-04-2011 10:56:15

Hola.

Lo que lleva rato diciendo oscarac :) y ahora ratifica JoseAntonio lo dice todo: El algorítmo es correcto, pero no es aplicable a este caso... ;)

Se me escapó el carácter ordinal de los nombres de los meses que no es precisamente el alfabético...

Una idea que se me ocurre (y no es la mejor por que ensucias la tabla), es agregar un campo 'NroMes' de tipo numérico que se
corresponda con el mes del registro.

En el DBGrid deberías agregar todas las columnas menos la correspondiente a ese campo, luego podrías hacer:

Código Delphi [-]
...
function MesANro(Mes: string): Integer;
const 
   Nombre: array[1..12] of string=('ENERO','FEBRERO','MARZO','ABRIL','MAYO',
  'JUNIO','JULIO','AGOSTO','SEPTIEMBRE','OCTUBRE','NOVIEMBRE','DICIEMBRE');
var
  i: Byte;
begin
  i:= 1;
  while Nombre[i] <> UpperCase(Mes) do Inc(i);
  Result:= i;
end;

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  with DBGrid1.DataSource do
  begin
    DataSet.Filtered:= False;
    DataSet.Filter:= 'NroMes >= '+
            QuotedStr(IntToStr(MesANro(ComboBox1.Items[ComboBox1.ItemIndex])))+
                     ' AND NroMes <= '+
            QuotedStr(IntToStr(MesANro(ComboBox2.Items[ComboBox2.ItemIndex])));
    DataSet.Filtered:= True;
  end;
end;

No es "la" solución, pero no se me ocurre otra cosa usando filtros.


Un saludo.

ZiriusB 28-04-2011 15:59:07

Ok adopte una mejor opcion y mas rapida, luego pruebo con los nombres...

Me fui por los Numeros, una cosa que quiero dejar clara es que yo no tomo los valores de la base de datos para cargarlos a los Combobox, en la Propiedad ITEMS ahi coloco (1,2,3,4,5,6,7,8,9,10,11,12) ya que es una tabla en donde van a ir varios trabajadors con el mismo mes.

Lo cambie a numeros y todo bien hasta cierto punto...Al seleccionar del mes 1 al mes 11 me selecciona solo (1,11,12) supongo que solo esta tomando el primer numero "1" al seleccionar del mes 2 al mes 12,11 o 10 no me muestra resultados sin embargo si selecciono del mes 2 al 9 si me hace bien la busqueda!

Gracias por su ayuda, la aprecio mucho...

oscarac 28-04-2011 16:15:46

mmm
entonces el campo no es entero, debe ser de tipo caracter por eso no te funciona

ZiriusB 28-04-2011 16:45:48

Pues si, de hecho con tantas cosas en la cabeza no guarde el cambio que hice a Entero! por eso aun no lo tomaba...gracias, resuelto!!

Un millon por sus opiniones y ayuda! fueron un gran impulso!

zeta2 21-05-2011 00:09:53

Muchachos, he querido filtrar un dblookupcombobox y me sale un error. me llama la atención por que lo he hecho tantas veces y ahora no me sale, no se si se me está pasando algo...

Les envío el código y el mensaje de error...

Código:

procedure TFBuscar.DBLCBCargoClick(Sender: TObject);
begin
 FPrincipal.TBCargos.Open;
 FPrincipal.TBCargos.Filter:= 'Cátedra o Cargo =' +QuotedStr(DBLCBCargo.Text);
 FPrincipal.TBCargos.Filtered:= True;
 DBLCBIDSARH.Enabled:= True;
end;

El mensaje de error que me sale es:

TBCargos: Field 'C' not found.

FPrincipal: Formulario principal donde se encuentra el ttable.
TBCargos: Ttable
DBLCBCargo: dblookupcombobox donde programo el evento
DBLCBIDSARH: otro dblookupcomboboxque sólo habilito cuandoya se hizo el fintrado.

Gracias por su tiempo...
Saludos.

oscarac 21-05-2011 00:14:39

el campo de tu tabla tiene acentro? Cátedra????

no estoy seguro (porque no uso filtros)... pero no creo que el operador logico "o" exista en delphi

Prueba asi
Código Delphi [-]
procedure TFBuscar.DBLCBCargoClick(Sender: TObject);

FPrincipal.TBCargos.Filter:= 'Catedra =' +QuotedStr(DBLCBCargo.Text) + ' or Cargo =' +QuotedStr(DBLCBCargo.Text) 
end;

zeta2 21-05-2011 00:21:20

"Cátedra o Cargo" es el nombre del campo.
=p

Pruebo lo que me pasaste...

Gracias por responder.

oscarac 21-05-2011 00:23:39

ah pues pense que eran 2 campos diferentes.....
los nombres de los campos que uso no son asi

zeta2 21-05-2011 00:29:11

Gracias chicos, ahí resolví el problema, no se por qué pero no me acepta nombre de campos que contenga más de una palabra...

En lugar de poner

"Cátedras o Cargos" puse "Cargos"

Gracias por todo chicos.

martinartaza 06-06-2011 16:04:37

no te acepta por el espacio.
 
Proba con corchetes.
Código Delphi [-]
FPrincipal.TBCargos.Filter:= '[Cátedras o Cargos]' = QuotedStr(DBLCBCargo.Text)

Ahí debería funcionar.


La franja horaria es GMT +2. Ahora son las 01:53:48.

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