PO 中的消息映射的标准 Function 和用户定义 Function UDF

作者:郑德鼎 约 6 分钟阅读 更新日期:2025-03-02 1 年前更新 标签:ABAP, Data Engineering, 开发, 数据工程
PO 中的消息映射的标准 Function 和用户定义 Function UDF - 封面图
PO 中的消息映射的标准 Function 和用户定义 Function UDF - 封面图

# PO中的消息映射的标准Function和用户定义Function(UDF)

原创 段志刚 [ 建广技师 ](javascript:void\(0\);)

__ _ _ _ _

在po message

mapping里,当直连达不到想要的效果时,可以考虑使用标准function和udf实现特殊功能,以下举例介绍标准function和udf的使用

1、Duplicate Subtree的使用,复制节点,适用于将平行结构转换成表,如图所示

PO 中的消息映射的标准 Function 和用户定义 Function UDF - 封面图
PO 中的消息映射的标准 Function 和用户定义 Function UDF - 封面图

例:

• * * * * * * * * * * * * * * *

<?xml version="1.0" encoding="UTF-8"?><ns0:MT_MDM_TEST_Req xmlns:ns0="http://ycrenfu.com/sap/mdm/inbound"> <person1> <perid>p001</perid> <pernam>张三</pernam> </person1> <person2> <perid>p002</perid> <pernam>李四</pernam> </person2> <person3> <perid>p003</perid> <pernam>王五</pernam> </person3></ns0:MT_MDM_TEST_Req>

将三个展开的人员信息合并到一个表,达到以下效果:

• * * * * * * * * * * * * * * *

<?xml version="1.0" encoding="UTF-8"?><ns0:MT_SAP_TEST_Req xmlns:ns0="http://ycrenfu.com/sap/mdm/inbound"> <person> <perid>p001</perid> <pernam>张三</pernam> </person> <person> <perid>p002</perid> <pernam>李四</pernam> </person> <person> <perid>p003</perid> <pernam>王五</pernam> </person></ns0:MT_SAP_TEST_Req>

Mapping里我们使用了 Duplicate Subtree复制了2个person节点,使得源节点数和目标节点数一致。

2、FUNCTION的使用

以下我们使用FUNCTION实现以上1中相反的效果,即:将person中的三个成员分别的对应到person1、person2、person3 >

先看看不使用FUNCTION直连的效果

PO 中的消息映射的标准 Function 和用户定义 Function UDF - 封面图
PO 中的消息映射的标准 Function 和用户定义 Function UDF - 封面图

• * * * * * * * * * * * * * * * *

<?xml version="1.0" encoding="UTF-8"?><ns0:MT_SAP_TEST_Req xmlns:ns0="http://ycrenfu.com/sap/mdm/inbound"> <person> <perid>p001</perid> <pernam>张三</pernam> </person> <person> <perid>p002</perid> <pernam>李四</pernam> </person> <person> <perid>p003</perid> <pernam>王五</pernam> </person></ns0:MT_SAP_TEST_Req>

经mapping转换后

• * * * * * * * * * * * * * * *

<?xml version="1.0" encoding="UTF-8"?><ns0:MT_MDM_TEST_Req xmlns:ns0="http://ycrenfu.com/sap/mdm/inbound"> <person1> <perid>p001</perid> <pernam>张三</pernam> </person1> <person2> <perid>p001</perid> <pernam>张三</pernam> </person2> <person3> <perid>p001</perid> <pernam>张三</pernam> </person3></ns0:MT_MDM_TEST_Req>

没有达到我们想要的结果

以下考虑用FUNCTION实现以上1中相反的效果:

FUNCTION | 描述 | 备注

---|---|---

Index | 返回某个节点值的索引 | 用此FUNCTION可以得到person里每个元素的索引

Constant | Constant 定义常量 |

equals | equals 判断两个字符串值是否相等 |

ifWithoutElse | ifWithoutElse 满足条件则返回一个元素 |

removeContexts | removeContexts 移除上下文更改 | 用此FUNCTION可以移除无效值

PO 中的消息映射的标准 Function 和用户定义 Function UDF - 封面图
PO 中的消息映射的标准 Function 和用户定义 Function UDF - 封面图

可以通过queue跟踪FUNCTION的转换过程

PO 中的消息映射的标准 Function 和用户定义 Function UDF - 封面图
PO 中的消息映射的标准 Function 和用户定义 Function UDF - 封面图
PO 中的消息映射的标准 Function 和用户定义 Function UDF - 封面图
PO 中的消息映射的标准 Function 和用户定义 Function UDF - 封面图

Index属性设置:

PO 中的消息映射的标准 Function 和用户定义 Function UDF - 封面图
PO 中的消息映射的标准 Function 和用户定义 Function UDF - 封面图
PO 中的消息映射的标准 Function 和用户定义 Function UDF - 封面图
PO 中的消息映射的标准 Function 和用户定义 Function UDF - 封面图
PO 中的消息映射的标准 Function 和用户定义 Function UDF - 封面图
PO 中的消息映射的标准 Function 和用户定义 Function UDF - 封面图
PO 中的消息映射的标准 Function 和用户定义 Function UDF - 封面图
PO 中的消息映射的标准 Function 和用户定义 Function UDF - 封面图

经转换得到第1个perid,以此类推得到第2、3个perid

3、使用FUNCTION实现数据结构的合并和拆分

例:

• * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

<?xml version="1.0" encoding="UTF-8"?><ns0:MT_MDM_TEST01_Req xmlns:ns0="http://ycrenfu.com/sap/mdm/inbound"> <employee> <basicInfo> <empid>e001</empid> <dpment>人力资源部</dpment> </basicInfo> <projects> <projid>p001</projid> <projdesc>XXXXXX项目01</projdesc> </projects> <projects> <projid>p002</projid> <projdesc>XXXXXX项目02</projdesc> </projects> <projects> <projid>p003</projid> <projdesc>XXXXXX项目03</projdesc> </projects> </employee> <employee> <basicInfo> <empid>e002</empid> <dpment>信息中心</dpment> </basicInfo> <projects> <projid>p004</projid> <projdesc>XXXXXX项目04</projdesc> </projects> <projects> <projid>p005</projid> <projdesc>XXXXXX项目05</projdesc> </projects> <projects> <projid>p006</projid> <projdesc>XXXXXX项目06</projdesc> </projects> </employee></ns0:MT_MDM_TEST01_Req>

通过mapping实现:

• * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

<?xml version="1.0" encoding="UTF-8"?><ns0:MT_SAP_TEST01_Req xmlns:ns0="http://ycrenfu.com/sap/mdm/inbound"> <employee> <empid>e001</empid> <dpment>人力资源部</dpment> <projid>p001</projid> <projdesc>XXXXXX项目01</projdesc> </employee> <employee> <empid>e001</empid> <dpment>人力资源部</dpment> <projid>p002</projid> <projdesc>XXXXXX项目02</projdesc> </employee> <employee> <empid>e001</empid> <dpment>人力资源部</dpment> <projid>p003</projid> <projdesc>XXXXXX项目03</projdesc> </employee> <employee> <empid>e002</empid> <dpment>信息中心</dpment> <projid>p004</projid> <projdesc>XXXXXX项目04</projdesc> </employee> <employee> <empid>e002</empid> <dpment>信息中心</dpment> <projid>p005</projid> <projdesc>XXXXXX项目05</projdesc> </employee> <employee> <empid>e002</empid> <dpment>信息中心</dpment> <projid>p006</projid> <projdesc>XXXXXX项目06</projdesc> </employee></ns0:MT_SAP_TEST01_Req>

将员工基本信息和项目合并到一张表,如果直连达不到这种效果,这里不再演示,下面介绍

FUNCTION实现方法
FUNCTION | 描述 | 备注

---|---|---

useOneAsMany | 将一个元素在一个节点下多次使用 | 可以将empid在projects里多次使用

removeContext | 移除上下文更改 | 移除上下文更改,使得empid在同一个上下文更改

SplitByValue | 插入上下文更改 | 插入上下文更改,使得每个empid在各自的上下文更改

| |

看下queue:

PO 中的消息映射的标准 Function 和用户定义 Function UDF - 封面图
PO 中的消息映射的标准 Function 和用户定义 Function UDF - 封面图
PO 中的消息映射的标准 Function 和用户定义 Function UDF - 封面图
PO 中的消息映射的标准 Function 和用户定义 Function UDF - 封面图

这里的SplitByValue我们选择Each Value。

PO 中的消息映射的标准 Function 和用户定义 Function UDF - 封面图
PO 中的消息映射的标准 Function 和用户定义 Function UDF - 封面图
PO 中的消息映射的标准 Function 和用户定义 Function UDF - 封面图
PO 中的消息映射的标准 Function 和用户定义 Function UDF - 封面图

4、以下使用FUNCTION实现以上3中相反的效果

即将以下结构:

• * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

<?xml version="1.0" encoding="UTF-8"?><ns0:MT_SAP_TEST01_Req xmlns:ns0="http://ycrenfu.com/sap/mdm/inbound"> <employee> <empid>e001</empid> <dpment>人力资源部</dpment> <projid>p001</projid> <projdesc>XXXXXX项目01</projdesc> </employee> <employee> <empid>e001</empid> <dpment>人力资源部</dpment> <projid>p002</projid> <projdesc>XXXXXX项目02</projdesc> </employee> <employee> <empid>e001</empid> <dpment>人力资源部</dpment> <projid>p003</projid> <projdesc>XXXXXX项目03</projdesc> </employee> <employee> <empid>e002</empid> <dpment>信息中心</dpment> <projid>p004</projid> <projdesc>XXXXXX项目04</projdesc> </employee> <employee> <empid>e002</empid> <dpment>信息中心</dpment> <projid>p005</projid> <projdesc>XXXXXX项目05</projdesc> </employee> <employee> <empid>e002</empid> <dpment>信息中心</dpment> <projid>p006</projid> <projdesc>XXXXXX项目06</projdesc> </employee></ns0:MT_SAP_TEST01_Req>

转换成:

• * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

<?xml version="1.0" encoding="UTF-8"?><ns0:MT_MDM_TEST01_Req xmlns:ns0="http://ycrenfu.com/sap/mdm/inbound"> <employee> <basicInfo> <empid>e001</empid> <dpment>人力资源部</dpment> </basicInfo> <projects> <projid>p001</projid> <projdesc>XXXXXX项目01</projdesc> </projects> <projects> <projid>p002</projid> <projdesc>XXXXXX项目02</projdesc> </projects> <projects> <projid>p003</projid> <projdesc>XXXXXX项目03</projdesc> </projects> </employee> <employee> <basicInfo> <empid>e002</empid> <dpment>信息中心</dpment> </basicInfo> <projects> <projid>p004</projid> <projdesc>XXXXXX项目04</projdesc> </projects> <projects> <projid>p005</projid> <projdesc>XXXXXX项目05</projdesc> </projects> <projects> <projid>p006</projid> <projdesc>XXXXXX项目06</projdesc> </projects> </employee></ns0:MT_MDM_TEST01_Req>

PO 中的消息映射的标准 Function 和用户定义 Function UDF - 封面图.textContent = new Date().getFullYear();