Trigger em Procedure

16/07/2014

Boas.
Eu tenho uma Tabela Paciente com os atributos: Nome, Morada, IdFamilia
IdFamilia é chave estrangeira para a tabela Familia.
A tabela Familia tem os atributos: IdFamilia, Morada, NPessoas.

Criei uma procedure para inserir Paciente.
spInsertPaciente 'Nome', 'Morada', 'IdFamilia'

Nessa procedure é verificado se existe algum registo de alguma Familia com a Morada do Paciente.
Se sim -> Paciente.IdFamilia = esse Id encontrado
Se não -> é criado um novo registo na Tabela Familia com os dados introduzidos

O problema está quando vou inserir novo Paciente e ele não sabe se alguem da Familia já está registado.
Neste caso passo o parametro NULL para o campo IdFamilia, mas esta procedure não está a preencher este mesmo campo com o valor certo.

Pensei em criar um trigger na procedure, mas acho que volto ao mesmo problema

Agradeço ajuda

Guilherme

Respostas

16/07/2014

Guilherme

É este o código que fiz.

CREATE PROCEDURE spInsertPaciente
	@Nome VARCHAR(20),
	@Morada VARCHAR(50),
	@IdFamilia INT,
	@NPessoas INT
AS
BEGIN
	BEGIN TRY
		BEGIN TRAN
			DECLARE @Fam INT

			SELECT IdFamilia INTO Fam
				FROM Familia
				WHERE Morada LIKE '%' + @Morada + '%'

			SET @Fam = (SELECT COUNT(*) FROM Fam)

			IF(@Fam = 0)
				BEGIN
					INSERT INTO Familia(IdFamilia, Morada, NPessoas)
						VALUES(@IdFamilia, @Morada, @NPessoas)

					SET Fam = (SELECT IdFamilia FROM Fam WHERE IdFamilia = @IdFamilia)

					INSERT INTO Paciente(Nome, Morada, IdFamilia)
						VALUES(@Nome, @Morada, @IdFamilia)
				END

			ELSE
				SET Fam = (SELECT IdFamilia FROM Fam WHERE IdFamilia = @IdFamilia)

				INSERT INTO Paciente(Nome, Morada, IdFamilia)
					VALUES(@Nome, @Morada, @IdFamilia)

		COMMIT TRAN
	END TRY

	BEGIN CATCH
		SELECT ERROR_MESSAGE() AS Retorno
	END CATCH
END
Responder Citar

16/07/2014

Marisiana

O problema está quando vou inserir novo Paciente e ele não sabe se alguem da Familia já está registado. Neste caso passo o parametro NULL para o campo IdFamilia, mas esta procedure não está a preencher este mesmo campo com o valor certo.


Mas vc não faz o teste para verificar se existe membro da familia cadastrado?
Não uso SQLServer, então não conseguir entender claramente o código...
Responder Citar

16/07/2014

Guilherme

Faz esse teste quando vejo se já alguma familia registada com aquela morada.
Cada familia tem a sua morada, não podendo pessoas de familias diferentes viver na mesma morada
Responder Citar

17/07/2014

Isaac Jose

[quote]O problema está quando vou inserir novo Paciente e ele não sabe se alguem da Familia já está registado. Neste caso passo o parametro NULL para o campo IdFamilia, mas esta procedure não está a preencher este mesmo campo com o valor certo.


Mas vc não faz o teste para verificar se existe membro da familia cadastrado?
Não uso SQLServer, então não conseguir entender claramente o código...[/quote]

eu nao entendi direito mais e se em uma morada tiver mais de uma familia? dentro de um terreno podemos ter n casas ex bairro a av 1 numero 5 . sendo que nesse numero 5 possui casa 1 casa2 casa3 porem so o pessoal da casa sabe disso para todos os orgaos permanece como um unica casa. ai vc cadastra esse registro de uma pessoa da casa1 e depois precisa cadastrar uma pessoa de outra familia da casa2 como ira fazer isso?

nao estou falando que o seu esta errado ate pq nao sei o que o sistema ira fazer mais sim pelo que vc espos ...

att Isaac
Responder Citar

17/07/2014

Isaac Jose

[quote]O problema está quando vou inserir novo Paciente e ele não sabe se alguem da Familia já está registado. Neste caso passo o parametro NULL para o campo IdFamilia, mas esta procedure não está a preencher este mesmo campo com o valor certo.


Mas vc não faz o teste para verificar se existe membro da familia cadastrado?
Não uso SQLServer, então não conseguir entender claramente o código...[/quote]

eu nao entendi direito mais e se em uma morada tiver mais de uma familia? dentro de um terreno podemos ter n casas ex bairro a av 1 numero 5 . sendo que nesse numero 5 possui casa 1 casa2 casa3 porem so o pessoal da casa sabe disso para todos os orgaos permanece como um unica casa. ai vc cadastra esse registro de uma pessoa da casa1 e depois precisa cadastrar uma pessoa de outra familia da casa2 como ira fazer isso?

nao estou falando que o seu esta errado ate pq nao sei o que o sistema ira fazer mais sim pelo que vc espos ...

att Isaac
Responder Citar

17/07/2014

Maria Araújo

Da maneira como o Guilherme pensa só se for várias casas numa rua, em que só diferem do nº da porta.
Aí sim, só há uma familia por cada morada(rua + nº) Certo?
Responder Citar

17/07/2014

Isaac Jose

Da maneira como o Guilherme pensa só se for várias casas numa rua, em que só diferem do nº da porta. Aí sim, só há uma familia por cada morada(rua + nº) Certo?


Sim e a realidade no Brasil é outra... temos muitas casas com um unico numero mais internamente podem haver varias..
mais é como eu falei nao sei se é o caso dele rs
Responder Citar

17/07/2014

Guilherme

A minha ideia é mesmo o que a Maria disse: uma ru com várias casas, mas cada familia tem um n* de porta diferente, o que faz com cada morada de cada familia seja unica
Responder Citar

17/07/2014

Isaac Jose

A minha ideia é mesmo o que a Maria disse: uma ru com várias casas, mas cada familia tem um n* de porta diferente, o que faz com cada morada de cada familia seja unica



e se em uma casa tiver mais de 1 familia?
Responder Citar

17/07/2014

Guilherme

Não tem, se for uma casa só pode ter uma familia.
Se for um predio, cada familia tem um nº de porta, dai ao fazer a comparação se diferir apenas no nº já não é a mesma morada e portanto crio nova familia
Responder Citar

18/07/2014

Isaac Jose

A minha ideia é mesmo o que a Maria disse: uma ru com várias casas, mas cada familia tem um n* de porta diferente, o que faz com cada morada de cada familia seja unica


então no seu caso em um numero é impossivel ter mais de uma familia morando.. se for isso ao meu ver esta correto..
Responder Citar

18/07/2014

Guilherme

Mas a minha procedure não faz o que pretendo.
Eu pretendo passar NULL no IdFamilia para um Paciente. Depois, a procedure é que irá ver se há alguém com a mesma Morada.
Se sim, substitui NULL pelo IdFamilia obtido, se não substitui NULL por um novo IdFamilia criado.
Responder Citar