• Viernes 8 de Noviembre de 2024, 07:40

Autor Tema:  Crear un horario de cursado  (Leído 1800 veces)

donramone

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Crear un horario de cursado
« en: Lunes 8 de Marzo de 2010, 23:31 »
0
Hola a todos, espero que alguién me pueda dar una mano con esta situación
Estoy creando una carga de horarios de cursado de un colegio y el primer planteo que se me viene para realizarlo es de la siguiente forma; los datos los guardaria en una tabla "Horarios" con: id_horarios (Autonumerico), Modulo, Dia, id_Carrera.

En la pantalla de visual basic tengo: 1 ComboBox (CmbCarrera) cargado con los nombres de las carreras , 5 label con los dias (lunes a viernes) y 4 label mas con los modulos de horario (ej: modulo I 20Hs a 22Hs)
Al seleccionar en el CmbCarrera me llena 20 combobox (CmbMaterias) con los nombres de las materias de dichas carreras y en el itemdata guardo los id de esas materias.
Como no me deja subir imagnes trato de ejemplificarlo de esta manera:

       ------------------ Lunes ---------------------  Martes............
Modulo I  cmbmaterias(0)  ---------------  cmbmaterias(1)
..........
Modulo IV   ----------------------------------  cmbmaterias(X)

Bueno el unico problema que tengo ES QUE NO TENGO LA MINIMA IDEA de como podria guardar esos datos (si es que se puede).Creeria que necesitaria crear una matriz pero no lo se hacer.
Lo que quisiera hacer es en la tabla me quede guardado asi:
Id_horario= 1, Modulo= 1, Dia= 1, id_carrera =(lo que tenga seleccionado en el combobox que pertenece a esa posicion)
id_horario=2, Modulo= 1, Dia= 2, id_carrera =(lo que tenga seleccionado en el combobox que pertenece a esa posicion)
....
id_horario=x, Modulo= 4, Dia= 5, id_carrera =(lo que tenga seleccionado en el combobox que pertenece a esa posicion)

Alguién me podria dar una mano?
Deberia plantearlo de otra manera lo que guardo en la tabla?
conviene usar otro control y no 20 Combobox?
* hay datos q no mostre como el del usuario que le correspone ese horario o el curso, para tratar de sea mas legible mi problema.

Bueno cualquier ayuda me es bienvenida y agradecida
Salutes!

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Crear un horario de cursado
« Respuesta #1 en: Lunes 15 de Marzo de 2010, 15:25 »
0
Bueno, previamente quiero aclararte que este tipo de post (al menos a mi) me da pereza contestarlos, porque quedan tantas cosas al aires, que en primer lugar genera una respuesta muy larga y en segundo lugar es muy probable que tras darte una respuesta luego venga un aluvión con un 'pequeño ciento' de preguntas secundarias al respecto y uno no tiene tanto tiempo libre como para responder a cada detalle que además es muy probable que sean muy básicas.
Pese a todo, no puedo pasar tu mensaje por alto y quiero darte por lo menos una orientación....

Aunque dices tener claro la tabla 'horarios' TblHorarios... sin embargo me parece que mejor repases todo el post para hacer los cambios oportunos... el post en sí, es una 'pequeña  lección' de como diseñar tablas y compartimentar los campos en las tablas necesarias y como estas se relacionan entre si.

__________________
PRIMERA PARTE:
Bien a partir de aquí conviene que tengas la primera tabla, para las materias, y ahora te explico como debe estar organizada esta tabla:
Tabla: 'TblMaterias
* Id_Materia: valor autonumérico y único
* Nombre: el nombre que define la materia
* Descripcion: Texto ampliado que describe la materia. este campo no es estrictamente necesario

Si hay alguna particularidad más común a todas las materias, pero que cada una tiene la suya, debe usarse un campo para esa propiedad. En cambio si hay una propiedad que como el horario, lo tienen todas las materias, pero evidentemente no es fijo por la materia sino por la carrera, no puede ser asignado a esta tabla.

A esta tabla se le asocia otra muy parecida llamada materias por carrera. Este tipo de tablas son 'tablas Indice'
Tabla: 'TblaMateriasCarrera
* id_Carrera: utiliza el msmo valor que la carrera en cuestión, para la que se oferta la asignatura.
* Id_Materia: no puede ser autonumérico, sino relacionado con la materia en cuestión, lo mismo que id_Carrera

Nota, al mantener 2 ids, podemos referenciar las materias de una carrera sobre esta tabla, y la descripción única de cada materia se toma de la tabla Materias. Al usar id_Carrera habrá registros cuasi duplicados * , pero aumenta la efectividad, ya que permite filtrar los registros para una materia dada o para una carrera dada .
Es decir podemos preguntar (crear 2 funciones) que carreras usan tal materia o que materias tiene una carrera. Un hipotética respuesta de estas 2 consultas:
Carreras que tiene la asignatura matemáticas: Física, Química, Política, Medicina, Biología...
Materias que tiene la carrera Medicina: Matemáticas, química orgánica, Aparatos médicos, Fisiología, Neurología, Medicamentos...

* Por otra parte los duplicados son finitos(el numero de carreras nnunca será de millones de modo que tenga que haber millones de registros duplicados). al describir la tabla horarios parte de esta tabla se entenderá mejor.

Hay que crear una tabla llamada carrera. Los detalles se relacionan a continuación:
Tabla: TblCarrera
* Id_Carrera: valor autonumérico y único.
* Nombre: El nombre descriptivo y completo de la carrera en cuestión.
* Aula: nombre o número de la estancia donde se los alumnos deben acudir, también puede ser una descripción... "escalera 2, frente al patio principal"... o algo más criptico: "E2,P2,N5" (escalera 2 piso 2º puerta nº 5", o incluso una imagen autodescriptiva señalando con una flecha la ubicación exacta...
* Planning: indica los días en que esta carrera es cursada, muy probablemente sea siempre de lunes a viernes sin excepción y sin ausencias, si es así para todas las carreras este campo se puede omitir, si no, debe seguir un criterio similar (funcionalmente) al siguiente, su valor se toma del siguiente modo:
Lunes=1, Martes=2, Miercoles=4 .... Domingo=64
Planning, por tanto vale la suma de los valores de los días en que esa carrera es desarrollada, si tiene de lunes a viernes ambos inclusive sería: 31 (1 +2 +4 +8 +16) , si una carrera se realizara los lunes, martes jueves viernes y sábado sería: 1 +2 +8 +16 +32= 59). Debe crearse una enumeración DiasSemana,  en el código, DIA_Lunes=1 .... y unas funciones para saber si un día en concreto está dentro de dicho código: ejemplo:
Código: Visual Basic
  1.  
  2. public Function SeEstudiaElDia(byval Dia as DiasSemana, byval Carrera as string) as boolean
  3.    dim plan as long
  4.    ' se omite el código para obtener el dato planning de la tabla carreras, en cualquier caso se usaría el nombre de la carrera (o mejor el id) para obtener el planning
  5.    Plan= x ' como se señala en la nota en cabeza
  6.  
  7.     if dia < 128 and dia >0 then  ' comprobamos que día está dentro de los límites aceptables, para no perder tiempo investigando algo que sabemos que está fuera de rango
  8.           SeEstudiaElDia = (( dia or Plan) = Plan)
  9.     end if
  10. end function
  11.  
  12.  
* FechaInicio: para el año en vigor
* Duración: en horas, semanas, meses, etc...
* Tutor: un valor que coincide con el identificador de un profesor. Esposible que una carrera no tenga un profesor que 'dirige' especialmente esa carrera, se pone más bien para explicar cn más detenimiento como se aborda un campo de 1 único valor frente a la necesidad de dun campo con varos valores (lista) y del que este se tomará como base y ejemplo.
Como en la tabla Materias, otros campos que sean comunes a todas las carreras...

* Profesorado: es un método para obtener todos los profesores que imparten esta carrera, dicho método es una query sobre la tabla de datos de profesores. como parámetro se pasa el id_carrera a la función
* Materias: también es un método para obetener todas las materias que se cursan en esta carrera, como parámetro se pasa el id_carrera a la función.
* Horarios: también es un método para obetener el horario de cada materia, como parámetro se pasa la carrera y la materia, la materia se obtien previamente del métodos materias...

Las tabla Horarios, se compone de tres campos, y refleja los horarios existentes diferentes (una única vez)
Tabla: TblHorarios
* Id_Horario: identificador único para cada horario, este valor debe ser autonumérico.
* Dia: un valor numérico que coindice con la enumeración DiasSemana, señala para que día es este horario
* HoraInicio: hora de inicio puede ser un campo de tipo Date o una cadena de texto, por ejemplos : 11:00    , 12:15, etc...
* HoraFinal: ídem, como hora inicio...

Nota: Añadir el campo día permite filtrar consultas para restringir los horarios de un día concreto. Además flexibiliza la tabla auqnue haya hrarios cuyos valores horainicio y horafinal sean idénticos.

esta tabla tiene otra asociada que deriva de esta y relaciona además a otras 2 tablas. En la que deberían constar 3 campos, para identificar unívocamente un horario
Tabla: TblHorariosMateriasCarrera
* Id_Carrera: se relaciona con la tabla carrera
* Id_Materia: se relaciona con la tabla metrias
* Id_Horario: se relaciona con la tabla horarios
Esta tabla permitiría mucha flexibilidad para realizar consultas sobre los horarios. Puede preguntarse por todos los horarios de una carrera dada, todos los horarios para una carrera y materia, y con ayuda delparámetro día aúnpodemos solicitar los horarios de una carrera para el jueves. El resto de consultas posibles no es muy necesario que sean implementadas por lo menos no son de primera utilidad.


Por fin la Tabla profesorado tiene las mismas características que la tabla TblMateriasCarrera
Tabla: TblProfesorado
* id_Profesor: da acceso relacionado  a una tabla que contiene los datos de los profesores
* Id_Carrera: mismo código asociado a la tabla de carreras


Al igual que aquella tabla, podemos pués hacer 2 consultas de modo sencilo, que profesores imparten una determinada carrera y en qué carreras imparte clase un determinado profesor...un ejemplo (como en aquella tabla de una hipotéctica respuesta a estas 2 funciones).
Profesores en la carrera de Matemáticas: Juan.. , Andrés...,  César... , Arturo... , Pedro... ...
Carreras en las que el profesor Andrés imparte clases: Matemáticas, Física, Biología ...

Fijate que un profesor puede impartir clase en varias carreras, por tanto aquí consta un registro por cada par unívoco profesor-carrera

Esta tabla se relaciona a través del id_Profesor con la tabla profesores que se describe a continuación:
Tabla: TblProfesores
* Id_Profesor: identificador único, no necesariamente autonumérico, posiblemente sea mejor un número de identificación personal (cédula, carnet de identidad... como sea que se llame en tu país).
* Nombre: nombre del profesor.
* Edad: .......... este campo y los siguientes pueden ser ignorados y utilizarse si se quiere una tabla adcional lamada TablaProfesoresDatos, donde se describen datos más personalizados y a los que sólo se tendría un acceso más restringido...  dicha tabla debería contener la misma cantidad de registros que esta y estar relacionado con id_Profesor para recoger estos datos, añadir o eliminar registros en una tabla implicaría hacer lo equivalente en la otra tabla 'hermana'  . La razón para crear esta tabla adciional es que suele ser útil y más rápido y cómodo disponer de los datos mínimos, en la mayoría de consultas, seguramente nos baste con saber el nombre del profesor y puesto que se devuelve también el identificador si fuera preciso podría ampliarse información del profesor posteriormente al profesor seleccionado...
* Domicilio: .........
Puesto que un profesor puede impartir más de 1 materia, no sería sensato introducir aquí un campo llamado materia para señalar la materia que imparte, sino que tenemos que crear otra tabla que relaciones los id_Profesor con los Id_materia, tal como se ha descrito más arriba cuando un campo ha de ser una lista debe crearse un método, al final se explica esto con más detenimiento.

por tanto necesitamos crear otra tabla
Tabla: TblMateriasProfesor
* id_Profesor: identificador del profesor relacionado con la tabla TblProfesores
* id_Materia: identificador relacionado con la tabla TblMaterias
Ahora como se ve en esta tabla se puede añadir un registro por cada materia que imparta un profesor.
..y tal como ya se ha explicado podemos hacer 2 cnsultas a esta tabla: Todas las materias que imparte un profesor y todos los profesores que imparten una materia.

__________________
SEGUNDA PARTE:
Para finalizar, fíjate como un campo que tiene un único valor se introduce su valor, en cambio si un capo es unalista, entonces los valores deben reflejarse en una nueva tabla  usando un par de identificadores, y crear métodos para filtrar esa tabla por uno u otro identificador, uno de los identificadores se realciona con la tabla donde nos interesaba introducir el campo y el otro identificador se relaciona con una tabla que contiene como registros la lista deseada. Por tanto en aquella tabla en vez de meter un campo se le añade un método, para obetener la lista deseada. Puede crearse métodos adicionales para buscar un elemento dado, o todos los que cumplan cierto criterio.
Un ejemplo claro del uso de un campo y y de un campo que debería ser lista, lo tenemos en la tabla Carrerasm, donde se ha añadido a propósito el campo tutor donde debe contener el identificador de un único profesor y en cambio el profesorado sería una lista, que como hemos dicho no puede ser introducido como un campo si no como un método. el método relamente debe constar en la tabla que mantiene la relación es decir la tabla TblProfesoresCarrera. Por último debe constatarse que que estas tablas son 'de paso' es decir con los registros obtenidos debe hacerse una nueva consulta para seleccionar todos los registros de la tabla que contiene dichos identificadores.
Más claro si queremos conocer la lista de profesores que imparten matemáticas en la carrera de medicina, debemos usar el id_Carrera preguntar a la tabla TblProfesoresCarrera por todos los registros cuyo id_carrera coincida con ese, con esos datos (sólo tendremos unos valores numéricos) luego debemos dirigirnos a la tabla TblProfesores y recoger todos los registros cuyos id_profesor coincida con los id_profesor que hemos obtenido previamente, ahora ya tendremos un recordset con los registros  de datos de los profesores de esa carrera.

Verás que a mi me salen 8 tablas, aunque parece algo apabullante, lo cierto es que el hecho de tener bien organizadas las tablas facilita luego cualquier consulta, así mismo resulta más sencillo diseñar las funciones que son necesarias, tanto  que incluso resulta evidentes por sí mismas.
Es más rápido (las búsqeudas de resultados) si los métodos se diseñan como procedmientos almacenados dentro de la propia base de datos y en la aplicación se diseñan funciones que delegan en los procedimientos almacenados . Estas funciones entonces son realmente simples, pués simplemente reciben 1 parámetro e internamente reinvocan al procedimiento almacenado con ese parámetro y uno constante en función de que 'dato' realiza la consulta. En definitiva si se crean procedimientos almacenados, las funciones de la aplicación resultan luego muy sencillas...

________
FINAL

Bueno, espero que te sirve para algo lo explicado. Dado que se ha escrito del tirón y lleva cierto tiempo y no dispongo ahora mismo de más, no está revisado por lo que es probable que haya alguna inconsistencia en las explicaciones (revisarlo me llevaría  cierto tiempo adicional), por lo que sírvete de preguntar si algo no lo entiendes o  encuentras alguna contradicción que por falta de revisión se me haya escapado...

p.d.: Fíjate que al igual que tú he omitido todo lo respecto a los alumnos... deberías ser capaz de relacionar correctamente estos en las tablas adecuadas metidando sobre lo indicado y viendo (más bien comprendiendo) como se relaciona cada campo lógicamente a una tabla.
«Ma non troppo»
----> ModoVacaciones = False<----

donramone

  • Nuevo Miembro
  • *
  • Mensajes: 10
    • Ver Perfil
Re: Crear un horario de cursado
« Respuesta #2 en: Martes 16 de Marzo de 2010, 08:44 »
0
Nebire Muchisimas Gracias! era exactamente lo que necesitaba, te agradesco mucho tus explicaciones, con el horario ya avancé bastante pero se me estaban escapando las "tablas indices", me ayudo muchisimo y me quito un poco de inseguridad ( pensando: estara bien o en determinado momento voy a tener que rediseñar todo).
La verdad que no tengo ni una otra pregunta.
Muchisimas gracias saludos