Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Tablas planas
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-04-2005
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
A mi un proceso similar Dbf hacia Db (Pardox), 60.000 registros más o menos me tardan 15 minutos, utilizo incluso una barra de progreso.

No ataco directamente la tabla DBf sino que lanzo un SQL Select *.

El post solamente lo hago despues de añadir el último registro.

Pienso que uno de los problemas en los que interviene esta lentitud, son los índices que tenga la tabla destino.

Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #2  
Antiguo 07-04-2005
Toñico Toñico is offline
Miembro
 
Registrado: ene 2005
Posts: 56
Poder: 22
Toñico Va por buen camino
Gracias Neftali, aunque he hecho una prueba de rendimiento haciendo 1000 insert contra 1000 append .. post y es el doble de rápido ejecutando secuencias sql de inserción.
Responder Con Cita
  #3  
Antiguo 07-04-2005
Toñico Toñico is offline
Miembro
 
Registrado: ene 2005
Posts: 56
Poder: 22
Toñico Va por buen camino
Gracias Marcoszorrilla. La tabla que estoy llenando tiene un solo índice que además es clave primaria. La última parte que realizo cuando paso el fichero DBF a access no le cuesta mas de 1 minuto ya que puedo lanzar la consulta SQL que haga la inserción de usa sola vez. Uso la siguiente secuencia:

INSERT INTO Tabla SELECT * FROM fichero_dbf IN "{ruta del fichero}" "dBASE IV;"

Si hubiera una secuencia similar pero que el fichero origen fuera un fichero de texto, me salvaría la vida.
Responder Con Cita
  #4  
Antiguo 02-05-2005
Avatar de hgiacobone
hgiacobone hgiacobone is offline
Miembro
 
Registrado: may 2003
Ubicación: La Plata, Bs. As., Argentina
Posts: 165
Poder: 24
hgiacobone Va por buen camino
Casualmente yo nececito hacer algo similar.
Para ejecutar esa instrucción SQL, utilizas un ADOConnection+ADODataSet y para la tabla DBF un TTable común?
No logro que funcione esa instruccion, hay algún error en las comillas o los string que mostraste?
__________________
Gracias de antemano por vuestra ayuda.
·.:*:.·Yako·.:*:.·
Responder Con Cita
  #5  
Antiguo 02-05-2005
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.941
Poder: 27
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Podrias dar numeros? Que es lo que se demora? Cuanto es el tiempo?

Quiero decir:

- Cuanto se gasta leyendo un registro... cuanto se demora en leer en total
- Cuanto se gasta dando un inserte
- El codigo de ejemplo de que es lo que haces
- Los parametros de conexion (que componentes usas ademas). Me interesa saber que nivel de aislamiento de transacciones manejas...

La "otra" tabla que es? Si intentas usar el asistente de importacion de datos de Acces, cuanto se demora este?

Se me ocurre:

1- Estas usando cursores de solo lectura-hacia adelante? Deberias....
2- Intenta lanzar todos los insert dentro de una transaccion...deberia ser mas rapido
3- Si usas ADO, puedes intentar con un cursor del lado del servidor (CursorLocation=Server)
__________________
El malabarista.
Responder Con Cita
  #6  
Antiguo 04-05-2005
Toñico Toñico is offline
Miembro
 
Registrado: ene 2005
Posts: 56
Poder: 22
Toñico Va por buen camino
Hola hgiacobone,

para lanzar la instrucción SQL uso un componente TADOCommand. La rutina que uso es la siguiente:

Código:
 
Código Delphi [-]
 
 
Procedure ...
var
cSQL: String;
... Begin
..... Try
MyAdoCommand.Connection := MyAdoConnection; MyAdoConnection.BeginTrans; cSQL := 'INSERT INTO {Tabla} ' + 'SELECT * FROM {TablaDBF} ' + 'IN ' + #39 + {directorio de la tablaDBF} + #39 + ' ' + #39 + 'dBASE IV;' + #39; MyAdoCommand.CommandText := cSQL; MyAdoCommand.Execute; MyAdoConnection.CommitTrans;
Except
MyAdoConnection.RollbackTrans;
end; ....
end;
La tabla dentro de Access tiene que existir previamente y tener la misma estructura.

Un saludo.
Responder Con Cita
  #7  
Antiguo 04-05-2005
Toñico Toñico is offline
Miembro
 
Registrado: ene 2005
Posts: 56
Poder: 22
Toñico Va por buen camino
Hola Mario,

voy a intentar responderte a todo. Te vuelvo a explicar el problema que tengo: Tengo que rellenar una Tabla en Access con los datos que están en otra base de datos. El problema radica en que dicha base de datos es totalmente cerrada al acceso y lo único que me permite es, usando una libreria, leer secuencialmente la tabla de donde quiero obtener los datos.

Leer secuencialmente la tabla origen con 100.000 registros y rellenar un fichero de texto con los campos que necesito tarda unos 5 minutos como mucho.

Hacer insert mientras estoy leyendo la tabla pasa de media hora como poco.

Para abrir la base de datos access uso componentes ADO. El código que probé para hacer los insert es similar al que he puesto como ejemplo en la respuesta que le he dado a hgiacobone. Inicio la transacción, hago todos los insert y al final hago el commit.

El problema fundamental de todo esto, es que tiene que ser transparente para el usuario este proceso. Tengo que rellenar la tabla en access porque tengo que realizar procesos y calculos de registros que no puedo hacer directamente con la tabla origen. Y claro, decirle al usuario que se vaya a tomar un café mientras realizo la exportación no es una opción admisible.

Si hubiera alguna forma de realizar la importación de los datos desde un fichero de texto a access, directamente, usando una secuencia SQL, me solucionaría la vida.

Muchas gracias.

Un saludo.
Responder Con Cita
  #8  
Antiguo 09-05-2005
Avatar de hgiacobone
hgiacobone hgiacobone is offline
Miembro
 
Registrado: may 2003
Ubicación: La Plata, Bs. As., Argentina
Posts: 165
Poder: 24
hgiacobone Va por buen camino
Solo una pequeña observacion: el BeginTrans va fuera del Try, sino nunca salta.
Código:
 
Código Delphi [-]
 
Begin
..... MyAdoConnection.BeginTrans; Try
MyAdoCommand.Connection := MyAdoConnection; cSQL := 'INSERT INTO....' MyAdoCommand.CommandText := cSQL; MyAdoCommand.Execute; MyAdoConnection.CommitTrans;
Except
MyAdoConnection.RollbackTrans;
end;
end;
__________________
Gracias de antemano por vuestra ayuda.
·.:*:.·Yako·.:*:.·
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 03:31:10.


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