Principales respuestas
Se ponen lentas las transacciones con Windows 7.

Pregunta
-
Tengo un sistema desarrollado en Visual Basic 6.0 y uso bases de datos en Access 97. El mismo es muy estable con Windows XP, pero ahora que lo instalé en Windows 7, me dá problemas con un formulario cuando intento realizar transacciones (agregar o suprimir registros), se pone lento el proceso. Es decir, cuando confirmo la alta de un registro se bloquea la pantalla. Miro los recursos de Windows y no consume nada, ni procesador, ni memoria. Lo raro es que uso otros proyectos (otro .EXE) como Bancos o Contabilidad que están desarrollado de la misma manera y andan bien. El acceso a las bases lo realizo por medio de la instrucción SELECT * FROM CTASCTES WHERE..... dentro de Visual Basic. Y para agregar, modificar o suprimir registros uso Data con Recordset.
Respuestas
-
Una recomendación. Es posible que tengas activada referencia a ADO y DAO, por lo que recomiendo que pongas el prefijo dao. Por ejemplo: Dim rstCtasCtes2 As dao.Recordset, asi puedes evitarte problemas.
Por otro lado, no es necesario que coloques todo el código, pero no veo donde se inicia la transacción. Revisa las referencias, ya que si otras aplicaciones que utilizan las mismas librerías funcionan bién...
Cordialmente, Carlos
- Marcado como respuesta Ariel L. Casalegno jueves, 11 de noviembre de 2010 20:14
Todas las respuestas
-
-
Hola, ésta es la forma que manejo las base de datos:
Dim dbsCtasCtes As Database, rstCtasCtes As Recordset
Dim rstCtasCtes2 As Recordset
Set dbsCtasCtes = OpenDatabase(Archivo2)
FechaUS = Mid(txtFechaD, 7, 4) & Mid(txtFechaD, 4, 2) & Mid(txtFechaD, 1, 2)
FechaUS2 = Mid(txtFechaH, 7, 4) & Mid(txtFechaH, 4, 2) & Mid(txtFechaH, 1, 2)
Set rstCtasCtes = dbsCtasCtes.OpenRecordset("SELECT * FROM CTACTTXT WHERE NroClteCtaCte = " & txtCódCliente & " ORDER BY FechaVtoCtaCte, FechaCtaCte, HoraCtaCte")
With rstCtasCtes
If .EOF = False And .BOF = False Then
.MoveFirst
SaldoAnterior = 0
Do Until .EOF Or .Fields!FechaVtoCtaCte >= Val(FechaUS)
SaldoAnterior = SaldoAnterior + .Fields!TotalCompCtaCte
.MoveNext
If .EOF Then
Exit Do
End If
Loop
SaldoAnterior = SaldoAnterior * -1
SaldoActual = SaldoAnterior
Else
SaldoAnterior = 0
SaldoActual = 0
End If
End With
Set rstCtasCtes2 = dbsCtasCtes.OpenRecordset("SELECT * FROM CTACTTXT WHERE NroClteCtaCte = " & txtCódCliente & " and FechaVtoCtaCte >= " & Val(FechaUS) & " ORDER BY FechaVtoCtaCte, FechaCtaCte, HoraCtaCte")
NroPago = 0
With rstCtasCtes2
If .EOF = False And .BOF = False Then
.MoveFirst -
Hola, ésta es la forma en que manejo las bases de datos:
Dim dbsCtasCtes As Database, rstCtasCtes As Recordset
Dim rstCtasCtes2 As RecordsetSet dbsCtasCtes = OpenDatabase(Archivo2)
FechaUS = Mid(txtFechaD, 7, 4) & Mid(txtFechaD, 4, 2) & Mid(txtFechaD, 1, 2)
FechaUS2 = Mid(txtFechaH, 7, 4) & Mid(txtFechaH, 4, 2) & Mid(txtFechaH, 1, 2)
Set rstCtasCtes = dbsCtasCtes.OpenRecordset("SELECT * FROM CTACTTXT WHERE NroClteCtaCte = " & txtCódCliente & " ORDER BY FechaVtoCtaCte, FechaCtaCte, HoraCtaCte")With rstCtasCtes
If .EOF = False And .BOF = False Then
.MoveFirst
SaldoAnterior = 0
Do Until .EOF Or .Fields!FechaVtoCtaCte >= Val(FechaUS)
SaldoAnterior = SaldoAnterior + .Fields!TotalCompCtaCte
.MoveNext
If .EOF Then
Exit Do
End If
Loop
SaldoAnterior = SaldoAnterior * -1
SaldoActual = SaldoAnterior
Else
SaldoAnterior = 0
SaldoActual = 0
End If
End With
Set rstCtasCtes2 = dbsCtasCtes.OpenRecordset("SELECT * FROM CTACTTXT WHERE NroClteCtaCte = " & txtCódCliente & " and FechaVtoCtaCte >= " & Val(FechaUS) & " ORDER BY FechaVtoCtaCte, FechaCtaCte, HoraCtaCte")
NroPago = 0
With rstCtasCtes2
If .EOF = False And .BOF = False Then
.MoveFirst
Pasada_1ra = True
Movimientos = 0
SaldoDiferido = 0
SaldoAnterior = Format(SaldoAnterior, "#,###,##0.00")
lstCltaOperaciones.AddItem (Mid(Blancos, 1, 56) & "SALDO ANTERIOR $ " & Format(SaldoAnterior, "@@@@@@@@@@@@"))
lstCltaOperaciones.AddItem ("-------------------------------------------------------------------------------------------------------------")
Do Until .EOF = True
Select Case .Fields!CódCompCtaCte
Case 1
-
Una recomendación. Es posible que tengas activada referencia a ADO y DAO, por lo que recomiendo que pongas el prefijo dao. Por ejemplo: Dim rstCtasCtes2 As dao.Recordset, asi puedes evitarte problemas.
Por otro lado, no es necesario que coloques todo el código, pero no veo donde se inicia la transacción. Revisa las referencias, ya que si otras aplicaciones que utilizan las mismas librerías funcionan bién...
Cordialmente, Carlos
- Marcado como respuesta Ariel L. Casalegno jueves, 11 de noviembre de 2010 20:14
-
Después de realizar varias pruebas, el tema es la cantidad de registros de la base de datos de Access 97. La pruebo con una con 146.000 registros y se pone lenta. Cuando bajo a 57.000 aprox. los registros funciona bien. Es como que le cuesta filtrar los datos. Puede ser la versión de Access, te ha pasado en algún caso. Estoy usando DAO, y me resulta complicado interpretar como trabaja con ADO, es decir, la codificación. Tendrás algún ejemplo?
-
Rayos Ariel, no había notado que consultabas algo... voy a desarrollar ese mismo código de tu ejemplo en ADO y prueba la velocidad. Además de usar ADO, utilizo un método GetRows(), que es cargar el recordset en un arreglo y destruyo el recordset e inclusive la conexión (en algunos casos) lo que significa memoria liberada.
-
Crea una referencia a Microsfot Activex Data Objects (yo seleccioné la 2.7 library)
En un módulo he creado una función para conectarme. Fíajte en la primera línea:Global dbsCtasCtes As New ADODB.Connection
Sub conecTate()
ruta = App.Path
mydb = ruta & "\SMSdata.mdb"
strCad = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & mydb _
& ";Jet OLEDB:System Database=" & ruta & "\grupo.mdw;User Id=gerente;Password=;"
With dbsCtasCtes
.ConnectionString = strCad
.ConnectionTimeout = 10
.Open
End With
End SubAhora, parte del mismo código de tu post, con ADO.
Dim rstCtasCtes As ADODB.Recordset
Dim rstCtasCtes2 As ADODB.Recordset
If dbsCtasCtes.State = 0 Then conecTate ' si está cerrada la conexión, ábrela
FechaUS = Mid(txtFechaD, 7, 4) & Mid(txtFechaD, 4, 2) & Mid(txtFechaD, 1, 2)
FechaUS2 = Mid(txtFechaH, 7, 4) & Mid(txtFechaH, 4, 2) & Mid(txtFechaH, 1, 2)
rstCtasCtes.Open "SELECT * FROM CTACTTXT WHERE NroClteCtaCte = " & txtCódCliente _
& " ORDER BY FechaVtoCtaCte, FechaCtaCte, HoraCtaCte", dbsCtasCtes, 2, 4 '4=solo lectura=+velocidad
With rstCtasCtes
If .EOF = False And .BOF = False Then
SaldoAnterior = 0
Do Until .EOF Or .Fields!FechaVtoCtaCte >= Val(FechaUS)
SaldoAnterior = SaldoAnterior + .Fields!TotalCompCtaCte
.MoveNext
If .EOF Then
Exit Do
End If
Loop
SaldoAnterior = SaldoAnterior * -1
SaldoActual = SaldoAnterior
Else
SaldoAnterior = 0
SaldoActual = 0
End If
End With
' si ya terminamos con el recordst anterior, podemos cerrarlo y destruirlo=>memoria liberada=>+recursos
rstCtasCtes.Close
Set rstCtasCtes = Nothing...
'cerrar conexión:
if dbsCtasCtes.state=1 then dbsCtasCtes.close
A mi me costó mucho tomar ADO por DAO, pero en el entorno web es necesario, y bueno, cuestión de costumbre. No se quien pueda decir con propiedad cual es mejor.
Pruébalo, seguro hay que hacerle ajustes. No pude probarlo porque no tengo la base de datos y tampoco tiempo ;)
Seguimos...