none
Se ponen lentas las transacciones con Windows 7. RRS feed

  • 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.
    lunes, 1 de noviembre de 2010 20:54

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

     

    miércoles, 3 de noviembre de 2010 21:16

Todas las respuestas

  • Hola Ariel. ¿Revisaste el orden de las refrencias? Utilizas ADO o DAO, declarando el recordset o utilizando control data?
    martes, 2 de noviembre de 2010 0:50
  • 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

    martes, 2 de noviembre de 2010 12:51
  • Hola, ésta es la forma en que manejo las bases 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
        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

    martes, 2 de noviembre de 2010 12:53
  • 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

     

    miércoles, 3 de noviembre de 2010 21:16
  • 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?
    jueves, 11 de noviembre de 2010 20:18
  • 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.
    sábado, 13 de noviembre de 2010 20:33
  • 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 Sub

     

    Ahora, 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...

    sábado, 13 de noviembre de 2010 20:54