Access - Código para conocer el estado de la cuota social

 
Vista:

Código para conocer el estado de la cuota social

Publicado por JIGGPF (1 intervención) el 18/07/2023 13:58:17
Tengo una base de datos en Access con la que gestiono los datos de los socios de mi Asociación. En la tabla, tengo los siguientes campos:
campo "Grado", de tipo texto, que recoge el tipo de socio, pudiendo tener los valores "Caballero", "Dama", "Paje", "Infantina" y "Socio de Honor";
campo "Fecha de alta", de tipo fecha, que recoge la fecha de alta de cada socio, siguiendo el modelo DD/MM/AAAA
campo "Fecha de baja", de tipo fecha, que recoge la fecha de baja de cada socio, siguiendo el modelo DD/MM/AAAA
y sucesivos campos "Cuota [Año]" (donde [Año] es el número de los sucesivos años desde el 2020), de tipo verdadero/falso, que recoge si la cuota está pagada (verdadero) o pendiente de pago (falso)

Quiero crear un campo calculado que me diga, textualmente, que el socio está al día del pago de sus cuotas o qué cuotas tiene pendiente cada socio y a cuánto asciende el importe que debe. Este campo debe tener en cuenta los siguientes factores:
el campo "Fecha de alta", dado que el mismo año en que se produce el alta ya se paga la cuota; el código debe tener en cuenta la posibilidad de que no conste la fecha de alta en cuyo caso se asume que es el 31/12/2019.
el campo "Fecha de baja", dado que después de esa fecha ya no se pagan cuotas
que los socios con "Grado" "Caballero" o "Dama" pagan 25 euros al año, mientras que "Paje" e "Infantina" pagan 10 euros al año; los "Socios de Honor" pagan 0 euros.

Si el socio está al día del pago de todas sus cuotas, el campo debería mostrar el texto " estás al día del pago de todas las cuotas ". En cambio, si debe cuotas deberá mostrar un texto que indique los años que debe y la cuantía similar a "debes la cuota de los años 2020, 2021 y 2022, es decir, 75 euros" (si solo se debiera un año, el texto sería "debes la cuota del año 2021, es decir, 25 euros"). Estos textos deben tener coherencia gramatical, no pudiendo mostrar textos como " debes las cuotas 2020" o "debes las cuotas 2020, 2021".

He tratado de que el código sea lo más compacto posible y que esté programado de tal manera que no requiera de ninguna modificación, ni en su programación, ni en la manera de ser invocado en el campo para los años sucesivos.


Este es el código que he escrito:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
Public Function EstadoCuotas2(Grado As String, FechaAlta As Date, FechaBaja As Date, ParamArray Cuotas() As Variant) As String
    Dim i As Integer
    Dim TotalDebe As Double
    Dim Anno As Integer
    Dim TextoDebe As String
 
 
    'Verificar el estado de cada cuota
    'Socios con fecha de baja
    If Not IsEmpty(FechaBaja) Then
        If LBound(Cuotas) < Year(FechaBaja) Then
            TotalDebe = 0
            TextoDebe = ""
        Else
            For i = LBound(Cuotas) To Year(FechaBaja)
                Anno = 2020 + i
                If Not Cuotas(i) Then
                    TotalDebe = TotalDebe + IIf(Grado = "Caballero" Or Grado = "Dama", 25, IIf(Grado = "Paje" Or Grado = "Infantina", 0, 10))
                    TextoDebe = TextoDebe & IIf(Len(TextoDebe) > 0, ", ", "") & Anno
                End If
            Next i
        End If
 
    'Socios sin fecha de alta
    ElseIf IsEmpty(FechaAlta) Then
        FechaAlta = DateSerial(2019, 12, 31)
        For i = Year(FechaAlta) To UBound(Cuotas)
            Anno = 2019 + i
            If Not Cuotas(i) Then
                TotalDebe = TotalDebe + IIf(Grado = "Caballero" Or Grado = "Dama", 25, IIf(Grado = "Paje" Or Grado = "Infantina", 0, 10))
                TextoDebe = TextoDebe & IIf(Len(TextoDebe) > 0, ", ", "") & Anno
            End If
        Next i
 
    'Socios con fecha de alta y sin fecha de baja
    Else
        For i = LBound(Cuotas) To UBound(Cuotas)
            Anno = 2020 + i
            If Not Cuotas(i) Then
                TotalDebe = TotalDebe + IIf(Grado = "Caballero" Or Grado = "Dama", 25, IIf(Grado = "Paje" Or Grado = "Infantina", 0, 10))
                TextoDebe = TextoDebe & IIf(Len(TextoDebe) > 0, ", ", "") & Anno
            End If
        Next i
    End If
 
 
    ' Construir el texto de estado de cuotas
    If Len(TextoDebe) > 0 Then
        If Len(TextoDebe) > 4 Then
            TextoDebe = "debes las cuotas de los años " & Left(TextoDebe, Len(TextoDebe) - 6) & " y " & Right(TextoDebe, 4)
        Else
            TextoDebe = "debes la cuota del año " & TextoDebe
        End If
        EstadoCuotas2 = TextoDebe & ", es decir, " & TotalDebe & " euros"
    Else
        EstadoCuotas2 = "estás al día del pago de todas las cuotas"
    End If
End Function


Cuando lo ejecuto, a través de una consulta de anexión de información, me indica que 203/243 registros no se han podido actualizar por un error en la conversión de tipos. Además, socios que tienen pendiente alguna cuota aparecen como al día. ¿Dónde está el fallo? Porque por más que lo reviso no logro dar con él.

Gracias a todos
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder