Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 10-10-2006
kia kia is offline
Miembro
 
Registrado: jul 2003
Posts: 78
Poder: 23
kia Va por buen camino
Post Siguiendo el hilo

OK. con Firebird 1.5. Gracias.
Ya he descubierto el problema con las fechas.
Cambios efectuados:
Código Delphi [-]
 valor2:= formatDateTime('dd/mm/yyyy', Rxdbgrid1.SelectedField.asdatetime); 
close;
   SelectSQL.Clear;
   SelectSQL.Add('SELECT * FROM equipos');
    SelectSQL.add('WHERE '+sino+ format('%s %s %s',[Campo,Operador,Valor]));

     if (rxdbgrid1.SelectedField.DataType=ftdate) and (valor<>'is null') then
         begin
         showmessage('fecha no nula');
         DMDatos.Dsetequipos.ParamByName('tfecha').AsDateTime:=valor2;
        end;
        //Con fechas no se puede ordenar, no salen datos,ni error.
       // SelectSQL.Add('ORDER BY '+campo);
     ShowMessage(DMDatos.Dsetequipos.SelectSQL.text);
     Open;
      DMDatos.Dsetequipos.Last;
     label1.Caption:=inttostr(DMDatos.Dsetequipos.RecordCount);
     end;

Funcionaban todas las consultas, a la hora de visualizar los datos en la rejilla con las fechas se perdian al ordenar el campo y salian todos. creyendo que fallaba la consulta. Alguna idea por que ocurre solo con las fechas.?
__________________
Nadie nace enseñado, pide y se te dara.
Responder Con Cita
  #2  
Antiguo 10-10-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 31
Lepe Va por buen camino
Intenta esto:
Código Delphi [-]
uses DateUtils;

 DMDatos.Dsetequipos.ParamByName('tfecha').AsDateTime:= 
                RecodeTime(Rxdbgrid1.SelectedField.asdatetime, 0,0,0,0);

Me da que es el típico fallo de siempre, pasas una fecha 01/02/2000 y lo interpreta como mm/dd/yyyy.

Ten en cuenta que formatDateTime te devuelve un String, por tanto valor2 tendrá un String en formato dd/mm/yyyy, pero despues Firebird al asignar esa fecha al parámetro de la consulta, es donde no sabe en qué formato está la fecha, si mm/dd o bien dd/mm, si la fecha encaja en el formato mm/dd directamente lo manda en ese formato (por ejemplo todas cuyo día sea menor o igual que 12); si el día es mayor a 12, entonces lo intenta encajar en el formato dd/mm/yyyy.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #3  
Antiguo 11-10-2006
kia kia is offline
Miembro
 
Registrado: jul 2003
Posts: 78
Poder: 23
kia Va por buen camino
Post Siguiendo el hilo

OK el filtro recursivo para ibDataset/MDOdataset, (no tablas).
Lepe distes en el clavo despues de muchos cambios y adaptar la linea del filtro como hizo Neomanar en otro post. ¡¡¡¡Funciono por fin!!!. Debo reconocer que soy algo cabezona y las fechas en firebird no las domino, estoy empezando. Muchas gracias por lo que me habeis enseñado. Kia
Para quien le pueda interesar lo posteo:

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;

Si empleamos TablasIB o MDOTable el filtro para fecha seria:
Código Delphi [-]
with DMDatos.Dsetequipos do
Filter:='FECHA= '+QuotedStr(FormatDateTime('yyyy/mm/dd',strtodate(valor)));
Filtered:=true;
__________________
Nadie nace enseñado, pide y se te dara.
Responder Con Cita
  #4  
Antiguo 11-10-2006
kia kia is offline
Miembro
 
Registrado: jul 2003
Posts: 78
Poder: 23
kia Va por buen camino
Post Siguiendo el hilo

OK el filtro recursivo para ibDataset/MDOdataset, (no tablas).
Lepe distes en el clavo despues de muchos cambios y adaptar la linea del filtro como hizo Neomanar en otro post. ¡¡¡¡Funciono por fin!!!. Debo reconocer que soy algo cabezona y las fechas en firebird no las domino, estoy empezando. Muchas gracias por lo que me habeis enseñado. Kia
Para quien le pueda interesar lo posteo:

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
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Fechas federiconqn21 Varios 1 04-05-2006 15:30:01
Las horribles fechas, control de fechas Huer OOP 6 18-10-2005 19:11:49
Fechas jmlifi Varios 2 11-04-2005 16:40:22
sql con fechas soloriv SQL 4 11-03-2005 21:12:49
Fechas SQL ronson SQL 2 11-03-2004 11:48:34


La franja horaria es GMT +2. Ahora son las 06:13:31.


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
Copyright 1996-2007 Club Delphi