Access impedir registros según registro anterior

Tengo una tabla de access con una serie de campos: DNI de Socio, N° de cuota (1°, 2° y 3°, como opciones), Fecha de pago. He creado un formulario para introducir los datos en esta última.
Quisiera saber si es posible hacer (ya sea con un macro o con validaciones) que para un determinado socio (campo DNI socio), no sea posible registrar la cuota "2°" si es que antes no se hizo un registro para el mismo socio con la cuota "1°". Esto es para que no pueda registrarse que un socio haya pagado la segunda cuota sin que haya abonado la primera de ese año.

2 respuestas

Respuesta
2

Por hacerlo puedes hacerlo de mil formas. Al no saber exactamente como lo quieres. Supongamos que con la tabla Pagos hago un formulario continuo. Si escribo la cuota 2 y no ha abonado la 1

Al pulsar Aceptar el cursor se vuelve a Ncuota para que lo cambies. Vamos a suponer que ha abonado la 1 pero no la 2(este tío no tiene remedio)

El código del evento Antes de actualizar del cuadro de texto Ncuota es

Private Sub NCuota_BeforeUpdate(Cancel As Integer)
If NCuota = 2 And Nz(DCount("*", "pagos", "dni like '" & Me.DNI & "' and ncuota=1")) = 0 Then
MsgBox "Este tío no ha abonado la cuota 1", vbOKOnly + vbExclamation, "Liquídalo"
DoCmd.CancelEvent
ElseIf NCuota = 3 And Nz(DCount("*", "pagos", "dni like '" & Me.DNI & "' and ncuota=2")) = 0 Then
MsgBox "Tampoco ha pagado la cuota 2", vbOKOnly + vbExclamation, "Este tío es un cara"
DoCmd.CancelEvent
End If
End Sub

Pero como te decía puedes hacerlo de muchas formas.

Sería mucha molestia que me explicases cada frase del código así lo puedo adaptar correctamente? Gracias :D

Sería mucha molestia que me explicases cada frase del código así lo puedo adaptar correctamente? Gracias :D

Le digo, en el evento Antes de actualizar, es decir antes de guardar el valor comprueba

- Si el numero que escribo es 2 y no hay ninguna cuota con valor 1 que corresponda a ese DNI en la tabla Socios entonces avísame y "anula" el proceso. Eso es lo de Dcount, es decir cuéntame si hay algún registro( y como me da igual el valor que sea, ya que también podría poner

Dcount("DNI","socios","Ncuota=1 and DNI like '" & me.dni & "'")

Además le pongo que use la función NZ que convierte los nulos en ceros, ya que si no fuera así no los contaría. Por ejemplo, supón que te digo, cuéntame cuantos niños chinos hay en ese grupo. Al no haber ninguno no me dirías nada, con lo cual yo no lo sabría. Pero si te digo cuéntame cuantos niños chinos hay en ese grupo y en caso de no haber ninguno dime Ninguno. Entonces vienes y me das la mala noticia.

También le digo, que en caso de que no se cumpla la condición anterior, es decir, que si hay al menos un registro donde el DNI sea igual al que has escrito( o elegido) y que Ncuota=1, entonces comprueba ¿Hay algún registro en la tabla en que Ncuota sea igual a 2 y DNI sea igual a...? Si me dice que no(=0) entonces que no me admita que pueda escribir el 3 cuando no me ha pagado el 2.

Como te dije, lo puedes hacer de mil formas. Esta respuesta es válida porque dijiste que siempre eran tres cuotas. En caso de ser más se puede hacer de otra forma, usando por ejemplo

Do while...

Respuesta

La respuesta es valida cuando solo son 3 cuotas ¿Qué pasa si son 50 cuotas?. Tendríamos cualquier cantidad de IF ELSEIF o un CASE con 50 validaciones. Y eso que supongo que en esta pregunta se asume que el valor de la cuota es constante ¿Qué pasaría si se aceptarán abonos parciales de la cuota?. Si quiere un ejemplo completo de un sistema de amortización de préstamos en donde se aceptan abonos menores o mayores que la cuota del periodo puede enviarme su correo a [email protected] haciendo referencia en el asunto sobre su petición y con gusto se lo hago llegar el ejemplo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas