Ayuda elección dentro del Formulario

Espero que me ayudéis con esto.

Tengo ese formulario y quiero hacer que al darle a la lista se vayan agregando los módulos debajo, pero sólo pueden sumar 6 créditos en total(el campo créd va diciendo cuanto vale cada uno).

Y además de esto a la hora de elegir la combinación depende del campo Tipo y solo puede ser:

H+H+V

H+V+V

I+V

Las H y las V valen 2 y la I vale 4 de ahí esa combinaciones

1 Respuesta

Respuesta
1
Private Sub Form_Current()
On Error GoTo Err_Form_Current
    Dim miRegistros As Recordset, miValor As Integer
    miValor = 0
    Set misRegistros = Me.miSubform.Form.RecordsetClone
    With misRegistros
        If .EOF And .BOF Then
            Exit Sub
        Else
            .MoveLast
            .MoveFirst
            Do Until .EOF
                miValor = miValor + !Campo1.Value
                .MoveNext
            Loop
        End If
        .Close
    End With
    Select Case miValor
        Case Is >= 6
            Me.Lista8.Enabled = False
        Case Else
            Me.Lista8.Enabled = True
    End Select
Exit_Form_Current:
    Exit Sub
Err_Form_Current:
    MsgBox Err.Description
    Resume Exit_Form_Current
End Sub

Buenas noches.

Hay varias maneras de hacerlo. Te voy a indicar una de ellas teniendo en cuenta que lo que te comento debes de adecuarlo a tu diseño en concreto.

Añade como referencia a tu código, en la ventana de código Menú Herramientas, submenú Referencias, buscas en la lista Microsoft DAO 3.6 Object Library y la marcas para añadirla. Con ello ya puedes usar recordsets para efectuar cálculos...

En el formulario principal que muestras en la imagen añade código similar al que incluyo al principio de esta respuesta (modificándolo según los nombre de tus controles).

Este código hace lo siguiente: en el evento current que se ejecuta al activar un registro en el formulario principal (modulo alumno) crea una copia de los registros que halla en el subformulario. Sobre esa copia efectúa el cálculo de sumar los valores en mi caso del campo1 (en tu caso sería del campo crédito). Tras sumar los valores hay un select case que hace que si el valor es igual o superior a 6 inhabilita el cuadro de lista Lista8 (en tu caso debería inhabilitar la lista de módulos de modo que impida añadir más al alumno activo).

También hay que considerar que sucede si un alumno ya tiene por ejemplo 4 créditos. Al no estar bloqueada la lista en teoría podría usarla para añadir un nuevo módulo de cuatro créditos. La próxima vez que abrieses el formulario ya no te dejaría añadir más, ya que ya tiene 8 créditos, pero no hemos evitado esta circunstancia. Para ello debemos de usar también el evento antes de actualizar del cuadro de lista en donde seleccionamos los módulos. Te copio el código (modifica según nombre...)

Private Sub Lista8_BeforeUpdate(Cancel As Integer)
On Error GoTo Err_Lista8_BeforeUpdate
    Dim miRegistros As Recordset, miValor As Integer
    miValor = 0
    Set misRegistros = Me.Tabla1.Form.RecordsetClone
    With misRegistros
        If .EOF And .BOF Then
            Exit Sub
        Else
            .MoveLast
            .MoveFirst
            Do Until .EOF
                miValor = miValor + !Campo1.Value
                .MoveNext
            Loop
        End If
        .Close
    End With
    miValor = miValor + Me.Lista8.Value
    Select Case miValor
        Case Is > 6
            Cancel = True
        Case Else
    End Select
Exit_Lista8_BeforeUpdate:
    Exit Sub
Err_Lista8_BeforeUpdate:
    MsgBox Err.Description
    Resume Exit_Lista8_BeforeUpdate
End Sub

Como verás es similar al anterior con algunas diferencias. Tras sumar los valores de créditos del subformulario se suman los valores de créditos del modulo seleccionado en Lista8. Si esa nueva suma es mayor de 6 se ejecuta Cancel=True, lo que hace que no se guarde el cambio hecho en Lista8. Si el nuevo valor es inferior a 7 se añadirá el nuevo módulo al alumno activo.

Con ello controlas el total de créditos independientemente de las combinaciones que puedan existir para sumar como máximo 6 créditos.

Cordiales saludos.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas