Re: [firebase-br] Dificuldade com Query - Ninguém pode me Ajudar ?

Josauro S.J. josauro em casasoft.inf.br
Ter Dez 21 17:29:39 -03 2004



Veja um modelo do que uso, mas so uso uma conta com qualquer numero de niveis,    1.1.01.01.001 

o resulta do é

1                    110.000,00     100.000,00

1.1                   70.000,00      70.000,00

1.1.01               50.000,00     20.000,00
1.1.01.001         10.000,00     10.000,00
1.1.01.002         40.000,00     10.000,00

1.1.02               20.000,00     50.000,00
1.1.02.001          5.000,00       5.000,00
1.1.02.002        15.000,00      45.000,00

1.2                   40.000,00     30.000,00
.....


CREATE PROCEDURE GET_BALANCO_CONTAS (
    CONTA_INICIAL VARCHAR(13),
    CONTA_FINAL VARCHAR(13),
    DATA_INICIAL DATE,
    DATA_FINAL DATE,
)
RETURNS (
    TOTAL_CREDITO NUMERIC(18,2),
    TOTAL_DEBITO NUMERIC(18,2),
    TOTAL NUMERIC(18,2),
    SINTETICO_ANALITICO CHAR(1),
    TITULO VARCHAR(40),
    CONTA VARCHAR(13))
AS
DECLARE VARIABLE OPERACAO SMALLINT;
DECLARE VARIABLE VALOR NUMERIC(18,2);
DECLARE VARIABLE CONTA_CLASSE VARCHAR(13);
begin
  /* Procedure Text */
  FOR
    select c.cla_conta,
           c.cla_titulo,
           c.cla_sintetico_analitico,
           c.cla_codigo
           from PLANO_CONTA c
    where (c.cla_conta >= :CONTA_INICIAL AND
           c.cla_conta <= :CONTA_FINAL) OR
          (:CONTA_INICIAL = '' AND
           :CONTA_FINAL   = '')
    order by c.cla_conta
    INTO :CONTA,:TITULO,:SINTETICO_ANALITICO,:CLA_CODIGO
  DO BEGIN
    TOTAL = 0;
    TOTAL_DEBITO = 0;
    TOTAL_CREDITO = 0;
    if (SINTETICO_ANALITICO = 'A')
    then BEGIN
      FOR
        SELECT L.LCS_VALOR,
               L.LCS_OPERACAO,
               L.lcs_MOVIMENTO_VALOR,
               L.lcs_LANCAMENTO
        FROM VW_lancamento_CONTAS L
        WHERE L.CLASSE LIKE (:CONTA||'%') and
              ((L.classe >= :CONTA_INICIAL AND
                L.classe <= :CONTA_FINAL) OR
               (:CONTA_INICIAL = '' AND
               :CONTA_FINAL   = ''))
        INTO VALOR, :OPERACAO
      DO BEGIN
          TOTAL = TOTAL + (VALOR*OPERACAO);
          if (OPERACAO = -1)
          then TOTAL_DEBITO = TOTAL_DEBITO + (VALOR*OPERACAO);
          ELSE
          if (OPERACAO = 1)
          then TOTAL_CREDITO = TOTAL_CREDITO + (VALOR*OPERACAO);
      END
    END
    ELSE BEGIN
      FOR
        SELECT LCS_VALOR, LCS_OPERACAO, LCS_MOVIMENTO_VALOR, LCS_CLASSE, LCS_LANCAMENTO
        FROM lancamento_CONTAS
        WHERE LCS_CLASSE = :CLA_CODIGO
        INTO :VALOR,:OPERACAO
      DO BEGIN
          TOTAL = TOTAL + (OPERACAO*VALOR);
          if (OPERACAO = -1)
          then TOTAL_DEBITO = TOTAL_DEBITO + (OPERACAO*VALOR);
          ELSE
          if (OPERACAO = 1)
          then TOTAL_CREDITO = TOTAL_CREDITO + (OPERACAO*VALOR);
      END
    END
    if ((TOTAL <> 0) OR
        (TOTAL_DEBITO <> 0) OR
        (TOTAL_CREDITO <> 0))
    then suspend;
  END
end


Josauro S.J.
Diretor
josauro em casasoft.inf.br



Mais detalhes sobre a lista de discussão lista