PDA

Ver la Versión Completa : 25000 registros, ni uno más.


Tecnic2
07-09-2004, 11:00:07
Hola,

Me encuentro con el problema de que cuando voy copiando todos los registros de una tabla FoxPro hacia una tabla Access con la misma estructura a través de un bucle registro por registro, al cabo de un rato me da el siguiente error:
"Data provider or other service returned an E_Fail Status".
Y como cosa a destacar, decir que pasa cuando llevo copiados 25000 registros, ni uno más ni uno menos.

Me ayudais?

Gracias.

Neftali [Germán.Estévez]
07-09-2004, 12:03:13
¿Puedes poner qué componentes estás utilizando? ¿cómo te conectas a cada BD? ¿versión de Delphi? Si el código de copia no es muy rande tal vez tb ayudaría.

¿Has mirado ayuda o probado el TBachMove a ver si se genera el mismo error? Podría sevir para descartar algun origen desde donde se produce el error.

Tecnic2
07-09-2004, 12:12:01
Utilizo un TTable en el que està la tabla access donde guardo los registros, y un TADOQuery donde hago la consulta de la tabla FoxPro y de la que obtengo los registros. El código es el siguiente:

procedure TFAssistent.VolcarTiclin();
begin
ADOQueryAux.Close;
ADOQueryAux.SQL.Clear;
ADOQueryAux.SQL.Add('SELECT canped, codart, fectic, preven');
ADOQueryAux.SQL.Add('FROM ticlin');
ADOQueryAux.Open;

while not ADOQueryAux.Eof do
begin
TAccessDades.Insert;
TAccessDades.FieldByName('canped').AsString := ADOQueryAux.Recordset.Fields.Item[0].Value;
TAccessDades.FieldByName('codart').AsString := ADOQueryAux.Recordset.Fields.Item[1].Value;
TAccessDades.FieldByName('fectic').AsString := ADOQueryAux.Recordset.Fields.Item[2].Value;
TAccessDades.FieldByName('preven').AsString := ADOQueryAux.Recordset.Fields.Item[3].Value;
TAccessDades.Post;
ADOQueryAux.Recordset.MoveNext;
end;
end;
//_________________________________________________________________________

Neftali [Germán.Estévez]
07-09-2004, 13:40:19
Algunas cosas que puedes probar:
* Revisa la versión que tienes instalada de las MDAC. Sé que en algunos casos algunos errores de éste tipo se solventan instalando las últimas versiones.
* Revisa la propiedad CursorLocation y CursorType de la conexión de ADO, Prueba con las diferentes opciones.

marcoszorrilla
07-09-2004, 15:41:19
Independientemente de localizar el fallo, yo quitaría:
TAccessDades.Post; del bucle y solamente lo pondría al salir del mismo.


Un Saludo.

Tecnic2
07-09-2004, 16:47:43
Siento decíros que nada de lo que me habéis dicho ha funcionado.
Por cierto, tengo Win2000, Delphi 7 y Access2000.
He probado incluso de aumentar hasta 512 - 768 mb's el archivo de intercambio de windows, pero nada de nada.

Neftali [Germán.Estévez]
07-09-2004, 17:12:50
Ves a la página de Tamaracka:
http://www.tamaracka.com/ (Tamaracka)

En el cuadro de edición de "Search Borland* Newsgroups" escribe "E_Fail Status" (sin comillas) y busca.
Ahí puedes encontrar más info.

Suerte.

Tecnic2
07-09-2004, 20:16:06
- Cambiar el CursorType y/o el CursorLocation no va a servir ya que todo se realiza en la misma máquina, los datos y los resultados están en el mismo ordenador.
- Poner el ".post" al final del bucle tampoco me ha cambiado nada, da el mismo error.
- La versión MDAC és la más actualizada.
- La función BatchMove sólo sirve para objetos BDE y yo tengo en el origen tablas FoxPro.
- He probado poner la propiedad "MaxRecords" del TADOQuery a 100 pero al hacer el bucle sobrepasa los 100 y sigue, o sea que me devuelve más registros de los que le pido.

Total, que a los 25000 registros se para, da el "Data provider or other service returned an E_Fail status" y allí se queda, me graba 25000 registros y el resto me dice que me los coma.

guillotmarc
07-09-2004, 20:38:21
Hola.

Ni idea de donde puede venir el Error. En todo caso si no puedes solucionarlo, sortealo.

Es decir, copia los registros de 2000 en 2000. Cerrando y volviendo a abrir el Dataset con los datos originales, al llegar a los 2000 registros, aunque naturalmente, abriendo solo los registros que faltan por copiar (utilizando por ejplo, una variable que te indique el código de la clave primaria del último registro copiado).

Saludos.

sitrico
07-09-2004, 21:57:31
No se si valga de algo, pero el límite de 25000 registros podría estar asociado al buffer de transacciones, a lo mejor falta un "commit" o algo parecido.

Suerte.

Tecnic2
08-09-2004, 09:38:51
....y para cerrar el objeto destino, es decir el TTable, qué método tengo que utilizar?
Lo que hago ahora ya es que cada 5000 registros le hago un .Close y un .Active := False. y luego el paso inverso, pero sigue parandose en 25000.

Tengo que cerrar tambien el objeto origen? es decir el TADOQuery?

basti
08-09-2004, 10:17:50
Es posible que el error dependa de los valores del registro en el que da el error. Supongo que el campo 'fecttic' es de tipo "date", entonces sería mejor que utilizases la siguiente línea por si los formatos de fecha de las tablas es distinto
TAccessDades.FieldByName('fectic').AsDateTime := ADOQueryAux.Fields[2].AsDateTime;

Si este no es el problema, puedes usar TTable para acceder a FoxPro utilizando los controladores ODBC de FoxPro

Raptor
08-09-2004, 18:43:43
hola chicos como estan.

Tecnic2
Por que no utiliza la herramientas que trae Delphi DataPum, no se que version tu tienes, pero si no tiene esta herramientas utiliza un BatchMove a este componentes solo tienes que ponerle de donde vienen los datos y para donde van y listo.


suerte. cualquier cosa estamos por aqui...

Tecnic2
08-09-2004, 18:47:19
El BatchMove no funciona con objetos ADO, y para tablas FoxPro necesito ADO.

Raptor
08-09-2004, 19:10:51
Una pregunta .
Tu objetivo no es migrar tus datos a otro Manejador de Datos ?.

Porque si tu resp. es si entonces la solucion que te planteo funciona!!!

Tecnic2
08-09-2004, 19:23:37
Mi objetivo es:

Abrir una tabla FoxPro de nombre "ticlin" a partir de un fichero "conta.dbc" que contiene el nombre de todas las tablas del programa comercial Wingest Carrera 2.5, y pasar todos los datos de algunos campos hacia una tabla Access.

Para abrir "conta.dbc" y obtener los datos de las tablas del programa necesito un objeto TADOConnection, en el cual enlazo un TADOQuery para hacer crear el origen de datos.

Pues eso.

guillotmarc
08-09-2004, 19:43:33
Hola.

Yo utilizaria ADO tanto para conectar con FoxPro, como para conectar con Access. Piensa que el BDE hace años que no se actualiza. (Por cierto tanto para acceder a Access como para acceder a FoxPro, lo mejor es utilizar el Provider Jet 4 para ADO, y no el provider ODBC para ADO).

Saludos.

Ryu
01-04-2005, 22:32:29
:)
tu problema no esta en las tablas de fox pro

por que no tratas de conectar tu tabla de fox pro a un ado query o ado table
si son tablas libres solo tienes que crear un alias o un odbc que contenga esas
tablas libre y conectalas normal
:cool:
recuerda q son las tablas de fox pro son .dbf y estas son las tablas nativas de delphi.
foxrep:=esto es un odbc;
table1.database:=foxrep;
table1.tablename:=nombre de la tabla libre;

mamcx
01-04-2005, 22:45:08
Si mal no recuerdo el problema es el proveedor OLEDB de foxpro. NO sirve el de la version 6 de foxpro. Bajate el ultimo proveedor OLEDB de foxpro...

mamcx
01-04-2005, 22:48:42
A proposito... Si el runtime de foxpro esta instalado porque no usas las funciones de Fox? Puedes hacer es crear una automatizacion OLE (creo que es "VisualFoxPro.Application") y con DoCMD corres comandos de FoxPro. Es muho mas optimo asi...