PDA

Ver la Versión Completa : There is an error in input of field "procedure body"


davidss79
01-02-2013, 23:58:11
Llevo ya bastante rato que no programo en interbase, pero agarre un proyecto y como era pequeño decidí utilizar firebird,
en mi procedimiento solo necesito traer de la tabla de movimientos las entradas y las salidas, restarlas y sacar la existencia de un producto, mi procedimiento esta asi:

CREATE PROCEDURE EXISTENCIA_BODEGA
(V_ID_TIPO INT NOT NULL, V_ID_GRUPO INT NOT NULL, V_ID_PRODUCTO INT NOT NULL, V_ID_BODEGA INT NOT NULL)
RETURNS (EXISTENCIA FLOAT NOT NULL)
AS
DECLARE ENTRADAS TYPE OF FLOAT;
DECLARE SALIDAS TYPE OF FLOAT;
BEGIN
/* Procedure body */
SELECT SUM(D.CANTIDAD)
FROM FER_DETALLE_MOVIMIENTO D INNER JOIN FER_TIPO_MOVIMIENTO T ON D.ID_TIPO_MOVIMIENTO = T.ID_TIPO_MOVIMIENTO
WHERE D.ID_TIPO = :V_ID_TIPO
AND D.ID_GRUPO = :V_ID_GRUPO
AND D.ID_PRODUCTO = :V_ID_PRODUCTO
AND D.ID_BODEGA = :V_ID_BODEGA
AND T.SIGNO = '+' into :ENTRADAS;

IF ENTRADAS = NULL THEN
:ENTRADAS := 0;

SELECT SUM(D.CANTIDAD)
FROM FER_DETALLE_MOVIMIENTO D INNER JOIN FER_TIPO_MOVIMIENTO T ON D.ID_TIPO_MOVIMIENTO = T.ID_TIPO_MOVIMIENTO
WHERE D.ID_TIPO = :V_ID_TIPO
AND D.ID_GRUPO = :V_ID_GRUPO
AND D.ID_PRODUCTO = :V_ID_PRODUCTO
AND D.ID_BODEGA = :V_ID_BODEGA
AND T.SIGNO = '-' into :SALIDAS;

IF SALIDAS = NULL THEN
:SALIDAS := 0;

EXISTENCIA := :ENTRADAS - :SALIDAS;

SUSPEND;
END;

y me sale ese error al querer compilarlo.

Saludos y gracias por su ayuda.

birmain
02-02-2013, 01:34:27
A simple vista veo un error de sintaxis que se repite en cada asignación de variables
EXISTENCIA := :ENTRADAS
debería ser: EXISTENCIA = :ENTRADAS
La asignación es el signo = y no := como en Pascal

Casimiro Notevi
02-02-2013, 02:00:01
.

Bienvenido a clubdelphi, ¿ya leiste nuestra guía de estilo (http://www.clubdelphi.com/foros/guiaestilo.php)?, gracias por tu colaboración :)

Recuerda poner los tags al código fuente, ejemplo:

http://www.clubdelphi.com/images/UtilizarTAGs.png

Gracias :)

ecfisa
02-02-2013, 02:23:59
Hola.

Además de lo que bién te señaló birmain, noto que en la declaración de variables estas utilizando TYPE OF FLOAT, como si FLOAT se tratase de un dominio. Y también pareciera que están sobrando algunos ':'.

Intentá de este modo:

SET TERM ^ ;

CREATE PROCEDURE PROC_TMP(V_ID_TIPO INT NOT NULL, V_ID_GRUPO INT NOT NULL,
V_ID_PRODUCTO INT NOT NULL, V_ID_BODEGA INT NOT NULL)
RETURNS (EXISTENCIA FLOAT NOT NULL)
AS
DECLARE ENTRADAS FLOAT;
DECLARE SALIDAS FLOAT;
BEGIN
SELECT SUM(D.CANTIDAD)
FROM FER_DETALLE_MOVIMIENTO D INNER JOIN FER_TIPO_MOVIMIENTO T ON D.ID_TIPO_MOVIMIENTO = T.ID_TIPO_MOVIMIENTO
WHERE D.ID_TIPO = :V_ID_TIPO
AND D.ID_GRUPO = :V_ID_GRUPO
AND D.ID_PRODUCTO = :V_ID_PRODUCTO
AND D.ID_BODEGA = :V_ID_BODEGA
AND T.SIGNO = '+' into :ENTRADAS;
IF(ENTRADAS = NULL) THEN
ENTRADAS = 0;

SELECT SUM(D.CANTIDAD)
FROM FER_DETALLE_MOVIMIENTO D INNER JOIN FER_TIPO_MOVIMIENTO T ON D.ID_TIPO_MOVIMIENTO = T.ID_TIPO_MOVIMIENTO
WHERE D.ID_TIPO = :V_ID_TIPO
AND D.ID_GRUPO = :V_ID_GRUPO
AND D.ID_PRODUCTO = :V_ID_PRODUCTO
AND D.ID_BODEGA = :V_ID_BODEGA
AND T.SIGNO = '-' into :SALIDAS;
IF (SALIDAS = NULL) THEN
SALIDAS = 0;

EXISTENCIA = ENTRADAS - SALIDAS;

SUSPEND;
END^

SET TERM ; ^


Saludos.