none
procedure complexa RRS feed

  • Pergunta

  • olá pessoal,

    estou desenvolvendo um sistema para marcação de consultas de clinicas. preciso criar uma procedure.

    Eu vou selecionar o médico, e vai ter os horários disponíveis de cada médico pra eu agendar o compromisso.

    Ex: Médico Pedro

    Agenda

    09:00

    10:00 - consulta - fulano

    11:00

    Tipo, o horário de 10:00 é um compromisso que foi agendado,foi gravado no banco.

    o horário de 09:00 e 11:00 é só a agenda, pra mostrar que está disponível o horário.

    Tenho uma tabela agenda(horarios disponíveis do médico), uma outra tabela consultas(horários marcados.)

    Tabela Agenda

    ID int Unchecked
    DiaID int Unchecked     (1 domingo, 2 seg, 3 terca...)
    MedicoID int Unchecked
    Tipo varchar(50) Checked
    hora time(7) Checked

    Eu vou passar a data e o médico para esta procedure como parametro.

    Deve me retornar os horários disponíveis e os horários marcados para o médico na data selecionada.

    Tipo a data selecionada da numa segunda-feira, então vou carregar a agenda do médico da segunda-feira, mais os horários marcados naquela data.

    Mas não quero que venha horários repetidos. tipo tenho o horário disponível 09:00 do medico fulano, mas eu marquei uma consutla neste horário, então criou um registro na tabela consultas, eu não quero carregar 2 registros. um da tabela consultas e outro da tabela agenda. Preciso fazer esta verificação.

    Obrigado.

    segunda-feira, 5 de novembro de 2012 12:27

Respostas

  • Experimente mais ou menos desta forma:

    SELECT     
        dbo.Medicos.ID, 
        dbo.Medicos.Nome, 
        dbo.AgendaMedicos.Hora,
        dbo.Consultas.ID, 
        dbo.Consultas.Data, 
        dbo.Consultas.ClienteID, 
        dbo.Consultas.Causa, 
        dbo.Consultas.Descricao, 
        dbo.Consultas.HoraInicio, 
        dbo.Consultas.HoraFinal, 
        dbo.Consultas.Revisao, 
        dbo.Consultas.ConvenioID, 
        dbo.Consultas.Situacao, 
        dbo.Clientes.Nome AS Expr1
    FROM dbo.Medicos 
    INNER JOIN dbo.AgendaMedicos
        ON dbo.AgendaMedicos.MedicoID = dbo.Medicos.ID AND 
           dbo.AgendaMedicos.DiaID = DATEPART(DW, '11-05-2012')
    LEFT JOIN dbo.Consultas 
        ON dbo.Consultas.MedicoID = dbo.Medicos.ID
    LEFT JOIN dbo.Clientes 
        ON dbo.Clientes.ID = dbo.Consultas.ClienteID


    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br


    • Editado gapimex terça-feira, 6 de novembro de 2012 16:27
    • Marcado como Resposta Gustavo M. Guimarães segunda-feira, 10 de dezembro de 2012 13:53
    terça-feira, 6 de novembro de 2012 16:26

Todas as Respostas

  • Pedro, bom dia.

    Uma saída é tratar a hora ao invés de time, utilizar o tinyint mesmo, pois pelo que percebi o hora é sempre fechada ( 8:00 - 9:00 - 10:00 e assim por diante).

    Desta forma vc poderia fazer um left join da tabela de horas com a tabela de agenda, onde as chaves seriam MedicoID e hora. Desta forma não duplicaria a hora para aquele dia de agenda.

    Abs.


    Eduardo Gomes - http://www.h1solucoes.com.br - Twitter: @edugp_sp

    segunda-feira, 5 de novembro de 2012 13:20
  • Eu consegui fazer assim.
    tem um detalhe.
    Qdo for consulta marcada eu preciso mostrar outros campos, qdo for só a agenda me traz os outros campos vazios.
    select HoraInicio from Consultas where Data = '11-05-2012' and MedicoID = 5
    union
    select hora from AgendaMedicos where (DATEPART(DW,getdate())) = DiaID and MedicoID = 5
     and hora not in (select HoraInicio from Consultas where Data = '11-05-2012' and MedicoID = 5)
    ex:
    select HoraInicio,ID,Cliente, Medico, causa from Consultas where Data = '11-05-2012' and MedicoID = 5
    union
    select hora from AgendaMedicos where (DATEPART(DW,getdate())) = DiaID and MedicoID = 5
     and hora not in (select HoraInicio from Consultas where Data = '11-05-2012' and MedicoID = 5)
    não consegui, visto que com o union tem que ter a mesma qtde de campos.
    obrigado.

    segunda-feira, 5 de novembro de 2012 18:22
  • Boa tarde,

    Experimente desta forma:

    select 
        a.Hora,
        c.ID,
        c.Cliente, 
        c.Medico, 
        c.causa 
    from AgendaMedicos as a
    left join Consultas as c
        on c.Data = '11-05-2012' and 
           c.MedicoID = 5 and
           c.HoraInicio = a.Hora
    where DATEPART(DW, '11-05-2012') = a.DiaID and 
          a.MedicoID = 5
    

    obs: se for necessário utilizar o Union você pode utilizar null para cada coluna a mais existente na outra tabela

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    segunda-feira, 5 de novembro de 2012 20:17
  • Gapimex, deu certo , é assim mesmo.

    Mas eu preciso utilizar mais 2 campos de outra tabelas, tentei fazer o inner join mas não deu certo.

    como eu colocaria o campo cliente e medico?

    Segue o sql

    SELECT     dbo.Consultas.ID, dbo.Consultas.Data, dbo.Consultas.ClienteID, dbo.Consultas.MedicoID, dbo.Consultas.Causa, dbo.Consultas.Descricao, dbo.Consultas.HoraInicio, 
                          dbo.Consultas.HoraFinal, dbo.Consultas.Revisao, dbo.Consultas.ConvenioID, dbo.Consultas.Situacao, dbo.Medicos.Nome, dbo.Clientes.Nome AS Expr1
    FROM         dbo.Medicos INNER JOIN
                          dbo.Consultas INNER JOIN
                          dbo.Clientes ON dbo.Consultas.ClienteID = dbo.Clientes.ID ON dbo.Medicos.ID = dbo.Consultas.MedicoID
          
    obrigado.
    terça-feira, 6 de novembro de 2012 12:48
  • Experimente mais ou menos desta forma:

    SELECT     
        dbo.Medicos.ID, 
        dbo.Medicos.Nome, 
        dbo.AgendaMedicos.Hora,
        dbo.Consultas.ID, 
        dbo.Consultas.Data, 
        dbo.Consultas.ClienteID, 
        dbo.Consultas.Causa, 
        dbo.Consultas.Descricao, 
        dbo.Consultas.HoraInicio, 
        dbo.Consultas.HoraFinal, 
        dbo.Consultas.Revisao, 
        dbo.Consultas.ConvenioID, 
        dbo.Consultas.Situacao, 
        dbo.Clientes.Nome AS Expr1
    FROM dbo.Medicos 
    INNER JOIN dbo.AgendaMedicos
        ON dbo.AgendaMedicos.MedicoID = dbo.Medicos.ID AND 
           dbo.AgendaMedicos.DiaID = DATEPART(DW, '11-05-2012')
    LEFT JOIN dbo.Consultas 
        ON dbo.Consultas.MedicoID = dbo.Medicos.ID
    LEFT JOIN dbo.Clientes 
        ON dbo.Clientes.ID = dbo.Consultas.ClienteID


    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br


    • Editado gapimex terça-feira, 6 de novembro de 2012 16:27
    • Marcado como Resposta Gustavo M. Guimarães segunda-feira, 10 de dezembro de 2012 13:53
    terça-feira, 6 de novembro de 2012 16:26