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反向失败原因分析

  1. 确保待反向的表/视图是属于当前Schema(数据源)。
  2. 确保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(客户退货订单)同步的主要内容,如果未能解决你的问题,请参考以下文章

数据仓库-订单管理应该注意那些事项?

SAP系统标准销售业务流程及配置内容

FusionInsight LibrA与ODI 12c的完美结合

sap 采购订单退货

SAP里的订单退货

sql销售日结统计