最近项目上涉及到PO接口相关的内容,所以在这里记录一下RFC的PO接口配置方式。后续还有代理类形式这种目前较为常用的配置方式。
PO接口配置 RFC形式
一、编写远程调用RFC
使用PO的RFC形式接口,需要在SAP GUI先将远程调用的RFC编写完成。在编写RFC时,需要注意将RFC的属性,设置为远程启用的模块。
在设置这个属性时,需要将参数都设置为值传递。


除了需要设置导入和导出参数的值传递属性外,还需要在Table页签中将其中的所有参数勾选上可选的。这样做主要是为了将所有的校验过程都放在SAP中进行。如果你在此处有一个参数没选择可选的属性,那么外围系统在调用这个接口时会直接被PO端返回500的状态码和一些用于说明异常的乱码。但是这样的乱码对于代码的友好性不高,所以建议在此处将部分参数设置为可选的,而将输入校验放在SAP代码中进行校验,然后封装返回的Message传递给外围系统。

二、配置PO接口
1.打开PO配置页面
此处做一个提醒,在使用PO接口配置时,需要保证自己的PC环境中有Java的JDK包。不然无法生成服务和通道。
此处的PO配置页面地址可以向Basis或者PO顾问咨询,由他们提供给你PO的地址和账号。当然你也可以使用它们的账号为自己创建一个账号。打开的PO配置界面如下。

在这个页面有很多的内容项。基本上你要使用和操作的大部分功能都需要登陆PO之后才可以进行。而登录的方式也很简单,只需要你随意点击界面上的一个链接,然后就会进入下图所示的登陆界面,输入你的PO管理员账号登陆即可。

2.配置PO账号
既然在此处提到了配置PO的管理员账号,那就在这里提一嘴。
点击下图中红框圈中的超链接,进入PO的配置界面。

按照图中圈中的页签,进入到PO的身份管理界面。

进入后你可以在上面的输入框中输入**然后点击查询,查询出当前PO的全部管理员账号信息。然后可以点击上面的创建用户*按钮新建用户账号信息。也可以找到其他人的账号进行复制就行。一般情况下我们都是直接复制别人的账号然后修改一下账号和密码与用户信息即可。这样最方便。

配置完账号属性与信息之后点击上面的保存按钮就创建好PO的管理员账号了。之后可以使用这个账号对PO进行配置和操作。
3.配置PO接口对象
点击下图中红圈圈中的企业服务生成器,第一次进入时需要输入你的PO管理员账号。


输入完成账号信息之后,浏览器会为你下载一个PO的配置文件,打开该文件进入PO配置文件。


4.导入RFC
(1)找到导入RFC的路径
进入PO的服务生成器后,就可以通过下图所示的路径,导入RFC。此处有个注意事项,此处可以导入的只有在RFC属性中选择了远程启用的模块属性的Function。如果你在此处找不到你需要导入的Function,则可以看看是不是这个属性没有设置。

在RFCs上单击鼠标右键,唤出Import of SAP Objects按钮。

在导入RFC前需要登陆你要导入的SAP系统。需要填入SAP系统的IP地址和编码,最后再输入账号和密码。

(2)查找需要导入的RFC
进行完上面的操作之后,就会弹出下图所示的弹框。在该弹框中会有两个页签。分别是IDoc页签和RFC页签。因为我们导入的是RFC对象,所以我们展开RFC页签。展开时因为RFC对象数量较多,所以会等待一小段时间。等待系统将找到的RFC列举出来后,在上方的搜索输入框中输入需要导入的Function名称,点击查询,就可以找到需要导入的Function了。

点击上面红色框圈起来的按钮后,就会将你的RFC导入到PO系统中,如下图所示。

可以看到刚刚导入的RFC和其余的RFC并不一样,这是因为这个新导入的RFC没有激活。
(3)激活导入的RFC对象
在PO中激活对象的方式是在没有激活的对象上单击右键,然后点击Activate按钮。之后在弹出来的框中选中你要激活的对象然后点击左下角的Activate按钮,激活对象。


值得注意的是,没有变更过的对象,单击鼠标右键是不会出现激活这个选项按钮的。只有在未激活的对象上右键才会出现这个选项按钮。
进行完以上操作之后,导入RFC的操作就全部完成了。接下来就是创建服务的过程了。
5.创建PO服务
为了方便后续的维护,我们可以创建一个关于这个接口的文件夹,将与这个接口有关的内容全部放在这个文件夹中。我当前的这个接口是与WMS的MM模块进行交互的接口,所以我将文件夹建在WMS的MM区域中。
(1)创建接口文件夹

编写文件夹名称与描述。

点击保存按钮,将文件夹与其属性保存到PO。此时的文件夹是非激活状态,等后面我们创建的东西多起来之后一起激活。

(2)创建Service
与上面创建文件夹类似,在新创建的文件夹上右键,点击New按钮。然后按照下图所示的内容新建Service Interface。并为其起一个名字。方便后面使用和查找。

先修改服务节点为异步。在其中填入刚刚导入的RFC的Request与Response对象。此处填写这两个对象时有个注意事项。导入RFC的两个对象时,不要点击搜索帮助按钮。点击搜索帮助按钮后面的下拉框箭头,然后选择RFC Message。打开帮助弹框,选择刚刚导入的RFC对象。
此处有个注意事项,虽然该服务的分类(Category)为Outbound,但其实代表的却是数据的输入源,也就是外围系统传输数据到PO的这一个过程,所以此处如果你设置了不同的映射字段,此处就需要根据具体的需求填写不同的MT对象。

根据角色Role列的信息,在第一行导入RFC的Request对象。

在第二行,导入RFC的Response对象。

导入完成之后点击上面的保存按钮,将Service保存到刚刚新建的文件中即可。

6.Request Message Mapping(Request报文字段映射)
这里是映射外围系统报文字段与SAP系统字段的地方,如果外围系统的字段名称与SAP的名称不一致,就需要在这里对他们进行例外映射。相反如果字段名称一致,那么只需要选中他们的抬头结构点击映射按钮,系统就会自动根据字段的名称进行映射了。字段名称不一样的处理方式我会在创建代理类的PO中进行介绍,此处就介绍下如果两边系统字段名称一致时的处理方式。
所以开发时建议业务顾问和外围系统对接时,能将两边的字段统一一下。这样无论是开发还是调试都会方便很多。
(1)新建Request Message Mapping对象

(2)填写映射字段结构
新建完映射对象后,会来到下图所的界面。这个界面就是用来映射请求的字段对应的界面。点击图中红框圈中的搜索帮助按钮。打开PO中现在存在和导入的结构。

在两边的搜索列表中选择我们之前导入的RFC对象。

(3)映射字段
之后选中两边结构的抬头,点击红框圈中的映射按钮,看到两边的字段前面的圆点颜色变成绿色则代表该字段映射成功。或者你也可以点击其中的某一个字段,看到最下面出现映射结构则也代表映射成功。

完成上面的操作之后,就和保存文件夹一样,点击最上面的保存按钮,将Request Message Mapping保存好。
7.Response Message Mapping(Response报文字段映射)
(1)导入映射字段结构
这个和上面的Request Message Mapping一样,只不过上面是用来映射Request的报文字段的,这个是用来映射Response的报文字段的。所以这里直接从上面的点击搜索帮助导入字段结构开始。
之前导入的是RFC对象,这次导入RFC的Response对象。

(2)映射接口字段
在两侧都导入RFC的Response对象后,和上面的映射操作一样。先选择抬头的结构,然后点击映射按钮。在点击映射按钮之前可以看到字段在未映射之前,前面的圆点颜色是灰色的。而且现在点击的字段在最下面也是没有映射结构的。
.png)
在点击映射按钮后就可以看到比较明显的变化了。字段前圆点变为绿色,下面出现字段映射结构。
.png)
之后点击保存按钮,保存Message Mapping。
8.关联接口的出入参数
我们在上面将接口的SAP端传入参数与外围系统的传入参数进行了映射,此外还将SAP端的传出参数与外围系统的传出参数也同样进行了映射。但是并没有将传入参数与传出参数进行映射。将传入参数与传出参数进行映射的对象为Operation Mapping。
(1)新建Operation Mapping对象(映射传入与传出参数)
同样是在接口文件夹上右键新建下图所示的对象。并为其分配一个用于快速定位的名字。

(2)填写映射的对象
新建好的Operation Mapping对象界面如下图所示,图中红圈圈中的输入框就是要填入的属性参数。
- Source Operation:源操作
- Target Operation:目标操作

① Source Operation 源操作
点击输入框的搜索帮助按钮,将服务对象导入。

② Target Operation 目标操作
此时将SAP的导入的RFC对象引用进输入框中。

③ 填入Response映射结构
此处填写参数映射时有个注意事项,因为新建的Operation Mapping对象在一开始不会显示输入与输出参数映射的页签。需要点击下图箭头指向的按钮,将参数页签刷新出来。
之后再根据输入框的搜索帮助将之前设置的Message Mapping对象填入即可。

④ 填入Request映射结构
只要唤出参数页签,填写参数映射对象的方式就都是一样的。

9.激活接口对象
配置完以上内容之后,就完成了PO接口的配置了。接口的文件夹结构如下。

然后将其激活就可以进行下一步的操作了,配置接口的通道。


三、配置PO通道集成
1.进入集成界面
点击下图红圈圈中的超链接,进入与PO配置类似的网页浏览器下载PO集成软件。同样的,如果你是刚进入PO的话需要登陆之后才可以进行下一步操作,但如果你登陆过后就不需要再次登陆了。

进入到下载软件界面

之后将下载好的软件打开运行最后会进入到下面的界面中。


2.更改视图结构
此处不一定要和我一样,只是我习惯这样而已。点击图中红圈圈中的下拉框,选中文件夹形式。

展开文件夹,因为是和WMS系统交互的接口,所以我们打开WMS的文件夹。在这个文件夹下添加接口的通道和集成。

3.通信通道
(1)创建通信通道
在WMS的文件夹上右键点击New按钮,新增如下图所示的通信通道对象(Communication Channel)。
- 通信组件(Communication Component):将PO顾问配置好的外围系统的Business Component对象放置在此处,这个输入框最后面有搜索帮助按钮,所以可以通过搜索帮助弹框快速键入外围系统的Business Component。
- 通信通道(Communication Channel):此处就是新建的通信通道的名称了,为了方便后面查找,建议规范命名形式。

(2)填写接口类型
新建好的通信通道界面如下所示,在这个界面你需要选择接口的适配器类型。方式有很多种,点击红框圈中的搜索帮助可以看到很多的适配器类型。

PO端支持的适配器类型入下面弹框所示的内容,还有一部分适配器类型在下拉框下面就不展示了,因为本接口使用的是Rest类型的适配器,所以这次就将其设置为Rest类型的适配器,然后向下配置适配器的参数内容。

(3)填写Rest适配器参数

用于获取Element Name与Element Namespace的界面。注意命名空间填写的是冒号中间的内容。

(4)设置接口的URL
因为PO接口地址的前缀都是一样的,所以此处只需要设置PO个例的URL后缀即可。例如下图所示的内容,他的URL就是:http://poappdev:50000/RESTAdapter/ERP/ZMMFM010
PO URL的公共前缀:http://poappdev:50000/RESTAdapter
(5)设置请求方式
此处设置的就是接口的请求方式。GET、POST、PUT、DELETE和PATCH等。

(6)添加服务到业务组件
此处主要是为了创建集成配置时导入使用的。点击需要交互的外围系统所对应的Business Component业务组件,跳转到Sender页签中点击编辑按钮,将之前PO接口的服务添加到其中。
4.集成配置
(1)创建集成对象
如果上面没有添加服务到业务组件中,此处Interface的搜索帮助是无法带出你想要的服务对象的。

(2)入站设置 Inbound Processing
使用第一个输入框的搜索帮助按钮,将之前创建的通信通道填进去。

(3)接收者 Receiver
因为是外围系统调用SAP,所以接收者就是SAP系统的Business Component业务组件。使用搜索帮助按钮将SAP系统的业务组件填入即可。

(4)接收者接口 Receiver Interfaces
此处填写的是PO接口中,参数映射对象,也就是Operation Mapping对象。

(5)出站设置 Outbound Processing
传入上面创建的通信通道。

(6)高级设置 Advanced Settings
此处主要用来设置接口返回的报文与日志信息。

进行完上面的操作之后,保存并激活所有的对象,就完成测试了。
四、接口测试
1.测试工具 Postman
之前测试接口介绍过Soap UI这个测试工具,这次换一种。使用Postman对接口进行测试,但是使用这个软件测试时如果是第一次使用需要创建一个账号。不然没法创建工作空间保存测试的接口地址和报文信息。
首先附上Postman的下载地址:Download Postman | Get Started for Free

2.新建测试界面
安装好Postman并创建好工作空间之后,来介绍一下如何创建一个测试界面。
点击Postman左上角的汉堡按钮,点击File –> new按钮,选择图中所示的测试类型界面。


3.测试界面介绍
如下图所示,是测试要填写的内容。接口名称是为了方便自己区分接口而起的。默认情况下接口名称是测试用的URL地址。

4.添加接口认证账号
填充完上图的内容并不能直接调用接口,因为还需要填写PO服务端的认证账号。如果不填写账号就会出现下图所示的返回报文。

认证账号在下图所示的位置。

5.运行的测试结果
进行完上面的设置之后,就可以测试看接口是否创建和配置成功。如下图示的内容,返回了报文的内容,则代表接口创建和调用成功了。

五、接口调试
1.设置调试账号
在开发过程中我们避免不了需要测试接口是否正确执行了或解决没有按照预期的内容进行运行。此时就需要我们对内部的程序进行调试。因为是外部程序调用接口,所以我们就需要设置程序的外部断点。而个人设置的断点也只有个人会生效,但是PO在调用SAP时使用的是SAP分配给PO的账号,如果以个人账号访问是无法使断点相应的。
所以在启用外部断点前需要知道自己的PO系统连接SAP系统的账号是什么。以我的程序为例子,我的账号在报文中体现为WMS的账号。

所以我需要找PO顾问要到PO访问SAP的账号后,在程序的实用程序—>设置打开设置弹框。

在ABAP 编辑器页签转到调试子页签,在用户处填入账号,当系统以你填入的账号调用程序时,若你在调用程序中设置了外部断点,则会进行程序调试界面。

2.添加外部断点
进行完上面的操作后,就可以添加外部断点,然后使用Postman调用接口进入调试界面。如果你确认完上面的操作,在调用接口后没有进入调试界面的话,建议看看是不是你断点设置的系统Client是否和PO调用的Client一致。

使用Postman调用接口。

使用Postman调用接口后,Postman会进入下图所示的界面。

SAP GUI端的调试窗口如下。
