Hi.
I trying create a function in DB2 V5.4.
Code:
SET PATH='DB2DTAMART';
SET SCHEMA='DB2DTAMART';
CREATE FUNCTION fx_f76a09_DIVJ ( FECHA_desde date, FECHA_hasta date)
RETURNS TABLE (
Documento CHAR(2) --1
,fecha NUMERIC(6,0)
,Compania CHAR(5)
,Centro_Emisor CHAR(4)
,Descripcion CHAR(25)
,Grupo_Facturas CHAR(1)
,Numero CHAR(8)
,nroAnterior CHAR(8)
,FechaAnterior NUMERIC(6,0)
,nroSiguiente CHAR(8)
,FechaSiguiente NUMERIC(6,0)
)
LANGUAGE SQL
MODIFIES SQL DATA
NO EXTERNAL ACTION
DETERMINISTIC
BEGIN ATOMIC
declare FECHA_JUL_desde numeric(6,0);
declare FECHA_JUL_hasta numeric(6,0);
set FECHA_JUL_desde = ((year( FECHA_desde ) - 1900)*1000) + ( dayofyear(FECHA_desde));
set FECHA_JUL_hasta = ((year( FECHA_hasta ) - 1900)*1000) + ( dayofyear(FECHA_hasta));
DECLARE GLOBAL TEMPORARY TABLE f76a09_tmp
(
ttDCT CHAR(2),
ttDIVJ NUMERIC(6,0),
ttKCO CHAR(5),
ttVINV CHAR(25)
) ON COMMIT DELETE ROWS
WITH REPLACE;
-----------------------------------------------------------------------------
---------------------- Llenamos la tabla temporal
insert into QTEMP.f76a09_tmp
select
ttDCT,
ttDIVJ,
ttKCO,
ttVINV
from pd812dta.f76a09
where trim(ttDCT) in ('XF', 'CF', 'XM', 'XD', 'CD', 'X1', 'XC', 'CC', 'X2' )
AND ttDIVJ between FECHA_JUL_desde and FECHA_JUL_hasta;
-----------------------------------------------------------------------------
select
cast(actual.ttDCT as char(2)) as Documento
,cast(actual.ttDIVJ as numeric(6,0)) as fecha
,cast(actual.ttKCO as char(6)) as Compania
,cast(substring(actual.ttVINV,4,4) as char(4)) as Centro_Emisor
,cast(
case
when actual.ttDCT in ('XF','CF','XM') then 'Factura'
when actual.ttDCT in ('XD','CD','X1') then 'Nota de Debito'
when actual.ttDCT in ('XC','CC','X2') then 'Nota de Credito'
else 'Doc.Desconocido' end
as char(25)) as Descripcion
,cast(substring(actual.ttVINV,3,1) as char(1)) as Grupo_Facturas
,cast(substring(actual.ttVINV,8,8) as char(8)) as Numero
--------Informacion doc anterior
,cast(substring(actual.ttVINV,8,8) - 1 as char(8)) as nroAnterior
,cast(coalesce(
anterior.ttDIVJ ,
( select q1.ttDIVJ --Fecha (Anterior)
from pd812dta.f76a09 as q1
where actual.ttKCO = q1.ttKCO -- Cia
and substring(actual.ttVINV,4,4) = substring(q1.ttVINV,4,4) -- Centro
and actual.ttDCT = q1.ttDCT -- Descripcion
and substring(actual.ttVINV,3,1) = substring(q1.ttVINV,3,1) -- Grupo fact
and cast(substring(actual.ttVINV,8,8) - 1 as char(8)) = strip( substring(q1.ttVINV,8,8), LEADING, '0')
) ) as numeric(6,0)) as FechaAnterior
--------Informacion doc siguiente
,cast(substring(actual.ttVINV,8,8) + 1 as char(8)) as nroSiguiente
,cast(coalesce(
siguiente.ttDIVJ ,
( select max(q1.ttDIVJ) --Fecha (Anterior)
from pd812dta.f76a09 as q1
where actual.ttKCO = q1.ttKCO -- Cia
and substring(actual.ttVINV,4,4) = substring(q1.ttVINV,4,4) -- Centro
and actual.ttDCT = q1.ttDCT -- Descripcion
and substring(actual.ttVINV,3,1) = substring(q1.ttVINV,3,1) -- Grupo fact
and cast(substring(actual.ttVINV,8,8) + 1 as char(8)) = strip(substring(q1.ttVINV,8,8),LEADING,'0') )
) as numeric(6,0)) as FechaSiguiente
from QTEMP.f76a09_tmp as actual
left outer join QTEMP.f76a09_tmp as anterior
on actual.ttKCO = anterior.ttKCO
and substring(actual.ttVINV,4,4) = substring(anterior.ttVINV,4,4)
and actual.ttDCT = anterior.ttDCT
and substring(actual.ttVINV,3,1) = substring(anterior.ttVINV,3,1)
and cast(substring(actual.ttVINV,8,8) + -1 as char(8)) = strip(substring(anterior.ttVINV,8,8),LEADING,'0')
left outer join QTEMP.f76a09_tmp as siguiente
on actual.ttKCO = siguiente.ttKCO
and substring(actual.ttVINV,4,4) = substring(siguiente.ttVINV,4,4)
and actual.ttDCT = siguiente.ttDCT
and substring(actual.ttVINV,3,1) = substring(siguiente.ttVINV,3,1)
and cast(substring(actual.ttVINV,8,8) + -1 as char(8)) = strip(substring(siguiente.ttVINV,8,8),LEADING,'0');
END;
Query failed to execute. Execute Query failed.
Error type: Odbc error. Odbc operation attempted: SQLExecDirect. [42000:-104: on SQLHANDLE] [IBM][Controlador ODBC de iSeries Access][DB2 UDB]SQL0104 - Símbolo <FIN DE SENTENCIA> no válido. Símbolos válidos: ;.