ODI接口开发案例:RMA(客户退货订单)同步
Posted Jane Chiu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ODI接口开发案例:RMA(客户退货订单)同步相关的知识,希望对你有一定的参考价值。
案例需求说明
功能开发描述
将ERP系统已生成行状态为“等待退货”的退货订单(已登记),通过ODI工具生成WMS相应的退货订单。
基本业务需求
ERP系统生成已登记,行状态为“等待退货”退货订单,通过ODI工具同步至WMS系统自动生成对应的退货订单,在WMS系统订单管理系统超级用户下的订单;退货—订单管理器可查询到相应的订单。
功能实现思路
ERP系统生成已登记,已分配组织下行状态为“等待退货”退货订单后,通过ODI工具将订单信息同步至WMS,自动生成WMS对应的退货订单,且订单类型默认为“默认客户退货”,客户为默认为“默认客户”,价目表默认为“GPDC价目表”,销售人员默认为“No
Sales Credit”,具体的信息由ERP直接传至单头弹性域进行维护。在WMS系统订单管理系统超级用户下:订单;退货—订单管理器可查询到相应的订单。
功能设计
ODI首先迁移ERP系统未同步至WMS的满足同步条件的退货订单信息,并更新单据头的弹性域的ATTRIBUTE12为P,通过ODI Interface,进入WMS客制化接口表,更新ERP单据头的弹性域的ATTRIBUTE12为I,随后对WMS客制化接口表进行相应的转换,插入标准接口表,并提交请求,将接口表数据插入标准表,将处理状态回写至WMS和ERP客制化接口表。
ERP标准表同步标识说明
ERP退货订单单头与行弹性域字段ATTRIBUTE12为同步标识符号,其状态有三种。
N:该退货订单未同步
P:该退回订单数据数据已从标准表插入到了接口表中
I:该退回订单数据数据已经同步至WMS
ODI工具开发环境说明
潍柴全球配送WMS项目:潍柴WMS系统大部分数据(如SO\\PO\\MO等)都是从ERP系统获取的(初始化数据),然后在WMS系统中维护这些数据,并实时同步到ERP系统中。这些初始化数据和同步数据的迁徙媒介都是ODI。
ODI用户
源系统和目标系统中的ODI用户为CUXWMS。
资料库
ODI在ERP系统搭建环境,其TNS信息为:
WC_EBS_UAT =
(DESCRIPTION= (ADDRESS=(PROTOCOL=tcp)(HOST=ebsuat.weichai.com)(PORT=1526))
(CONNECT_DATA=
(SERVICE_NAME=UAT) (INSTANCE_NAME=UAT)
)
)
主资料库(Master Repository) @ERP
Technology:Oracle
DBC:Driver oracle.jdbc.driver.OracleDriver
JDBC:URL jdbc:oracle:thin:@ ebsuat.weichai.com:1526:UAT
用户/密码:cuxwms/cuxwms
工作资料库(Work Repository) @ERP
数据库服务器
ERP系统的数据服务器:Topology Manager\\Physical Architecture\\Technologies\\Oracle\\WMS_ORACLE_ERP_R12
WMS系统的数据服务器:Topology Manager\\Physical Architecture\\Technologies\\Oracle\\WMS_ORACLE_SAL
物理架构
源系统CUX用户的物理架构
目标系统CUX用户的物理架构
逻辑架构
源系统CUX用户的逻辑架构:Topology Manager\\Logical Architecture\\Technologies\\Oracle\\WMS_ORACLE_ERP_CUX
目标系统CUX用户的逻辑架构:Topology Manager\\Logical Architecture\\Technologies\\Oracle\\WMS_ORACLE_SAL_CUX
上下文Context
ODI代理
物理代理
Topology Manager\\Physical Architecture\\Agents\\OracleODIAgent
逻辑代理
Topology Manager\\Logical Architecture\\Agents\\WMS_L_ODI_Agent
创建反向数据存储Datastores
反向的数据存储,是ODI接口开发的前提。反向分为两种:标准反向和客户化反向。
这里只涉及标准反向
源系统ERP
Designer\\Models\\CUX,右键模型CUX_ERP,选择Open,(或双击模型)
选择Reverse Engineer TAB 页,输入如下信息:
注:cux_iwms_rma_lines_iface是ERP中RMA行订单的接口表。
执行该页面Menu中Reverse Enginner按钮(上图的黄色部分)后模型CUX_ERP下就有了CUX_IWMS_RMA_LINES_IFACE。
同理,新建RMA头订单的接口表相应的DataStores:CUX_IWMS_RMA_HEADERS_IFACE。
目标系统WMS
与源系统ERP新建DataStores的方法一样,在Designer\\Models\\CUX\\CUX_WMS下新建CUX_DWMS_RMA_HEADERS_IFACE 和CUX_DWMS_RMA_LINES_IFACE这两个Datastores。
Datastores反向失败原因分析
- 确保待反向的表/视图是属于当前Schema(数据源)。
- 确保ODI的Work Schema(CUXWMS)用户能访问到反向数据存储的数据源
创建Projects
创建floder
右键Projects WMS Distributed Deployment ,选择New Folder。
输入如下信息后保存。
创建Variables
新建组织代码变量
Designer\\Projects\\WMS
Distributed Deployment \\Variables 右键NewVariable
输入如下信息,
Definition TAB页
Name: WMS_V_STANDALONE_ORG_CODE
其他信息默认即可。保存,创建组织代码Variable完成。
新建两个时间变量
与组织代码Variable的方法一样,输入如下信息,
Definition TAB页
Name: WMS_V_FROM_CREATION_DATE
Datatype: Alphanumeric
Keep History: No History
Default Value: null
其他信息默认即可。保存,创建起止时间Variable完成。
Definition TAB页
Name: WMS_V_TO_CREATION_DATE
Datatype: Alphanumeric
Keep History: No History
Default Value: null
其他信息默认即可。保存,创建终止时间Variable完成。
订单类型变量
与组织代码Variable的方法一样,输入如下信息,
Definition TAB页
Name: WMS_V_SO_ORDER_TYPE
Datatype: Alphanumeric
Keep History: No History
Default Value: null
其他信息默认即可。保存,创建订单类型Variable完成。
新建订单编号变量
与组织代码Variable的方法一样,输入如下信息,
Definition TAB页
Name: WMS_V_SO_ORDER_NUMBER
Datatype: Numeric
Keep History: No History
其他信息默认即可。保存,创建订单编号Variable完成。
新建ODISession个数变量
首先查看Designer\\Projects\\WMS Distributed Deployment \\Variables下是否有ODISession个数变量,若无,新建。
Definition TAB页
Name: WMS_N_ODI_SESSION_COUNT
Datatype: Numeric
Keep History: No History
Default Value: 0
Refreshing TAB 页
Schema: WMS_ORACLE_WR_APPS
Select Query:
SELECT COUNT(*)
FROM odim.snp_session
WHERE sess_status = 'R'
AND sess_name = '<%=odiRef.getSession("SESS_NAME")%>'
AND context_code = '<%=odiRef.getSession("CONTEXT_NAME")%>'
AND sess_no < '<%=odiRef.getSession("SESS_NO")%>'
其他信息默认即可。保存,创建ODISession个数Variable完成。
创建Interfaces
ODI接口开发是ODI开发的核心。基础接口一般用于ODI数据初期导入,运行一次。
创建ERP到WMS的Interface
Designer\\Projects\\ WMS Distributed Deployment \\CUXWMS Import RMA\\Interfaces 右键New Interface。
输入如下信息后保存。
Overview TAB页中的Definition TAB页
Name: CUX_DWMS_RMA_HEADERS_INTERFACE
Quick-Edit TAB页
Sources 添加源系统ERP RMA头订单接口表。
Filters 中过滤掉源系统ERP RMA头订单接口表的Process_status字段的值。
Mappings 中 Target Datastore 选择(下图中黄色部分是入口)目标系统WMS RMA头订单接口表。
完成后可在Mapping TAB页中看到如下源系统ERP RMA头订单接口表与目标系统WMS
RMA头订单接口表的相关逻辑信息。
Flow TAB页
源系统Datastore选择WMS LKM
Oracle to Oracle
目标系统Datastore选择WMS IKM Oracle Incremental Update,
Optons: UPDATE false
Controls TAB页
CKM
Selector: WMS CKM SQL
其他默认即可。保存,创建源系统到目标系统的RMA头订单接口表的接口完成。
同理,新建RMA行订单接口表相应的Interface。
创建WMS到ERP的Interface
与创建ERP到WMS的Interface的方法一样。在Designer\\Projects\\ WMS Distributed Deployment \\CUXWMS Import RMA\\Interfaces下新建CUX_IWMS_RMA_HEADERS_INTERFACE 和CUX_IWMS_RMA_LINES_INTERFACE。
需要注意,做WMS到ERP的接口目的是将WMS的RMA订单接口表的处理状态(PROCESS_STATUS)回写至ERP的RMA订单接口表的处理状态。
CUX_IWMS_RMA_HEADERS_INTERFACE接口的信息截图如下。
Overview TAB 页
Quick_Edit TAB 页
Mapping TAB 页
Flow TAB 页
Controls TAB 页
其他信息默认即可。保存。
等完成所有接口后,Designer\\Projects
WMS Distributed Deployment \\CUXWMS Import RMA\\Interfaces下有四个接口
创建Procedures
创建ERP数据迁移Proceduce
Designer\\Projects\\WMS Distributed Deployment \\CUXWMS Import RMA\\Procedures 右键New Procedure
输入如下信息,
Definition TAB页
Name:populate_rma
Details TAB页
点击添加图标(绿色+图标),弹出窗口,输入如下信息
Name: Command 0
Schema: WMS_ORACLE_ERP_APPS
Command:
DECLARE
l_organization_code VARCHAR2(40) := '#WMS_V_STANDALONE_ORG_CODE';
l_order_type VARCHAR2(40) := '#WMS_V_SO_ORDER_TYPE';
l_order_number NUMBER := '#WMS_V_SO_ORDER_NUMBER';
l_from_creation_date VARCHAR2(40) := '#WMS_V_FROM_CREATION_DATE';
l_to_creation_date VARCHAR2(40) := '#WMS_V_TO_CREATION_DATE';
x_return_status VARCHAR2(1);
x_return_message VARCHAR2(2000);
done_exp EXCEPTION;
BEGIN
apps.cux_iwms_integration_processor.init_context('<%=odiRef.getSession("CONTEXT_NAME")%>');
apps.cux_iwms_integration_processor.rma_syn_populate(
x_return_status => x_return_status,
x_return_message => x_return_message,
p_organization_code => l_organization_code,
p_order_type => l_order_type,
p_order_number => l_order_number,
p_from_creation_date => l_from_creation_date,
p_to_creation_date => l_to_creation_date);
IF x_return_status<>'S' THEN
RAISE done_exp;
END IF;
END;
其他值默认即可。保存,Procedure创建完成了。
创建WMS提交标准表Procedure
与创建ERP数据迁移Procedure的方法一样。
Definition TAB页
Name: process_rma_syn
Target Technology: Oracle
Details TAB页
点击添加图标(绿色+图标),弹出窗口,输入如下信息
Name: Command 0
Schema: WMS_ORACLE_SAL_APPS
Transaction: Transaction 1
Commit: Commit
Command:
DECLARE
x_return_status VARCHAR2(1);
x_return_message VARCHAR2(2000);
done_exp EXCEPTION;
BEGIN
apps.cux_dwms_integration_processor.init_context('<%=odiRef.getSession("CONTEXT_NAME")%>');
apps.cux_dwms_integration_processor.rma_syn_done(
x_return_status => x_return_status,
x_return_message => x_return_message);
IF x_return_status <> 'S' THEN
RAISE done_exp;
END IF;
END;
其他值默认即可。保存,Procedure创建完成了。
创建回写ERP标准表同步标识的Procedure
与创建ERP数据迁移Procedure的方法一样。
Definition TAB页
Name: complete_rma_syn
Target Technology: Oracle
Details TAB页
点击添加图标(绿色+图标),弹出窗口,输入如下信息
Name: Command 0
Schema: WMS_ORACLE_ERP_APPS
Transaction: Autocommit
Command:
DECLARE
x_return_status VARCHAR2(1);
x_return_message VARCHAR2(2000);
done_exp EXCEPTION;
BEGIN
apps.cux_iwms_integration_processor.complete_rma_syn(
x_return_status => x_return_status,
x_return_message => x_return_message);
IF x_return_status<>'S' THEN
RAISE done_exp;
END IF;
END;
其他值默认即可。保存,Procedure创建完成了。
创建提交Procedure
与创建ERP数据迁移Procedure的方法一样。
Definition TAB页
Name: commit_transaction
Target Technology: Oracle
Details TAB页
点击添加图标(绿色+图标),弹出窗口,输入如下信息
Name : Command 0
Schema: WMS_ORACLE_SAL_APPS
Transaction: Transaction 1
Commit: Commit
Command: Commit
其他值默认即可。保存,Procedure创建完成了。
创建回滚Procedure
与创建ERP数据迁移Procedure的方法一样。
Definition TAB页
Name: rollback _transaction
Target Technology: Oracle
Details TAB页
点击添加图标(绿色+图标),弹出窗口,输入如下信息
Name: Command 0
Schema: WMS_ORACLE_SAL_APPS
Transaction: Transaction 1
Commit: Commit
Command: rollback
其他值默认即可。保存,Procedure创建完成了。
等完成所有Procedures后,Designer\\Projects\\ WMS Distributed
Deployment \\CUXWMS Import RMA\\Procedures下有四个过程
创建和执行Packages
新建Packages
Designer\\Projects\\WMS Distributed Deployment \\CUXWMS Import RMA\\Packages 右键New Package
输入如下信息,
Definition TAB页
Name: CUXWMS Import RMA
Diagrams TAB页
将所有相关的Variables、Interfaces、Procedures、OdiSleep拖曳到Diagram TAB 页区域中。然后选择这两个箭头,对包中的接口和视图进行先后顺序的连接。注意,连接的顺序是包执行的顺序。
图中在变量WMS_V_STANDALONE_ORG_CODE图标的右下角有个绿色的三角符号,这个是必须设置的,意思就是流程的起始。
需要注意,图中的变量有三种状态(Type):
1、 问号+箭头的变量Type是Delcare Variable;
2、 问号+彩环的变量Type是Refresh Variable;
3、 判断+问号的变量Type是Evaluate Variable(如图);
ODI会默认第一个拖到包中的接口或是程序设为包执行的第一步。如果你想设置另外的为第一步执行,可以选中你需设置的接口或过程或变量,右键 选择First Step。
其他信息默认即可。保存,包创建完成了
执行
(Designer\\Projects\\WMS Distributed Deployment \\CUXWMS Import RMA\\Packages\\CUXWMS Import RMA) 下选择Excute。弹出代理窗口。输入如下信息,
Context: GLOBAL
Agent: WMS_L_ODI_Agent
Log Level: 5
执行完,去Operator查看执行结果
创建和执行Scenarios
创建方案
创建方案一般用于接口或过程或包按设定的计划进行执行。
这里对包:CUXWMS Import RMA创建和执行方案。过程和接口创建和执行方案方式相同。
(Designer\\Projects\\WMS Distributed Deployment\\CUXWMS Import RMA\\Packages\\CUXWMS Import RMA)
右键选择Generate Scenario
如没特殊需求,Name和Version的值默认即可。
点击OK,弹出场景参数窗口,启动参数。
点击OK,ODI生成了Scenarios文件,展开有刚新建的的Scenario。
执行方案
(Designer\\Projects\\WMS Distributed Deployment \\CUXWMS Import RMA\\Packages\\CUXWMS Import RMA\\Scenarios) 下选择创建好的方案选择Excute。
代理窗口
点击OK,弹出参数窗口。
当不勾选Latest Value列时,其Value可输入,否则取变量默认值。
点击OK。执行完,去Operator查看执行结果。
验证
同时检测目标系统数据库数据是否导入成功,源系统数据库数据是否更新成功。
目标系统
SELECT h.header_id,h. order_number,h.process_status,h.process_message
FROM cux_dwms_rma_headers_iface h
SELECT l.line_id,l.header_id, l.process_status,l.process_message
FROM cux_dwms_rma_lines_iface l
SELECT h.header_id,h.order_number
FROM oe_order_headers_all h
WHERE h.creation_date BETWEEN SYSDATE - 1 AND SYSDATE + 1
源系统
SELECT h.header_id, h.order_number, h.process_status
FROM cux_iwms_rma_headers_iface h
select h.order_number
from oe_order_headers_all h
where h.attribute12=‘I' --已同步标识
ODI请求
除了上述使用ODI工具外,还可建立手动提交请求,CUX:ERP系统RMA同步WMS。
main过程
参数主要包括:库存组织(必填),ERP环境版本(必填),订单类型(不必填),起始时间(必填项)、截止时间(必填项);订单编号(不必填)。
PROCEDURE main(errbuf OUT NOCOPY VARCHAR2,
retcode OUT NOCOPY NUMBER,
p_env_code IN VARCHAR2,
p_organization_code IN VARCHAR2,
p_order_type IN VARCHAR2 DEFAULT NULL,
p_order_number IN NUMBER DEFAULT NULL,
p_date_from IN VARCHAR2,
p_date_to IN VARCHAR2,
p_scen_name IN VARCHAR2,
p_scen_number IN VARCHAR2);
需要注意的是,时间的类型转换,参考方式如下。
l_date_from := fnd_conc_date.string_to_date(p_date_from);
l_date_to := fnd_conc_date.string_to_date(p_date_to);
main过程内主要调用如下方法。
-- parameters
l_cmd_code := '-WMS_DISTRIBUTED_DEPLOYMENT.WMS_V_STANDALONE_ORG_CODE=' || p_organization_code;
l_cmd_code := l_cmd_code || '-WMS_DISTRIBUTED_DEPLOYMENT.WMS_V_SO_ORDER_TYPE=' || p_order_type;
l_cmd_code := l_cmd_code || '-WMS_DISTRIBUTED_DEPLOYMENT.WMS_V_SO_ORDER_NUMBER=' || p_order_number;
l_cmd_code := l_cmd_code || '-WMS_DISTRIBUTED_DEPLOYMENT.WMS_V_FROM_UPDATE_DATE=' || to_char(p_date_from, 'MM/DD/YYYYHH24:MI:SS');
l_cmd_code := l_cmd_code || '-WMS_DISTRIBUTED_DEPLOYMENT.WMS_V_TO_UPDATE_DATE='|| to_char(p_date_to, 'MM/DD/YYYYHH24:MI:SS');
cux_wms_odi_pub.execute_odi_cmd(x_return_status => x_return_status,
x_msg_count => x_msg_count,
x_msg_data => x_msg_data,
p_env_code => p_env_code,
p_organization_code => p_organization_code,
p_scen_name => p_scen_name,
p_scen_version => p_scen_number,
p_extra_parameters => l_cmd_code);
关于 cux_wms_odi_pub 公共包及如何在EBS环境配置ODI信息后续再补充。
发布至WMS
应用开发员(Application Development)\\并发\\可执行,新建可执行并发程序。
应用开发员(Application Development)\\并发\\程序,新建并发程序。
其参数如下。
提交ODI请求
数据仓库管理员职责下,Tool菜单上点击查看(V),选择请求。
RMA同步涉及的相关接口表及过程中相应Sql
接口表注意事项
RMA涉及头行订单两个标准表,所以相应源系统的接口表也应创建头行结构。
在创建接口表时需注意,除去需求所需要的标准表中的ID字段和弹性域字段外,统一存储标准表的NUMBER字段/DATE字段/FLAG字段和ID字段相关连表的Code字段。
目标系统接口表的相关字段类型要和源系统保持一致。
相应的Sql
通过上下文获取已分配的组织
相关SQL语句:
SELECT 'X'
FROM fnd_lookup_values_vl flv
WHERE 1 = 1
AND flv.lookup_type = 'CUX_IWMS_SYNINV_MAPPING'
AND flv.enabled_flag = 'Y'
AND SYSDATE BETWEEN nvl(flv.start_date_active, SYSDATE - 1) AND nvl(flv.end_date_active, SYSDATE + 1)
AND flv.tag = cux_dwms_integration_processor.g_ebs_env
AND mp.organization_code = flv.lookup_code;
源系统中迁移数据Procedure
此过程中,当完成标准表到接口表的数据迁移后,要回写标准表的同步标识。
相关SQL语句:
UPDATE oe_order_headers_all h
SET h.attribute12 = 'P'
WHERE h.header_id IN
(SELECT i.so_header_id
FROM cux_iwms_rma_headers_iface i);
UPDATE oe_order_lines_all l
SET l.attribute12 = 'P'
WHERE 1 = 1
AND l.line_id IN
(SELECT i.so_line_id
FROM cux_iwms_rma_lines_iface i);
回写源系统标准表的同步标识Procedure
当源系统接口表数据同步至目标系统接口表后,应回写源系统标准表的同步标识,表明该数据已同步至源系统中。
相关SQL语句:
UPDATE oe_order_headers_all h
SET h.attribute12 = 'I'
WHERE h.header_id IN
(SELECT i.so_header_id
FROM cux_iwms_rma_headers_iface i
WHERE i.process_status = 'PENDING');
UPDATE oe_order_lines_all l
SET l.attribute12 = 'I'
WHERE l.line_id IN
(SELECT i.so_line_id
FROM cux_iwms_rma_lines_iface i
WHERE i.process_status = 'PENDING');
WMS系统中提交标准表Procedure
验证接口表的数据,获取相应的ID。头行表验证成功后,提交接口表中该订单插入标准表的请求,并回写处理状态至接口表;否则不提交改订单请求。
以上是关于ODI接口开发案例:RMA(客户退货订单)同步的主要内容,如果未能解决你的问题,请参考以下文章