[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