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:
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
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
0