Está en la página 1de 9

32.

1 USO DE PAQUETES REMOTOS


Nos permitirá ENVIAR objetos para realizar operaciones entre Base de datos, ya que
si realizamos un envio de objetos tipo record mediante funciones o procedimientos
de vinculados nos saldría error. Para tal fin seguiremos los siguientes pasos:

Para realizar un buen seguimiento de los posibles errores al crear nuestros paquetes,
se recomienta trabajar con control de errores en cada método y en los
disparadores, para ello emplear Exception y grabar los errores en las tablas SDTS de
cada Base de datos, asi mismo, colocar puntos de ejecución en variables, que nos
permitirá saber con exactitud en que línea se fallando nuestro modulo.
Se debe considerar la sintaxis ya empleada para dar nombre a los paquetes,
entidades, métodos, variables.

 PRIMERO: Definiciones
Definir nuestra BD origen y BD Destino lo que seria BD1 y BD2, Para este
ejemplo vamos a transportar valores de una tabla de JDE hacia UNISYS.

 SEGUNDO: Vista
Creamos una Vista en la BD1 que representa la información del objeto de la
BD2 destino, esta vista puede ser un conjunto de tablas cuyos campos
deben ser formateados de acuerdo a la tabla que se requiere llenar en la
BD2 destino, este nos servirá para tener en cuenta la estructura de los datos
a transportar de la BD1 a la BD2

 TERCERO: Entidad
Creamos los Objetos en la BD destino, este será La Entidad de Negocio (BE)
en términos de programación orientada a objetos, pero en programación
estructurada repesentaria una TABLA que estará dentro de un Paquete en
la BD2, dado que deseamos transportar de la BD1 a la BD2 información. La
estrucutra de esta entidad se basa en la vista creada previamente.

Nota: Considerar que para crear un paquete primero es la parte de


declaraciones o especificaciones y luego va el cuerpo.

Manual de PL/SQL for Oracle by Ing. Victor Ybañez Pág. 73 de 97


CREATE OR REPLACE PACKAGE INTEGRACION_JDE.PKG_SIMA_PLANIFICACION_BE AS
/******************************************************************************
NAME: PKG_SIMA_PLANIFICACION_BE
PURPOSE: Pasar registros entre SERVIDORES VINCULADOS JDE-UNISYS

REVISIONS:
Ver Date Author Description
--------- ---------- --------------- ------------------------------------
1.0 25/01/2020 vybanez 1. Basado en la vista JDE : VV_F30026_VALORIZACIONES
******************************************************************************/

-- DEFINICION DE REGISTROS
TYPE TBL_VALORIZACION_BE IS RECORD
(
IEITM NUMBER,
IEMMCU NCHAR(12),
IECSL NUMBER,
IEXSCR NUMBER,
COSTO_SIMULADO NUMBER,
SDAN8 NUMBER,
SHCRCD NCHAR(3),
SDUOM NCHAR(2),
FECHA1 VARCHAR2(4000),
FECHA2 VARCHAR2(4000),
IETDAY NUMBER,
IEUPMJ NUMBER,
IEJOBN NCHAR(10),
IEPID NCHAR(10),
IEUSER NCHAR(10),
COD_CEO NVARCHAR2(1),
COD_DIV VARCHAR2(2),
NRO_VAL NUMBER,
COD_PRD NVARCHAR2(10),
FEC_GNR DATE,
FEC_SGM DATE,
DUR_DIA NCHAR(10),
FEC_VLD DATE,
COD_ETM NUMBER,
COD_MON VARCHAR2(12 CHAR),
COD_TLL VARCHAR2(10),
CND_PAG NCHAR(3),
CST_UTIL NUMBER,
CST_CFU NUMBER,
MAR_UTIL NUMBER(9,4),
MAR_CFU NUMBER(9,4),
NRO_SOL_JDE NUMBER,
SHCRR NUMBER,
IEAITM NCHAR(25),
COD_IPTO1 NUMBER,
IELITM NCHAR(25)
);

-- DEFINICION DE ARRAY DE LA TABLA INICIAL CREADA


TYPE TBL_VALORIZACION_BE_arr IS TABLE OF
PKG_SIMA_PLANIFICACION_BE.TBL_VALORIZACION_BE INDEX BY PLS_INTEGER;

END;
/

Manual de PL/SQL for Oracle by Ing. Victor Ybañez Pág. 74 de 97


 CUARTO: Metodos
Creamos más Objetos en la BD destino, este será Los métodos de la Entidad
Negocio (BE), tales como funciones y procedimientos de tipo transaccional.
Para ello primero creamos la cabecera que viene a ser las especificaciones
SPEC
Como parámetros enviaremos la entidad y otras variables que se requieran
que no pertenecen a la entidad

CREATE OR REPLACE PACKAGE INTEGRACION_JDE.PKG_SIMA_PLANIFICACION_TAD AS


/******************************************************************************
NAME: PKG_SIMA_PLANICACION_TAD
PURPOSE: Realizar operaciones en las entidades de negocio

REVISIONS:
Ver Date Author Description
--------- ---------- --------------- ------------------------------------
1.0 27/01/2020 vybanez 1. Contiene todo los metodos de los objetos para el PROCESO de
PLANIFICACION.
******************************************************************************/
FUNCTION UFValorizacion(tbVAL PKG_SIMA_PLANIFICACION_BE.TBL_VALORIZACION_BE,
N_CST_HD integer,V_COD_MON_HD varchar2,sAcccion char) RETURN
varchar2;

END PKG_SIMA_PLANIFICACION_TAD;
/
Para crear el Cuerpo del PAQUETE:

Clic sobre el paquete y creamos un nuevo Script

Manual de PL/SQL for Oracle by Ing. Victor Ybañez Pág. 75 de 97


A Las líneas que se muestran, suprimimos la parte del DELETE y adicionamos
a la línea de CREACION O ACTUALIZACION la palabra BODY y allí
colocamos nuestros métodos (funciones y/o procedimientos)

CREATE OR REPLACE PACKAGE BODY PKG_SIMA_PLANIFICACION_TAD AS


/******************************************************************************
NAME: PKG_SIMA_PLANIFICACION_TAD
PURPOSE:

REVISIONS:
Ver Date Author Description
--------- ---------- --------------- ------------------------------------
1.0 27/01/2020 vybanez 1. Created this package.
******************************************************************************/
Resultado VARCHAR2(6):='0';
FUNCTION UFValorizacion(tbVAL PKG_SIMA_PLANIFICACION_BE.TBL_VALORIZACION_BE,
N_CST_HD integer,V_COD_MON_HD varchar2,sAcccion char) -- Parametros para ejecutar la
función, que es de tipo TABLA, la cual usamos de nuestro PAQUETE Entidad de negocio
RETURN VARCHAR2 -- Rpta si procesó
---------------------------------------------------------------
-- PERMITE VALORIZAR LA ESTIMACION | 25.01.20 By Ing. tbVAL.Y.R
---------------------------------------------------------------

IS --- DECLARACION DE VARIABLES


N_TOTAL NUMBER;
N_Est_prc NUMBER ;
v_errm VARCHAR2(500) ;
V_DES_DET VARCHAR(2000);
V_DES_ABR VARCHAR(50);
N_COD_CLI NUMBER(5);
N_COD_UND NUMBER(3);
V_PTO CHAR(12); -- para punto de error
----------------------------------------------------------------------------------------------------------------------------
-- PARA Probar : select INTEGRACION_JDE.UFValorizacion('RN19126901','RN',1957,200002,303,'SOLES') as Rpta
from dual; ------
----------------------------------------------------------------------------------------------------------------------------
BEGIN --- inicio funcion
-----------------------------------------------------------------
-- (1) Obtiene el ultimo estado_proceso de la Valorizacion

Manual de PL/SQL for Oracle by Ing. Victor Ybañez Pág. 76 de 97


-----------------------------------------------------------------
V_PTO:='1';
SELECT COUNT(*)
INTO N_TOTAL
FROM U001.VV_VALORIZACION Valo
WHERE Valo.NRO_DOC_JDE=tbVAL.NRO_SOL_JDE and trim(Valo.cod_div)=trim(tbVAL.COD_DIV)
and valo.nro_val=tbVAL.NRO_VAL;
N_TOTAL:=NVL(N_TOTAL,0);
--------------------------------------------------

IF N_TOTAL>0 THEN
V_PTO:='1.1';
SELECT MAX(Valo.EST_PRC)
INTO N_Est_prc
FROM U001.VV_VALORIZACION Valo
WHERE Valo.NRO_DOC_JDE=tbVAL.NRO_SOL_JDE and trim(Valo.cod_div)=trim(tbVAL.COD_DIV)
and valo.nro_val=tbVAL.NRO_VAL;
N_Est_prc:=NVL(N_Est_prc,0);

ELSE
N_Est_prc:=1;

END IF;

-----------------------------------------------------------------
-- (2) Obtiene Ciertos datos de la SOLICITUD DE TRABAJO
-----------------------------------------------------------------

V_PTO:='2';
SELECT COUNT(*)
INTO N_TOTAL
FROM U001.VV_SOLICITUDES_TTY SOL
WHERE TRIM(SOL.COD_DIV)=TRIM(tbVAL.COD_DIV) AND SOL.NRO_VAL=tbVAL.NRO_VAL AND
SOL.NRO_SOL_JDE=tbVAL.nro_sol_jde;
N_TOTAL:=NVL(N_TOTAL,0);

IF N_TOTAL>0 THEN
V_PTO:='2.1';
SELECT SOL.DES_DET,SOL.DES_ABR, SOL.COD_CLI ,SOL.COD_UND
INTO V_DES_DET,V_DES_ABR,N_COD_CLI,N_COD_UND
FROM U001.VV_SOLICITUDES_TTY SOL
WHERE TRIM(SOL.COD_DIV)=TRIM(tbVAL.COD_DIV) AND SOL.NRO_VAL=tbVAL.NRO_VAL AND
SOL.NRO_SOL_JDE=tbVAL.nro_sol_jde;

END IF;

-----------------------------------------------------------------
-- (3) Insertamos en la TTY
-----------------------------------------------------------------

--.................
BEGIN --- COntrol de errores
V_PTO:='3';
--............................
delete PD_VAL_DAT_GEN_TTY
WHERE TRIM(COD_DIV)= trim(tbVAL.COD_DIV) AND NRO_DOC_JDE=tbVAL.NRO_SOL_JDE AND
NRO_VAL=tbVAL.NRO_VAL;

If sAcccion<>'DEL' AND N_TOTAL>0 then


V_PTO:='3.1';
Insert into PD_VAL_DAT_GEN_TTY
(COD_CEO,COD_DIV,NRO_VAL,DES_DET,DES_ABR,
FEC_GNR ,COD_CLI ,COD_UND,COD_PRD,FEC_SGM,
DUR_DIA,FEC_VLD ,COD_ETM ,CST_HD ,COD_MON_HD,
COD_DES,TIP_CMB,COD_MON,COD_TLL,CND_PAG,
--- Algunos costos--
MAR_UTIL,MAR_CFU,POR_DST,COD_IPTO1
-----------------------------------
,NRO_DOC_JDE,TIPO_DOC_JDE,EST_PRC
-- ,NRO_REG

Manual de PL/SQL for Oracle by Ing. Victor Ybañez Pág. 77 de 97


)

VALUES (
'1',tbVAL.COD_DIV,tbVAL.NRO_VAL,V_DES_DET,V_DES_ABR,
tbVAL.FEC_GNR, N_COD_CLI,N_COD_UND ,tbVAL.COD_PRD,tbVAL.FEC_SGM,
TO_NUMBER(NVL(TRIM(tbVAL.DUR_DIA),0)) ,tbVAL.FEC_VLD,tbVAL.COD_ETM ,

---------------------------------------
-------costo mano de obra--------------
-----si el tipo de moneda es diferente a soles, se trendra que divivir entre tipo de cambio
N_CST_HD ,
V_COD_MON_HD ,
------------------------------------
(CASE WHEN N_COD_CLI=100 --CODIGO DE MARINA DE GUERRA
THEN 'E'
ELSE 'G' END) , -- COD_DES
-------------------------------------------
tbVAL.SHCRR , -- TP_CMB
tbVAL.COD_MON,tbVAL.COD_TLL,tbVAL.CND_PAG,
---------------------
---- algunos Porcentajes costos--
---------------------
(CASE WHEN N_COD_CLI<>100 THEN --CODIGO NO ES DE MARINA DE GUERRA
cast( TO_NumberDecimal_pto(tbVAL.MAR_UTIL,4) as number(9,6) )
END) , -- MAR_UTIL
---------------------------
(CASE WHEN N_COD_CLI<>100 THEN --CODIGO NO ES DE MARINA DE GUERRA
cast(
round(tbVAL.MAR_CFU,6)
as number(9,6) )
END) , -- MAR_CFU
---------------------
NULL ,-- POR_DST
--------PORCENTAJE DE IGV-------------
tbVAL.COD_IPTO1
----------------
,tbVAL.nro_sol_jde,'VA', -- TIPO_DOC_JDE
N_Est_prc

------------------------------------------
);

-- COMMIT;

RETURN '1';
ELSE
return '0' ;
END IF; -- FIN ACCION <>DEL

--------------------------------
EXCEPTION
WHEN OTHERS THEN
v_errm := SUBSTR(SQLERRM, 1 , 500);
INSERT INTO integracion_jde.SDTS(ID,NOMBRE,DESCRIPCION,IDESTADO,TOTAL)
SELECT tbVAL.NRO_SOL_JDE AS ID,'UFValorizacion| ERROR:Insertando en Tabla
PD_VAL_DAT_GEN_TTY ' ||to_char(sysdate) || ' ' ||to_char(sysdate, 'HH24:MI:SS') as NOMBRE,
(TRIM(v_errm) ||' insertando registro. DATOS V_Producto= ' || to_char(tbVAL.IELITM) ||'
and COD_DIV=' || to_char(tbVAL.COD_DIV) ||' and NRO_SOL_JDE=' || TO_CHAR(tbVAL.NRO_SOL_JDE) ||
' and NRO_VAL='|| to_char(tbVAL.NRO_VAL) || ' and N_CST_HD='|| to_char(N_CST_HD) || ' and
V_COD_MON_HD='|| to_char(V_COD_MON_HD) || ' V_PTO='|| V_PTO )
as DESCRIPCION,
N_Est_prc as IDESTADO, 1 as total
FROM DUAL
WHERE (Select count(*) from integracion_jde.SDTS
where trim(DESCRIPCION)= trim
(TRIM(v_errm) ||' insertando registro. DATOS V_Producto= ' || to_char(tbVAL.IELITM) ||'
and COD_DIV=' || to_char(tbVAL.COD_DIV) ||' and NRO_SOL_JDE=' || TO_CHAR(tbVAL.NRO_SOL_JDE) ||
' and NRO_VAL='|| to_char(tbVAL.NRO_VAL) || ' and N_CST_HD='|| to_char(N_CST_HD) || ' and
V_COD_MON_HD='|| to_char(V_COD_MON_HD) || ' V_PTO='|| V_PTO )
)=0;

Manual de PL/SQL for Oracle by Ing. Victor Ybañez Pág. 78 de 97


-- commit;
return '0' ;
END; --- TERMINA MANEJO DE ERRORES

END; -- fin funcion


END PKG_SIMA_PLANIFICACION_TAD;
/

 QUINTO: Referencia
Creamos los Sinonimos para referenciar los paquetes de la BD2 en la BD1

CREATE PUBLIC SYNONYM PKG_SIMA_PLANIFICACION_BE9i


for integracion_jde.PKG_SIMA_PLANIFICACION_BE@DB_ORAC9I_IJ;

CREATE PUBLIC SYNONYM PKG_SIMA_PLANIFICACION_TAD9i


for integracion_jde.PKG_SIMA_PLANIFICACION_TAD@DB_ORAC9I_IJ;

 SEXTO: Transacción
Aquí realizaremos la transaccion hacia la BD2, llenamos la Entidad remota
(tabla) instancia en el paquete que hemos creado, este llenado puede ser
mediante la Vista que difinimos o solo con los campos de la tabla que
ejecuta el trigger; y finalmente ejecutaremos el método para insertar,
Modificar, o eliminar el registro mediante el uso de Trigger que contendrá la
información que vamos a pasar.
Para definir en que tipo de acción de trigger se debe conocer el proceso
de negocio.

create or replace TRIGGER INTEGRACION_JDE."TRG_TRANS_F4106 VALORIZACION"


after INSERT OR UPDATE OR DELETE ON PRODDTA.F4106
REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROW
----------------------------------------------------
-- Se llama TRANS: de la abreviacion de Transaccion
----------------------------------------------------
/*
AUTOR : Ybañez Revollar Victor
ACTIVIDAD: Registro de una Valorización
PROPOSITO: Trasladar la información de l Valorización de JDE a UNISYS
MODELO : Patron de desarrollo arquitectura de Interface

*/
DECLARE -- DECLARACION DE VARIABLES

-- Entidades Remotas
tbVAL PKG_SIMA_PLANIFICACION_BE9i.TBL_VALORIZACION_BE; -- A partir del Sinonimo del dblink
del Paquete empleamos la entidad
-- Variables generales
v_code NUMBER;
v_errm VARCHAR2(500);
N_TOTAL NUMBER;
v_Rpta VARCHAR2(1):='0';
V_Pto varchar(50);
V_acc varchar(3);
-- capturamos en variables los valores de ciertos campos para emplearlos en consultas
C_PRODUCTO CHAR(25):=:NEW.BPLITM ; -- NCHAR(25 CHAR)
C_SUCURSAL CHAR(12):=:NEW.BPMCU; --NCHAR(12 CHAR)
N_CST_HD NUMBER(7,3):=(:New.BPACRD/10000); -- NUMBER
V_COD_MON_HD VARCHAR(5):=:New.BPCRCD; -- NCHAR(3 CHAR)
BEGIN

DBMS_SESSION.RESET_PACKAGE; -- INICIAMOS LA SESION LIMPIANDO TODOS LOS PAQUETES

Manual de PL/SQL for Oracle by Ing. Victor Ybañez Pág. 79 de 97


----------
BEGIN -- PARA CONTROL DE ERORRES

--- (0) guardamos la accion que se esta realizando en el formulario


V_Pto:='0';
IF DELETING THEN
V_acc:='DEL';
ELSE
V_acc:='INS';
END IF;

-- (1) HACEMOS LA CONSULTA A LA VISTA CREADA Y LLENAMOS NUESTRA ENIDAD REMOTA,


instanciando cada campo
-- nota podemos notas que coinciden el nombre de los campos de la vista empleada con el
entidad remota,
-- esto se hizo para evitar confundirse con los nombres cuando se emplean varios.
V_Pto:='1.1';
-- 1.1 verificamos que exista valor
SELECT COUNT(*)
INTO N_TOTAL
from VV_F30026_VALORIZACIONES
WHERE trim(IELITM)=trim(C_PRODUCTO) and
trim(IEMMCU)=trim(C_SUCURSAL);
N_TOTAL:=NVL(N_TOTAL,0);

--- 1.2 SI EXISTE LLENAMOS LA ENTIDAD REMOTA tbVAL


IF N_TOTAL>0 THEN
V_Pto:='1.2';
--- FORMATEAMOS LA MONEDA------
SELECT
(case when V_COD_MON_HD='PEN' THEN 'SOLES'
WHEN (V_COD_MON_HD='USC' OR V_COD_MON_HD='USD') THEN 'DOLAR'
WHEN V_COD_MON_HD='EUR' THEN 'EURO'
ELSE TO_CHAR(V_COD_MON_HD) END) COD_MON
INTO V_COD_MON_HD
FROM DUAL;
V_Pto:='1.3';
--- INSERTAMOS A LA ENTIDAD REMOTA ----
select
IEITM , IEMMCU, IECSL, IEXSCR, COSTO_SIMULADO,SDAN8, SHCRCD,
SDUOM , FECHA1, FECHA2, IETDAY, IEUPMJ, IEJOBN,
IEPID , IEUSER, TRIM(COD_CEO), TRIM(COD_DIV), NRO_VAL, COD_PRD,
FEC_GNR,FEC_SGM,DUR_DIA, FEC_VLD, COD_ETM, COD_MON,
TRIM(COD_TLL),CND_PAG,CST_UTIL,CST_CFU, MAR_UTIL,MAR_CFU,
NRO_SOL_JDE,SHCRR,IEAITM,COD_IPTO1,IELITM
INTO -- llenamos los campos de la entidad remota tbVAL
tbVAL.IEITM , tbVAL.IEMMCU, tbVAL.IECSL, tbVAL.IEXSCR, tbVAL.COSTO_SIMULADO,
tbVAL.SDAN8, tbVAL.SHCRCD,
tbVAL.SDUOM , tbVAL.FECHA1, tbVAL.FECHA2, tbVAL.IETDAY, tbVAL.IEUPMJ,
tbVAL.IEJOBN,
tbVAL.IEPID , tbVAL.IEUSER, tbVAL.COD_CEO, tbVAL.COD_DIV, tbVAL.NRO_VAL,
tbVAL.COD_PRD,
tbVAL.FEC_GNR, tbVAL.FEC_SGM, tbVAL.DUR_DIA, tbVAL.FEC_VLD, tbVAL.COD_ETM,
tbVAL.COD_MON,
tbVAL.COD_TLL, tbVAL.CND_PAG, tbVAL.CST_UTIL, tbVAL.CST_CFU, tbVAL.MAR_UTIL,
tbVAL.MAR_CFU,
tbVAL.NRO_SOL_JDE, tbVAL.SHCRR, tbVAL.IEAITM, tbVAL.COD_IPTO1,tbVAL.IELITM

from VV_F30026_VALORIZACIONES
WHERE trim(IELITM)=trim(C_PRODUCTO) and
trim(IEMMCU)=trim(C_SUCURSAL);

-- (2) Despues de llenar la entidad remota,


-- ejecutamos la funcion remota que insertará el registro, y guardamos el resultado en una
variable
-- recordar que se tiene que hacer un sinonimo del paquete remoto
PKG_SIMA_PLANIFICACION_TAD9I
V_Pto:='2';
v_Rpta:= PKG_SIMA_PLANIFICACION_TAD9I.UFValorizacion(tbVAL,N_CST_HD,V_COD_MON_HD,
V_acc);
-- Resultado:= PKG_SIMA_TESORERIA_TAD9I.OrdendePago(mODP);

Manual de PL/SQL for Oracle by Ing. Victor Ybañez Pág. 80 de 97


END IF;

----- control de errores ---------------


EXCEPTION
WHEN OTHERS THEN
-- v_code := SQLCODE; -- v_code NUMBER;
v_errm := SUBSTR(SQLERRM, 1 , 500); -- v_errm VARCHAR2(500):=' ';
INSERT INTO integracion_jde.SDTS(ID,NOMBRE,DESCRIPCION,IDESTADO)
SELECT 1 AS ID,'TRG_TRANS_F30026_VALORIZACION | ERROR:Empleando
VV_F30026_VALORIZACIONES '|| TO_CHAR(SYSDATE)|| ' ' || to_char(sysdate, 'HH24:MI:SS') as
NOMBRE,
'update integracion_jde.F30026 C_PRODUCTO=' || TRIM(C_PRODUCTO) ||'
C_SUCURSAL=' || TRIM(C_SUCURSAL) || ' V_Pto='|| V_Pto || ' ' || v_errm
DESCRIPCION, N_TOTAL IDESTADO
FROM DUAL
where (select count(*) from sdts
where trim(DESCRIPCION)=trim(
'update integracion_jde.F30026 C_PRODUCTO=' || TRIM(C_PRODUCTO) ||'
C_SUCURSAL=' || TRIM(C_SUCURSAL) || ' V_Pto='|| V_Pto || ' ' || v_errm
) )=0;
-- COMMIT;
END;
------
END;

Manual de PL/SQL for Oracle by Ing. Victor Ybañez Pág. 81 de 97

También podría gustarte