Pular para o conteúdo
Visualizando 5 posts - 1 até 5 (de 5 do total)
  • Autor
    Posts
  • #99409
    Anônimo

      Boas malta sou novo por aqui ,

      Estou com umas duvidas na resoluçao de uns exercicios , e depois de visualizar este vosso forum 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 ..

      Exercicio 1 :
      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.

      Ficaria algo 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/

      Exercicio 2 :
      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.

      Exercicio 3 :
      Criar função “CALCULAR_DIVIDA” que aceite o código do proprietário e devolva o valor em divida do mesmo.

      Exercicio 4 :
      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. [/i][/u]

      #99416
      Ishii
      Participante

        Olá,

        Basicamente tem uns pontos no código a serem revisados…

        1) Criar a variável saldoactual no corpo da trigger;
        2) A conta correta seria:

        UPDATE Condominio
        set saldo_conta:=saldo_conta-:new.valor
        WHERE condominio.cod_condominio:=NEW.cod_condominio;

        Pois o campo Despesa.valor deve atualizar o saldo, correto?

        3) Melhor revisar a codificação, pois podem ocorrer erros na compilação.

        No mais, coloque os erros que por ventura ocorram aqui para que possamos te ajudar!

        []s Ishii

        #99420
        Anônimo

          Obrigado pela sua ajuda Ishii ,

          A variavel criei em Declare a seguir a Exception :

          saldoactual NUMBER;

          pode ser assim ou seria algo saldoactual%ROWTYPE ?!

          Já agora deixo aqui as tentativas de resolução do exercicio 2 e 3 .
          Exercicio 2 :
          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.
          CREATE OR REPLACE PROCEDURE EX2

                      (Codigo IN NUMBER, Mes IN NUMBER, ANO IN NUMBER)
          

          IS

                      CURSOR C_ApartamentosComCondominio (COD NUMBER) IS
          
                                     SELECT  COD_Espaco,Cod_proprietario,valor_mensalidade from Apartamentos
          
                                     where cod_condomino=COD;        
          

          BEGIN

                      OPEN C_ApartamentosComCondominio(Codigo);
          
                      FETCH  C_ApartamentosComCondominio INTO CondominoApartamento;
          
                      WHILE C_ApartamentosComCondominio%FOUND THEN
          
                                     INSERT INTO FACTURA
          
                                     VALUES
          
                                     (CondominoApartamento.Cod_ESpaco, Mes, Ano, CondominoApartamento.Cod_proprietario, CondominoApartamento. valor_mensalidade, LAST_DAY(TO_DATE(ANO & '/' & MES &'/01','YYYY/MM/DD')),NULL);
          
                                     FETCH  C_ApartamentosComCondominio INTO CondominoApartamento;
          
                      END LOOP;
          
          
          
                      CLOSE C_ApartamentosComCondominio;
          

          END;

          /

          Exercicio 3 :
          Criar função “CALCULAR_DIVIDA” que aceite o código do proprietário e devolva o valor em divida do mesmo.
          Assumi que o significado do pagamento não existir é o campo data_pagamento ser null …..


          CREATE OR REPLACE FUNCTION CALCULAR_DIVIDA (COD in Number)

          RETURN NUMBER

          IS

          BEGIN

                      SELECT SUM(VALOR) into Valor
          
                      FROM FACTURA
          
                      WHERE COD_PRORIATARIO=COD and data_pagamento is null
          
          
          
                      RETURN (Valor);
          

          END CALCULAR_DIVIDA;

          /
          [/code]

          #99421
          Ishii
          Participante

            Olá,

            Está correto: saldoactual NUMBER;

            Com relação a procedure e a function, aparentemente, (pois não testei…) estão ok. Somente o teste poderá validar mesmo isso.

            []s Ishii

            #99422
            Anônimo

              Obrigado ! Neste computador não possuo instalado o oracle deixo aqui as tabelas , caso seja util ..

              create table Apartamento
              (cod_espaco     NUMBER(2) primary key,
              num_apartamento       NUMBER(5),
              num_metros_quadrados  NUMBER(10),
              foreign key (cod_condominio) references Condominio(cod_condominio),
              foreign key (cod_proprietario) references Proprietario(cod_proprietario),
              valor_mensalidade         NUMBER(12));
              
              
              create table Condominio
              (cod_condominio     NUMBER(2) primary key,
              morada       VARCHAR(),
              edificio  VARCHAR(10),
              local VARCHAR(10),
              NIB  NUMBER(10),
              saldo_conta NUMBER(10));
              
              
              create table Proprietario
              (cod_proprietario    NUMBER(2) primary key,
              nome       VARCHAR(),
              telefone  VARCHAR(10));
              
              
              
              create table Factura
              (cod_espaco     NUMBER(2) primary key,
              mes      NUMBER(),
              ano  NUMBER(),
              local VARCHAR(10),
              NIB  NUMBER(10),
              foreign key (cod_proprietario) references Proprietario(cod_proprietario),
              foreign key (cod_espaco) references Apartamento(cod_espaco),
              valor NUMBER(),
              data_limite_pagamento DATE(),
              data_pagamento         DATE());
              
              
              create table Despesa
              (cod_despesa    NUMBER(2) primary key,
              foreign key (cod_condominio) references Condominio(cod_condominio),
              valor      NUMBER(),
              data  DATE(1),
              tipo_despesa VARCHAR());
              

            Visualizando 5 posts - 1 até 5 (de 5 do total)
            • Você deve fazer login para responder a este tópico.