[firebase-br] RES: Procedure para caixa

Ivan Guimarães Meirelles igmeirelles em gmail.com
Qua Ago 19 10:04:25 -03 2009


Olá Everton...

A tabela CAIXA não necessita ter a coluna SALDO pois o mesmo é um campo
calculado então bastaria fazer o calculo quando for realizado uma
consulta... para isso utilize uma Stored Procedure... veja esse exemplo
(baseado na sua tabela):

TABELA CAIXA:

CREATE TABLE CAIXA (
    CODCAIXA     INTEGER NOT NULL,
    TIPO         VARCHAR(7), 
    DESCRICAO    VARCHAR(50),
    NOMEUSUARIO  VARCHAR(20),
    DATA         DATE,
    HORA         TIME,
    VALOR        DECIMAL(10, 2)
);

Para melhorar um pouco mais sua base, eu aconselharia colocar o campo TIPO
como CHAR(1) apenas para armazenar 'E' ou 'S' (entrada ou saída) ou ainda
'D' ou 'C' (para débito ou crédito)... vamos assumir que você armazena em
TIPO os valores 'ENTRADA' ou 'SAIDA':

Vamos criar agora a STORED PROCEDURE RELAT_CAIXA:

CREATE PROCEDURE RELAT_CAIXA 
returns (
    CODCAIXA     INTEGER,
    TIPO         VARCHAR(7), 
    DESCRICAO    VARCHAR(50),
    NOMEUSUARIO  VARCHAR(20),
    DATA         DATE,
    HORA         TIME,
    VALOR        DECIMAL(10, 2),
    SALDO        DECIMAL(10, 2)
)
as
declare variable saldoatual decimal(10,2);
begin
    saldoatual = 0;
    for select c.codcaixa, c.tipo, c.descricao, c.nomeusuario, c.data,
c.hora, c.valor
        from caixa c Order by c.data, c.hora
        into :codcaixa, :tipo, :descricao, :nomeusuario, :data, :hora,
:valor
    do
        Begin
            if (:tipo = 'ENTRADA') then
                saldo = saldoatual + :valor;
            else
                saldo = :saldoatual - :valor;
            saldoatual = :saldo;
            suspend;
        end
end;


E então na sua aplicação você irá fazer um simples select desta stored
procedure, 
sem se preocupar com o saldo quando ocorrer uma atualização de valores:
SELECT * FROM RELAT_CAIXA

E você pode melhorar essa stored procedure acrescentando parâmetros como
DATA_INICIAL e DATA_FINAL para trazer apenas o período que o usuário
desejar.
Isso foi um exemplo bem simples... pode e deve ser melhorado.

Espero ter ajudado,
Um forte abraço...


-----Mensagem original-----
De: lista-bounces em firebase.com.br [mailto:lista-bounces em firebase.com.br] Em
nome de everton.patricio01
Enviada em: terça-feira, 18 de agosto de 2009 17:51
Para: lista em firebase.com.br
Assunto: [firebase-br] Procedure para caixa

Olá pessoal,

Escreví uma procedure para uma tabela caixa da seguinte forma:

--------------

CREATE PROCEDURE INSERIR_LANCAMENTO (
 DATA_LANCAMENTO DATE,
 TIPO VARCHAR(7),
 DESCRICAO VARCHAR(50),
 NOMEUSUARIO VARCHAR(20),
 DATA DATE,
 HORA TIME,
 VALOR DECIMAL(10,2),
 SALDO DECIMAL(10,2)
)

AS

BEGIN
 INSERT INTO CAIXA (
  CODCAIXA,
  TIPO,
  DESCRICAO,
  NOMEUSUARIO,
  DATA,
  HORA,
  VALOR,
  SALDO
 )

 VALUES
 (
  GEN_ID(GERACODCAIXA,1),
  :TIPO,
  :DESCRICAO,
  :NOMEUSUARIO,
  :DATA,
  :HORA,
  :VALOR,
  :SALDO
 );

END

-------------


A trigger que ativa a procedure está descrita a seguir:

-------------


SET TERM ^;
CREATE TRIGGER NOVOLANCCAIXACONTASREC FOR CONTASRECEBER AFTER UPDATE AS
BEGIN
 IF (NEW.FECHADO = 'TRUE') THEN
  EXECUTE PROCEDURE INSERIR_LANCAMENTO('ENTRADA','PAGAMENTO DE PARCELA',
NEW.NOMEUSUARIO,
  NEW.DATA, NEW.HORA, NEW.VALORTOTAL, 100);
END ^

-------------

O meu problema é justamente o campo saldo pois, justamente como podem
perceber, estou jogando um número fixo 100, mas o que eu gostaria é que
minha trigger ou procedure identificasse o campo saldo do último registro
para então atualizá-lo conforme o tipo (entrada ou saída).

Muito obrigado a todos, Everton.
 

______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
Para saber como gerenciar/excluir seu cadastro na lista, use:
http://www.firebase.com.br/fb/artigo.php?id=1107
Para consultar mensagens antigas: http://firebase.com.br/pesquisa





Mais detalhes sobre a lista de discussão lista