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)
-   -   Una de fechas ...? (https://www.clubdelphi.com/foros/showthread.php?t=36310)

kia 07-10-2006 20:59:10

Una de fechas ...?
 
Hola a todos.
Empleo D6 MDO Interbase, Estoy tratando de efectuar unos filtros en una rejilla,:rolleyes: (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.:confused:
Problema con las fechas: como le digo que deseo todas las fechas distinta de la señalada?. Salu2 Kia Gracias (Soy novata con Interbase).:)

Lepe 07-10-2006 22:45:22

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

kia 08-10-2006 11:08:09

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.:o
Quizas se me olvido decir que los datos que manejo son emigrados de una aplicación con datos paradox.:rolleyes: 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.:p

Lepe 08-10-2006 14:19:04

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

kia 10-10-2006 11:56:29

Siguiendo el hilo
 
OK. con Firebird 1.5.:D Gracias.
Ya he descubierto el problema con las fechas.:rolleyes:
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,:cool: a la hora de visualizar los datos en la rejilla con las fechas se perdian al ordenar el campo y salian todos.:o creyendo que fallaba la consulta. :( Alguna idea por que ocurre solo con las fechas.? :)

Lepe 10-10-2006 16:59:33

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

kia 11-10-2006 21:02:29

Siguiendo el hilo
 
OK :D 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!!!. :p Debo reconocer que soy algo cabezona y las fechas en firebird no las domino, estoy empezando. :rolleyes: 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;

kia 11-10-2006 21:05:10

Siguiendo el hilo
 
OK :D 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!!!. :p Debo reconocer que soy algo cabezona y las fechas en firebird no las domino, estoy empezando. :rolleyes: 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;


La franja horaria es GMT +2. Ahora son las 06:28:55.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi