Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   There is an error in input of field "procedure body" (https://www.clubdelphi.com/foros/showthread.php?t=82159)

davidss79 01-02-2013 23:58:11

There is an error in input of field "procedure body"
 
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
Código SQL [-]
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

Cita:

Empezado por davidss79 (Mensaje 454428)
.

Bienvenido a clubdelphi, ¿ya leiste nuestra guía de estilo?, gracias por tu colaboración :)

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



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:
Código SQL [-]
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.


La franja horaria es GMT +2. Ahora son las 01:31:26.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi