[firebase-br] calcular inventário

MAURICIO COSTA maximmumsistemas em gmail.com
Ter Ago 21 23:39:24 -03 2012


Caros amigos! Um dos colegas solicitou como gerar inventário, prometi que
iria fazer um exemplo e postar. Acho que era isso que ele precisava. Este
pequeno exemplo deve servir para ele e vários que estão iniciando com o
firebird.
Estou enviando um script com a criação do bando de dados, das tabelas,
procedures e Triggers. Como também as integridades das tabelas.
Na abertura do seu aplicativo você roda a procedure e no decorrer do dia as
triggers que estão nas tabelas intes_compra e itens_venda se encarregam de
preecher os dados das tabela inventário.

SET SQL DIALECT 3;

SET NAMES WIN1252;

SET CLIENTLIB 'fbclient.dll';

CREATE DATABASE 'C:\DADOS\ESTOQUE.FDB'
USER 'SYSDBA' PASSWORD 'masterkey'
PAGE_SIZE 8192
DEFAULT CHARACTER SET WIN1252 COLLATION WIN_PTBR;


CREATE PROCEDURE PRC_GERA_INVENTARIO
AS
BEGIN
  EXIT;
END


CREATE TABLE INVENTARIO_DIA (
    DATA_INVENTARIO  DATE NOT NULL,
    IDPRODUTO        INTEGER NOT NULL,
    QTDE_COMPRA      NUMERIC(18,3),
    QTDE_VENDA       NUMERIC(18,3),
    QTDE_ESTOQUE     NUMERIC(18,3)
);

CREATE TABLE ITENS_COMPRA (
    IDCODIGO     INTEGER NOT NULL,
    IDPRODUTO    INTEGER NOT NULL,
    QTDE_COMPRA  NUMERIC(18,3),
    DATA_COMPRA  DATE
);

CREATE TABLE ITENS_VENDA (
    IDCODIGO    INTEGER NOT NULL,
    IDPRODUTO   INTEGER NOT NULL,
    QTDE_VENDA  NUMERIC(18,3),
    DATA_VENDA  DATE
);

CREATE TABLE PRODUTOS (
    IDCODIGO         INTEGER NOT NULL,
    DESCRICAO        VARCHAR(20),
    QTDE_ESTOQUE     NUMERIC(18,3),
    DATA_INVENTARIO  DATE
)

ALTER TABLE INVENTARIO_DIA ADD CONSTRAINT PK_INVENTARIO_DIA PRIMARY KEY
(DATA_INVENTARIO, IDPRODUTO);
ALTER TABLE ITENS_COMPRA ADD CONSTRAINT PK_ITENS_COMPRA PRIMARY KEY
(IDCODIGO, IDPRODUTO);
ALTER TABLE ITENS_VENDA ADD CONSTRAINT PK_ITENS_VENDA PRIMARY KEY
(IDCODIGO, IDPRODUTO);
ALTER TABLE PRODUTOS ADD CONSTRAINT PK_PRODUTOS PRIMARY KEY (IDCODIGO);

ALTER TABLE INVENTARIO_DIA ADD CONSTRAINT FK_INVENTARIO_DIA_1 FOREIGN KEY
(IDPRODUTO) REFERENCES PRODUTOS (IDCODIGO) ON DELETE CASCADE ON UPDATE
CASCADE;
ALTER TABLE ITENS_COMPRA ADD CONSTRAINT FK_ITENS_COMPRA_1 FOREIGN KEY
(IDPRODUTO) REFERENCES PRODUTOS (IDCODIGO) ON DELETE CASCADE ON UPDATE
CASCADE;
ALTER TABLE ITENS_VENDA ADD CONSTRAINT FK_ITENS_VENDA_1 FOREIGN KEY
(IDPRODUTO) REFERENCES PRODUTOS (IDCODIGO) ON DELETE CASCADE ON UPDATE
CASCADE;


/* Trigger: ITENS_COMPRA_AI0 */
CREATE TRIGGER ITENS_COMPRA_AI0 FOR ITENS_COMPRA
ACTIVE AFTER INSERT POSITION 0
AS
begin
  if (new.idproduto > 0) then
  begin
    update inventario_dia set qtde_compra = qtde_compra + new.qtde_compra
    where idproduto = new.idproduto
    and data_inventario = new.data_compra;
  end
end

/* Trigger: ITENS_VENDA_AI0 */
CREATE TRIGGER ITENS_VENDA_AI0 FOR ITENS_VENDA
ACTIVE AFTER INSERT POSITION 0
AS
begin
  if (new.idproduto > 0) then
  begin
    update inventario_dia set qtde_compra = qtde_compra + new.qtde_venda
    where idproduto = new.idproduto
    and data_inventario = new.data_venda;
  end
end


ALTER PROCEDURE PRC_GERA_INVENTARIO
AS
declare variable VESTOQUE numeric(18,3);
declare variable VPRODUTO integer;
begin
  for
    select idcodigo, qtde_estoque from produtos
    into :vproduto, :vestoque
  do
  if (vproduto > 0) then
  begin
    if (vestoque is null) then
      vestoque = 0.00;
    insert into inventario_dia(idproduto, data_inventario, qtde_estoque,
qtde_compra, qtde_venda) values (:vproduto, current_date, :vestoque, 0.000,
0.000);
    update produtos set data_inventario = current_date
    where idcodigo = :vproduto;
  end
end



Mais detalhes sobre a lista de discussão lista