Ver Mensaje Individual
  #2  
Antiguo 11-10-2006
kia kia is offline
Miembro
 
Registrado: jul 2003
Posts: 78
Reputación: 21
kia Va por buen camino
Thumbs up Siguiendo el hilo

Hola Las respuestas son voluntarias. Despues de muchas ayudas recibidas. no estaria bien que me las guardara. 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;
__________________
Nadie nace enseñado, pide y se te dara.
Responder Con Cita