Boas ,
Estou com umas duvidas na resoluçao de um exercicio , e depois de visualizar este site resolvi em perguntar se me podem ajudar ou explicar como faço isto .
Tenho as tabelas :
Apartamento (cod_espaço, cod_condomino FK , num_apartamento, valor_mensalidade, num_metros_quadrados, cod_proprietario FK)
-----------------------------------------------------------------------------------
Condominio (cod_condominio, morada_edificio, local, NIB, saldo_conta)
-------------------------------------------------------------------------------------
Proprietário (cod_proprietario, nome, telefone)
-------------------------------------------------------------------------------------
Factura (cod_espaço FK, mês, ano, cod_proprietario FK, valor, data_limite_pagamento, data_pagamento)
-------------------------------------------------------------------------------------
Despesa (cod_despesa, cod_condominio FK, valor, data, tipo_despesa)
-------------------------------------------------------------------------------------
Já as criei em SQL Plus e até aqui tudo bem , mas agora vêm o mais dificil :
Crie um trigger sobre a tabela DESPESAS que:
a) Não permita efectuar uma despesa (da tabela DESPESAS) se o valor do saldo da conta (tabela CONDOMINIO) não chegar para cobrir a despesa. Utilizar excepções.
b) Actualizar o saldo da conta se a despesa de concretizar.
Criar um procedimento que aceite o código, mês e ano para as facturas de todos os apartamentos do respectivo condomínio no mês e ano em apreço. Data limite de pagamento ficaram será o ultimo dia do mês , data de pagamento ficara nula ate ao acto da entrega.
Criar função “CALCULAR_DIVIDA” que aceite o código do proprietário e devolva o valor em divida do mesmo.
Criar um procedimento que utilize a função para escrever para a tabela mensagem o nome dos proprietários e os valores em divida dos mesmos.
Criar um trigger para forçar a inserção ou actualização do número de metros na tabela apartamento
Alguém me pode explicar ou ajudar com este exercicio ?!
Obrigado
Triggers - Funcoes e Procedimentos - Duvidas
-
- Rank: Estagiário Júnior
- Mensagens: 2
- Registrado em: Qua, 25 Mai 2011 6:55 pm
- Localização: Portugal
-
- Rank: Estagiário Júnior
- Mensagens: 2
- Registrado em: Qua, 25 Mai 2011 6:55 pm
- Localização: Portugal
O 1º Trigger seria assim ?!
CREATE OR REPLACE TRIGGER DespesasT
BEFORE INSERT OR UPDATE ON Despesa
FOR EACH ROW
DECLARE
excepcao EXCEPTION;
BEGIN
SELECT saldo_conta INTO saldoactual FROM Condominio
WHERE condominio.cod_condominio:=NEW.cod_condominio
IF (NEW.valor > saldoactual)
RAISE excepcao;
END IF;
UPDATE Condominio
set saldo_conta:=saldo_conta-saldoactual
WHERE condominio.cod_condominio:=NEW.cod_condominio;
EXCEPTION
WHEN excepcao THEN
RAISE_APPLICATION_ERROR(-20000,'O Saldo da Conta não permite a compra');
END/
-
- Rank: Programador Júnior
- Mensagens: 17
- Registrado em: Qua, 07 Jul 2010 2:53 pm
- Localização: Americana - SP
Boa tarde,
Segue abaixo algumas respostas, não testei pois estou escrevendo direto aqui na tela, qualquer coisa, responde aee, rs =]
As que não fiz é porque não entendi o que você queria, hehe! falou!
CREATE OR REPLACE TRIGGER trg_despesas
BEFORE INSERT OR UPDATE ON despesa
FOR EACH ROW
DECLARE
v_saldo_atual number;
BEGIN
SELECT saldo_conta
INTO v_saldo_atual
FROM condominio
WHERE cod_condominio = :new.cod_condominio;
IF (new.valor > v_saldo_atual)
raise_application_error(-20100, 'Saldo insuficiente!');
END IF;
UPDATE condominio
SET saldo_conta := saldo_conta - v_saldo_atual
WHERE cod_condominio = :new.cod_condominio;
EXCEPTION
WHEN NO_DATA_FOUND THEN
raise_application_error(-20100, 'Valor não encontrado!');
END;
CREATE OR REPLACE FUNCTION fnc_calcular_divida(p_codigo number)
RETURN NUMBER IS
v_valor number;
BEGIN
--Irá trazer o valor da fatura que não foi pago ainda
SELECT NVL(SUM(valor), 0)
INTO v_valor
FROM factura
WHERE cod_proprietario = p_codigo
AND data_pagamento IS NULL;
RETURN v_valor;
END;
CREATE OR REPLACE TRIGGER trg_apartamento
BEFORE INSERT OR UPDATE ON Apartamento
FOR EACH ROW
BEGIN
IF :new.num_metros_quadrados IS NULL THEN
RAISE_APPLICATION_ERROR(-20100, 'Obrigatório informar os metros quadrados!');
END IF;
END;
Segue abaixo algumas respostas, não testei pois estou escrevendo direto aqui na tela, qualquer coisa, responde aee, rs =]
As que não fiz é porque não entendi o que você queria, hehe! falou!
CREATE OR REPLACE TRIGGER trg_despesas
BEFORE INSERT OR UPDATE ON despesa
FOR EACH ROW
DECLARE
v_saldo_atual number;
BEGIN
SELECT saldo_conta
INTO v_saldo_atual
FROM condominio
WHERE cod_condominio = :new.cod_condominio;
IF (new.valor > v_saldo_atual)
raise_application_error(-20100, 'Saldo insuficiente!');
END IF;
UPDATE condominio
SET saldo_conta := saldo_conta - v_saldo_atual
WHERE cod_condominio = :new.cod_condominio;
EXCEPTION
WHEN NO_DATA_FOUND THEN
raise_application_error(-20100, 'Valor não encontrado!');
END;
CREATE OR REPLACE FUNCTION fnc_calcular_divida(p_codigo number)
RETURN NUMBER IS
v_valor number;
BEGIN
--Irá trazer o valor da fatura que não foi pago ainda
SELECT NVL(SUM(valor), 0)
INTO v_valor
FROM factura
WHERE cod_proprietario = p_codigo
AND data_pagamento IS NULL;
RETURN v_valor;
END;
CREATE OR REPLACE TRIGGER trg_apartamento
BEFORE INSERT OR UPDATE ON Apartamento
FOR EACH ROW
BEGIN
IF :new.num_metros_quadrados IS NULL THEN
RAISE_APPLICATION_ERROR(-20100, 'Obrigatório informar os metros quadrados!');
END IF;
END;
-
- Informação
-
Quem está online
Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante