Curso Completo Base de datos

consulta sql para generar reporte en cristal report

Colapsar
X
  • Filtrar
  • Tiempo
  • Mostrar
Limpiar todos
nuevos mensajes

  • consulta sql para generar reporte en cristal report

    Consulta

    tengo 3 tablas para un informe el cual son:

    ya he sacado varios informes, ejemplo: todas las horas tomadas del medico filtradas por medico y fecha.

    pero me piden uno el cual quiere que muestre el horario completo del medico mostrando sus horas y que pacientes están registrados y las horas libres que les quedan en blanco ejemplo

    Medico:xxx Fecha:xxxx

    Horas nombrep apellidop apellidom
    10:00-10:15 xxxxxxx xxxxxxxx xxxxxxxx
    10:15-10:30
    10:30-10:45 xxxxxxx xxxxxxxx xxxxxxxx
    10:45-11:00 xxxxxxx xxxxxxxx xxxxxxxx
    11:00-11:15
    11:15-11:30 xxxxxxx xxxxxxxx xxxxxxxx
    etc..

    he realizado consultas sql como select anidados pero no logro dar con el listado final. al seleccionar lo nombres de los pacientes se me duplica los datos y es un embrollo.

    se que acá algunos tienen mas experiencia en programación y consulta sql y me podrían ayudar a este dilema-

    logro dar con el horario de cada medico con esta consulta, pero al querer mostrar los datos de los pacientes que tienen esas horas y las horas que no están tomadas no puedo mostrarlo.
    Código:
    SELECT DISTINCT horamedicos.hora_ini, horamedicos.hora_fin, medicos.Nombrem, medicos.Apellidopm
    FROM            horamedicos INNER JOIN
                             medicos ON horamedicos.id_doctor = medicos.id_doctor
    WHERE        (horamedicos.id_doctor = @iddoctor)
    me podrían dar su opinión acerca de este procedimiento.

    ATTE

    Esteban Barrientos

  • #2
    Re: consulta sql para generar reporte en cristal report

    Hola Esteban, tal vez te está costando encontrar la sentencia SQL, porque hay que redefinir el diseño de la base de datos. Sería conveniente que manejes una tabla independiente para los horarios, entonces en tu tabla horamedicos sólo guardarías el ID que apunte hacia la tabla Horarios. A pesar que tengo poca experiencia en esta área, te comento que en mis BDs esta tabla independiente para los horarios hasta ahora me da buenos resultados, ya que es la forma más eficiente, claro que a veces es más complicado manipular una tabla más, pero fijate que así pude encontrar la solución para este caso, por ejemplo, cosa que para el otro diseño sólo se me ocurre meterle mano al Visual. Entonces el diagrama sería el siguiente:


    Luego a las tablas le puse los siguientes datos:
    Tabla Horarios Tabla Hora_Medicos Tabla Medicos


    Y obtuve los siguientes resultados:


    En el primer SELECT traigo todos los registros de los horarios que coincidan con un cod_medico (id_doctor) que en este caso es el 1. Para esto necesitamos relacionar las tres tablas, por eso el uso de INNER JOIN. En cambio el segundo SELECT es para traer todos los horarios en los cuales no figure ese médico, para lo cual se necesita relacionar las tablas de Hora_Medicos y Horarios, esta vez no con INNER JOIN, sino con NOT IN. Y finalmente la UNION entre los dos SELECTs principales para conseguir tanto los horarios que tiene un médico como los horarios que no los tiene. Sólo resta reemplazar los 1 por @id_doctor, y algunas otras modificaciones menores en cuanto a nomenclatura. Esto lo hice así porque por ejemplo en el caso de id siempre pienso en clave primaria y por eso no la uso en claves foráneas, en su lugar pongo cod, entonces logro diferenciarlas. Este ejemplo seguramente lo tendrás que adaptar para tu BD, porque me imagino que habrán más criterios de búsqueda. Para que no te resulte tediosa la transcripción, aquí te dejo la sentencia SQL, pero la idea es que la estudies bien:
    [highlight=sql]SELECT H.hora_ini, H.hora_fin, M.Nombrem, M.Apellidopm
    FROM (Medicos M
    INNER JOIN Hora_Medicos HM ON M.id = HM.cod_medico)
    INNER JOIN Horarios H ON HM.cod_horario = H.id
    WHERE HM.cod_medico = 1
    UNION
    SELECT H.hora_ini, H.hora_fin, NULL, NULL
    FROM Horarios H
    WHERE H.ID
    NOT IN( SELECT HM.cod_horario
    FROM Hora_Medicos HM
    WHERE HM.cod_medico = 1);[/highlight]
    Espero que el ejemplito te sea de utilidad y principalmente comprensible ¡Saludos cordiales desde Argentina!
    Saludos.

    Comentario


    • #3
      Re: consulta sql para generar reporte en cristal report

      Javinet:

      que tal un saludo para ti también desde chile, chequeare tu respuesta durante la tarde o el lunes ya que ahora toy en otro lugar trabajando, haré las pruebas y te cuento la otra semana, muchas gracias.-(Tambien chequeare el tema de las tablas y tomare tu consejo)

      Atte
      Esteban B

      Comentario


      • #4
        Re: consulta sql para generar reporte en cristal report

        Lo único que cambiaria seria la expresión NOT IN, por un NOT EXISTS, siempre que esto sea posible.
        Ing. Isaías Islas González
        MCP MCTS SQL Server 2008

        Share what you know, learn what you don't

        Comentario

        Trabajando...
        X