"fundir" filas en Access2007

Muy buenas, lo primero gracias y felicitaciones por la web, mi pregunta puede ser fundada por mi poca experiencia con el access o porque soy muy torpe xD tampoco se si se puede hacer.
Estoy creando una base de datos para controlar un poco el seguimiento de mis alumnos en la escuela, y querría crear un horario que se fuese actualizando en función de los alumnos que tengo. Hasta ahora lo más cercano que he conseguido es un horario con las consultas de referencias cruzadas, lo que sucede es que tengo varios alumnos por cada hora y en la consulta solo consigo que se muestre un nombre.
En la base de datos tengo (entre otros datos) horario, nombre y apellidos, y cree una consulta para que me diese tres campos: Hora, Día, y Nombre completo. Pienso que debería hacer una consulta para que en lugar de darme un solo nombre por día y hora, me diese varios nombres que compartan día y hora en la misma fila.
En resumen, y visualmente, yo tengo esto
     Día Hora Alumno
   Lunes 17 Juan Uno
   Lunes 17 Pepe Dos
   Martes 18 Inma Tres
   Martes 18 Julia Cuatro
   Martes 18 Pepa Cinco
Y he pensado que podría intentar conseguir esto
      Día Hora Alumno
   Lunes 17 Juan Uno, Pepe Dos
   Martes 18 Inma Tres, Julia Cuatro, Pepa Cinco
Es lo que se me ha ocurrido usando las referencias cruzadas, aunque si tenéis otra idea, os lo agradezco
Muchas gracias por vuestro tiempo
Curro

1 respuesta

Respuesta
1
La única forma que se me ocurre para hacer lo que quieres es a través de código.
Yo crearía una función (para poder llamarla desde una macro) que una los nombres de los alumnos dejando el resultado en una tabla temporal. El código sería el siguiente:
Option Compare Database
Option Explicit
Function agruparAlumnosPorHoras()
    Dim rsH As Recordset    ' Para leer los días/horas del horario
    Dim rsA As Recordset    ' Para leer los alumnos de un día/hora
    Dim rsS As Recordset    ' Para grabar en la tabla de salida (temporal)
    Dim txtSql As String
    Dim listaAlumnos As String
    ' Creamos una tabla de trabajo
    On Error Resume Next
    DoCmd.RunSQL "drop table tmpHorario"
    On Error GoTo 0
    DoCmd.RunSQL "create table tmpHorario(dia text(9),hora text(2),alumnos memo)"
    ' Abrimos la tabla de salida
    Set rsS = CurrentDb().OpenRecordset("tmpHorario")
    ' Leemos de la tabla de horarios los diferentes días y horas
txtSql = "select distinct día, hora from horario order by día, hora"
    Set rsH = CurrentDb().OpenRecordset(txtSql)
    If Not rsH.EOF Then rsH.MoveFirst
    Do While Not rsH.EOF
        ' Leemos los alumnos que hay en el día/hora seleccionado
        txtSql = "SELECT * from horario " & _
                 "WHERE dia='" & rsH!dia & "' and " & _
                 "hora = '" & rsH!hora & "' " & _
                 "order by alumno"
        Set rsA = CurrentDb().OpenRecordset(txtSql)
        rsA.MoveFirst
        listaAlumnos = ""
        Do While Not rsA.EOF
            If listaAlumnos <> "" Then listaAlumnos = listaAlumnos & vbCrLf ' Separamos el nombre de un alumno y el siguiente por un salto de línea
            listaAlumnos = listaAlumnos & rsA!alumno
            rsA.MoveNext
        Loop
        rsA.Close
        ' Grabamos en la tabla de salida
        rsS.AddNew
        rsS!dia = rsH!dia
        rsS!hora = rsH!hora
        rsS!alumnos = listaAlumnos
        rsS.Update
        ' Otro dia/hora
        rsH.MoveNext
    Loop
    ' Ya está todo. Cerramos los recordset y termina el proceso
    rsH.Close
    rsS.Close
End Function
Para llamar a la función desde una macro utiliza la acción 'ejecutarCódigo'.
Muchisimas muchisimas gracias, un codigo genial, justo lo que necesitaba, solo una minima modificacion (con el campo memo no se podia hacer una referencia cruzada, solucionado superrapido cambiandolo a texto) y tengo el horario perfecto, una vez mas muchisimas gracias ^^
Curro

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas