Ir al contenido



Foto

[RESUELTO] Insertar campo "Date" desde Delphi a tabla DBF de FoxPro


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

#1 JordiP

JordiP

    Member

  • Miembros
  • PipPip
  • 19 mensajes

Escrito 23 octubre 2009 - 07:17

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'. El problema se presenta cuando quiero insertar o modificar dicho campo fecha (Date) da error, me dice que "El Proveedor actual no admite que una única ejecución devuelva multiples recordsets":s Esto que es ? que quiere decir este mensaje ? :

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



delphi
  1. with DataModule1.ADOQuery_Importar do
  2.   begin
  3.     active:=false;
  4.     connectionString:='Provider=VFPOLEDB.1;Data Source=C:\dirBD;Password="";Collating Sequence=MACHINE';
  5.     SQL.Clear;
  6.     SQL.Add('INSERT INTO table2 (fecha) VALUES (:FECHA)');
  7.     Parameters.ParamByName('FECHA').Value := StrToDate('01/01/2010');
  8.     active:=true;
  9.   end;



En el propio FoxPro, la sentencia para insertar un registro es la siguiente:


sql
  1. INSERT INTO table2 (fecha) VALUES (CTOD("11/10/2010"))


donde CTOD es un comando que convierte de caracter a Date

Esto mismo he hecho en Delphi y también da error


delphi
  1.   with DataModule1.ADOQuery_Importar do
  2.   begin
  3.     active:=false;
  4.     connectionString:='Provider=VFPOLEDB.1;Data Source=C:\dirBD;Password="";Collating Sequence=MACHINE';
  5.     SQL.Clear;
  6.     SQL.add('INSERT INTO table2 (fecha) VALUES (CTOD("11/10/2010"))');
  7.     active:=true;
  8.   end;



Alguien sabe de que manera se puede grabar un campo fecha en una tabla DBF de FoxPro ?? :sad:
  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.019 mensajes
  • LocationMéxico

Escrito 23 octubre 2009 - 07:19

Hola JordiP, bienvenido a DelphiAccess.

Intenta con esto:



delphi
  1. with DataModule1.ADOQuery_Importar do
  2.   begin
  3.     connectionString:='Provider=VFPOLEDB.1;Data Source=C:\dirBD;Password="";Collating Sequence=MACHINE';
  4.     SQL.Clear;
  5.     SQL.Add('INSERT INTO table2 (fecha) VALUES (:FECHA)');
  6.  
  7.     Parameters.ParamByName('FECHA').DataType := ftDateTime;
  8.     Parameters.ParamByName('FECHA').ParamType := ptInput;
  9.     Parameters.ParamByName('FECHA').Value := StrToDateTime('01/01/2010');
  10.  
  11.     ExecSQL;
  12.   end;



Salud OS

Edito, No puedes usar active := true debes usar ExecSQL.
  • 0

#3 JordiP

JordiP

    Member

  • Miembros
  • PipPip
  • 19 mensajes

Escrito 23 octubre 2009 - 07:28

Alusinante amigo EGOSTAR, que rapida tu respuesta, creo que no me ha dado tiempo ni de publicar la pregunta, jaja.

Te comento, utilizo Delphi 2010 y el componente es un TADOQuery y el campo ParamType que me comentas no existe en dicho componente. Es posible que hayan cambiado este campo por otro y lo desconozco. :^)

Espero poder encontrar una respuesta porque ya tengo casi acabado mi programa y me supondría una catastrofe tener que modificar parte del programa por este problema.

Gracias de nuevo por responder. :wink:
  • 0

#4 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.019 mensajes
  • LocationMéxico

Escrito 23 octubre 2009 - 07:42

Hola JordiP

Tienes razón, no existe la propiedad ParamType en los componentes ADO, en su lugar es Direction



delphi
  1. with DataModule1.ADOQuery_Importar do
  2.   begin
  3.     connectionString:='Provider=VFPOLEDB.1;Data Source=C:\dirBD;Password="";Collating Sequence=MACHINE';
  4.     SQL.Clear;
  5.     SQL.Add('INSERT INTO table2 (fecha) VALUES (:FECHA)');
  6.  
  7.     Parameters.ParamByName('FECHA').DataType := ftDateTime;
  8.     Parameters.ParamByName('FECHA').Direction := pdInput;
  9.     Parameters.ParamByName('FECHA').Value := StrToDateTime('01/01/2010');
  10.  
  11.     ExecSQL;
  12.   end;



Salud OS
  • 0

#5 JordiP

JordiP

    Member

  • Miembros
  • PipPip
  • 19 mensajes

Escrito 23 octubre 2009 - 07:47

Ya tengo solucionado el problema, el tema estaba en que utilizaba "active=true" en vez de "ExecSql". Según he leido hace unos minutos hay una importante diferencia entre una y otra instrucción, el hilo al que hago referencia es http://www.clubdelph...ead.php?t=14163 (es de otro foro, espero que no haya problemas).

Open se usa para consultas que regresan registros (SELECT) mientras que ExecSql se usa para consultas que no regresan registros (UPDATE, INSERT, DELETE)


He tomado el codigo que comentaste y lo unico que hice es quitar la linea que te dije que no reconocia el componente


delphi
  1. Parameters.ParamByName('FECHA').ParamType := ptInput;


y cambiar

delphi
  1. active:=true;

por

delphi
  1. ExecSQL




El codigo resultante y que funciona es:



delphi
  1. with DataModule1.ADOQuery_Importar do
  2. begin
  3.   active:=false;
  4.   connectionString:='Provider=VFPOLEDB.1;Data Source=C:\dirBD;Password="";Collating Sequence=MACHINE';
  5.   SQL.Clear;
  6.   SQL.Add('INSERT INTO table2 (fecha) VALUES (:FECHA)');
  7.   Parameters.ParamByName('FECHA').DataType := ftDateTime;
  8.   Parameters.ParamByName('FECHA').Value := StrToDateTime('01/01/2010');
  9.   ExecSQL;
  10. end;



Para ser mi primer POST en este Foro, ha ido muy pero que muy bien.

Gracias a todos. :wink:
  • 0

#6 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.019 mensajes
  • LocationMéxico

Escrito 23 octubre 2009 - 07:59

Ah pues que bien amigo, voy a asignar este tema como resuelto para que otros puedan encontrar esta información mas rápidamente.

Nuevamente bienvenido a DelphiAccess.

Salud OS
  • 0

#7 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.019 mensajes
  • LocationMéxico

Escrito 23 octubre 2009 - 08:03

Ya tengo solucionado el problema, el tema estaba en que utilizaba "active=true" en vez de "ExecSql". Según he leido hace unos minutos hay una importante diferencia entre una y otra instrucción, el hilo al que hago referencia es http://www.clubdelph...ead.php?t=14163 (es de otro foro, espero que no haya problemas).

Open se usa para consultas que regresan registros (SELECT) mientras que ExecSql se usa para consultas que no regresan registros (UPDATE, INSERT, DELETE)


Por supuesto que no hay ningún problema :)

Salud OS
  • 0