参考资料:我的第一个SAP PROXY ABAP Program(SAP PO 开发五)_sap po开发-CSDN博客
https://www.cnblogs.com/BruceKing/p/11341060.html
一、SAP PO简介:
SAP PO(Process Orchestration),是SAP的中间件系统,是基于SAP Net weaver平台的中间件产品,为企业提供一套支持SAP系统间、SAP系统与Non-Sap系统间以及Non-SAP系统间进行数据交换和流程整合的平台,数据集成可以是A2A或B2B,支持同步和异步的数据交互方式;基于此,PO支持多个系统间的数据流的集成,从而支持业务层面的流程整合,即BPM(业务流程管理);BRM(业务规则管理)功能为BPM提供基于业务规则的业务流程流转,预定义的业务规则,为BPM的业务节点提供基于规则的决策,极大的提高了BPM的业务效率。
PO建立在完全的开放的Web Service架构上的,支持来自不同供应商、高度异构、应用不同技术的系统之间的数据交换和流程整合。PO开发基于可视化和拖拽式的配置,零代码实现各系统间的WEB接口,从而实现资源的共享,降低公司的集成成本,减少代码所带来的复杂度和系统升级的难度。
PO 接口技术标准提供了基于组件的开放式集成架构,有助于建立柔性的,可靠的和可扩展的E-Business 解决方案。PO 建立在web services 、XML messaging 、 J2EE等工业标准只是,能够与目前使用任何技术的第三方软件进行集成,支持File、JDBC、HTTP、RFC、IDOC、BPM、ABAP Proxy、JMS、MAIL、SMTP、SOAP、PCK(SAP Partner Connectivity Kit )以及各类工业领域的标准集成包。
作为中间件,PO支持很多与系统交互的方式(RESTful, SOAP ,JDBC, FILE )等等
二、PO的版本演进:
XI(Exchange Infrastructure),2002~2005 (ABAP & JAVA Dual Stack)
XI(Data Exchange Infrastructure)
PI(Process Integration),2005~2012 (ABAP & JAVA Dual Stack)
XI( Data Exchange Infrastructure)
BPM(Business Process Management)
PO(Process Orchestration),2012~2019 (JAVA Stack Only)
XI( Data Exchange Infrastructure)
BPM(Business Process Management)
BRM(Business Rule Management)
PO已经有7年老了,它拥有3大主要功能,只在JAVA堆的环境使用运行。
三、PO的特点:
大概每25个SAP ERP系统,其中就会有一个SAP PO中间件在配套使用,
中国目前有6000个SAP ERP系统,那么中国应该有几百个PO服务器在运行。
对于SOA中间件,我感觉最大的益处就是能够快速接通多个系统,降低企业IT系统的集成时间和难度。
PO的强项应该是在它提供特有的PROXY技术功能实现同ERP-SAP系统的高级集成,
弱项其中一个是它没有MQ服务端,只有JMS客服端。在消息管理上,功能还有待了解。
四、PO开发的环境:
SAP PO服务器安装后,提供web供用户访问,web中可以作一些开发配置。
比较复杂的开发配置,SAP采用了JAVA桌面程序客户端来给用户使用。
JAVA桌面程序工作端口:80,8101,50000。环境详见:SAP PO 开发 一
配置大概分为三大块:
1、SLD是在浏览器里就可以配置。
2、ESR JAVA桌面程序里配置。
3、ID JAVA桌面程序里配置。
(一) 我们首先在SLD中配置我们的DEMO实例数据:
这个接口的请求端和服务端的产品、组件、技术系统、业务系统等等,都通通配置上去,因为在后面会使用到这些。
请求方是我的笔记本,上面用SoapUI发起WS请求;服务方是我的一个程序,已经放到了WIN2008服务器上。
(二)进到ESR里面去,我们要配置2个接口的内容:
1、请求方接口的DateType、MessageType、ServiceInterface
我们的接口是同步接口,请求发出去,马上会返回结果,所以可以看到,
DateType、MessageType都配有发送(req)和返回(back)2项。
在ServiceInterface的配置中,我们可以看到同步模式会包含请求request的MessageType和response的MessageType。
我们的接口是同步接口,请求发出去,马上会返回结果,所以可以看到,
DateType、MessageType都配有发送(req)和返回(back)2项。
在ServiceInterface的配置中,我们可以看到同步模式会包含请求request的MessageType和response的MessageType。
最简单的DT:
2、WS的服务方的ESR配置:
因为服务方的WebService有WSDL(接口标准描述)文件,所以我们不需要自己再建什么DT和MT了。
把该接口的WSDL文件导入进来,会产生一个ED_demo003:
最后把这个IC的WDSL给SoapUI客户端使用:
发送数据测试成功(注意PO要用户名和密码):
总结:
PO的配置里面有很多的概念,配置的方向大致应该是这样:
WebService在PO中的应用及特殊映射方式
作为中间件,PO支持很多与系统交互的方式(RESTful, SOAP ,JDBC, FILE )等等
SOAP只是webService三要素之一, 用来描述传递信息的格式
WebService测试工具:SOAPUI
Web Service(企业服务)就是一个应用程序,它向外界暴露出一个能够通过Web调用的API(业务接口)。Web Service是一种基于Web的中间件技术。用户通过把应用程序的一部分包装成Web服务的形式,将自己的应用程序功能提供给别人,实现应用程序之间的接口。webservice可用于多个系统和SAP系统之间的传输,比较灵活。
根据外部系统提供的webservice的wsdl地址,在SAP系统创建webservice consumer(接收方)时候输入该URL(地址)。基于安全性、传输协议的考虑,使用SOAMANAGER(可以直接T-CODE)创建逻辑端口,封装函数,在函数里指定端口,并调用类的方法,反之,创建webservice provider(提供方),生成wsdl供外部调用。
2. ABAP与webService
ABAP可以直接引入或发布webService.
详见连接无峰,公众号:ABAP 技巧与实战 SAP操作手册之 ABAP调用WEB服务
详见连接无峰,公众号:ABAP 技巧与实战 SAP操作手册之 RFC函数发布WEB服务
3. webService的优点
webService的最大优点就在于包含了WSDL(WebServicesDescriptionLanguage) . WSDL包含了这个接口的几乎所有信息
-
数据定义 :接口传递内容的结构定义及类型
-
调用地址 :服务提供的调用地址
-
调用点 :服务提供的调用点 SOAP ACTION
并且大部分的软件都支持引入WSDL定义生成调用接口的类,方便应用中直接使用.
比如ABAP引入WSDL产生类.调用类的方法就是调用接口.
4. SOAPUI与WSDL
把WSDL定义引入到SOAPUI(一个应用广泛的接口测试工具)中可以看到接口的这些信息(数据定义,调用地址,调用点) (当然,也可以用浏览器打开WSDL定义的地址或者文件,只是可读性相对较差)
5. PO引入WSDL
PO不支持直接引入WSDL地址.
但是可以通过IE浏览器(新版的浏览器似乎没有另存为功能)把地址另存为文件.
然后在ESB中创建 External Definition 引入WSDL文件.
创建的External Definition 代替了标准的 data type 和 message type .
Service Interface 中可以直接使用引入的External消息
6. SOAP接收通道
其中 Target URL 就是通过SOAP UI 看到的调用url地址 SOAP action 就是SOAPUI中看到的调用点,接收通道每个接口需要单独定义,因为其中包含了每个接口的特性: 调用地址,调用点
7. SOAP发送通道
发送通道只需要定义一些通用属性 安全层级 同步/异步属性. 在PO中可以共用SOAP发送通道
8. 特殊的webService
有些系统为了简化或者统一化接口调用. 会发布一种特殊的webService .
这种webService中只有一个string字段. 如下图所示. 调用方需要在这个字段中填入XML或JSON内容. 接收方需要解析这个字段中的XML或JSON内容. 根据解析的结果再确定后续处理方式.
-
优点:可以用一个接口实现所有业务信息的传输.
-
缺点:WSDL定义丢失了业务含义.不便于调用方理解接口需要传输的内容.
不推荐使用这种webService定义方式, 因为他丢失了三要素之一: 数据定义
PO与特殊webService
PO可以通过MAPPING 把一个XML结构映射到一个字段中. 过程如下.
该方式的原文链接如下
https://blogs.sap.com/2010/06/17/convert-the-input-xml-to-string-in-pi-71-using-standard-graphical-mapping/
01 源结构
02 目标结构
03 映射
任何一个文本函数(例如trim) . 右键点击源字段,勾选 return as xml
04 源消息
05 目标消息
实际接口处理时,PO为了避免嵌套XML的解析错误, 会使用特殊字符
这种使用转义字符取代 < > 只是为了避免XML的解析错误. 并体现XML的嵌套.不影响系统对XML的解析.
9. 局限性
PO对特殊webService的MAPPING 存在局限性.
PO MAPPING可以把一个XML结构MAPPING 到一个字段中. 但是因为一个PO接口只有一次MAPPING. 所以无法同时实现字段映射及XML映射到字段. 如果要实现这种复杂的映射,估计需要使用JAVA开发映射逻辑来实现.
一个变通的方法是把一个接口拆分成两个接口, 让PO本身作为一个中转系统.
比如接口
-
系统A -> 系统B
可以调整为
-
系统A->PO虚拟
-
PO虚拟->系统B
这样就可以通过两次映射:第一次执行字段隐射, 第二次再把XML结构映射到一个字段. 来实现这个功能. 只是PO的配置量增大了一倍.
10. 总结
webService是应用广泛的接口方式,几乎所有软件对webService有良好的支持.
一般项目中,如果外围系统不是现成的接口, 都建议使用webService方式和外部系统交互.
通过webService的WSDL定义可以解决双方系统对传输内容结构及字段定义的分歧.
快速完成接口的调用(无论是否使用PO). 当然这要建立在不使用特殊webService的基础上.
ABAP调用WEB服务
01 前提条件
ABAP调用WEB服务的前提条件: 你需要一个WEB服务的WSDL定义的地址链接.
02 创建企业服务
进入TCODE: SE80. 选择一个开发类,右键点击开发类,创建一个企业服务,进入创建向导
03 创建消费者代理
进入向导后,选择 service consumer(消费者代理).
选择external WSDL
选择URL 创建 你也可以用浏览器打开wsdl 下载为本地文件后, 选择local File创建
输入之前准备好的WSDL的url地址
因为演示的服务是SAP提供的WEB服务 . 所以系统会弹框输入SAP的登录信息, 如果是其它系统提供的, 可能就没有这弹框了.
设置一个前缀 和开发类.
04 发布消费者代理
完成后. 系统会生成一个service consumer Z_IF_SD216,( 这个服务的名称来自WSDL中的定义) 及对应的类. ZTS_CO_Z_IF_SD216.
修改 release status 为发布状态. 激活一下.
05 服务测试
测试对象. 系统会报错.原因是消费者代理尚未在当前服务器部署. (消费者代理传输到其它系统后,同样需要部署一下,类似于服务的发布需要在不同的服务器上部署)
06 部署服务
执行TCODE : SOAMANAGER . 进入浏览器界面. 找到之前创建好的消费者代理.
点击消费者代理.
基于WSDL完成配置. 进入配置向导.
输入一个逻辑端口名称. 后面测试及程序中会用到这个端口.
输入一下wsdl 地址. 可能需要输入用户 /密码(依赖于WEB服务)
查看一下
因为之前创建的服务使用了基本验证.
所以这里需要输入基本验证的用户/密码(依赖于WEB服务的定义)
选择一下登录语言(估计SAP发布的WEBSERVICE才会有这个选项)
点击完成后, 系统会创建并激活一个逻辑端口.
07 重新测试
回到SE80找到之前创建的企业服务 service consumers ZTS_CO_Z_IF_SD216
重新测试时.输入创建的逻辑端口 ZTS_PORT.点击执行
点击按钮 进入数据编辑模式
修改并保存测试数据
执行后可以看到返回的信息
08 程序调用
双击类 查看生成的类的输入,输出参数, 写代码时会用到这些参数的定义.
代码调用DEMO程序
*&---------------------------------------------------------------------*
*& Report ZTS_CALL_WEBSERVICE
*&---------------------------------------------------------------------*
*& DEMO程序,调用WEBSERVICE
*&---------------------------------------------------------------------*
REPORT zts_call_webservice.
TABLES: kna1.
PARAMETERS: p_kunnr LIKE kna1-kunnr DEFAULT '1000098',
p_vkorg LIKE knvv-vkorg default '6121'.
START-OF-SELECTION.
PERFORM frm_call.
*&---------------------------------------------------------------------*
*& Form FRM_CALL
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_call .
DATA:lc_web TYPE REF TO zts_co_z_if_sd216. "WebService代理类
DATA:ls_input TYPE zts_z_if_sd216, "输入参数
ls_output TYPE zts_z_if_sd216response. "输出参数
DATA:lo_sys_exception TYPE REF TO cx_ai_system_fault,
lo_app_exception TYPE REF TO cx_ai_application_fault.
TRY.
CREATE OBJECT lc_web
EXPORTING
logical_port_name = 'ZTS_PORT'. "为此WebService创建的逻辑端口。
CATCH cx_ai_system_fault .
MESSAGE '出错了' TYPE 'E'.
ENDTRY.
*传递传入参数
ls_input-is_stru-kunnr = p_kunnr.
ls_input-is_stru-vkorg = p_vkorg.
TRY.
CALL METHOD lc_web->z_if_sd216
EXPORTING
input = ls_input
IMPORTING
output = ls_output.
CATCH cx_ai_system_fault INTO lo_sys_exception .
"message ‘出错了 systemai’ type ‘S’.
WRITE lo_sys_exception->errortext.
CATCH cx_ai_application_fault INTO lo_app_exception .
WRITE / .
WRITE lo_app_exception->textid.
ENDTRY.
WRITE: ls_output-es_stru-kwert.
ENDFORM.
RFC函数发布WEB服务
ERP系统RFC协议发送端通过PO连通WebService接口
这次我们在ERP SAP ECC6系统中用RFC接口发出数据,通过PO发送到一个WebService中。
并且这是一个发送和应答同步的消息服务:ERP发出数据,马上就可以接到WebService返回的消息。SAP RFC函数发布WEB服务的步骤如下:
一、ERP SAP系统中的RFC接口程序
1、建一个Remote远程启用的SAP RFC的函数
注意(01):RFC函数处理类型设置为Remote远程启用的模块
2、创建Web Service服务
使用菜单功能创建web服务(一般选择来自函数模块, 每个函数发布一个服务). 如果选择来自函数组,则会把函数组中的所有函数发布成一组服务.
进入发布服务的向导界面,这里的服务名称可以和函数一致
这里不要勾选Map Name . Map Name 会把一些字段命名按照特定规则修改调整. 导致服务中的字段名不同于函数中的字段名
选择安全参数文件. 如果服务是局域网调用, 可以选择最后一个, 简化后续的设置. 如果要发布到互联网, 建议选择前三种.
输入服务的开发类及传输请求
点击完成,即可创建WEB服务
在服务定义界面中激活一下WEB服务
3、配置Web Service服务
然后执行事物代码 SOAMANAGER, 会启动一个浏览器界面设置服务的调用点信息(后面的步骤在传输到测试或生产系统后还需要执行)
点击WEB服务配置,输入之前定义的WEB服务名称,点击搜索
点击内部名称,进入服务定义.
点击创建服务,进入向导
设置安全信息
点击完成后,会看到定义服务和绑定的内容
4. 测试Web Service服务
点击上图的红框图标, 可以看到服务的wsdl定义
复制WSDL地址,用第三方工具测试一下(比如SOAPUI),测试时,需要输入基本验证信息(用户名,密码)
4. RFC函数发布WEB服务总结
RFC函数发布WEB服务比较简单.一般发布的是一个同步WEB服务.
发布的服务可以通过 事物代码 : SRT_ELOG 查看调用的底层报错信息: 比如日期格式错误,数字格式错误等. 业务报错则需要开发通过程序逻辑返回.
日期字段:调用方输入日期的格式必须是YYYY-MM-DD 否则可能会报错.
语言参数:某些版本可能会默认英文登录,可以在服务地址上添加参数?sap-language=ZH 来强制登录语言
使用这个函数发出消息,可以用一个ABAP程序来调用它:
*&---------------------------------------------------------------------*
*& Report ZDEMO004
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT ZDEMO004.
DATA GV_VALUE TYPE /BCV/FND_INT1.
DATA GV_GETDATARESULT TYPE /ASU/TEXT.
GV_VALUE = 9.
CALL FUNCTION 'ZDEMO004' DESTINATION 'ZPO_RFC'
EXPORTING
VALUE = GV_VALUE
IMPORTING
GETDATARESULT = GV_GETDATARESULT .
WRITE :/ GV_GETDATARESULT.
注意,RFC目标是SM59里面配置的RFC链接:
这是PO已经配置完成的结果,输入一个数字,ERP RFC传给PO,PO传给WebService,
WebService返回一个处理结果的字符串给PO,PO再返回到RFC函数中:
2、SM59中需要配置RFC的链接:
(注意,我们的例子是ERP发出数据,是外围系统作服务器模式,外围系统会有一个“程序标识”,
这需要再SM59的链接中配置)
RFC的名称,在ABAP中使用DESTINATION语法来使用。
“CALL FUNCTION 'ZDEMO004' DESTINATION 'ZPO_RFC'”
二、SAP PO配置实现RFC和WebService的连接。
我使用的PO版本是7.5,这是一个比较新的版本。网上很多文章还停留在PI的版本中,出现大量PI的术语已经过时了。
要学习PO,还是看看我这个系列,呵呵。
1、SLD中,我们需要配置ERP端的产品、组件、技术系统、业务系统,WebService端就还是沿用原来的:
2、ESR(Enterprise Services Repository)中,我们导入ERP的RFC函数
例如:权限自助平台的几个RFC接口都是这种方式走PI
3、ESR(Enterprise Services Repository)中,我们导入WebService的接口(WSDL)和建WS的SI。
4、配上数据发送方向的消息映射:
5、配上数据返回方向的消息映射:
6、发送方向和返回方向的消息都要OM中集中体现:
4、在ID(Integration Directory)中配置CC通道,我理解是PO到外围系统的adapter链路。
第一个CC是PO到ERP的RFC协议:
总示意图: