PAGUE 6 MESES
LEVE 12 MESES
GARANTIR DESCONTO

Fórum Erro Criar Store procedure. #520898

25/05/2015

0

Boa noite pessoal. Estou adaptando uma store procedure que peguei no próprio Devmedia, porém está dando uma erro na hora de criação.
segue o erro.

:ISC ERROR CODE:335544569

ISC ERROR MESSAGE:
Dynamic SQL Error
SQL error code = -104
Unexpected end of command - line 12, column 47

Abaixo a store procedure.; O erro acontece na declaração de variáveis. uso o firebird 2.1.

CREATE PROCEDURE CAIXA (
INICIO DATE,
FIM DATE)
RETURNS (
DATA DATE,
HISTORICO VARCHAR(30),
TIPO CHAR(1),
VALOR NUMERIC(9,2),
ORDENAR INTEGER,
SALDO NUMERIC(9,2))
AS
DECLARE VARIABLE SALDO_ANT_CREDITO NUMERIC(9,2);
DECLARE VARIABLE SALDO_ANT_DEBITO NUMERIC(9,2);

BEGIN
/*Primeiro recuperamos a soma dos valores dos debitos anteriores ao
periodo informado para posteriormente calcularmos nosso saldo inicial*/
SELECT COALESCE(SUM(VR_PARCELA),0)
FROM CTPAGAR
WHERE (DT_VENCTO < :INICIO)
INTO :SALDO_ANT_DEBITO;

/*Agora recuperamos a soma dos valores dos creditos anteriores ao
periodo informado*/
SELECT COALESCE(SUM(VR_PARCELA),0)
FROM CTRECEBER
WHERE (DT_VENCTO < :INICIO)
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. Isse será feito pela função COALESCE() */
DATA = :INICIO - 1;
HISTORICO = 'SALDO ANTERIOR';
VALOR = 0;
ORDENAR = 0;

/*Inicializando a variavel que armazenara o saldo final
com o valor do saldo anterior*/
SALDO = (SALDO_ANT_CREDITO - SALDO_ANT_DEBITO);

/*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
TIPO = 'D';
VALOR = VALOR * -1;
END
ELSE
TIPO = 'C';

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*/

DATA = :INICIO;
WHILE (:DATA <= :FIM) DO
BEGIN
TIPO = 'D'; /*Estamos recuperando débitos*/
FOR SELECT DT_VENCTO, FATURA, VR_PARCELA
FROM CTPAGAR
WHERE (DT_VENCIMENTO = :DATA)
AND COALESCE(VR_PARCELA,0) > 0
INTO :DATA, :HISTORICO, :VALOR
DO
BEGIN
/*Subtraimos o valor do lançamento do saldo final*/
HISTORICO = :HISTORICO;
VALOR = :VALOR;
SALDO = SALDO - VALOR;
ORDENAR = 1;
/*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*/
SUSPEND;
END

TIPO = 'C'; /*Estamos recuperando créditos*/
/*seleciona os registros dentro do periodo informado
buscando na tabela de contas a receber*/
FOR SELECT DT_VENCTO, FATURA, VR_PARCELA
FROM CTRECEBER
WHERE (DT_VENCTO = :DATA)
AND COALESCE(VR_PARCELA,0) > 0
INTO :DATA, :HISTORICO, :VALOR
DO
BEGIN
/*Adicionamos o valor do lançamento ao saldo final*/
SALDO = SALDO + VALOR;
HISTORICO = :HISTORICO;
VALOR = :VALOR;

/*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*/
SUSPEND;
END

DATA = DATA + 1;
END

/*Montamos o ultimo "registro" que conterá os valores do saldo FINAL*/
IF (:SALDO < 0) THEN
BEGIN
TIPO = 'D';
SALDO = SALDO * -1;
END
ELSE
TIPO = 'C';

DATA = :FIM;
HISTORICO = 'SALDO FINAL';
VALOR = 0;
ORDENAR = 2;
SUSPEND;
END
Antonio Júnior

Antonio Júnior

Responder

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

Aceitar