Crear una base de datos para gestionar cuotas de alumnos

Este tema comenzó en el chat de Telegram LibreOffice-es. Ante la sugerencia de @mariosv de trasladarlo aquí para que no se pierda la conversación, que a él le pareció que podía ser interesante para más usuarios, voy a intentar trasladarla a aquí.

Algunos mensajes no aparecen completos o tienen anexos que no se ven, pero se pueden consultar en Telegram

1 Like

Mario Mey in LibreOffice-ES

Buen día, gente. Estoy aprendiendo un poco Base para armar la base de datos para la cooperadora de mi colegio. Voy a estar preguntando algunas cosas por aquí… desde ya, gracias.
Tengo una tabla ALUMNOS con los datos de todos los alumnos. Por el momento, tienen un id_alumno, nombres, apellido y algunas campos más que no se usan.

Tengo otra tabla SOCIES que voy a ir llenando mediante un formulario, que se tratan de los padres de los alumnos que pagan la cooperadora. Tiene algunos campos, entre ellos, id_alumno (que estaría linkeado con el del alumno).

Quiero armar un formulario en el que, cuando agregue un elemento nuevo a SOCIES, llenando los campos, pero quiero que pueda linkearse al alumno correspondiente.

Sé cómo hacerlo seleccionando al alumno a su id_alumno (clave principal)… pero obviamente, cuando quiera elegir al alumno, no voy a saber ese número… entonces, quiero buscarlo por su apellido y nombre.

¿Cómo hago para hacer una búsqueda por el nombre y apellido para saber su id_alumno, desde un formulario?

Si es complejo y a esto se le llama de alguna forma en particular, por favor, díganme cómo es, así puedo googlear esta funcionalidad.

Gracias.

Hola Jucasaca, a primera vista distingo un error de diseño en tu estructura de datos, debido a que seguramente te encontrarás con el caso de que haya más de un alumno por SOCIES, o más de un Socies por alumno, en tal caso deberías contar con una table de detalle de Socies donde se agreguen los alumnos.

Yo haría lo siguiente:
Tabla de Familias Id_familia, id_socies, id_alumnos
Tabla de Socies Id_socies
Tabla de Alumnos, Id_alumno,
Tabla de Cursos Id_curso, periodo_anual
Tabla de Clase Id_clase, Id_curso, Id_alumnos

Un caso
Familia Williams tiene 1 padre, 1 madre, 1 abuelo, 2 hijos
Hijo 1 tiene como socies al padre quien paga esa mensualidad, asiste a Nivel 4 de 2024
Hijo 2 tiene como socies al padre quien paga esa mensualidad, asiste a Nivel 2 de 2024
Madre, Padre y Abuelo están autorizados para retirar alumnos de clase, pagar cuotas o solicitar aplazamientos, prórrogas o becas,

Posteriormente podrás realizar las consultas siguiendo con las ayudas que te han dado…

Saludos,

Mario Mey in LibreOffice-ES

Mario Mey in LibreOffice-ES

El macro es este:

REM ***** BASIC *****

Sub Main

End Sub 

Sub search
dim oFilter as object
dim oFormCtl as object

oFormCtl = ThisComponent.Drawpage.Forms.getByName("FrmMain")
oFilter = oFormCtl.getByName("TextBoxSearch")

if oFilter.Text <> "" then
oFormCtl.Filter = " UPPER(apellido) LIKE " + "UPPER('%"+ofilter.Text+"%')"
oFormCtl.ApplyFilter = True
else
oFormCtl.ApplyFilter = False
end if

oFormCtl.Reload
End Sub

t.me/libreoffice_es/91813

Jun 12 at 09:56

jucasaca in LibreOffice-ES

Lo mejor sería que compartieras la base de datos, que supongo que de momento no tendrá datos confidenciales, o si los tiene, podrías enviar una copia con solo unos pocos datos (anonimizados) de prueba.

Lo primero que veo en la relación de las tablas que nos muestras, es que hay algo que a mí no me encaja.

Según se ve, un alumno puede tener varios socios, que según la descripción, son los padres; esto es correcto un alumno puede tener varios padres, se supone que dos como máximo y yo supongo que solo uno será socio.

Por otro lado,según esta relación, cada socio podrá tener relacionado solo uno alumno , y yo supongo que algún socio tendrá más de un hijo en el centro, incluso puede que haya algún gemelo en la clase.

La solución a este problema, suponiendo que solo habrá un socio, independientemente del número de alumnos relacionados, es añadiendo a la tabla alumnos el campo id_socio, y relacionando este campo con el campo ID de la tabla SOCIES. (Eliminando la relación previa y si se quiere también el campo id_alumno de la tabla SOCIES

Si queremos que también haya la posibilidad de tener dos socios por alumno, la cosa se complicaría.

Para hacer lo que quieres, no se necesita ninguna macro. Un campo de lista es suficiente…
No se por que oscura razón hay tendencia a pensar que todos los problemas de Base se solucionan con macros

t.me/libreoffice_es/91814

edited Jun 12 at 09:59

Mario Mey
Uy, qué bueno que me des una mano con esto. Igualmente, aquí son las 5am… me desvelé y me puse a hacer esto :person_facepalming:. Así que ahora me voy a dormir y seguiré otro día. ¡Gracias por contestar!

Bueno, aquí te echo otra mano y de paso, para el resto, vemos que hacer una base de datos no es tan complicado y que las quinientas columnas con las cuotas se pueden sustituir fácilmente con una pequeña tabla enlazada (me imagino una tabla de Calc con columnas para cada mes; suponiendo que solo se ponga fecha y cantidad, en ocho o nueve meses ya estamos en columnas de dos letras , si se pone otra columna para pagado…)

t.me/libreoffice_es/91816

edited Jun 12 at 11:22
(Aquí hay un vídeo enlazado)
Y esta es la base de datos
socies.odb (21,3 KB)

Pip in LibreOffice-ES


Mario Mey
El macro es este: REM ***** BASIC ***** Sub Main End Sub Sub search dim oFilter as object dim oFormCtl as object oFormCtl = ThisComponent.Drawpage.Forms.getByName(“FrmMain”) oFilter = oFormCtl.getByName(“TextBoxSearch”) if oFilter.Text <> “” then…

Una base de datos para ser sólida necesita un id único por persona, eso da consistencia y solidez a la base de datos. Acá en Chile existe el Rut, para todas las bases de datos.
Y no necesitas macro, BASE ocupa sql, sql es un lenguaje de consultas completo.

Pip in LibreOffice-ES


Mario Mey
El macro es este: REM ***** BASIC ***** Sub Main End Sub Sub search dim oFilter as object dim oFormCtl as object oFormCtl = ThisComponent.Drawpage.Forms.getByName(“FrmMain”) oFilter = oFormCtl.getByName(“TextBoxSearch”) if oFilter.Text <> “” then…

Y la relación de tutores o socios con el alumno es: relación mucho a mucho por lo que tendrás la tabla de socios, la tabla de alumnos y la tabla socios_alumnos

jucasaca in LibreOffice-ES


Pip
Y la relación de tutores o socios con el alumno es: relación mucho a mucho por lo que tendrás la tabla de socios, la tabla de alumnos y la tabla socios_alumnos

Así es, podría ser una relación n-m, pero es muy poco probable que, según la descripción, los dos padres quieran pagar la cuota y además, proponer una relación muchos a muchos complicaría mucho la vida a alguien que está comenzando con las bases de datos

t.me/libreoffice_es/91827

edited Jun 12 at 15:48

Pip in LibreOffice-ES


jucasaca
Así es, podría ser una relación n-m, pero es muy poco probable que, según la descripción, los dos padres quieran pagar la cuota y además, proponer una relación muchos a muchos complicaría mucho la vida a alguien que está comenzando con las bases de datos

Es mejor que parta simple tienes razón.
Aunque hay que evaluar los casos :+1:

t.me/libreoffice_es/91828

Jun 12 at 15:56

Pip in LibreOffice-ES


jucasaca
Así es, podría ser una relación n-m, pero es muy poco probable que, según la descripción, los dos padres quieran pagar la cuota y además, proponer una relación muchos a muchos complicaría mucho la vida a alguien que está comenzando con las bases de datos

La cuota debe estar asociado a un calendario de pagos del alumno. Los socios o padres serían información adicional en su tabla correspondiente

t.me/libreoffice_es/91829

Jun 12 at 18:21

jucasaca in LibreOffice-ES


Pip
La cuota debe estar asociado a un calendario de pagos del alumno. Los socios o padres serían información adicional en su tabla correspondiente

No sabemos (al menos yo) exactamente todo el proceso, pero yo entiendo que la cuota está asociada al socio, y no al alumno, y así es como lo he relacionado, pero no habría ningún inconveniente en relacionarla con el alumno y también con el socio (que se supone que es quien paga).
Efectivamente, y así he diseñado la tabla de cuotas, cada registro tiene una fecha y un importe y está relacionado con quien supongo que es el pagador. Quizá falten más campos, y quizá haya que añadir todas las cuotas del año de una vez (no me parecería lógico) o quizá habría que rediseñar toda la base de datos dependiendo de las necesidades concretas (que de momento desconozco), pero no olvidemos que es un ejemplo que he creado para ayudar a que se vean las posibilidades y se solucionen algunas aberraciones que se aprecian en el diseño.
Si queremos un diseño completo y exacto de las necesidades de cada uno, quizá haya que cobrar algo :stuck_out_tongue_winking_eye:, aquí estamos para ayudar, no para hacer el trabajo a otros. Y si alguien tiene una duda se contestará, pero se requiere también su esfuerzo, cuando menos para explicar lo que pretende

t.me/libreoffice_es/91836

Jun 12 at 19:15

Pip in LibreOffice-ES


jucasaca
No sabemos (al menos yo) exactamente todo el proceso, pero yo entiendo que la cuota está asociada al socio, y no al alumno, y así es como lo he relacionado, pero no habría ningún inconveniente en relacionarla con el alumno y también con el socio (que se supone…

Se podría tener una tabla de fechas mes año, para hacer una consulta cruzada con la tabla de cuotas y ver todos los meses: pagados y no pagados

t.me/libreoffice_es/91837

Jun 12 at 20:18

jucasaca in LibreOffice-ES


Pip
Se podría tener una tabla de fechas mes año, para hacer una consulta cruzada con la tabla de cuotas y ver todos los meses: pagados y no pagados

Si tenemos una tabla de cuotas con fecha de emisión y algún campo que indique si el recibo está pagado o no, no se necesitan más tablas, una simple consulta a la tabla de cuotas permite conocer ese dato.
Puedes ver la explicación en esta respuesta Telegram: Contact @libreoffice_es y la tabla con el ejemplo en esta otra Telegram: Contact @libreoffice_es


Telegram
jucasaca in LibreOffice-ES

t.me/libreoffice_es/91839

Jun 12 at 20:23

jucasaca in LibreOffice-ES

Evidentemente,como te he dicho antes, es un ejemplo simplificado, no una base de datos real. En ella siempre utilizo como fecha de emisión el primer día de mes, que es lo que más se usa, pero se podría seleccionar un rango de fechas en vez de una fecha concreta

t.me/libreoffice_es/91840

edited Jun 12 at 20:28

Pip in LibreOffice-ES


jucasaca
Si tenemos una tabla de cuotas con fecha de emisión y algún campo que indique si el recibo está pagado o no, no se necesitan más tablas, una simple consulta a la tabla de cuotas permite conocer ese dato. Puedes ver la explicación en esta respuesta https:/…

Muy interesante, muy buen aporte.
Aliento a los del grupo a ver el video y aprender un poco de base de datos que no todo es hojas de cálculos (muy mala estrategia para manejar bases de datos ya que no es el propósito del programa)

t.me/libreoffice_es/91841

Jun 12 at 20:29

gmolleda in LibreOffice-ES


jucasaca
No sabemos (al menos yo) exactamente todo el proceso, pero yo entiendo que la cuota está asociada al socio, y no al alumno, y así es como lo he relacionado, pero no habría ningún inconveniente en relacionarla con el alumno y también con el socio (que se supone…

Pero paga tantas cuotas como alumnos le pertenezcan, una cuota por alumno, una o más de una por socio.

t.me/libreoffice_es/91842

Jun 12 at 20:38

jucasaca in LibreOffice-ES


gmolleda
Pero paga tantas cuotas como alumnos le pertenezcan, una cuota por alumno, una o más de una por socio.

Bueno, no lo sabemos, en el colegio de mis hijos se pagaba una sola cuota por todos los hijos, me parece recordar.

Si como dices se paga una cuota por alumno, tendríamos que enlazar la tabla de cuotas con el alumno en primer lugar y con el socio por otro lado.

t.me/libreoffice_es/91843

Jun 12 at 20:46

Rodrigo in LibreOffice-ES

Ya que estamos… ¿Podrían sugerir un par de fuentes donde aprender diseño de bases de datos para principiantes?

t.me/libreoffice_es/91846

Jun 12 at 22:41