Array
(
)

Trigger em Procedure

Guilherme
   - 16 jul 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
   - 16 jul 2014

É este o código que fiz.

#Código

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

Marisiana
   - 16 jul 2014


Citação:
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...

Guilherme
   - 16 jul 2014

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

Isaac Jose
   - 17 jul 2014


Citação:

Citação:
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...


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

Isaac Jose
   - 17 jul 2014


Citação:

Citação:
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...


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

Maria Araújo
   - 17 jul 2014

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?

Isaac Jose
   - 17 jul 2014


Citação:
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

Guilherme
   - 17 jul 2014

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

Isaac Jose
   - 17 jul 2014


Citação:
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?

Guilherme
   - 17 jul 2014

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

Isaac Jose
   - 18 jul 2014


Citação:
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..

Guilherme
   - 18 jul 2014

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.