下图是ESR配置中各种对象的关联关系,注意OperationMapping和MessageMapping的方向性
MsgMapping是两个MassageType之间的关系,用于ServiceInterface的OperationMapping中发送和接收方在Request和Response结构之间的映射,如果ServiceInterface的inB/outB双方使用的MessageType是同样的,那么是可以不需要MsgMapping的。
MsgMapping提供了图形操作界面,最终会根据配置生成java代码并编译成jar文件,在运行时会执行该文件处理mapping。
在命名空间或其下面的Folder上右键--新建,填上名字即可,通常我们Z_MM开头表示MsgMapping
源和目的的方向也是有讲究的,同一个接口请求和返回的mapping其方向是相反的,只要以数据的流向去理解就好了
Source | Target | |
RequestMapping | 调用方的RequestMsgType | 被调方的RequestMsgType |
ResponseMapping | 被调方的ResponseMsgType | 调用方的ResponseMsgType |
在选择MsgType时,有两种操作方式:
其一就是下面红色按钮弹出选择框,选择MsgType对象,也可导入XML或XSD文件
其二就是将左侧DesignObjectTree中的适用对象(MsgType,RFC,ExternalDefinition)拖拽到下图黄框区域即可
红框2按钮会删除所有关联;红框3按钮会显示连接红线,帮助直观了解字段关联。
字段的关联也有多种操作方式
1,直接将左树节点直接拖拽到对应右树节点
2,鼠标点选树节点,会黄色显示在图底部,按红框1按钮或者在底部拉线连接,连接后变绿色;删除单个连接也可在底部右键操作
3,红框1按钮会连接Selected节点,如果节点含子节点会将同名的子节点自动连接,如下图LS_INFO和arg0可自动关联所有下级字段
function分为很多功能:文本操作,布尔运算,常量,日期,数值计算
function的操作都在下图区域进行,我们从上面点选相关列,再从下方点选所需function。
上图表示了如下一个映射关系,小白框代表了参数个数和输入输出方向
if zywbj = A.
dtsend目标 = dtsend源.substring(0,8).
else.
dtsend目标 = dtsend源.substring(0,4).
endif.
除了系统预置的function,还可自己创建function(UDF客制化函数),点击上图标红的按钮。ExecutionType会影响形式参数,代码按java语法编辑,但此处无法编译检查,如有语法错误需到下一节test运行才能看到。在MsgMapping中自建的function只能在这MsgMapping中用,如果想建一个可以多处通用的自建function,参见图二蓝框
//示例代码,从XI头部取DynamicVariable;这里的命名空间和变量,特别是系统预设变量,可以到ReceiverRule的condition维护那里去找
@LibraryMethod(title=“getASMA”, description=“get adapter specific message attribute”, category=“UDFPool”, type=ExecutionType.SINGLE_VALUE
public String getASMA (@Argument(title=“命名空间”) String namespace,@Argument(title=“变量名”) String attribute, Container container) throws StreamTransformationException{
Map<String, Object> all = container.getInputHeader().getAll();
DynamicConfiguration dynConf = (DynamicConfiguration)all.get(StreamTransformationConstants.DYNAMIC_CONFIGURATION);
DynamicConfigurationKey key = DynamicConfigurationKey.create( namespace, attribute);
String value = dynConf.get(key);
return value;
}
红框按钮可以切换网格视图与源码视图,在左侧网格视图或源码视图都可编辑值,然后点击左下面执行按钮,右侧就会展现目的MsgType收到的数据。
在源码视图我们有一点要关注的就是xml的命名空间与前缀:命名空间与MessageType所在命名空间一致,而前缀左侧是ns0右侧是ns1
对于Occurence可以大于1的element,在下图左侧测试编辑界面默认也只显示一个,可以右键--“duplicate subtree”来复制多个
前面小节是都是介绍MsgMapping图形操作的,会生成jar文件在runtime执行;此外还有一种直接编写java代码或XSLT文件,然后导入到PI中(见图二绿框)
使用java mapping时不需要创建MsgMapping,在OperationMapping时选择导入Jar的那个class即可
java编程参考:How to create SOAP to RFC PI interface with Java Mapping | SAP Blogs
SAP PI/PO Java Mapping — Test and Debug on Eclipse | SAP Blogs