Você está na página 1de 5

/* Banco de Dados Controle de Materiais (Estoque) */ /* Tabelas */ CREATE TABLE MATERIAIS ( MT_CODIGO INTEGER NOT NULL, /* cdigo do material

l */ MT_NOME VARCHAR(40) NOT NULL, /* nome do material */ MT_UNID VARCHAR(10), /* unidade (caixa, litro, pea, ) */ MT_ESTOQUE NUMERIC(15,2) DEFAULT 0, /* quantidade em estoque */ MT_ESTMIN NUMERIC(15,2) DEFAULT 0, /* quantidade mnima de estoque deste material */ MT_VRTOTAL NUMERIC(15,2) DEFAULT 0 /* valor total em estoque (moeda) */ ); CREATE TABLE MOVIMENTO ( MV_SEQ INTEGER NOT NULL, /* sequencia do movimento numerao automtica */ MV_DATA DATE DEFAULT CURRENT_DATE NOT NULL, /* data da movimentao */ MV_CODMAT INTEGER NOT NULL, /* cdigo do material movimentado */ MV_MOV CHAR(1), /* Tipo do movimento E = Entrada S = Sada */ MV_QUANT NUMERIC(15,2) DEFAULT 0 NOT NULL, /* Quantidade do movimento */ MV_VRUNIT NUMERIC(15,2) DEFAULT 0 NOT NULL, /* Valor unittio de entrada ou saida */ MV_VRTOTAL NUMERIC(15,2) DEFAULT 0 NOT NULL /* Valor total do movimento (quant * vr.unit) */ ); /* Check */ ALTER TABLE MOVIMENTO ADD CONSTRAINT MOV_ENTRADA_SAIDA check (mv_mov in ('E','S')); ALTER TABLE MOVIMENTO ADD CONSTRAINT MOV_QUANTIDADE check (mv_quant > 0); ALTER TABLE MOVIMENTO ADD CONSTRAINT MOV_VALOR_TOTAL check (mv_vrtotal > 0); ALTER TABLE MOVIMENTO ADD CONSTRAINT MOV_VALOR_UNITARIO check (mv_vrunit > 0); /* Primary Keys */ ALTER TABLE MATERIAIS ADD CONSTRAINT PK_MATERIAIS PRIMARY KEY (MT_CODIGO); ALTER TABLE MOVIMENTO ADD CONSTRAINT PK_MOVIMENTO PRIMARY KEY (MV_SEQ); /* Foreign Keys */ ALTER TABLE MOVIMENTO ADD CONSTRAINT FK_MOV_MATERIAL FOREIGN KEY (MV_CODMAT) REFERENCES MATERIAIS (MT_CODIGO);

/* Triggers */ Trigger de autoincremento para o cdigo do material e para a sequncia da movimentao. No movimento quando for sada, devemos informar apenas a quantidade, sendo que o valor unitrio e valor total devem ser calculados pelo estoque atual e quantidade de sada. No movimento quando for entrada, devemos informar a quantidade e o valor unitrio, sendo apurado o valor total. A tabela movimento deve atualizar a quantidade em estoque e o valor total em estoque da tabela materiais.

/* Procedimentos */ Criar um procedimento para fazer a verificao de todos os materiais, sendo que para cada material devemos fazer a leitura de todos os seus movimentos de entrada e sada, apurando a quantidade e valor em estoque e comparar com a quantidade e valor em estoque da tabela de materiais, e em caso de divergncia, listar o cdigo e nome do material e os valores divergentes.

/* Banco de Dados Controle Financeiro*/ /* Tabelas */ CREATE TABLE CLASSIFICACAO ( CL_COD INTEGER NOT NULL, CL_NOME VARCHAR(20) NOT NULL, CL_TIPO CHAR(1) ); CREATE TABLE CLIENTES ( CLI_CODIGO INTEGER NOT NULL, CLI_NOME VARCHAR(50) NOT NULL ); CREATE TABLE CONTAS ( CO_CONTA INTEGER NOT NULL, CO_TIPO INTEGER NOT NULL, CO_BANCO CHAR(3), CO_AGENCIA VARCHAR(4), CO_NCONTA VARCHAR(10), CO_SALDO NUMERIC(15,2) DEFAULT 0, CO_LIMITE NUMERIC(15,2) DEFAULT 0, CO_CLIENTE INTEGER NOT NULL ); CREATE TABLE "LOG" ( LG_SEQ INTEGER NOT NULL, LG_TABELA VARCHAR(30), LG_OPERACAO VARCHAR(20), LG_DESCRICAO VARCHAR(500) ); CREATE TABLE MOVIMENTO ( MV_SEQ INTEGER NOT NULL, MV_DATA DATE DEFAULT current_date, MV_CONTA INTEGER, MV_MOV CHAR(1), MV_VALOR NUMERIC(15,2), MV_HIST VARCHAR(30), MV_MES INTEGER, MV_ANO INTEGER );

/* Check */ ALTER TABLE CLASSIFICACAO ADD CONSTRAINT CHK_CLASSIFICACAO_TIPO check (cl_tipo in ('C','P','I','S','E')); ALTER TABLE MOVIMENTO ADD CONSTRAINT CHK_MOVIMENTO_MOV check (mv_mov in ('E','S')); /* Primary Keys */ ALTER TABLE CLASSIFICACAO ADD CONSTRAINT PK_CLASSIFICACAO PRIMARY KEY (CL_COD); ALTER TABLE CLIENTES ADD CONSTRAINT PK_CLIENTES PRIMARY KEY (CLI_CODIGO); ALTER TABLE CONTAS ADD CONSTRAINT PK_CONTAS PRIMARY KEY (CO_CONTA); ALTER TABLE "LOG" ADD CONSTRAINT PK_LOG PRIMARY KEY (LG_SEQ); ALTER TABLE MOVIMENTO ADD CONSTRAINT PK_MOVIMENTO PRIMARY KEY (MV_SEQ); /* Foreign Keys */ ALTER TABLE CONTAS ADD CONSTRAINT FK_CONTAS_CLASSIF FOREIGN KEY (CO_TIPO) REFERENCES CLASSIFICACAO (CL_COD); ALTER TABLE CONTAS ADD CONSTRAINT FK_CONTAS_CLIENTE FOREIGN KEY (CO_CLIENTE) REFERENCES CLIENTES (CLI_CODIGO); ALTER TABLE MOVIMENTO ADD CONSTRAINT FK_MOVIMENTO_CONTA FOREIGN KEY (MV_CONTA) REFERENCES CONTAS (CO_CONTA);

/* Triggers */ CREATE TRIGGER MOVIMENTO_BI FOR MOVIMENTO ACTIVE BEFORE INSERT POSITION 0 AS BEGIN IF (NEW.MV_SEQ IS NULL) THEN NEW.MV_SEQ = GEN_ID(GEN_MOVIMENTO_ID,1); new.mv_mes = extract (month from new.mv_data); new.mv_ano = extract (year from new.mv_data); END CREATE TRIGGER MOV_DEPOIS_ALTERAR FOR MOVIMENTO ACTIVE AFTER UPDATE POSITION 0 AS begin if (new.mv_mov = old.mv_mov) then /* movto igual */ begin -- registro de log insert into log (lg_seq, lg_tabela, lg_operacao, lg_descricao) values (null, 'Movimento', 'Alteracao', 'Valor alterado de R$ ' || old.mv_valor || ' para R$ ' || new.mv_valor || ' Conta = ' || new.mv_conta || ' Data = ' || current_date ); if (new.mv_mov = 'E') then /* Entrada */ begin update contas set co_saldo = co_saldo - old.mv_valor + new.mv_valor where co_conta = new.mv_conta; end if (new.mv_mov = 'S') then /* Saida */ begin update contas set co_saldo = co_saldo + old.mv_valor - new.mv_valor where co_conta = new.mv_conta; end end if (new.mv_mov = 'E' and old.mv_mov = 'S') then /* Movto de Saida para Entrada */ begin update contas set co_saldo = co_saldo + old.mv_valor + new.mv_valor where co_conta = new.mv_conta; end if (new.mv_mov = 'S' and old.mv_mov = 'E') then /* Movto de Entrada para Saida*/ begin update contas set co_saldo = co_saldo - old.mv_valor - new.mv_valor where co_conta = new.mv_conta; end end

/* Triggers */ CREATE TRIGGER CONTAS_BI FOR CONTAS ACTIVE BEFORE INSERT POSITION 0 AS declare variable proximo integer; BEGIN IF (NEW.CO_CONTA IS NULL) THEN begin proximo = null; select max(co_conta) from contas into :proximo; if (:proximo is null) then proximo = 0; proximo = :proximo + 1; new.co_conta = :proximo; end END CREATE TRIGGER MOV_DEPOIS_EXCLUIR FOR MOVIMENTO ACTIVE AFTER DELETE POSITION 0 AS begin if (old.mv_mov = 'E') then /* Entrada */ begin update contas set co_saldo = co_saldo - old.mv_valor where co_conta = old.mv_conta; end if (old.mv_mov = 'S') then /* Saida */ begin update contas set co_saldo = co_saldo + old.mv_valor where co_conta = old.mv_conta; end end CREATE TRIGGER MOV_DEPOIS_INSERIR FOR MOVIMENTO ACTIVE AFTER INSERT POSITION 0 AS begin if (new.mv_mov = 'E') then /* Entrada */ begin update contas set co_saldo = co_saldo + new.mv_valor where co_conta = new.mv_conta; end if (new.mv_mov = 'S') then /* Saida */ begin update contas set co_saldo = co_saldo - new.mv_valor where co_conta = new.mv_conta; end end

/* Procedures */ CREATE PROCEDURE PR_TRANSFERENCIA ( P_CONTA_SAIDA INTEGER, P_CONTA_ENTRADA INTEGER, P_VALOR NUMERIC(15,2)) AS begin -- insere saida insert into movimento (mv_conta, mv_mov, mv_valor) values (:p_conta_saida, 'S', :p_valor); -- insere entrada insert into movimento (mv_conta, mv_mov, mv_valor) values (:p_conta_entrada, 'E', :p_valor); end

Você também pode gostar