PDA

Ver la Versión Completa : Stored Procedure en Firebird


elrockdelpais
07-04-2014, 16:01:03
Hola gente, ante todo me presento, mi nombre es Alejandro y soy programador. Es la primera vez que trabajo con Firebird y me estoy volviendo loco con el siguiente stored procedure:



CREATE PROCEDURE REPORTE_COMPARATIVAVENTAPESOS
(FECHADESDE date,
FECHAHASTA date)


AS

BEGIN

SELECT M.DESCRIPCION AS MARCA,SR.DESCRIPCION AS RUBRO, SUM(C.TOTAL) AS TOTAL
FROM CUERPOCOMPROBANTES CC
INNER JOIN CABEZACOMPROBANTES C ON CC.NUMEROCOMPROBANTE = C.NUMEROCOMPROBANTE
INNER JOIN ARTICULOS A ON CC.CODIGOARTICULO = A.CODIGOARTICULO
INNER JOIN MARCAS M ON A.CODIGOMARCA = M.CODIGOMARCA
INNER JOIN RUBROS R ON A.CODIGORUBRO = R.CODIGORUBRO
INNER JOIN SUPERRUBROS SR ON R.CODIGOSUPERRUBRO = SR.CODIGOSUPERRUBRO
WHERE (C.FECHACOMPROBANTE BETWEEN :FECHADDE AND :FECHAHTA)
AND (C.TIPOCOMPROBANTE = 'FA'
OR C.TIPOCOMPROBANTE = 'FB'
OR C.TIPOCOMPROBANTE = 'NCA'
OR C.TIPOCOMPROBANTE = 'NCB'
OR C.TIPOCOMPROBANTE = 'NDA'
OR C.TIPOCOMPROBANTE = 'NDB')
GROUP BY M.DESCRIPCION,SR.DESCRIPCION

END^




el cual me da el siguiente error:



Message: isc_dsql_prepare failed

SQL Message : -104
Invalid token

Engine Code : 335544436
Engine Message :
SQL error code = -104
Token unknown - line 12, column 5
END




Por favor, estoy haciendo un trabajo y lo unico que me esta faltando para terminarlo es ese stored. Si alguien me puede dar una mano con eso se lo agradeceria.

aposi
07-04-2014, 16:35:28
WHERE (C.FECHACOMPROBANTE BETWEEN :FECHADDE AND :FECHAHTA)

los parametros son :FECHADESDE AND :FECHAHASTA

duilioisola
07-04-2014, 19:28:52
Te falta un ;

CREATE PROCEDURE REPORTE_COMPARATIVAVENTAPESOS
(FECHADESDE date,
FECHAHASTA date)
AS
BEGIN
SELECT M.DESCRIPCION AS MARCA,SR.DESCRIPCION AS RUBRO, SUM(C.TOTAL) AS TOTAL
FROM CUERPOCOMPROBANTES CC
INNER JOIN CABEZACOMPROBANTES C ON CC.NUMEROCOMPROBANTE = C.NUMEROCOMPROBANTE
INNER JOIN ARTICULOS A ON CC.CODIGOARTICULO = A.CODIGOARTICULO
INNER JOIN MARCAS M ON A.CODIGOMARCA = M.CODIGOMARCA
INNER JOIN RUBROS R ON A.CODIGORUBRO = R.CODIGORUBRO
INNER JOIN SUPERRUBROS SR ON R.CODIGOSUPERRUBRO = SR.CODIGOSUPERRUBRO
WHERE (C.FECHACOMPROBANTE BETWEEN :FECHADDE AND :FECHAHTA)
AND (C.TIPOCOMPROBANTE = 'FA'
OR C.TIPOCOMPROBANTE = 'FB'
OR C.TIPOCOMPROBANTE = 'NCA'
OR C.TIPOCOMPROBANTE = 'NCB'
OR C.TIPOCOMPROBANTE = 'NDA'
OR C.TIPOCOMPROBANTE = 'NDB')
GROUP BY M.DESCRIPCION,SR.DESCRIPCION; /* Falta ; aqui */
END^


De todos modos supongo que quieres que te devuelva algo. Debes agregar la sentencia SUSPEND y meter el resultado dentro de variables de retorno.
Como supongo que devuelve más de un registro, debes utilizar un bucle FOR SELECT INTO VARIABLES DO.

CREATE PROCEDURE REPORTE_COMPARATIVAVENTAPESOS
(FECHADESDE date,
FECHAHASTA date)
RETURNS (MARCA varchar(10), RUBRO varchar(10), TOTAL double precision)
AS
BEGIN
/* Genero un bucle mediante FOR SELECT INTO :VAR DO*/
FOR SELECT M.DESCRIPCION AS MARCA,SR.DESCRIPCION AS RUBRO, SUM(C.TOTAL) AS TOTAL
FROM CUERPOCOMPROBANTES CC
INNER JOIN CABEZACOMPROBANTES C ON CC.NUMEROCOMPROBANTE = C.NUMEROCOMPROBANTE
INNER JOIN ARTICULOS A ON CC.CODIGOARTICULO = A.CODIGOARTICULO
INNER JOIN MARCAS M ON A.CODIGOMARCA = M.CODIGOMARCA
INNER JOIN RUBROS R ON A.CODIGORUBRO = R.CODIGORUBRO
INNER JOIN SUPERRUBROS SR ON R.CODIGOSUPERRUBRO = SR.CODIGOSUPERRUBRO
WHERE (C.FECHACOMPROBANTE BETWEEN :FECHADDE AND :FECHAHTA)
AND (C.TIPOCOMPROBANTE = 'FA'
OR C.TIPOCOMPROBANTE = 'FB'
OR C.TIPOCOMPROBANTE = 'NCA'
OR C.TIPOCOMPROBANTE = 'NCB'
OR C.TIPOCOMPROBANTE = 'NDA'
OR C.TIPOCOMPROBANTE = 'NDB')
GROUP BY M.DESCRIPCION,SR.DESCRIPCION
INTO :MARCA, :RUBRO, TOTAL
DO
SUSPEND;
END^