[firebase-br] Procedure linha de saldo do caixa por dia

Arlei Ferreira Farnetani Junior junior em farsoft.com.br
Sex Jan 30 00:51:49 -03 2009


Pessoal gostaria de fazer o seguinte, uma procedure
que me resultasse o saldo do caixa da seguinte forma:

Saldo anterior: 0.00

01/01/2009  XXXXXXXXXXXX   100,00    100,00
01/01/2009  YYYYYYYYYYYY     50,00    150,00
saldo do dia 01.01.2009..................................150,00  (é isto 
aqui q tá faltando)
02/01/2009  ZZZZZZZZZZZZZZ 1.100,00  1.250,00
02/01/2009  gggggggggggggggggg    200,00  1.450,00
saldo do dia 02.01.2009...............................1.450,00   (é isto 
aqui q tá faltando)


Não to conseguindo fazer ele quebrar como no exemplo acima!!!
Como eu teria que fazer para a procedure gerar esta linha
de saldo por dia???


Segue o código baseado num exemplo que o Cantu fez para uma revisa:

CREATE OR ALTER PROCEDURE RELATORIO_CAIXA_SIMPLES (
    inicio date,
    fim date,
    conta varchar(11),
    is_filial integer)
returns (
    id integer,
    data date,
    identificador varchar(11),
    documento varchar(15),
    notafiscal varchar(20),
    historico varchar(50),
    nome varchar(50),
    codigoplano varchar(6),
    plano varchar(60),
    codigosubplano varchar(6),
    subplano varchar(60),
    cod_pessoa integer,
    valor numeric(10,2),
    subsaldo numeric(10,2),
    modalidade varchar(40),
    operacao varchar(1),
    ordenar varchar(1))
as
declare variable saldo_ant_credito numeric(10,2);
declare variable saldo_ant_debito numeric(10,2);
declare variable saldo_final numeric(10,2);
declare variable datacab date;
begin

  /* Primeiro recuperamos a soma dos valores dos debitos anteriores ao
     periodo informado para posteriormente calcularmos nosso saldo inicial 
*/

  select
  cast(sum(m.valor+coalesce(m.juros,0)+coalesce(m.multa,0)-coalesce(m.descontos,0)) 
as numeric(10,2))
  from money m
  left outer join
  money_tipos mt
  on m.is_money_tipo=mt.id_moneytipo
  left outer join
  money_contas mc
  on mc.id_moneyconta=m.is_money_conta
  where (m.data_baixa < :inicio)
  and m.situacao='Q'
  and mt.quitacao_direta='S'
  and not m.cancelado='S'
  and mc.conta_money=:conta
  and m.is_filial=:is_filial
  and m.operacao='D'
  and ((mt.forma='0') or (mt.forma='2'))
  into :saldo_ant_debito;

  /* Agora recuperamos a soma dos valores dos creditos anteriores ao
     periodo informado  */

  select
  cast(sum(m.valor+coalesce(m.juros,0)+coalesce(m.multa,0)-coalesce(m.descontos,0)) 
as numeric(10,2))

  from money m
  left outer join
  money_tipos mt
  on m.is_money_tipo=mt.id_moneytipo
  left outer join
  money_contas mc
  on mc.id_moneyconta=m.is_money_conta
  where (m.data_baixa < :inicio)
  and m.situacao='Q'
  and mt.quitacao_direta='S'
  and not m.cancelado='S'
  and mc.conta_money=:conta
  and m.is_filial=:is_filial
  and m.operacao='C'
  and ((mt.forma='0') or (mt.forma='2'))
  into :saldo_ant_credito;

  /* Caso não haja lancamentos anteriores, a variavel ficara no estado NULL,
     como no SQL qualquer operação matemática feita com valores NULL sempre
     resulta em NULL, temos que verificar isso e atribuir 0.00 na variavel 
nula
     para que forneça o resultado esperado */

  if (:saldo_ant_credito is null) then saldo_ant_credito = 0.00;
  if (:saldo_ant_debito is null) then saldo_ant_debito = 0.00;

  data = :inicio - 1;
  modalidade = '';
  historico = '** SALDO ANTERIOR';
  cod_pessoa = null;
  notafiscal = '';
  nome='';
  plano='';
  codigoplano='';
  subplano='';
  codigosubplano='';
  documento = '';
  identificador = 'SALDO ANT';
  valor = (saldo_ant_credito - saldo_ant_debito);
  subsaldo = valor;
  ordenar = '';

  /* Inicializando a variavel que armazenara o saldo final
     com o valor do saldo anterior */
  saldo_final = valor;

  /* Por questões "estéticas" não queremos ter valores negativos no campo 
valor,
     sendo assim, se o saldo anterior é negativo, devemos informar que o 
lançamento é
     de débito e tornar o valor do saldo positivo, caso contratio informamos 
que o
     lançamento é de crédito.*/

  if (:valor < 0) then
  begin
    operacao = 'D';
    valor = valor * -1;
  end
  else
  begin
    operacao = 'C';
  end

  suspend; /* Retornando a primeira linha (registro) com o saldo anterior */

    /* o comando a seguir seleciona os registros dentro do periodo informado
     buscando na tabela de contas a pagar */


  datacab =: inicio;

  for

  select
  m.id_money,
  m.data_baixa,
  m.identificador_operacao,
  m.notafiscal,
  case
  when p.nome is null then m.historico
  else p.nome
  end historico,
  p.nome,
  m.codigo_plano,
  mp.planoconta,
  m.codigo_subplano,
  sp.planoconta,
  p.id_pessoa,
  cast 
((m.valor+coalesce(m.juros,0)+coalesce(m.multa,0)-coalesce(m.descontos,0)) 
as numeric(10,2)),
  m.operacao,
  mt.tipo_money,
  m.numero_duplicata
  from money m
  left outer join
  pessoas p
  on p.id_pessoa=m.is_pessoa
  left outer join
  money_tipos mt
  on m.is_money_tipo=mt.id_moneytipo
  left outer join
  money_contas mc
  on mc.id_moneyconta=m.is_money_conta
  left outer join
  money_planocontas mp
  on mp.codigoplano=m.codigo_plano
  left outer join
  money_planocontas sp
  on sp.codigoplano=m.codigo_subplano
  where m.situacao='Q'
  and mc.conta_money=:conta
  and not m.cancelado='S'
  and mt.quitacao_direta='S'
  and ((mt.forma='0') or (mt.forma='2'))
  and (m.data_baixa between :inicio and :fim)
  order by m.data_baixa, m.operacao, m.identificador_operacao, p.nome, 
m.historico
  into :id, :data, :identificador, :notafiscal, :historico, :nome, 
:codigoplano, :plano, :codigosubplano, :subplano, :cod_pessoa, :valor, 
:operacao, :modalidade, :documento
  do
  begin
    /* Subtraimos o valor do lançamento do saldo final */
    if (operacao='C') then
        saldo_final = saldo_final + valor;
    else
        saldo_final = saldo_final - valor;

    subsaldo = saldo_final;
    /* O suspend a seguir retorna uma "linha" contendo os campos
       data, historico, tipo e valor que tem seus valores armazenados
       nas variáveis de mesmo nome */
    ordenar = 'A';

    suspend;
  end



  /* Montamos o ultimo "registro" que conterá os valores do saldo FINAL */
  data = :fim;
  historico = '** SALDO FINAL';
  cod_pessoa = null;
  notafiscal = '';
  documento = '';
  nome='';
  plano='';
  codigoplano='';
  subplano='';
  codigosubplano='';
  identificador = 'SALDO FINAL';
  ordenar = 'C';
  operacao = 'C';
  modalidade = '';
  valor = saldo_final;
  id = null;

  suspend;

end





Mais detalhes sobre a lista de discussão lista