Utilizamos cookies propias y de terceros. [Más información sobre las cookies].
Política de cookies
Proyecto AjpdSoft

· Inicio
· Buscar
· Contactar
· Cookies
· Descargas
· Foros
· Historia
· Nosotros
· Temas
· Top 10
· Trucos
· Tutoriales
· Wiki
Proyecto AjpdSoft: Foros

AjpdSoft :: Ver tema - Campos DateTime en tablas DBF (FoxPro)
Foros de discusión Buscar Perfil FAQ Iniciar sesión
Information Campos DateTime en tablas DBF (FoxPro)

Publicar nuevo tema Responder al tema
Foros de discusión » Borland Delphi, Codegear Delphi .Net   
Ver tema anterior :: Ver tema siguiente
AutorMensaje
JordiP
Buen usuario


Registrado: Oct 28, 2009
Mensajes: 12

Asunto: Campos DateTime en tablas DBF (FoxPro) Responder citando

Buenas, se me presenta un problema, quiero pasar información de una base de datos en Delphi a una tabla DBF de FoxPro.

Cuando leo registros con campos fecha (Date o DateTime) de la tabla DBF, no tengo problemas, se lee perfectamente como un string. El formato es '10/10/2010 06:15:20' para campos DateTime.

El problema se presenta cuando quiero insertar o modificar dicho campo fecha (DateTime) me graba solamente la fecha y la hora siempre poner "12:00:00 AM" y no la que yo le quiero grabar

El codigo que he probado (en delphi) es el siguiente:

Código:
with DataModule1.ADOQuery_Importar do
begin 
    active:=false; 
    connectionString:='Provider=VFPOLEDB.1;Data Source=C:\baseDatos;Password="";Collating Sequence=MACHINE';
    SQL.Clear;  SQL.Add('INSERT INTO table2 (fecha) VALUES (:FECHA)');
    Parameters.ParamByName('FECHA').DataType := ftDateTime;
    Parameters.ParamByName('FECHA').Value := StrToDateTime('13/12/2040 11:22:33'); 
    ExecSQL;
end;


Para que entendais bien, lo que se ve en la tabla una vez insertado el registro es '13/12/2040 12:00:00 AM'. Como veis la fecha es correcta pero la hora no lo es.

Que puede estar ocurriendo ya no se que mirar ni que probar. icon_question.gif icon_question.gif

Por favor si alguien tiene alguna posible solución, agradeceria que lo comentasen.

Un saludo a todos
MensajePublicado:
Mie Oct 28, 2009 6:32 am
Top of PageVer perfil de usuario
alonsojpd
Administrador/Moderador


Registrado: Sep 16, 2003
Mensajes: 2687

Asunto: Re: Campos DateTime en tablas DBF (FoxPro) Responder citando



Anuncios



JordiP escribió:
Buenas, se me presenta un problema, quiero pasar información de una base de datos en Delphi a una tabla DBF de FoxPro.

Cuando leo registros con campos fecha (Date o DateTime) de la tabla DBF, no tengo problemas, se lee perfectamente como un string. El formato es '10/10/2010 06:15:20' para campos DateTime.

El problema se presenta cuando quiero insertar o modificar dicho campo fecha (DateTime) me graba solamente la fecha y la hora siempre poner "12:00:00 AM" y no la que yo le quiero grabar

El codigo que he probado (en delphi) es el siguiente:

Código:
with DataModule1.ADOQuery_Importar do
begin 
    active:=false; 
    connectionString:='Provider=VFPOLEDB.1;Data Source=C:\baseDatos;Password="";Collating Sequence=MACHINE';
    SQL.Clear;  SQL.Add('INSERT INTO table2 (fecha) VALUES (:FECHA)');
    Parameters.ParamByName('FECHA').DataType := ftDateTime;
    Parameters.ParamByName('FECHA').Value := StrToDateTime('13/12/2040 11:22:33'); 
    ExecSQL;
end;


Para que entendais bien, lo que se ve en la tabla una vez insertado el registro es '13/12/2040 12:00:00 AM'. Como veis la fecha es correcta pero la hora no lo es.

Que puede estar ocurriendo ya no se que mirar ni que probar. icon_question.gif icon_question.gif

Por favor si alguien tiene alguna posible solución, agradeceria que lo comentasen.

Un saludo a todos


Hola JordiP, si te es posible, en vez de utilizar ADO, prueba a utilizar ODBC y en Delphi utiliza TDatabase y TQuery para ejecutar la consulta SQL de inserción de registros.

Te comentamos, por si no sabes hacerlo, cómo lo hemos hecho nosotros y nos ha insertado correctamente la fecha y hora:

1. Hemos creado un origen de datos ODBC desde "Inicio" - "Configuración" - "Panel de control" - "Herramientas administrativas" - "Orígenes de datos (ODBC)". Hemos agregado un nuevo "DNS de sistema", poniéndole como nombre "foxprueba":



Lógicamente, nuestras tablas FoxPro se encuentran en:

g:\Mis documentos\delphi\FoxPro

2. Desde Delphi hemos creado una aplicación, en el formulario hemos agregado un TDatabase, componente que está en la paleta "BDE" (en Delphi 6). En la propiedad "Alias" de este componente hemos seleccionado el origen de datos creado anteriormente "foxprueba" y en la propiedad "DatabaseName" hemos introducido "bd":



3. Hemos agregado un componente de tipo TQuery (en Delphi 6 está en la paleta "BDE". En la propiedad "DatabaseName" pondremos "bd" que es el nombre que le hemos dado a la propiedad "DatabaseName" del componente "TDatabase", de esta forma ambos quedan enlazados:



4. Lógicamente, tenemos una tabla llamada "orders.dbf" en la carpeta indicada anteriormente, que contiene un campo de tipo DateTime llamado "orderdate".

5. Hemos puesto un botón y en evento OnClick de éste hemos colocado el siguiente código:

Código:

procedure TForm1.Button1Click(Sender: TObject);
begin
  Query1.Close;
  Query1.SQL.Clear;
  Query1.SQL.Add('insert into orders');
  Query1.SQL.Add('  (orderid, orderdate)');
  Query1.SQL.Add('   values (:pID, :pFecha)');
  Query1.ParamByName('pID').DataType := ftInteger;
  Query1.ParamByName('pID').AsDateTime := 1;
  Query1.ParamByName('pFecha').DataType := ftDateTime;
  Query1.ParamByName('pFecha').AsDateTime :=
      StrToDateTime('13/12/2040 11:22:33');
  Query1.ExecSQL;
end;


6. Para ver el resultado de la inserción del registro anterior, hemos añadido un TTable, en su propiedad "DatabaseName" hemos puesto "bd" , en su propiedad "TableName" hemos seleccionado "orders" y en la propiedad "Name" hemos puesto "Table1", hemos añadido un TDataSource, en su propiedad "Dataset" hemos seleccionado "Table1" (para enlazar el TTable con el TDatasource), en su propiedad "Name" hemos puesto "DataSource1". Por último hemos añadido un TDBGrid, en su propiedad "DataSource" hemos puesto el valor "DataSource1":



7. Por último hemos añadido un botón para activar (abrir) la conexión de Table1 con la tabla "orders", con el siguiente código:

Código:

procedure TForm1.Button2Click(Sender: TObject);
begin
  Table1.Active := true;
end;


La aplicación en ejecución:



Nota: no hemos podido probar aún tu caso, con ADO, en cuanto lo probemos te indicamos los resultados. De todas formas, lo que te hemos comentado, con ODBC puedes solucionarlo.
MensajePublicado:
Vie Oct 30, 2009 7:33 am
Top of PageVer perfil de usuario
JordiP
Buen usuario


Registrado: Oct 28, 2009
Mensajes: 12

Asunto: Responder citando

alonsojpd, estoy empezando a creer que el problema es de los drivers FoxPro que estan instalados en mi equipo. He hecho todo lo que has comentado y en el momento de execSQL da el siguiente error:

General SQL error [microsoft][ODBC FoxPro Driver]Data type mismatch

El Driver que tengo es el 6.01.8629.01 del 07/12/1999. Mira por favor si tienes alguno mas actualizado.

Ire investigando por esta linea a ver si encuentro algo. Se que estoy cerca.


Gracias por tu completisima respuesta. icon_biggrin.gif
MensajePublicado:
Vie Oct 30, 2009 2:09 pm
Top of PageVer perfil de usuario
JordiP
Buen usuario


Registrado: Oct 28, 2009
Mensajes: 12

Asunto: Responder citando

alonsojpd, YA ESTA SOLUCIONADO icon_eek.gif , el problema del codigo que publicaste es, que el campo orderid es Integer y no DateTime

Con esto, la linea del codigo
Código:
Query1.ParamByName('pID').AsDateTime := 1;


Queda de la siguiente manera
Código:
Query1.ParamByName('pID').AsInteger := 1;


Esto lo he probado con Delphi 7, aunque ahora hare la prueba con Delphi 2010 que es con la versión que estoy haciendo mi aplicación, espero no encontrarme con problemas.

AGRADECIDO COMPAÑERO, SOIS GENIALES icon_biggrin.gif icon_mrgreen.gif
MensajePublicado:
Sab Oct 31, 2009 10:32 am
Top of PageVer perfil de usuario
alonsojpd
Administrador/Moderador


Registrado: Sep 16, 2003
Mensajes: 2687

Asunto: Responder citando

JordiP escribió:
alonsojpd, YA ESTA SOLUCIONADO icon_eek.gif , el problema del codigo que publicaste es, que el campo orderid es Integer y no DateTime

Con esto, la linea del codigo
Código:
Query1.ParamByName('pID').AsDateTime := 1;


Queda de la siguiente manera
Código:
Query1.ParamByName('pID').AsInteger := 1;


Esto lo he probado con Delphi 7, aunque ahora hare la prueba con Delphi 2010 que es con la versión que estoy haciendo mi aplicación, espero no encontrarme con problemas.

AGRADECIDO COMPAÑERO, SOIS GENIALES icon_biggrin.gif icon_mrgreen.gif



Es cierto, tienes razón, muchas gracias por tu aportación.
MensajePublicado:
Dom Nov 01, 2009 9:35 am
Top of PageVer perfil de usuario
JordiP
Buen usuario


Registrado: Oct 28, 2009
Mensajes: 12

Asunto: Responder citando

Por fin he encontrado la manera de incluir un campo DateTime en una tabla FoxPro. Para esto se tiene que mezclar comandos SQL normales y comandos propios del FoxPro.

Es mucho más sensillo que todo lo que hemos estado probando y de la propuesta vuestra de generar un DNS.

El codigo sería el siguiente:

Código:
with MainForm.ADOQuery_Importar do
begin
  active:=false;
  connectionString:='Provider=VFPOLEDB.1;Data Source=c:\dBase;Password="";Collating Sequence=MACHINE';
  SQL.Clear;
  SQL.Add('insert into tabla1 (fecha)');
  SQL.Add(' values (CTOT('''+'05/06/2010 11:22:33 AM'+'''))');
  ExecSQL;
end;


Al utilizar el proveedor "VFPOLEDB.1" acepta incluir estos comandos FoxPro.
El CTOT es un comando que transforma una fecha de tipo string (caracter) a tipo DateTime.

Despues de 1 mes por fin se ha resuelto. Espero que le pueda ayudar a alguien.

Saludos icon_biggrin.gif icon_biggrin.gif icon_biggrin.gif icon_biggrin.gif
MensajePublicado:
Mar Nov 03, 2009 3:18 pm
Top of PageVer perfil de usuario
alonsojpd
Administrador/Moderador


Registrado: Sep 16, 2003
Mensajes: 2687

Asunto: Responder citando

JordiP escribió:
Por fin he encontrado la manera de incluir un campo DateTime en una tabla FoxPro. Para esto se tiene que mezclar comandos SQL normales y comandos propios del FoxPro.

Es mucho más sensillo que todo lo que hemos estado probando y de la propuesta vuestra de generar un DNS.

El codigo sería el siguiente:

Código:
with MainForm.ADOQuery_Importar do
begin
  active:=false;
  connectionString:='Provider=VFPOLEDB.1;Data Source=c:\dBase;Password="";Collating Sequence=MACHINE';
  SQL.Clear;
  SQL.Add('insert into tabla1 (fecha)');
  SQL.Add(' values (CTOT('''+'05/06/2010 11:22:33 AM'+'''))');
  ExecSQL;
end;


Al utilizar el proveedor "VFPOLEDB.1" acepta incluir estos comandos FoxPro.
El CTOT es un comando que transforma una fecha de tipo string (caracter) a tipo DateTime.

Despues de 1 mes por fin se ha resuelto. Espero que le pueda ayudar a alguien.

Saludos icon_biggrin.gif icon_biggrin.gif icon_biggrin.gif icon_biggrin.gif


Estupendo JordiP, por supuesto que ayudará a más personas ¡¡gracias!!
MensajePublicado:
Jue Nov 05, 2009 6:15 am
Top of PageVer perfil de usuario
Mostrar mensajes de anteriores:   
Todas las horas son GMT - 1 Horas
Publicar nuevo tema Responder al tema
Foros de discusión » Borland Delphi, Codegear Delphi .Net  

Cambiar a:  
Key
  Puede publicar nuevos temas en este foro
No puede responder a temas en este foro
No puede editar sus mensajes en este foro
No puede borrar sus mensajes en este foro
No puede votar en encuestas en este foro
Visita nuestro nuevo sitio web con programas y contenidos actualizados: Proyecto A