Access - Año y morosos

 
Vista:

Año y morosos

Publicado por Javier (109 intervenciones) el 08/06/2011 21:09:00
Hola y gracias a todos de antemano:

Estoy haciendo una BD de una asociación y ahora estoy con una consulta para saber que socios no han pagado su cuota en un año "X"

Para ello tengo hechas tres consultas con las que me salen las personas que no me han pagado ese año "X", pero si el socio fue dado de alta el año siguiente también me aparece como no pagado en ese año "X"

Las consultas son las siguientes:

TODOS LOS SOCIOS
SELECT socios.[Nº Socio], socios.Nombre, socios.[1º Apellido], socios.[2º Apellido], socios.[Fecha de alta]
FROM socios;

AÑO PAGADO/u]
SELECT [TODOS LOS SOCIOS].[Nº Socio], [TODOS LOS SOCIOS].Nombre, [TODOS LOS SOCIOS].[1º Apellido], [TODOS LOS SOCIOS].[2º Apellido], cuotas.Año, cuotas.Cantidad
FROM cuotas LEFT JOIN [TODOS LOS SOCIOS] ON cuotas.Nº_Socio = [TODOS LOS SOCIOS].[Nº Socio]
WHERE (((cuotas.Año)=[QUE AÑO]));

3º [u]FINAL

SELECT [TODOS LOS SOCIOS].[Nº Socio], [TODOS LOS SOCIOS].Nombre, [TODOS LOS SOCIOS].[1º Apellido], [TODOS LOS SOCIOS].[2º Apellido], [AÑO PAGADOS].Cantidad
FROM [TODOS LOS SOCIOS] LEFT JOIN [AÑO PAGADOS] ON [TODOS LOS SOCIOS].[Nº Socio]=[AÑO PAGADOS].[Nº Socio]
WHERE ((([AÑO PAGADOS].Cantidad) Is Null));

Espero que alguien pueda ayudarme con mi problema. Muchas gracias nuevamente.
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

Año y morosos

Publicado por angelessebas (208 intervenciones) el 09/06/2011 19:31:49
Hola,

¿Me puedes decir las tablas y campos de esas tablas?

Saludos, Angeles

http://angelessebas.es/
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Año y morosos

Publicado por Javier (109 intervenciones) el 09/06/2011 23:38:34
Hola Angeles:

La base solo tiene dos tablas, socios y cuotas.

socios

Nº socio
Nombre
....
Fecha de alta
Fecha de baja

cuotas

Nº Socio
Año
Cantidad
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Año y morosos

Publicado por angelessebas (208 intervenciones) el 10/06/2011 19:45:46
Hola,

Yo lo haría de la siguiente forma.

Supongamos que las tablas Socios tiene los campos NumSocio, FechaAlta y FechaBaja y la tabla Cuotas: NumSocio, Año y Cuota.

Crearia otra tabla que llamo Estado con los campos NumSocio, Año y Pagado

Con un código llenaría esta tabla viendo los pagados y no pagados, así tendría todo en la misma tabla.

El código sería:

Function EstadoCuentas()

Dim db As Database
Dim rs1 As Recordset
Dim rs2 As Recordset
Dim vAño As Integer

Set db = CurrentDb

DoCmd.RunSQL "Delete * from Estado"

Set rs1 = db.OpenRecordset("Estado")

Set rs2 = db.OpenRecordset("Select * from socios where FechaBaja is null")

Do While Not rs2.EOF

vAño = Year(rs2!FechaAlta)

Do While vAño <= Year(Date)

If IsNull(DLookup("[NumSocio]", "[Cuotas]", "NumSocio='" & rs2!NumSocio & "' and Año=" & vAño & "")) = True Then

rs1.AddNew
rs1!NumSocio = rs2!NumSocio
rs1!Año = vAño
rs1!Pagado = "No"
rs1.Update

Else

rs1.AddNew
rs1!NumSocio = rs2!NumSocio
rs1!Año = vAño
rs1!Pagado = "Si"
rs1.Update

End If

vAño = vAño + 1
Loop

rs2.MoveNext
Loop

End Function

Saludos, Angeles

http://angelessebas.es/
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Año y morosos

Publicado por Javier (109 intervenciones) el 10/06/2011 20:46:41
Y, ¿cual es la función de la tabla Estado? Porque los campos son los mismos que la tabla "cuotas"
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Año y morosos

Publicado por angelessebas (208 intervenciones) el 13/06/2011 15:42:55
Hola,

La tabla Estado lo que te dice es, para un socio y año, los pagados o no. Por eso se genera nueva cada vez que pasas el código, ya que si te fijas, lo primero que hago es un DELETE de esa tabla.

Te explico el código:

Function EstadoCuentas()

'declaramos las variables

Dim db As Database
Dim rs1 As Recordset
Dim rs2 As Recordset
Dim vAño As Integer

'activamos la base de datos

Set db = CurrentDb

'Borramos la tabla Estado y la asociamos al recordset rs1

DoCmd.RunSQL "Delete * from Estado"

Set rs1 = db.OpenRecordset("Estado")

'Abrimos el recordset rs2 basado en la tabla socios que estén activos (es decir sin fecha de baja)

Set rs2 = db.OpenRecordset("Select * from socios where FechaBaja is null")

'Recorremos el recordset rs2

Do While Not rs2.EOF

'asociamos la variable vAño al año de la fecha de alta

vAño = Year(rs2!FechaAlta)

'Hacemos un bucle que se complete mientras esta variable sea menor o igual al año del día actual

Do While vAño <= Year(Date)

'con dlookup lo que hacemos es buscar en la tabla cuotas si existe algún registro para ese año y
'ese socio

If IsNull(DLookup("[NumSocio]", "[Cuotas]", "NumSocio='" & rs2!NumSocio & "' and Año=" & vAño & "")) = True Then

'si no existe es que no ha pagado e insertamos el registro en la tabla estado con pagado=No

rs1.AddNew
rs1!NumSocio = rs2!NumSocio
rs1!Año = vAño
rs1!Pagado = "No"
rs1.Update

Else

'si existe lo insertamos en la misma tabla, pero con pagado=Sí

rs1.AddNew
rs1!NumSocio = rs2!NumSocio
rs1!Año = vAño
rs1!Pagado = "Si"
rs1.Update

End If

vAño = vAño + 1
Loop

rs2.MoveNext
Loop

End Function

De este modo en la tabla Estado tienes todo lo que quieres, pagados y no pagados y sobre ella podrás hacer las consultas pertinentes.

Me cuentas, saludos Angeles

http://angelessebas.es/
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar