[firebase-br] Ajuda com SP
ncsinfo em tganet.com.br
ncsinfo em tganet.com.br
Ter Nov 11 16:06:06 -03 2008
Salve,
Estou com dificuldades, na elaboração de uma Stored Procedure para calcular
o saldo de Diversas contas o texto é extenso, mas é pra melhor explicar o
meu objetivo.
Tabela: CaixaSaldo
data conta debito credito
01/11 1.1.1.1 57,00 0,00
01/11 1.1.1.2 23,00 0,00
01/11 1.1.1.3 0,00 63,00
01/11 1.1.1.4 0,00 50,00
01/11 1.1.1.1 0,00 10,00
01/11 1.1.1.1 0,00 5,00
02/11 1.1.1.2 0,00 15,00
02/11 1.1.1.1 25,00 0,00
02/11 1.1.1.1 0,00 20,00
quero que me retorne:
Data Conta Saldo Debito Credito Saldo Atual
01/11 1.1.1.1 0,00 80,00 15,00 65,00
SALDO ATUAL
65,00
01/11 1.1.1.2 0,00 23,00 0,00
23,00
SALDO ATUAL
23,00
01/11 1.1.1.3 0,00 0,00
,00 -63,00
SALDO
-63,00
01/11 1.1.1.4 0,00 0,00
,00 -50,00
SALDO
-50,00
02/11 1.1.1.1 65,00 25,00 20,00 70,00
SALDO ATUAL
70,00
02/11 1.1.1.2 23,00 0,00 15,00
8,00
SALDO ATUAL
8,00
Montei a SP abaixo, mas não estou conseguindo o objetivo acima.
CREATE PROCEDURE SP_CAIXA_SALDO_01 (
filial integer,
data_ini date,
data_fim date,
sldanterior varchar(1),
splanocta varchar(30))
returns (
data date,
tipo varchar(100),
plano_conta varchar(20),
plano_nome varchar(30),
saldo_anterior numeric(12,2),
credito numeric(12,2),
debito numeric(12,2),
saldoatual numeric(12,2))
as
declare variable valorcredito numeric(12,2);
declare variable valordebito numeric(12,2);
begin
-- zerar quaisquer creditos
CREDITO = 0.00;
-- zerar quaisquer debitos
DEBITO = 0.00;
-- transferir SALDO ANTERIOR para saldo atual
SALDOATUAL = 0.00;
SALDO_ANTERIOR = 0.00;
/* calcular o saldo anterior ao relatório soliticado
Somente se o usuário solicitar */
if (SLDANTERIOR='S') then
begin
-- essa rotina retorna todos os credito
select coalesce(sum(credito),0)
from ctrl_caixa_saldo
where data < :DATA_INI
into :valorcredito;
-- essa rotina retorna todos os debitos
select coalesce(sum(debito),0)
from ctrl_caixa_saldo
where data < :DATA_INI
into :valordebito;
-- Informar a data anteior a data inicial informada pelo usuario
--DATA = DATA_INI-1;
DATA = DATA_INI-1;
-- Informar uma mensagem para usuario
TIPO = 'SALDO ANTERIOR ATÉ ' || Cast(:DATA_INI-1 as date);
plano_conta = '';
plano_nome = '';
-- obtenho o saldo anterior subtraindo o crédito e o débito
SALDO_ANTERIOR = valordebito - valorcredito;
/* Se saldo anterior for negativo, pegar o valor da varivel
SALDO_ANTERIOR */
CREDITO = valorcredito;
DEBITO = valordebito;
-- transferir SALDO ANTERIOR para saldo atual
SALDOATUAL = SALDO_ANTERIOR;
-- exibir na tela se saldo anterior for maior o menor que 0 (zero)
if (SALDO_ANTERIOR<>0) then
Suspend; -- <== cria um retorno (Returns) e faz exibir na tela
-- transferir SALDO ANTERIOR para saldo atual
SALDOATUAL = SALDO_ANTERIOR;
-- zerar saldo anterior para que seja exibido somente na primeira linha
e não
-- nas linhas anteriores
SALDO_ANTERIOR=0;
end
/* LOOP para calcular saldos */
for select
DATA,
PLN_CONTA,
PLN_CONTA ||' - '||coalesce( (SELECT PCONOM FROM PLANOCONTAS
WHERE PCOCTA=PLN_CONTA),'[PLANO DE CONTAS NÃO DEFINIDO]' ),
SUM(CREDITO),
SUM(DEBITO)
from caixasaldo
Where
FILIAL = :FILIAL
and
data between :DATA_INI and :DATA_FIM
GROUP BY DATA, PLN_CONTA
ORDER BY DATA, PLN_CONTA
into :DATA, :PLANO_CONTA, :PLANO_NOME, :CREDITO, :DEBITO
DO
begin
TIPO ='RESUMO DIÁRIO';
-- execute procedure sp_erro_msg ('x');
SALDOATUAL = SALDOATUAL + (DEBITO - CREDITO);
suspend;
end
end
Está me retornando:
Data Conta Saldo Debito Credito Saldo Atual
01/11 1.1.1.1 0,00 80,00 15,00 65,00
01/11 1.1.1.2 0,00 23,00 0,00
88,00
01/11 1.1.1.3 0,00 0,00 63,00
15,00
01/11 1.1.1.4 0,00 0,00
,00 -35,00
02/11 1.1.1.1 0,00 25,00 20,00 -30,00
02/11 1.1.1.2 0,00 0,00
,00 -45,00
Mais detalhes sobre a lista de discussão lista