Ir al contenido


Foto

Fechas de delphi a DB2


  • Por favor identifícate para responder
9 respuestas en este tema

#1 kafastoforman

kafastoforman

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 277 mensajes
  • LocationMexico D.F.

Escrito 09 febrero 2010 - 10:49

Hola muchachos, he tenido algo de tiempo pensando en una solucion para la siguiente:

Resulta que voy una base de datos de SQL y la voy a pasar a DB2, el problema del programa que estoy realizando radica en que al momento de querer pasar el dato de fecha de sql a db2, me arroja un mensaje de db2 diciendo que el formato de la fecha no es el correcto, ya lo intente pasar como datetime, como float y como string, pero me falla.

aqui un ejemplo de como lo tengo



delphi
  1. var
  2. atable: TAdoTAble;
  3. aquery: TAdoQuery;
  4. i: integer;
  5.  
  6. begin
  7.   atable:= TAdoTable.Create(self);
  8.   aquery:= TAdoQuery.Create(self);
  9.  
  10.   atable.connection:= ASQLADOConnection;
  11.   aquery.connecton:= ADB2ADOConnection;
  12.  
  13.   atable.TableName = 'mitabla';
  14.   atable.active:= true;
  15.  
  16.   aquery.SQL.Lines.Add('select * from miTabla');
  17.   aquery.open;
  18.  
  19.   aquery.Insert;
  20. //el problema es en el siguiente ciclo for, funciona bien para la mayoria de datos
  21. //pero no para los datos datetime
  22.   for i:=0 to atable.fieldCount - 1 do
  23.     aquery.fields[i].value:= atable.Fields[i].value;
  24. // ya intente : fields[i].AsDateTime = Fields[i].asDateTime y tambien con AsFloat
  25. // pero aun asi no funciona me mando error en el post
  26.  
  27.   aquery.Post;
  28.  
  29. end;



Alguien me podría ayudar porfa, no quiero tener que generar un script insert para cada uno de los registros :( aunque todo apunta a que lo tendre que hacer asi :(

De antemano gracias

atte

kafastoforman
  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 09 febrero 2010 - 10:59

Hola

Me parece que el problema puede estar en que uno es TimeStamp y el otro Date, por lo que hay una incompatibilidad de tipos.

Salud OS

  • 0

#3 kafastoforman

kafastoforman

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 277 mensajes
  • LocationMexico D.F.

Escrito 09 febrero 2010 - 11:18

Hola

Me parece que el problema puede estar en que uno es TimeStamp y el otro Date, por lo que hay una incompatibilidad de tipos.

Salud OS


Asi es amigo egostar, pense que delphi podria hacerlo y por eso le deje la responsabilidad a delphi de la conversion, pero veo que no sirve :( si alguien tiene una idea, bienvenida.  :cheesy:

Saludos

Kafastoforman
  • 0

#4 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 09 febrero 2010 - 11:25

Cual es el tipo de cada uno amigo, de eso depende la solución :)

Salud OS
  • 0

#5 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 09 febrero 2010 - 11:33

Muchas bases de datos trabajan por defecto en formato americano.

Seguramente hay una forma mejor de arreglarlo, pero también puedes pasarle los datos en ese formato :

aquery.fields[i].value :=  FormatDateTime(atable.Fields[i].value, 'mm/dd/yyyy');

Saludos.
  • 0

#6 kafastoforman

kafastoforman

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 277 mensajes
  • LocationMexico D.F.

Escrito 09 febrero 2010 - 11:44

Muchas bases de datos trabajan por defecto en formato americano.

Seguramente hay una forma mejor de arreglarlo, pero también puedes pasarle los datos en ese formato :

aquery.fields[i].value :=  FormatDateTime(atable.Fields[i].value, 'mm/dd/yyyy');

Saludos.


Asi es marc, ya lo habia intentado asi, pero el problema estaba en que para que entrara a esa linea de codigo, ponia un if que comparaba el tipo de dato que me arrojaba el query de db2, y resulta que todos los campos del query me los manejaba como string  :embarrassed: asi que tuve que consultar los tipos de datos que arrojaba la tabla de SQL y asi, entraba correctamente a la linea de codigo que formateaba la fecha.

Muchisimas gracias, marc y egostar ;) ya funcionó :D
  • 0

#7 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 09 febrero 2010 - 11:45

Pregunta: ¿es desde MSSQL o SQL Server a DB2?.

de todos modos intenta haciendo esta consulta:



delphi
  1. aquery.SQL.Lines.Add('SELECT convert(datetime,[fecha_tipo_timestamp],101) as fecha from mi tabla ');



Saludos.

PD: Caray contesté tarde (b).
  • 0

#8 kafastoforman

kafastoforman

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 277 mensajes
  • LocationMexico D.F.

Escrito 09 febrero 2010 - 12:02

Pregunta: ¿es desde MSSQL o SQL Server a DB2?.


Desde Microsoft SQL Server 2000 a DB2




delphi
  1. aquery.SQL.Lines.Add('SELECT convert(datetime,[fecha_tipo_timestamp],101) as fecha from mi tabla ');



Lo que queria, era evitarme tener que hacer la consulta por cada registro, ya que no solo va un dato, si no van muchos datos y diferentes tablas.

PD: Caray contesté tarde (b).


Jajajajaja, amigo nunca es tarde y menos con una chela en mano jajajajajaja (b)

Saludos y gracas enecumene ;)
  • 0

#9 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 09 febrero 2010 - 12:03

Hola,
¿Los componentes son ADO?

Si es el caso, tengo entendido que se sugiere especificar el tipo de dato (propiedad DataType) a los campos. Como no uso DB2 no sabría decir, pero creo que con indicar que el campo debe tomarse como ftDate o ftDateTime basta.

En teoría, con indicar el tipo, el "motor" solito se encargará de darle el formato adecuado.

EDITO:
Y si es como indica Egostar que se trata de una incompatibilidad entre TimeStamp y TDate o TDateTime, puede hacerse uso de una función poco conocida: TimeStampToDateTime.

Converts a TTimeStamp value into the corresponding TDateTime value.

Unit

SysUtils

Category

date/time routines

function TimeStampToDateTime(const TimeStamp: TTimeStamp): TDateTime;

Description

Call TimeStampToDateTime to convert a TTimeStamp value into a TDateTime value. TTimeStamp values represent time as separate date and time values, where the date is the number of calendar days since the start of the current calendar (that is, January 1, 0001 would have a value of 1), and time is the number of milliseconds since midnight. TDateTime values represent time as the number of days (including fractional days) that have elapsed since 12:00 am on December 30, 1899.


Saludos,
  • 0

#10 kafastoforman

kafastoforman

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 277 mensajes
  • LocationMexico D.F.

Escrito 09 febrero 2010 - 12:18

Hola,
¿Los componentes son ADO?

Si es el caso, tengo entendido que se sugiere especificar el tipo de dato (propiedad DataType) a los campos. Como no uso DB2 no sabría decir, pero creo que con indicar que el campo debe tomarse como ftDate o ftDateTime basta.

En teoría, con indicar el tipo, el "motor" solito se encargará de darle el formato adecuado.

EDITO:
Y si es como indica Egostar que se trata de una incompatibilidad entre TimeStamp y TDate o TDateTime, puede hacerse uso de una función poco conocida: TimeStampToDateTime.

Converts a TTimeStamp value into the corresponding TDateTime value.

Unit

SysUtils

Category

date/time routines

function TimeStampToDateTime(const TimeStamp: TTimeStamp): TDateTime;

Description

Call TimeStampToDateTime to convert a TTimeStamp value into a TDateTime value. TTimeStamp values represent time as separate date and time values, where the date is the number of calendar days since the start of the current calendar (that is, January 1, 0001 would have a value of 1), and time is the number of milliseconds since midnight. TDateTime values represent time as the number of days (including fractional days) that have elapsed since 12:00 am on December 30, 1899.


Saludos,


Asi es Delphius, en efecto los componente son ado y yo pensaba lo mismo, que lo tendria que hacer por default, pero no lo hace para db2 ignoro por que, es mas al principio en vez de usar un query queria tambien usar un table para insertar los datos en db2, pero me salia tambien un error cuando ejecutaba, que el objecto o componente no soportaba peticiones, asi que depues de varias depuraciones me di cuenta de que db2 te maneja todos los campos del query como del tipo ftstring, y por eso mismo nunca hacia la conversion de fecha de ese campo, ya que nunca encontraba un campo del tipo fttime, ftdate o ftdatetime.

Saludos

Kafastoforman
  • 0




IP.Board spam blocked by CleanTalk.