PDA

Ver la Versión Completa : Problema con fechas de Firebird


egbaquela
05-07-2010, 04:51:34
Hola a todos. Estoy teniendo un problema con el tipo de datos "Date" en Firebird. Cree una base de datos en Firebird y exporté masivamente datos de otra base de datos de MS Access. Los campos de tipo "Date" del MS Access los capturé así:

procedure ExportarDatos
var
DTFecha: string;
Dia, Mes, Anio : word;
...
begin
...
if dmdDataMod.SQLTabla.FieldByName('DTFecha').AsString = '' then
DTFecha:= 'NULL'
else
begin
DecodeDate(dmdDataMod.SQLITabla.FieldByName('DTFecha').AsDateTime, Anio, Mes, Dia);
DTFecha := '''' + inttostr(Dia) + '.' + inttostr(Mes) + '.' + inttostr(Anio) + '''';
end;
...

Y para cargar los datos a la base firebird utilicé la siguiente consulta SQL (dentro del mismo procedimiento anterior):

with SQLEjecutable do begin
close;
sql.clear;
sql.add('INSERT INTO tblTabla(..., DTFecha,... ) VALUES (... +', ' + DTFecha +', ' ...);
readonly:= true;
usePrimaryKeyAsKey:= false;
end;
if SQLTransaction.Active then SQLTransaction.Commit;
SQLTransaction.StartTransaction;
SQLEjecutable.ExecSQL;
SQLTransaction.Commit;

Los datos se graban correctamente, y al utilizar un SELECT también me aparecen con el valor correcto. El problema es cuando actualizo registros desde el cliente de la aplicación (ya no de Access, sinó desde Lazarus). Los registros los actualizo con el siguiente código:

procedure actualizarRegistro
var
strFecha: string;
Dia, Mes, Anio : word;
begin
DecodeDate(deFecha.Date , Anio, Mes, Dia);
strFecha := '''' + inttostr(Dia) + '.' + inttostr(Mes) + '.' + inttostr(Anio) + '''';
with SqlQuery do begin
close;
sql.clear;
sql.add('UPDATE tblIsometricos SET dtFecha = ' + strFecha + ' WHERE IDReg = ' + SQLTabla.FieldByName('IDReg').AsString);
readonly:= true;
usePrimaryKeyAsKey:= false;
end;
if SQLTransaction.Active then SQLTransaction.Commit;
SQLTransaction.StartTransaction;
SQLQuery.open ;
end;

Donde "deFecha" es un TDateEdit de form que ejecuta el procedimiento, "SQLQuery", "SQLTabla" y "SQLEjecutable" son TSQLQuery, "SQLTransaction" es un SQLTransaction.
Cuando hago un SELECT y muestro los resultados en un TDBGrid, las fechas me parecen en el formato del sistema operativo (Windows XP en mi caso), el cual es DD/MM/YYYY. Pero, cuando exporto el contenido de la tabla a un archivo "TXT", las fechas que se cargaron en forma masiva siguen respetanto el formato DD/MM/YYYY pero la que se agregaron desde el cliente se cambian al formato MM/DD/YYYY, por mas que en el TDBGrid se muestren como DD/MM/YYYY. La obtención de la fecha para la exportación la realizo con el siguiente código:

var
strFecha: string;
...
begin
...
strFecha:= SQLTabla.FieldByName('dtFecha').AsString;
...
end;

Cualquier exportación dispone tanto de registros "nuevos" como de los cargados masivamente. Lo que me desconcierta es que este cambio de formato lo realiza solo para los registros "nuevos", los registros cargados masivamente se comportan correctamente (es decir, tanto en el TDBGrid como en el archivo de texto generado mantienen el mismo formato).
¿Alguien sabe por que puede estar pasando esto?.
Saludos, Gabriel.

PD: la versión de lázarus que uso es la 0.9.27.
www.egbaquela.com.ar (http://www.egbaquela.com.ar)

Casimiro Notevi
05-07-2010, 10:16:19
Me he perdido un poco en tu explicación, pero hay algo que no entiendo, si usas un campo del tipo date para las fechas, ¿por qué usas una variable string para trabajar con ella?. Debes usar un tdatetime, salvo que conviertas el string en date, pero no me ha parecido verlo en tu código.

egbaquela
05-07-2010, 12:37:45
Hola: la variable string la uso para armar la sentencia SQL. PAso las fechas a un string y después la concateno con el resto de la sentencia SQL. En estos procedimientos no hago ninguna otra operación con las fechas.
Saludos, Gabriel.

Casimiro Notevi
05-07-2010, 13:10:06
Pero lo que no me queda claro es el problema en sí, ¿que te sale con distinto formato?

egbaquela
06-07-2010, 03:03:52
Bueno, el campo fecha de cada registro lo escribo de dos formas, con un INSERT al crear un registro nuevo o con un UPDATE para modificarlo, ambos con el formato dd.mm.yyyy . Cuando los visualizo en el dbgrid, tanto las fechas cargadas en el INSERT como las actualizadas con UPDATE se ven en formato dd/mm/yyyy, pero cuando exporto el contenido de la tabla a un TXT (copiando el valor del campo a un string mediante "fieldByName" de un TSQLQuery), los datos cargados de la primer forma me los lee en formato dd/mm/yyyy, mientras que los que se cargaron mediante la consulta de actualización se leen en formato mm/dd/yyyy (aunque en el dbgrid se leen de otra forma).
Saludos, Gabriel.

egbaquela
06-07-2010, 03:42:25
Revisando la tabla con el IBAccess, todos los registros están cargados en formato MM/DD/YYYY (como los almacena Firebird), pero según como se haya cargado el dato me los sigue mostrando en forma diferente.
Probé capturar la fecha mediante un DecodeDate en vez de utilizar el FieldByName().AsString, pero sigo teniendo el mismo problema.

Por Ejemplo, el IBAcces me muestra esto:

CampoFecha
05/16/2010 00:00:00
05/19/2010 00:00:00
05/21/2010 00:00:00
06/01/2010 00:00:00

Haciendo una consulta y mostrandola en un dbGrid obtengo:

CampoFecha
16/05/2010
19/05/2010
21/05/2010
01/06/2010

Pero al leer un registro a la vez y guardar su contenido en un string obtengo:

16/05/2010
19/05/2010
21/05/2010
06/01/2010 -- (Este es el error)

Estoy totalmente desconcertado ¿?
Saludos, Gabriel.

egbaquela
06-07-2010, 03:59:22
Bueno, al final lo pude solucionar pero no muy ortodoxamente: en vez de consultar la tabla, consulto una vista de SQL que en vez del campo fecha tiene los campos día, mes y año extraidos con las funciones Day, Month y Year de Firebird. Después, concateno los valores en un string.
Igual, me quedó la duda de porque Lazarus se comporta así.
Saludos, Gabriel.