Access VBA: Duda a la hora de plantear código

Tengo creada una tabla "Tabla_Provincias" con dos campos, Id_Provincia (es el nombre de la provincia) e Id_ComercialAsignado, tiene un registro creado para cada provincia. En el Formulario Comerciales he creado un listado de provincias con una casilla de verificación asignada a cada una de ellas. Mi intención es que al cargar el formulario, Recorra la Tabla_Provincias desde el inicio hasta el final y tome el valor de los campos Id_Provincia e Id_ComercialAsignado.

En función de estos valores asignará el valor a la casilla de verificación de la provincia, de forma que si tiene asignado un comercial, le dará el valor verdadero y no tiene asignado comercial le dará el valor falso. A cada casilla de verificación le he asignado el nombre de la provincia.

Por otro lado, si tiene asignado comercial, y este es el mismo que el registro activo en el Formulario Comerciales, la casilla de verificación debe estar desbloqueada para poder cambiarla, pero si el Id_Comercial no coincide, debe estar bloqueada para que no pueda cambiarse.

He intentado crear el código, la estructura creo que la tengo planteada, pero tengo un montón de errores de sintaxis y no se como seguir.

Ayuda por favor:

Set dbsBase = CurrentDb
Set rstTabla = dbsBase.OpenRecordset("Tabla_Provincias", dbOpenDynaset)
rstTabla.MoveFirst
Do While Not EOF
Nombre_Provincia = rstTabla![Id_Provincia]
    Id_Comercial = rstTabla![Id_ComercialAsignado]
    If IsNull(Id_Comercial) Then
        Nombre_Campo = "Me!['" & Nombre_Provincia & "']"
        Nombre_Campo = False
        Valor_Propiedad = Nombre_Campo & ".Enabled = True"
        Valor_Propiedad
    Else
        Nombre_Campo = "Me!['" & Nombre_Provincia & "']"
        Valor_Campo = True
        If Id_Comercial = Forms![Formulario Comerciales]![Referencia] Then
            Valor_Propiedad = Nombre_Campo & ".Enabled = False"
            Valor_Propiedad
        Else
            Valor_Propiedad = Nombre_Campo & ".Enabled = True"
            Valor_Propiedad
    End If
RstTabla. MoveNext

1 respuesta

Respuesta
3

Lo que buscas es mucho más sencillo que lo que planteas (que por otro lado dista mucho de tener sentido a nivel de código, je je). Mi recomendación, recurre a la colección Controls del formulario y usa DLookUp.

Dim ctl As Control
For Each ctl In Me.Controls
    If ctl.ControlType = acCheckBox Then
        If len(nz(DLookup("Id_ComercialAsignado", "Tabla_Provincias", "Id_Provincia='" & ctl.Name & "'"),""))>0 Then
            Me.Controls(ctl.Name) = True
            If DLookup("Id_ComercialAsignado", "Tabla_Provincias", "Id_Provincia='" & ctl.Name & "'") = Me.Referencia Then
                Me.Controls(ctl.Name).Locked = False
            Else
                Me.Controls(ctl.Name).Locked = True
            End If
        Else
            Me.Controls(ctl.Name) = True
        End If
    End If
Next

Un saludo.


Quizás tengas que reformular los condicionales, porque al desconocer los datos que guardas en las tablas, igual no son los más adecuados...

Pero no deberías tener problemas en adecuarlos a lo que tengas.

Perfecto, ya está en marcha. Pero tengo una duda: Este subformulario (Subformulario_Provincias_Comerciales) está incluido en el formulario (Formulario Comerciales) como un subformulario independiente. Quiero que al abrir el formulario principal se calcule el Subformulario, para ello he puesto el código en el evento del subformulario Form_Open y lo calcula bien, pero al cambiar de registro en el formulario principal debería recalcular el formulario. ¿Cómo puedo solucionarlo? He intentado poner en el formulario principal en el evento Form_Load

Forms![Formulario Comerciales]![SubFormulario_Provincias_Comerciales].Form.Refresh

Pero no me funciona

Cambia el código del form_open al form_load, y prueba con requery en vez de refresh

No funciona, ten en cuenta que el Subformulario_Provincias_Comerciales es un subformulario independiente y tiene origen de datos. Es un listado de provincias con casillas de verificación y al cambiar el valor de una de estas casillas se actualiza el valor en la tabla Provincias. Por ejemplo, al cambiar Acoruña:

Private Sub Acoruña_AfterUpdate()
Valor_Provincia = Me![Acoruña]
Nombre_Provincia = "Acoruña"
Id_Comercial = Forms![Formulario Comerciales]![Referencia]
Set dbsBase = CurrentDb
Set rstTabla = dbsBase.OpenRecordset("Tabla_Provincias", dbOpenDynaset)
    rstTabla.FindFirst "Id_Provincia ='" & Nombre_Provincia & "'"
    rstTabla.Edit
        If Valor_Provincia = True Then
            rstTabla![Id_ComercialAsignado] = Id_Comercial
        Else
            rstTabla![Id_ComercialAsignado] = Null
        End If
        rstTabla.Update
End Sub

Por tanto la opción de requery no creo que es válida.

No entiendo el sistema que tienes montado, la verdad...

Dices que el subformulario es independiente, pero a su vez quieres que cambie según el registro del formulario => para mí eso es un subformulario dependiente...

Dices también que quieres que al cambiar de registro del formulario principal se recalcule el subformulario => eso lo hace el Requery

También creo que no terminas de entender del todo los eventos: "al abrir" se ejecuta al abrir un formulario, pero antes de cargar los registros, y una vez abierto el formulario, no se vuelve a ejecutar. El evento "al cargar", se produce al abrir el formulario y cargar los registros, y se desencadena de nuevo con cada Requery que le hagas al formulario. Por tanto, aunque puedan parecer lo mismo, no lo son. Y por eso en mi anterior respuesta de decía que cambiaras el código del "al abrir" del subformulario a "al cargar".

Por otro lado, lo del evento "al cargar" del formulario principal no te funciona, porque lo que buscas es un código que se ejecute cada vez que cambias el registro, y no solo al cargar el formulario, o sea, que tendrás que usar el evento "al activar registro"

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas