SQL - obtener las convocatorias de un alumno

   
Vista:

obtener las convocatorias de un alumno

Publicado por andres (4 intervenciones) el 15/05/2010 15:09:06
Hola a todos; a ver si alguien me puede ayudar.

Tengo cuatro trablas:
Alumnos: codigoAlumno, nombre, apellidos
Cursos: codigoCurso, nombreCurso
Convocatorias: codigoConvocatoria, codigoCurso, fechaInicio, fechaFin
ConvocatoriasAlumno: codigoConvocatoria, codigoAlumno

Sabiendo el campo codigoAlumno de la tabla Alumnos y dos fechas de inicio: fecha_ inicio_desde y fecha_inicio_hasta, quiero obtener los siguientes campos:
fechaInicio, fechaFin, nombreCurso.

Es decir, quiero obtener las convocatorias a las que ha acudido un alumno entre dos fechas de inicio dadas.

Si alguien me puede ayudar, muchas gracias por anticipado.
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

RE:obtener las convocatorias de un alumno

Publicado por Leonardo Josue (877 intervenciones) el 17/05/2010 16:54:26
Buenos dias Andrés:

¿qué has intentado hacer para obtener los resultados? Este post que colocas me parece que es de algún exámen o tarea de escuela. El foro es para resolver DUDAS, no para hacer el trabajo de otros.

Lo que tienes que hacer en este caso es un inner join entre todas las tablas y después hacer un filtrado por fechas.

Te pido que hagas un intento por hacerlo. Si tienes problemas pon en el post algo del código que hayas hecho y la problemática en concreto y con gusto trataremos de ayudarte.

saludos.
Leo.
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

RE:obtener las convocatorias de un alumno

Publicado por andres (4 intervenciones) el 17/05/2010 17:57:03
Tienes toda la razón; tenía que haber puesto el código con el que lo he intentado y he fracasado. Pensé en el INNER JOIN y en el UNION pero no lo veía claro así que lo último que he intentado ha sido esto:

SELECT fechaInicio, fechaFin, nombreCurso FROM Cursos, Convocatorias WHERE (( Convocatorias.codigoConvocatoria IN ( SELECT codigoConvocatoria FROM ConvocatoriasAlumnos WHERE codigoAlumno = " & intCodigoAlumno & ")) AND ( Convocatorias.codigoCurso = Cursos.codigoCurso) AND (( fechaInicio >= " & fecha_inicio_desde & " ) AND (fechaInicio >= " & fecha_inicio_hasta & ")))

Con la primera condición pretendo seleccionar los registros de la tabla Convocatorias que corresponden a un determinado código de alumno, con la segunda los registros que tengan el mismo código de curso en las tablas Convocatorias y cursos, y con la tercera los registros cuyas convocatorias estén entre dos fechas de inicio dadas.

En mi disculpa quiero decir que no puse antes el código porque me avergonzaba ver los resultados desastrosos que obtenía. También quiero aclarar que no es un examen sino el final de un trabajo que estoy haciendo en Access y que me veo derrotado ante un problema que creía que iba a ser fácil de resolver pero que está pudiendo conmigo.

Así que si me me echas una mano te lo agradezco de verdad.

Saludos y gracias.
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

RE:obtener las convocatorias de un alumno

Publicado por Leonardo Josue (877 intervenciones) el 17/05/2010 20:35:45
Hola de nuevo Andrés.

Siempre que tengas que unir dos tablas relacionadas la mejor opción es el INNER JOIN, sólo es cuestión de que practiques un poco y verás que en el futuro te resultará muy sencillo realizarlo. Access tiene un pequeño detalle y es que no te permite realizar INNER JOIN entre más de dos tablas, por lo que será necesario que se haga por partes y utilices paréntesis para ir agrupando.

Lo primero que tienes que hacer sería unir la tabla Alumnos con la Tabla ConvocatoriasAlumnos. El resultado de este INNER JOIN deberás utilizarlo para unirlo con la tabla Convocatorias. Finalmente el resultado de esta unión será el que utilices para hacer INNER JOIN con la tabla de Cursos. Recuerda que para evaluar una expresión con paréntesis primero se ejecutan los paréntesis internos y después los externos.

Dato que utilizas ACCESS como motor de BD puedes hacer uso del ASISTENTE DE CONSULTAS, una vez que tengas definidas las relaciones entre las tablas, Access infiere los INNER JOIN que se tienen que realizar cuando utilizas más de una tabla. Tu consulta debería ser más o menos así.

SELECT Cursos.nombreCurso, Convocatorias.fechaInicio, convocatorias.fechaFin
FROM
(
Convocatorias INNER JOIN
(
Alumnos INNER JOIN ConvocatoriasAlumnos
ON Alumnos.codigoAlumno = ConvocatoriasAlumnos.codigoAlumno
)
ON Convocatorias.codigoConvocatoria = ConvocatoriasAlumnos.codigoConvocatoria
)
INNER JOIN Cursos ON Convocatorias.codigoCurso = Cursos.codigoCurso
WHERE
(Convocatorias.fechaInicio >= " & fecha_inicio_desde & " ) AND
(Convocatorias.fechaFin <= " & fecha_inicio_hasta & ")

OJO con la sección WHERE. en la consulta que posteaste comparas fecha que feciaInicio sea >= que tus dos fechas de parámetrom pero nunca comparas la fechaFin

Saludos y espero que te sirva el código.
Leo.
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

RE:obtener las convocatorias de un alumno

Publicado por andrés (4 intervenciones) el 18/05/2010 23:36:45
Muy buenas Leo, y gracias por tu respuesta.
Me ha servido para entender, creo, la función del INNER JOIN.
Pero después de haberle dado vueltas, y sin haber probado el código, tengo una duda:
Si tengo el valor del códigoAlumno en la variable intCodigoAlumno no creo que necesite incluir la tabla Alumnos en el INNER JOIN y sí una condición más en la cláusula WHERE que diga codigoAlumno = " & intCodigoAlumno & " .
Me gustaría saber qué me dices sobre esta duda porque sé que me la resolverás.
Desde España (¿ de dónde eres tú?), muchas gracias y saludos.
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

RE:obtener las convocatorias de un alumno

Publicado por Leonardo Josue (877 intervenciones) el 19/05/2010 16:01:11
Buenos días Andrés...

Efectivamente, dado que lo único que necesitas conocer es el nombre del curso y las fechas de inicio y fin del mismo entonces no es necesario hacer el INNER JOIN con la tabla de Alumnos, La consulta, tál como la puse te daría como resultado las convocatorias para todos los alumnos existentes en la BD.

En tu caso como quieres obtener sólo lo de un alumno en particular entonces es correcto omitir del INNER JOIN la tabla Alumnos y agregar la condición que comentas.

Saludos desde México.
Leo.
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

RE:obtener las convocatorias de un alumno

Publicado por andrés (4 intervenciones) el 19/05/2010 20:16:46
Hola Leo, perdona que vuelva a incordiarte pero he probado el siguiente código y no me funciona. No me da ningún error pero tampoco me devuelve ningún registro. Sin embargo he comprobado manualmente en las tablas que hay varios registros que cumplen con las condiciones. El código que he probado es el siguiente:

SELECT fechaInicio, fechaFin, nombreCurso FROM (Convocatorias INNER JOIN ConvocatoriasAlumno ON Convocatorias.codigoConvocatoria = ConvocatoriasAlumnos.codigoConvocatoria) INNER JOIN Cursos ON Curso.codigoCurso = Convocatorias.codigoCurso WHERE ((fechaInicio >= " & fecha_inicio_desde & ") AND (fechaInicio >= " & fecha_inicio_hasta & ")) AND (ConvocatoriasAlumno.codigoAlumno = " & intCodigoAlumno & ") ORDER BY fechaInicio.

Como te digo, lo he comprobado manualmente y hay varios registros que satisfacen esas condiciones pero este código no me devuelve ningún registro. He pensado si el problema está en la condición de las fechas ya que un dato proviene de un campo "fecha" de la tabla "Convocatorias" mientras que el otro dato de la igualdad se toma de un cuadro de texto. Sin embargo, si fuera así me tendría que dar un error de compatibilidad de tipos y eso no ocurre.

En fin, si tienes el gusto y la paciencia de contestarme y aclararme qué puede fallar, te lo agradecería enormemente.

Saludos y gracias.
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