Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   filtrado por condicion (https://www.clubdelphi.com/foros/showthread.php?t=34211)

aanil 01-08-2006 15:57:15

filtrado por condicion
 
Hola a todos, quiero ayuda:
Este codigo es para filtrar de acuerdo a una condicion:
Si tengo RB1.check hace un filtrado por lo que se escriba en el Edit1.text.
Si tengo RB2.check hace un filtrado por lo que se escriba en los Edit1.text y Edit2.Text (Hasta aqui me funciona bien)
Si tento RB3.Check deberia hacer un filtrado por los que se escriba en los Edit1.text , Edit2.Text y Edit3.text, pero no hace nada: Que es lo que tiene de malo?

Este es el codigo:
Código Delphi [-]
procedure TDist06.SpeedButton2Click(Sender: TObject);
begin
if rb1.Checked then
if (edit1.Text <>'')then
begin
datam6.MATRICULA.Filter := 'CENT_CODIGO ='''+Edit1.Text+'''';
end else
if rb2.Checked then
if (edit1.Text <>'')and (edit2.Text <>'')then
begin
datam6.MATRICULA.Filter := 'CENT_CODIGO ='''+Edit1.Text+''' and CESE_CODIGO ='''+edit2.Text+'''';
end else
if rb3.Checked then
if (edit1.Text <>'')and (edit2.Text <>'')and (edit3.Text <>'')then
begin
datam6.MATRICULA.Filter := 'CENT_CODIGO ='''+Edit1.Text+''' and CESE_CODIGO ='''+Edit3.Text+''' and STATUS ='''+edit3.Text +'''';
end;
datam6.MATRICULA.Filtered := true;
end;
AAnil

vtdeleon 01-08-2006 16:26:03

Saludos

En ninguno de los caso funciona?, Te aseguraste de que el dato a filtrar está en la tabla?, Recuerda que es sensible a Mayuscula y minuscula!

Antes de esto "datam6.MATRICULA.Filtered := true;, muestra lo que tienes en el Filter con Showmessage(datam6.matriculo.filter)

Lepe 01-08-2006 16:50:23

Yo lo haría de otra forma, porque si tiene marcado el rb3 y no tiene nada escrito en el Edit1, el tema fallará. En estos casos hay que cuadrar todos las posibilidades.

Cuando estudies las funciones verás que es casi casi copy and paste, pero muy fácil de ampliar con más condiciones
Código Delphi [-]
procedure TDist06.SpeedButton2Click(Sender: TObject);
var filtro :string;
begin
filtro := emptystr;
filtro := checkrb1(filtro);
filtro := checkrb2(filtro);
filtro := checkrb3(filtro);
datam6.MATRICULA.Filtered := false;
datam6.MATRICULA.Filter := filtro;
datam6.MATRICULA.Filtered := true;
end;

function checkrb1(filtroAnterior:string):string;
begin
  result := filtroAnterior;
  if rb1.Checked then
  if (edit1.Text <>'')then
    result := 'CENT_CODIGO ='''+Edit1.Text+'''';
end;


function checkrb2(filtroAnterior:string):string;
begin 
  result := filtroAnterior;
  if rb2.Checked then
  if (edit2.Text <>'') then
  begin
   if result <> EmptyStr then
     result := result + ' and ';
   result := result + 'CESE_CODIGO ='''+edit2.Text+'''';
  end;
end;

function checkrb3(filtroAnterior:string):string;
begin
  result := filtroAnterior;
  if rb3.Checked then
  if (edit3.Text <>'') then
  begin
  if Result <> EmptyStr then
    result := result + ' and ';
  result := result + 'STATUS ='''+edit3.Text +'''';
  end;
end;

Queda un tema pendiente.... donde dice EditX.Text <> '' debería decir:

Trim(EditX.text) <> EmptyStr

que los usuarios son muy suyos y con introducir un espacio en blanco ya se fastidia la consulta.

Edito: Incluso podrías quitar los "rb" ya que no aportan nada nuevo, si el usuario escribe algo en una caja de texto, se añade la condición, si no escribe nada, se elimina del filtro.

Saludos

fer21unmsm 03-08-2006 19:13:22

Cita:

Empezado por aanil
Hola a todos, quiero ayuda:
Este codigo es para filtrar de acuerdo a una condicion:
Si tengo RB1.check hace un filtrado por lo que se escriba en el Edit1.text.
Si tengo RB2.check hace un filtrado por lo que se escriba en los Edit1.text y Edit2.Text (Hasta aqui me funciona bien)
Si tento RB3.Check deberia hacer un filtrado por los que se escriba en los Edit1.text , Edit2.Text y Edit3.text, pero no hace nada: Que es lo que tiene de malo?

Este es el codigo:Código Delphi [-]procedure TDist06.SpeedButton2Click(Sender: TObject); begin if rb1.Checked then if (edit1.Text <>'')then begin datam6.MATRICULA.Filter := 'CENT_CODIGO ='''+Edit1.Text+''''; end else if rb2.Checked then if (edit1.Text <>'')and (edit2.Text <>'')then begin datam6.MATRICULA.Filter := 'CENT_CODIGO ='''+Edit1.Text+''' and CESE_CODIGO ='''+edit2.Text+''''; end else if rb3.Checked then if (edit1.Text <>'')and (edit2.Text <>'')and (edit3.Text <>'')then begin datam6.MATRICULA.Filter := 'CENT_CODIGO ='''+Edit1.Text+''' and CESE_CODIGO ='''+Edit3.Text+''' and STATUS ='''+edit3.Text +''''; end; datam6.MATRICULA.Filtered := true; end;

AAnil

Hola AAnil, el filtrado de rb3 no te bota nada porque en la línea:
Código Delphi [-]
datam6.MATRICULA.Filter := 'CENT_CODIGO ='''+Edit1.Text+''' and CESE_CODIGO ='''+Edit3.Text+''' and STATUS ='''+edit3.Text +'''';
Pones dos veces "Edit3.Text", y en la segunda debería decir Edit2.Text

Saludos


La franja horaria es GMT +2. Ahora son las 22:09:19.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi