Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Filtro falla empleo IBX (https://www.clubdelphi.com/foros/showthread.php?t=32084)

kia 25-05-2006 21:33:47

Filtro falla empleo IBX
 
Hola.:)
Estoy tratando de adaptar un aplicacion que empleaba bde, :o ahora empleo los IBX (MDO) y con paciencia va funcionando. :rolleyes: Tengo una rejilla con un boton por el cual me filtraba los datos segun la columna donde se encuentre el cursor. Ahora no hay tabla sino un MDODataset,
cuando lo ejecuto observo que el filtrado lo ejecuta pero no me actualiza los datos en la rejilla. Sabeis donde he fallado..Soy novata y empleo D6 IB6.Gacias.;)

Código Delphi [-]
  procedure TV_equipo.Filtrar(Sender: TObject);
const
 TiposConComillas:set of TfieldType
 =[ftstring, ftdate, fttime,ftdatetime];
 var
 Campo, Operador, Valor:string;
 I:integer;
begin
  if sender= migual then
     operador:='='
   else if sender= mMayorigual then
     operador:='>='
   else if sender= mMenorigual then
     operador:='<='
   else
     operador:='<>';

  //extraemos nombre del campo
  Campo:=Rxdbgrid1.SelectedField.FieldName;
  //extraer y dar formato al valor
  if rxdbgrid1.SelectedField.DataType in TiposconComillas then
    begin
     if Rxdbgrid1.SelectedField.IsNull then //fecha en blanco
        valor :='null'
       else
        valor:=quotedstr(Rxdbgrid1.SelectedField.AsString); //string
     end
  else begin
  valor:=Rxdbgrid1.SelectedField.AsString ;
  for I := 1 to length(valor) do
     if valor[i]=DecimalSeparator then Valor[i]:='.';
  end ;
  //combinar nueva condicion con las anteriores
  If DMDatos.Dset_equipo.Filter='' then
   DMDatos.Dset_equipo.filter:=format('[%s] %s %s',[Campo,Operador, Valor])
  else
   DMDatos.Dset_equipo.filter:=format('%s AND [%s] %s %s',
   [DMDatos.Dset_equipo.filter,Campo,Operador, Valor]);
   //activar directamente el filtro
   mactivarfiltro.Checked:=true;
   DMDatos.Dset_equipo.Filtered:=true;
   DMDatos.Dset_equipo.RefreshSQL;
   label1.Caption:=inttostr(DMDatos.Dset_equipo.RecordCount);
   end;

Esta utilidad fue extraida de la "Cara oculta de D4"

kia 11-10-2006 21:16:48

Siguiendo el hilo
 
Hola :o Las respuestas son voluntarias. :cool: Despues de muchas ayudas recibidas. no estaria bien que me las guardara. :p Asi pues solucionado el problema.Lo posteo para todos.Kia:)

Funciona de maravilla.
Código Delphi [-]
//Sustituir DMDatos.Dsetequipos por vuestro Dataset.
procedure TV_equipo.Filtrar(Sender: TObject);
const
 TiposConComillas:set of TfieldType
 =[ftstring, ftdate, fttime,ftdatetime];
 var
 Campo, Operador, Valor, sino:string;
 I:integer;
begin
  sino:='';
  if sender= migual then
     operador:='='
   else if sender= mMayorigual then
     operador:='>='
   else if sender= mMenorigual then
     operador:='<='
   else
     operador:='<>';

  //extraemos nombre del campo
  Campo:=Rxdbgrid1.SelectedField.FieldName;
  //extraer y dar formato al valor
  if rxdbgrid1.SelectedField.DataType in TiposconComillas then
     BEGIN
     if rxdbgrid1.SelectedField.DataType=ftdate then //fechas
        begin
        valor:=Rxdbgrid1.SelectedField.AsString;
        valor:=QuotedStr(FormatDateTime('yyyy/mm/dd',strtodate(valor)));
        end else begin
        valor:=quotedstr(Rxdbgrid1.SelectedField.AsString); //string
        end;
     if (Rxdbgrid1.SelectedField.IsNull)  //campos nulos
     and(rxdbgrid1.SelectedField.DataType<>ftdate)then
        begin
        valor :='is null';  //fechas, string,...
        if operador<>'=' then sino:='NOT ';
        operador:='';
        end ;
     END ELSE BEGIN
     valor:=Rxdbgrid1.SelectedField.AsString ;
     for I := 1 to length(valor) do
       if valor[i]=DecimalSeparator then Valor[i]:='.';
     END ;
  if mActivarfiltro.Checked=false then  // 1º filtrado
     BEGIN
     with DMDatos.Dsetequipos do
       begin
       Close;
       SelectSQL.Clear;
       SelectSQL.Add('SELECT * FROM equipo');
       SelectSQL.add('WHERE '+sino+ format('%s %s %s',[Campo,Operador,Valor]));
       SelectSQL.Add('ORDER BY '+campo);
       Open;
       end;
     END ELSE BEGIN
     with DMDatos.Dsetequipos do  //2º filtrado y siguientes
       begin
       Close;
       //Averiguamos la posicion de la linea de Ordenamiento
       for I := SelectSQL.Count -1 downto 0 do
       if pos('ORDER BY',uppercase(SelectSQL[i])) <>0 then
       SelectSQL.Delete(i);
       SelectSQL.add ('AND '+sino+ format('%s %s %s',[Campo,Operador, Valor]));
       SelectSQL.Add('ORDER BY '+Campo);
       //ShowMessage(DMDatos.Dsetequipos.SelectSQL.text); //monitor
       open;
       end;
     END;
  mactivarfiltro.Checked:=true;
  DMDatos.Dsetequipos.Last;
  label1.Caption:=inttostr(DMDatos.Dsetequipos.RecordCount);//contador
  end;


La franja horaria es GMT +2. Ahora son las 02:16: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