1
I’m using the SQLSERVER
Condition(What the result should return to me) Creation of the agenda. Necessary creation of the flow for creation of agenda and blocking to reserve the vacancies;
When cross-referencing the data from two tables I need to assign a spot to that patient who came in contact first. And this vacancy can no longer be attributed to any other patient.
To do this I thought about creating a precedent, but I can’t get the syntax right, help me please, or if there’s any other way to do that too
CREATE PROCEDURE OcuparVaga
AS
BEGIN
-- Criando tabela de retorno da proc
SELECT CodPaciente, NomePaciente, NULL NomeEspecialidade, NULL NomeMedico,Telefone,
Celular, NULL DataVaga, NULL HoraVaga, 0 StatusVaga, NULL Obs
INTO #Retorno
FROM Paciente WHERE StatusSolic = 0
-- Declarando variavel para ser utilizada no while
DECLARE @i INT
SET @i = 0
-- Tabela temporaria para controle do while
SELECT * INTO #Solicitacoes FROM Paciente WHERE StatusSolic =0
-- Verificando se existe Pacientes com status igual a 0(disponivel)
IF (SELECT COUNT(*) FROM #Solicitacoes) ==0
BEGIN
RETURN 'Não há Pacientes a serem atribuido a vaga'
END
-- Iniciando o while
WHILE @i < (SELECT COUNT(*) FROM #Solicitacoes)
BEGIN
DECLARE @CodPaciente INT --Variavel que representará a linha da tabela Paciente que estamos executando
----Preenchendo a váriavel com a menor data/hora (conforme definido a prioridade)
SELECT @CodPaciente = CodPaciente FROM #Solicitacoes
ORDER BY DataContato, HoraContato
--- Pegar a primeira linha com a menor data/hora dentre as vagas disponíveis para atribuir ao Paciente de acordo com a especialidade, regra de data e statusVaga
SELECT TOP 1 a.* INTO #Disponivel FROM Horarios AS a
INNER JOIN Paciente AS s ON a.CodEspecialidade = s.CodEspecialidade
WHERE a.DataHorarios >= DATEADD(day, 3, s.DataContato)
AND a.StatusVaga=0 AND s.CodPaciente = @CodPaciente
DECLARE @CodHorarios INT = 0 --Será utilizada para o preenchimento da vaga
SELECT @CodHorarios = CodHorarios FROM #Disponivel -- Setar na variável o id da vaga disponível que está na tabela temporária
--Se existir uma vaga disponível, o status da vaga e do Paciente serão alterados
IF @CodHorarios >0
BEGIN
UPDATE Horarios SET StatusVaga = 1, CodPaciente = @CodPaciente
WHERE CodHorarios = @CodHorarios
UPDATE Paciente SET StatusSolic = 1
WHERE CodPaciente = @CodPaciente
UPDATE #Retorno SET NomeEspecialidade = a.NomeEspecialidade,
NomeMedico = a.NomeMedico,
DataVaga = a.DataHorarios, HoraVaga = a.HoraHorarios,
StatusVaga = 1, Obs = 'Vaga preenchida com sucesso!'
FROM #Retorno r
INNER JOIN Horarios AS a ON r.CodPaciente = a.CodPaciente
WHERE a.CodHorarios = @CodHorarios
END
ELSE
BEGIN
UPDATE #Retorno SET Obs = 'Não foi encontrado um horário para a especialidade desejada.'
WHERE CodPaciente = @CodPaciente
END
-- Deleta a linha atual para o while seguir para a próxima
DELETE FROM #Solicitacoes WHERE CodPaciente = @CodPaciente
SET @i= @i+1 --Incrementa +1 no indice do while
END
SELECT * FROM #Retorno
END
GO
It informs that incorrect syntax and q create Procedure must be the only instruction in the batch.
– Rogério Cristiano
I could add in the above description of the topic: (1) what are all the rules that should be followed for building the code; (2) the code that creates the tables; (3) code that generates the mass of data for testing.
– José Diz