Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Tres filtros para un clientdataset (https://www.clubdelphi.com/foros/showthread.php?t=93020)

giulichajari 21-04-2018 13:10:54

Tres filtros para un clientdataset
 
Hola amigos,

Tengo una grilla de productos tipica de sistema de gestion y quiero filtrar por una o varias cosas al mismo tiempo:
Categoria, marca y un edit para el nombre del producto:

Código Delphi [-]
procedure actualizaGrilla;
begin
 if Form3.DBLCBCATEGORIA.KeyValue<>null then
    begin
      if Form3.DBLCBMARCA.KeyValue<>null then
        begin
          with DataModule1.cdsproductos do
            begin
                  begin
                  Filtered:=False;
                  Filter:='idcategoria=' + IntToStr( form3.DBLCBCATEGORIA.KeyValue) + 'and idmarca='+ Inttostr(Form3.DBLCBMARCA.KeyValue);
                  Filtered:=True;

                  end;

            end;
    end
    else
    begin
    with DataModule1.cdsproductos do
    begin
     Filtered:=False;
     Filter:='idcategoria=' + IntToStr(form3.DBLCBCATEGORIA.KeyValue);
     Filtered:=True;
    end;
    end;
    end
    else
    if Form3.DBLCBMARCA.KeyValue<>null then
        begin
        if Form3.DBLCBCATEGORIA.KeyValue<>null then
            begin
              with DataModule1.cdsproductos do
                begin
                      begin
                      Filtered:=False;
                      Filter:='idcategoria=' +inttostr( form3.DBLCBCATEGORIA.KeyValue) + 'and idmarca='+ inttostr(Form3.DBLCBMARCA.KeyValue);
                      Filtered:=True;

                      end;

                end;
            end
            else
            begin
              with DataModule1.cdsproductos do
                begin
                      begin
                      Filtered:=False;
                      Filter:='idmarca='+ InttoStr(Form3.DBLCBMARCA.KeyValue);
                      Filtered:=True;

                      end;

                end;
            end;
        end;


end;

Hice lo anterior para filtrar tanto por categoria como por marca, pero no se como aplicar el filtro por nombre de producto pero sobre la tabla ya filtrada por marca y/o categoria..

Alguien me puede ayudar?

Casimiro Notevi 21-04-2018 13:36:54

Código SQL [-]
select *
from tabla
where idcategoria= :aaa
and idmarca= :bbb
and nombreproducto= :ccc

¡Ah!, un clientdataset, no me hagas caso.

giulichajari 21-04-2018 21:01:28

Cita:

Empezado por Casimiro Notevi (Mensaje 525804)
Código SQL [-]
select *
from tabla
where idcategoria= :aaa
and idmarca= :bbb
and nombreproducto= :ccc

¡Ah!, un clientdataset, no me hagas caso.

Claro la idea es no realizar una consulta sql nuevamente, el dataset trabaja en memoria.

Se puede hacer aunque no se si sea la forma mas adecuada(no es objetos obviamente)


Código Delphi [-]
procedure actualizaGrilla;
begin
if form3.ENOMBRE.Text='' then
begin
 if Form3.DBLCBCATEGORIA.KeyValue<>null then
    begin
      if Form3.DBLCBMARCA.KeyValue<>null then
        begin
          with DataModule1.cdsproductos do
            begin
                  begin
                  Filtered:=False;
                  Filter:='idcategoria=' + IntToStr( form3.DBLCBCATEGORIA.KeyValue) + 'and idmarca='+ Inttostr(Form3.DBLCBMARCA.KeyValue);
                  Filtered:=True;

                  end;

            end;
    end
    else
    begin
    with DataModule1.cdsproductos do
    begin
     Filtered:=False;
     Filter:='idcategoria=' + IntToStr(form3.DBLCBCATEGORIA.KeyValue);
     Filtered:=True;
    end;
    end;
    end
    else
    if Form3.DBLCBMARCA.KeyValue<>null then
        begin
        if Form3.DBLCBCATEGORIA.KeyValue<>null then
            begin
              with DataModule1.cdsproductos do
                begin
                      begin
                      Filtered:=False;
                      Filter:='idcategoria=' +inttostr( form3.DBLCBCATEGORIA.KeyValue) + 'and idmarca='+ inttostr(Form3.DBLCBMARCA.KeyValue);
                      Filtered:=True;

                      end;

                end;
            end
            else
            begin
              with DataModule1.cdsproductos do
                begin
                      begin
                      Filtered:=False;
                      Filter:='idmarca='+ InttoStr(Form3.DBLCBMARCA.KeyValue) + 'and nombre like ''%' + Form3.ENOMBRE.Text+'%''' ;
                      Filtered:=True;

                      end;

                end;
            end;
        end;
end
else
begin
   if Form3.DBLCBCATEGORIA.KeyValue<>null then
    begin
      if Form3.DBLCBMARCA.KeyValue<>null then
        begin
          with DataModule1.cdsproductos do
            begin
                  begin
                  Filtered:=False;
                  Filter:='idcategoria=' + IntToStr( form3.DBLCBCATEGORIA.KeyValue) + 'and idmarca='+ Inttostr(Form3.DBLCBMARCA.KeyValue) + 'and nombre like ''%' + Form3.ENOMBRE.Text+'%''' ;
                  Filtered:=True;

                  end;

            end;
    end
    else
    begin
    with DataModule1.cdsproductos do
    begin
     Filtered:=False;
     Filter:='idcategoria=' + IntToStr(form3.DBLCBCATEGORIA.KeyValue) + 'and nombre like ''%' + Form3.ENOMBRE.Text+'%''' ;
     Filtered:=True;
    end;
    end;
    end
    else
    if Form3.DBLCBMARCA.KeyValue<>null then
        begin
        if Form3.DBLCBCATEGORIA.KeyValue<>null then
            begin
              with DataModule1.cdsproductos do
                begin
                      begin
                      Filtered:=False;
                      Filter:='idcategoria=' +inttostr( form3.DBLCBCATEGORIA.KeyValue) + 'and idmarca='+ inttostr(Form3.DBLCBMARCA.KeyValue)  + 'and nombre like ''%' + Form3.ENOMBRE.Text+'%''' ;
                      Filtered:=True;

                      end;

                end;
            end
            else
            begin
              with DataModule1.cdsproductos do
                begin
                      begin
                      Filtered:=False;
                      Filter:='idmarca='+ InttoStr(Form3.DBLCBMARCA.KeyValue) + 'and nombre like ''%' + Form3.ENOMBRE.Text+'%''' ;
                      Filtered:=True;

                      end;

                end;
            end;
        end;
end;


end;

comparto

Al González 22-04-2018 06:38:00

Código Delphi [-]
CDS.Filter := CDS.Filter + ' and ...';

Por cierto, intenta evitar el uso de With. Es como Facebook: en principio parece algo bueno, pero es el mismísimo Diablo. ;)

Saludos.

Casimiro Notevi 22-04-2018 14:06:41

Cita:

Empezado por Al González (Mensaje 525811)
Por cierto, intenta evitar el uso de With. Es como Facebook: en principio parece algo bueno, pero es el mismísimo Diablo. ;)

Muy bueno ^\||/

gatosoft 23-04-2018 21:50:40

Cita:

Empezado por Al González (Mensaje 525811)
Código Delphi [-]
CDS.Filter := CDS.Filter + ' and ...';
Por cierto, intenta evitar el uso de With. Es como Facebook: en principio parece algo bueno, pero es el mismísimo Diablo. ;)
Saludos.

De acuerdo con Al. el código debería ser algo como:


Código Delphi [-]
Filtered:=False;        
Filter:='';          
if form3.ENOMBRE.Text<>'' then
   Filter:= Filter +Ifthen(Filter='','',' and ')+'nombre like '+QuotedStr('%' + Form3.ENOMBRE.Text+'%');            
   
if Form3.DBLCBCATEGORIA.KeyValue<>null then
   Filter:= Filter +Ifthen(Filter='','',' and ')+'idcategoria=' + IntToStr( form3.DBLCBCATEGORIA.KeyValue) ; 
   
 if Form3.DBLCBMARCA.KeyValue<>null then
   Filter:= Filter +Ifthen(Filter='','',' and ')+'idmarca='+ Inttostr(Form3.DBLCBMARCA.KeyValue);
Filtered:=True;

La función Ifthen la encuentras en: StrUtils, si el resultado es texto y en Math si el resultado es numérico (!!??)

Existe otra alternativay es programar el evento OnFilterRecord del Dataste. Ésta se utiliza cuando la condición es mas complicada, por ejemplo:

Código Delphi [-]
procedure DTM.QueryFilterRecord(DataSet: TDataSet; var Accept: Boolean);
begin
 Accept:= (CumpleCondicion1(Parametros) and (Random(100) > 50) ) or (Nombre<>'');
end;
y el código para filtrar sería:

Código Delphi [-]
CDS.Filtered:= False;
CDS.Filtered:= True; //aquí dispara el evento


La franja horaria es GMT +2. Ahora son las 19:48:13.

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