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)
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)