Fórum Procedure instavel #59747

14/05/2008

0

Amigos aqui estou mais uma vez.

Estou desenvolvendo um sistema contabil e para construir o relatório do Razão Analítico criei uma procedure que carrega o razão em uma tabela no FireBird.

O procedimento executado por ela é o seguinte: carrega os dados com um a select quer traz o movimento e dados das contas, apura o saldo anterior e faz o calculo do débito x crétido gera o saldo atual e grava na tabela.

Fato é que ao debugar a procedure utilizando a IBExpert ele me mostra o Saldo anterior correto e em fim todos os saldo corretos durante a execução da procedure porém ao encerrar o procedimento os valores dos saldos estão diferentes o saldo inicial é um valor sem precedentes.

Estou sem entender nada.

Vou colocar junto aqui o metadata da procedure se alguem puder me ajudar eu agradeço.

Atenciosamente,

Tadeu Rodrigues de Oliveira

---------------------------M E T A D A T A----------------------------------------

COMMIT WORK;
SET AUTODDL OFF;
SET TERM ^ ;

/* Stored procedures */

CREATE PROCEDURE ´RAZAO_ANALITICO´
(
´PEMPRESA´ VARCHAR(18),
´PFILIAL´ VARCHAR(18),
´PDATA_INICIAL´ TIMESTAMP,
´PDATA_FINAL´ TIMESTAMP,
´PDIA01´ TIMESTAMP,
´PDIANN´ TIMESTAMP,
´PEXERCICIO´ VARCHAR(4),
´PREFERENCIA´ VARCHAR(2)
)
AS
BEGIN EXIT; END ^


ALTER PROCEDURE ´RAZAO_ANALITICO´
(
´PEMPRESA´ VARCHAR(18),
´PFILIAL´ VARCHAR(18),
´PDATA_INICIAL´ TIMESTAMP,
´PDATA_FINAL´ TIMESTAMP,
´PDIA01´ TIMESTAMP,
´PDIANN´ TIMESTAMP,
´PEXERCICIO´ VARCHAR(4),
´PREFERENCIA´ VARCHAR(2)
)
AS
declare variable vempresa varchar(18);
declare variable vfilial varchar(18);
declare variable vconta_reduzida varchar(20);
declare variable vdata_movimento timestamp;
declare variable vlancamento integer;
declare variable vdocumento varchar(25);
declare variable vhistorico varchar(100);
declare variable vcomplemento varchar(50);
declare variable vsaldo_anterior double precision;
declare variable vdebito double precision;
declare variable vcredito double precision;
declare variable vsaldo_atual double precision;
declare variable vconta_analitica varchar(20);
declare variable vnome_analitica varchar(50);
declare variable vconta_sintetica varchar(20);
declare variable vnome_sintetica varchar(50);
declare variable vgrau varchar(1);
declare variable vgrupo varchar(1);
declare variable vconta varchar(20);
declare variable vdebite varchar(20);
declare variable vcredite varchar(20);
declare variable vvalor double precision;
declare variable vtotdeb double precision;
declare variable vtotcred double precision;
declare variable vconta_part varchar(20);
begin
vCONTA = ´´;
FOR SELECT P.CONTA, P.REDUZIDA, P.NOMENCLATURA, P.GRAU, P.GRUPO,
M.LANCAMENTO, M.DATA_MOVIMENTO, M.DEBITE, M.CREDITE,
M.HISTORICO, M.COMPLEMENTO, M.VALOR, M.DOCUMENTO
FROM MOVIMENTO M, PLANO P
WHERE P.CNPJ = :PEMPRESA
AND P.CNPJ_FILIAL = :PFILIAL
AND (M.DATA_MOVIMENTO BETWEEN :PDATA_INICIAL AND :PDATA_FINAL)
AND P.IMPRIME_RAZAO = ´True´
AND (M.DEBITE = P.REDUZIDA OR M.CREDITE = P.REDUZIDA)
ORDER BY P.CONTA, M.data_movimento, M.lancamento
INTO :vCONTA_ANALITICA, :vCONTA_REDUZIDA, :vNOME_ANALITICA,
:vGRAU, :vGRUPO, :vLANCAMENTO, :vDATA_MOVIMENTO, :vDEBITE, :vCREDITE,
:vHISTORICO, :vCOMPLEMENTO, :vVALOR, :vDOCUMENTO DO
BEGIN
IF (vCONTA <> vCONTA_ANALITICA) THEN
BEGIN
vCONTA = vCONTA_ANALITICA;
vSALDO_ANTERIOR = 0;
SELECT SALDO_ATUAL
FROM SALDOS
WHERE EMPRESA = :PEMPRESA
AND FILIAL = :PFILIAL
AND EXERCICIO = :PEXERCICIO
AND REFERENCIA = :PREFERENCIA
AND CONTA = :vCONTA_ANALITICA
INTO :vSALDO_ANTERIOR;
IF (EXTRACT(DAY FROM PDATA_INICIAL) <> ´1´) THEN
BEGIN
SELECT SUM(VALOR),
(
SELECT SUM(VALOR)
FROM MOVIMENTO
WHERE CNPJ = :PEMPRESA
AND CNPJ_FILIAL = :PFILIAL
AND CREDITE = :vCONTA_REDUZIDA
AND (DATA_MOVIMENTO BETWEEN :PDIA01 AND :PDIANN)
)
FROM MOVIMENTO
WHERE CNPJ = :PEMPRESA
AND CNPJ_FILIAL = :PFILIAL
AND DEBITE = :vCONTA_REDUZIDA
AND (DATA_MOVIMENTO BETWEEN :PDIA01 AND :PDIANN)
INTO :vTOTDEB, :vTOTCRED;
IF ((vGRUPO = ´A´) OR (vGRUPO = ´D´) OR (vGRUPO = ´T´)) THEN
BEGIN
vSALDO_ANTERIOR = ((vSALDO_ANTERIOR + vTOTDEB) - vTOTCRED);
END
ELSE
BEGIN
vSALDO_ANTERIOR = ((vSALDO_ANTERIOR + vTOTCRED) - vTOTDEB);
END
END
END
ELSE
BEGIN
vSALDO_ANTERIOR = vSALDO_ATUAL;
END
IF ((vGRUPO = ´A´) OR (vGRUPO = ´D´) OR (vGRUPO = ´T´)) THEN
BEGIN
IF (vDEBITE = vCONTA_REDUZIDA) THEN
BEGIN
vSALDO_ATUAL = (vSALDO_ANTERIOR + vVALOR);
vDEBITO = vVALOR;
vCREDITO = 0;
END
ELSE
BEGIN
IF (vCREDITE = vCONTA_REDUZIDA) THEN
BEGIN
vSALDO_ATUAL = (vSALDO_ANTERIOR - vVALOR);
vCREDITO = vVALOR;
vDEBITO = 0;
END
END
END
ELSE
BEGIN
IF (vDEBITE = vCONTA_REDUZIDA) THEN
BEGIN
vSALDO_ATUAL = (vSALDO_ANTERIOR - vVALOR);
vDEBITO = vVALOR;
vCREDITO = 0;
END
ELSE
BEGIN
IF (vCREDITE = vCONTA_REDUZIDA) THEN
BEGIN
vSALDO_ATUAL = (vSALDO_ANTERIOR + vVALOR);
vCREDITO = vVALOR;
vDEBITO = 0;
END
END
END
IF (vGRAU = ´4´) THEN
BEGIN
SELECT SUBSTRING(:vCONTA_ANALITICA FROM 1 FOR 11), NOMENCLATURA
FROM PLANO
WHERE CONTA = SUBSTRING(:vCONTA_ANALITICA FROM 1 FOR 12) || ´0000´
INTO :vCONTA_SINTETICA, :vNOME_SINTETICA;
END
ELSE
BEGIN
SELECT SUBSTRING(:vCONTA_ANALITICA FROM 1 FOR 7), NOMENCLATURA
FROM PLANO
WHERE CONTA = SUBSTRING(:vCONTA_ANALITICA FROM 1 FOR 8) || ´000.0000´
INTO :vCONTA_SINTETICA, :vNOME_SINTETICA;
vCONTA_PART = SUBSTRING(vCONTA_ANALITICA FROM 1 FOR 11);
END
INSERT INTO RAZAO (EMPRESA, FILIAL, CONTA_REDUZIDA, DATA_MOVIMENTO, LANCAMENTO, DOCUMENTO,
HISTORICO, COMPLEMENTO, SALDO_ANTERIOR, DEBITO, CREDITO, SALDO_ATUAL,
CONTA_ANALITICA, NOME_ANALITICA, CONTA_SINTETICA, NOME_SINTETICA)
VALUES (:PEMPRESA, :PFILIAL, :vCONTA_REDUZIDA, :vDATA_MOVIMENTO, :vLANCAMENTO, :vDOCUMENTO,
TRIM(:vHISTORICO), TRIM(:vCOMPLEMENTO), :vSALDO_ANTERIOR, :vDEBITO, :vCREDITO, :vSALDO_ATUAL,
:vCONTA_PART, :vNOME_ANALITICA, :vCONTA_SINTETICA, :vNOME_SINTETICA);
END
end
^

SET TERM ; ^
COMMIT WORK;
SET AUTODDL ON;


N_informatica

N_informatica

Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar