[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