Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   25000 registros, ni uno más. (https://www.clubdelphi.com/foros/showthread.php?t=14005)

Tecnic2 07-09-2004 11:00:07

25000 registros, ni uno más.
 
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

Aqui lo tienes.
 
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

Tampoco funciona
 
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/

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

Notaciones para ayudarme
 
- 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

Para cerrar el TTable
 
....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

No funciona con objetos ADO
 
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

Objetivo
 
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

trata haber esto
 
:)
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...


La franja horaria es GMT +2. Ahora son las 08:56:09.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi