Visual Basic - Metodo Close muy lento

Life is soft - evento anual de software empresarial
 
Vista:

Metodo Close muy lento

Publicado por isa (7 intervenciones) el 07/07/2008 09:16:34
Hola...

Tengo una base de datos en access y con visual basic 6.0 creo otra base de datos y añado las tablas que quiero (creo estructura y añado los datos). Todo funciona perfectamente, el problema es a la hora de cerrar el formulario. En el Form_Unload hago un close de las dos bases de datos, pero tarda mucho en cerrar (unos dos minutos por cada base de datos).

Alguien me puede ayudar??? Gracias de antemano.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Metodo Close muy lento

Publicado por igor (633 intervenciones) el 07/07/2008 20:50:18
Son muchos los registros de cada tabla?

Ayudaría tener el código que añade las tablas y Form_Unload.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Metodo Close muy lento

Publicado por isa (7 intervenciones) el 08/07/2008 09:29:04
En total crea 39 tablas y sincroniza 11 tablas con unos 60000 registros en total. He probado con pocas tablas y pocos registros y se cierra rápido, asi que el problema supongo que es el número de registros. ¿Qué puedo hacer?. El código que utilizo es el siguiente:

Private Sub Form_Unload(Cancel As Integer)
BDD_LOCAL.Close
Set BDD_LOCAL = Nothing

BDD_Origen.Close
Set BDD_Origen = Nothing

BDD_Destino.Close
Set BDD_Destino = Nothing
Unload Me
End Sub

Private Sub Sincroniza_Tablas_Entre_DBs(BDOrigen As DAO.Database, BDDestino As DAO.Database, nombre_tabla As String, sql As String, Crear_Tablas As Boolean)
Dim Correcto As Boolean
Dim xx As String
Dim rsOrigen As DAO.Recordset
Dim rsDestino As DAO.Recordset
Dim Campo As Variant
Dim Fecha As String
Dim Tabla_Orig As DAO.TableDef
Dim Tabla_Dest As DAO.TableDef
Dim Campo_Orig As DAO.Field
Dim Campo_Dest As DAO.Field
Dim IdOrigen As Index
Dim IdDestino As Index
Dim prOrigen As Property
Dim prDestino As Properties

On Error Resume Next

Correcto = False

If BDOrigen Is Nothing Or BDDestino Is Nothing Then GoTo FIN
If Crear_Tablas Then
Set Tabla_Orig = BDOrigen.TableDefs(nombre_tabla)
If Tabla_Orig Is Nothing Then GoTo FIN

Err.Clear
Set Tabla_Dest = Nothing
Set Tabla_Dest = BDDestino.CreateTableDef(Tabla_Orig.Name, Tabla_Orig.Attributes, Tabla_Orig.SourceTableName, Tabla_Orig.Connect)
If Tabla_Dest Is Nothing Then GoTo FIN

For Each Campo_Orig In Tabla_Orig.Fields
Set Campo_Dest = Tabla_Dest.CreateField(Campo_Orig.Name, Campo_Orig.Type, Campo_Orig.Size)

For Each prOrigen In Campo_Orig.Properties
Err.Clear
Campo_Dest.Properties(prOrigen.Name).Value = Campo_Orig.Properties(prOrigen.Name).Value
Next
Err.Clear
Tabla_Dest.Fields.Append Campo_Dest
Next

For Each IdOrigen In Tabla_Orig.Indexes
Set IdDestino = Tabla_Dest.CreateIndex(IdOrigen.Name)

For Each Campo_Orig In IdOrigen.Fields
Set Campo_Dest = IdDestino.CreateField(Campo_Orig.Name)
IdDestino.Fields.Append Campo_Dest
Next
For Each prOrigen In IdDestino.Properties
Err.Clear
IdDestino.Properties(prOrigen.Name) = IdOrigen.Properties(prOrigen.Name)
Next
Err.Clear
Tabla_Dest.Indexes.Append IdDestino
Next
Err.Clear
BDDestino.TableDefs.Append Tabla_Dest
If Err <> 0 Then GoTo FIN
End If

If sql = "" Or nombre_tabla = "" Then GoTo FIN

Set rsOrigen = BDOrigen.OpenRecordset(sql)
If rsOrigen Is Nothing Then GoTo FIN

xx = "select * from " & nombre_tabla
Set rsDestino = BDDestino.OpenRecordset(xx)
If rsDestino Is Nothing Then GoTo FIN

If Not rsOrigen.EOF Then Muestra_Mensaje ("Sincronizando la tabla... " & nombre_tabla)

Do While Not rsOrigen.EOF

rsOrigen.Edit
rsOrigen("Sincronizado").Value = True
Fecha = Format(Date, "dd/mm/yyyy") & " " & Format(Time, "Hh:Nn:Ss")
rsOrigen("Fecha_Sincronizacion").Value = Fecha

Err.Clear
rsOrigen.Update
Correcto = (Err = 0)
If Not Correcto Then Muestra_Mensaje ("Error al actualizar la Fecha de Sincronizacion en la BD Origen.")

rsDestino.AddNew

For Each Campo In rsOrigen.Fields
rsDestino(Campo.Name).Value = rsOrigen(Campo.Name).Value
Next

Err.Clear
rsDestino.Update
Correcto = (Err = 0)
If Not Correcto Then Muestra_Mensaje ("Error al actualizar los datos en la BD Destino.")

If Not rsOrigen.EOF Then rsOrigen.MoveNext
Loop

Correcto = True

FIN:
Set Tabla_Orig = Nothing: Set Tabla_Dest = Nothing
Set Campo_Orig = Nothing: Set Campo_Dest = Nothing
Set IdOrigen = Nothing: Set IdDestino = Nothing
Set prOrigen = Nothing: Set prDestino = Nothing

rsOrigen.Close
Set rsOrigen = Nothing
rsDestino.Close
Set rsDestino = Nothing

End Sub
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Metodo Close muy lento

Publicado por igor (633 intervenciones) el 08/07/2008 18:53:00
Para hacer lo que quieres es más recomendable utilizar instrucciones SQL, te recomiendo que te informes sobre ellas.

Sobre todo en lo referente a la copia de los registros te recomiendo que utilices la instrucción INSERT INTO tabladestino (campo1, campo2, ...., campon) SELECT tablaorigen ... utilizando una instruccion select como origen de datos.

Para crear tabla es CREATE TABLE tabla (campo1, campo2, ...., campon)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Metodo Close muy lento

Publicado por isa (7 intervenciones) el 09/07/2008 08:50:17
Gracias a los dos... He probado INSERT INTO y DOEVENTS y todo sigue igual. Si se os ocurre algo más os lo agradecería.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Metodo Close muy lento

Publicado por igor (633 intervenciones) el 09/07/2008 21:04:07
La instrucción doevents no evita el problema. Lo que hace es evitar que la aplicación se bloquee, permitiendo interactuar con esta para que responda a eventos de teclado y ratón.

Me extraña que utilizando INSERT INTO siga igual de lento, seguro que lo estás utilizando correctamente?

Quizás no me expliqué bien, con INSERT INTO se eliminan los bucles for each de manera que:
conexion.execute("INSERT INTO tabladestino (campo1, campo2, ...., campon) SELECT tablaorigen.* FROM tablaorigen")

Esta instrucción sustituye la copia completa de una tabla de access, teniendo una por cada tabla (eran 11).

Si de esta manera no va más rápido no puedes hacer más, porque esto ya es cosa del motor de base de datos access.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Metodo Close muy lento

Publicado por isa (7 intervenciones) el 10/07/2008 08:58:24
Asi es como utilice el INSERT INTO. Esto sustituye al bucle. Es la forma correcta no?

xx = BDDestino.Name
sql = "INSERT INTO " & Tabla_Dest.Name & " IN '" + xx & "'"
If Sql_Orig_Datos <> "" Then
sql = sql & " " & Sql_Orig_Datos
Else
sql = sql & " SELECT * FROM " & Tabla_Dest.Name
End If
Err.Clear
BDOrigen.Execute (sql)

Todo esto es para sincronizar dos bases de datos. Ahora son muchos datos (no se ha sincronizado todavia), pero luego se ira haciendo mas amenudo y la cantidad de informacion será menor, por lo que será más rápido.

Muchas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar