Bucles y arrays en Microsoft Access (VBA)

Iniciado por Lecram, 27 Enero 2012, 11:05 AM

0 Miembros y 1 Visitante están viendo este tema.

Lecram

Buenas, estoy haciendo un pequeño módulo en access 2001 (xD!) el cual va atado a un formulario y a una tabla. Tengo 4 campos: DESDE, HASTA, DIES y MESOS y cuando asigno un valor a uno de estos campos del formulario, este tambien se asigna a la tabla. Todo bien hasta ahí, eso ya lo hace, pero necesito que el valor de los campos se asignen a todos los registros de la tabla, no solo a 1, por lo tanto necesito un bucle y alomejor un array, pero no tengo ni idea de VB y no me aclaro demasiado...

¿Podría echarme un cable alguien?

Este es mi código:

Function CambioValores()

'Definicion de variables
Dim base As DAO.Database
Dim tabla As DAO.Recordset
Dim DESDE As Date
Dim HASTA As Date
Dim DIES As Long
Dim MESOS As Integer
Dim LIMITE As Integer
Dim CONTADOR As Integer
CONTADOR = 0

Set base = CurrentDb 'Asignamos la Base de datos actual a la variable base
Set tabla = base.OpenRecordset("COPIANOMINA") 'Guardamos en la variable tabla toda la tabla COPIANOMINA
LIMITE = tabla.Fields.Count

Do While CONTADOR < LIMITE

    DESDE = tabla(2) 'Asignamos que DESDE hace referencia al campo 2 de tabla
    HASTA = tabla(3)
    DIES = tabla(4)
    MESOS = tabla(40)
    DESDE = Form_DESDEHASTA.DESDE 'Asignamos a la variable DESDE el valor del campo de nuestro formulario
    HASTA = Form_DESDEHASTA.HASTA
    DIES = Form_DESDEHASTA.DIES
    MESOS = Form_DESDEHASTA.MESOS
    Form_DESDEHASTA.DIES = DateDiff("d", HASTA, DESDE) 'Cojo el valor en dias entre las fechas HASTA y DESDE

    Form_DESDEHASTA.MESOS = Month(DESDE) 'Asigno a la variable MESOS el valor del mes contenido por DESDE

    If Form_DESDEHASTA.DIES < 0 Then
        Form_DESDEHASTA.DIES = Form_DESDEHASTA.DIES * (-1)
    End If

    CONTADOR = CONTADOR + 1
   
Loop

End Function


Como se ve... lo que no se es cómo cambiar de registro por cada iteración del bucle...

Un saludo.

MCKSys Argentina

Sabias que un Recordset es un Objeto.. no?

Como objeto tiene propiedades y metodos.

Te recomiendo revisar la ayuda de DAO que viene con la MSDN del VS 6.

Saludos!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


Lecram

Se que Recordset es un objeto y que tabla es una instancia suya, tambien utilizo sus métodos en la variable LIMITE. Obviamente hice bastantes pruebas antes de postear aqui, pero sin resultado.

El método MoveNext en principio supongo que sirve para lo que quiero, pero cuando justo antes del final del bucle pongo tabla.MoveNext, me da un error diciéndome que "No hay ningún registro activo" y me pone el foco aqui: DESDE = tabla(2)

¿Puede decirme alguien por qué me sale este error?

MCKSys Argentina

Usa un bucle como el siguiente:



tabla.MoveFirst
Do while not tabla.EOF
    [instrucciones]
     tabla.MoveNext
Loop


Aunque no es recomendado usar MoveFirst, en este caso te servirá...  :P

Saludos!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


Lecram

Gracias por tu respuesta.

Haciéndolo tal y como dices ya no me aparece el error, de todos modos los cambios siguen aplicándose sólo al primer registro de la tabla y no a todos... sigue sin cambiar de registro por cada iteración de bucle.
¿Cómo puedo hacer para que me vaya cambiándo?

Un saludo.

MCKSys Argentina

Debes abrir el Recordset como Dynaset y ademas guardar los cambios ANTES de cambiar de registro.

Te vuelvo a repetir: revisa la ayuda de DAO de la MSDN que viene con Visual Studio 6

Saludos!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."