Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-10-2006
kia kia is offline
Miembro
 
Registrado: jul 2003
Posts: 78
Poder: 21
kia Va por buen camino
Post Una de fechas ...?

Hola a todos.
Empleo D6 MDO Interbase, Estoy tratando de efectuar unos filtros en una rejilla, (bueno los filter en MDODataset no se porque no me funcionan).
He modificado las tablas por MDOdataset. Supongamos que un campo fecha 01/12/2005

Código Delphi [-]
procedure TV_equipo.Filtrar(Sender: TObject);
const
 TiposConComillas:set of TfieldType
 =[ftstring, ftdate, fttime,ftdatetime];
 var
 Campo, Operador, Valor, valor2, 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
        begin
        valor:=':tfecha';
        valor2:=Rxdbgrid1.SelectedField.AsString //string 
        end else begin
        valor:=quotedstr(Rxdbgrid1.SelectedField.AsString); //string
        end;

     if (Rxdbgrid1.SelectedField.IsNull)  //campos en blanco
     and(rxdbgrid1.SelectedField.DataType<>ftdate)then
        begin
        valor :='is null';  //fechas vacias
        if operador<>'=' then sino:='NOT ';//para fechas distinta de vacias
        operador:=''//eliminamos 
        end ;
     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 mActivarfiltro.Checked=false then
     begin
     with DMDatos.Dsetequipos do
     begin
     Close;
     SelectSQL.Clear;
     SelectSQL.Add('SELECT * FROM equipos');
     //solo string, numeros, campos vacios
    SelectSQL.add('WHERE '+sino+ format('%s %s %s',[Campo,Operador,Valor]));
     //solo fechas
     if (rxdbgrid1.SelectedField.DataType=ftdate) and (valor<>'is null') then
      DMDatos.Dsetequipos.ParamByName('tfecha').asdate:=strtodate(valor2);
     SelectSQL.Add('ORDER BY '+Campo);
     Open;
     end;
Todo bien menos con las fechas.
Problema con las fechas: como le digo que deseo todas las fechas distinta de la señalada?. Salu2 Kia Gracias (Soy novata con Interbase).
__________________
Nadie nace enseñado, pide y se te dara.
Responder Con Cita
  #2  
Antiguo 07-10-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Antes de seguir con Interbase, te recomiendo la opción libre Firebird o tendrás que pasar por caja para obtener licencias Interbase.

Creo que una fecha no debe estar en el tipo "TiposConComillas" precisamente porque si se trata como un String, puedes tener errores al interpretarse la fecha (los Americanos usan el formato mm/dd/yyyy para las fechas y los españoles el dd/mm/yyyy).

¿Por qué pasar la fecha a texto si puedes usar el tipo Tdate?

Código Delphi [-]
DMDatos.Dsetequipos.ParamByName('tfecha').asdate:= Rxdbgrid1.SelectedField.AsDate

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 08-10-2006
kia kia is offline
Miembro
 
Registrado: jul 2003
Posts: 78
Poder: 21
kia Va por buen camino
Siguiendo el hilo

Ante todo gracias.
Código Delphi [-]
DMDatos.Dsetequipos.ParamByName('tfecha').asdate:= Rxdbgrid1.SelectedField.AsDate
He probado lo que mencionas pero con asDateTime, por que la regilla Rxdbgrid1 en sus propiedades no tiene asDate. Y no fue bien.
Quizas se me olvido decir que los datos que manejo son emigrados de una aplicación con datos paradox. Creo que tiene que ver con el formato de fecha. Una que empieza ,todavia mezcla algunas cosas.

Nota: He desinstalado Interbase e instalado Firebird 1.5 sin problemas, pero las tablas las tengo en un fichero IBdatos.gdb, debo cambiar algo mas?.
Perdon por el abuso.
__________________
Nadie nace enseñado, pide y se te dara.
Responder Con Cita
  #4  
Antiguo 08-10-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Antes de hacer un Consulta.Open, haz un ShowMessage(consulta.sql.text) así verás si hay algo desfasado (un paréntesis, un espacio de menos, etc), si puedes, pega el ShowMessage en el foro.

En cuanto a Interbase, no sé si usas el Ib Expert Personal (version gratuita), si lo tienes puedes ir a Tools -> Extract metadata, marca la casilla "Extract All", ahora en la pestaña "Data Tables" pasa todas las tablas a la derecha y así copiarás todos los registros que tengas. Se abrirá una ventana Script Executive, dejala abierta.

Creas una base de datos nueva y le dices que es Firebird 1.5, ojo, elige el CharSet ISO8859_1 y el collate ES_ES si es idioma español.

Creada la nueva Base de datos y despues de registrarla en Ib Expert, en el Script Executive de los metadatos, te dará la posibilidad de elegir la nueva conexión (es decir la BBDD Firebird), despues solo con pulsar el boton execute, creará toda la estructura y registros en tu nueva BBDD Firebird.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #5  
Antiguo 10-10-2006
kia kia is offline
Miembro
 
Registrado: jul 2003
Posts: 78
Poder: 21
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
  #6  
Antiguo 10-10-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
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
  #7  
Antiguo 11-10-2006
kia kia is offline
Miembro
 
Registrado: jul 2003
Posts: 78
Poder: 21
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
  #8  
Antiguo 11-10-2006
kia kia is offline
Miembro
 
Registrado: jul 2003
Posts: 78
Poder: 21
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



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 08:59:11.


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