20-SAP PI开发手册-ERP发布服务供外部系统调用(sproxy代理类)
一、 接口内容
接口详细信息
1. 字段对应关系
发送字段对应关系
返回字段对应关系
2. 报文信息
传入报文(报文结构,外围系统提供)
1 <?xml version="1.0" encoding="utf-8"?> 2 <REQMESG> 3 <HEADER> 4 <WERKS>B001</WERKS> 5 </HEADER> 6 <ITEM> 7 <MATNR>000000000500022359</MATNR> 8 <WERKS>B001</WERKS> 9 <LGORT>BBBB</LGORT> 10 </ITEM> 11 <ITEM> 12 <MATNR>000000000500022352</MATNR> 13 <WERKS>B001</WERKS> 14 <LGORT>9501</LGORT> 15 </ITEM> 16 </REQMESG>
返回报文(外围系统提供)
1 <?xml version="1.0" encoding="UTF-8"?> 2 <RESPONSE> 3 <MESG>天津市电工厂名称为</MESG> 4 <ITEM> 5 <MATNR>000000000500022359</MATNR> 6 <WERKS>B001</WERKS> 7 <LGORT>BBBB</LGORT> 8 <MAKTX>测试物料2004</MAKTX> 9 <LABST>3425.0</LABST> 10 </ITEM> 11 <ITEM> 12 <MATNR>000000000500022352</MATNR> 13 <WERKS>B001</WERKS> 14 <LGORT>9501</LGORT> 15 <MAKTX>test004</MAKTX> 16 <LABST>6.0</LABST> 17 </ITEM> 18 </RESPONSE>
二、 接口配置
登陆网址:http://sgnwpid.sgcc.com.cn:50000/dir/start/index.jsp
事物码登陆:SXMB_IFR
A. 配置ESR(Enterprise Service Builder)
找到对应命名空间(人资组开发机目前只有薪酬通道是正常的,此处我们暂时挂到薪酬组下)
1. 创建Data Types
代理类形式需要为双方接口创建数据类型,国网项目都需要走esb通道,所传数据以<![CDATA[*]]>包裹xml报文形式进行传输,所以发出方只需要输入输出各一个参数即可,此处我们使用公共数据类型
1.1 外围侧发送方
DT_SHARE_SGHRERP2CEERP_REQ
DT_SHARE_SGHRERP2CEERP_RESP
1.2 ERP侧接收方
DT_TS01_MM2CEERP_REQ
DT_TS01_MM2CEERP_RESP
1.3 外围和集中部署关系图如下
2. 创建Message Types
根据DATA TYPES创建ERP侧的MESSAGER TYPES
3. 创建Service Interface
分别创建外围系统方和集中部署方服务接口。
SIO_TS01_MM_GETMSG
SII_TS01_CEERP_GETMSG
4. 创建Imported Archives
编辑xsl文档,并导入IA
CDATA和xml之间转换的固定格式:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 3 <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 4 <xsl:template match="*"> 5 <!-- disable-output-escaping 属性为yes不转义符号--> 6 <xsl:variable name="xmlStr" select="/*/*"/> 7 <xsl:choose> 8 <xsl:when test="contains($xmlStr,'<?xml version="1.0" encoding="UTF-8"?>')"> 9 <xsl:value-of select="substring-after($xmlStr,'<?xml version="1.0" encoding="UTF-8"?>')" disable-output-escaping="yes"/> 10 </xsl:when> 11 <xsl:when test="contains($xmlStr,'<?xml version="1.0" encoding="utf-8"?>')"> 12 <xsl:value-of select="substring-after($xmlStr,'<?xml version="1.0" encoding="utf-8"?>')" disable-output-escaping="yes"/> 13 </xsl:when> 14 <xsl:otherwise> 15 <xsl:value-of select="$xmlStr" disable-output-escaping="yes"/> 16 </xsl:otherwise> 17 </xsl:choose> 18 </xsl:template> 19 </xsl:stylesheet>
1 <?xml version="1.0" encoding="UTF-8"?> 2 3 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 4 5 <xsl:output version="1.0" encoding="UTF-8" method="xml"/> 6 7 8 <xsl:template match="/"> 9 10 11 <m:MT_SHARE_SGWMS2ERP_RESP xmlns:m="http://www.sgcc.com.cn/sgwms"> 12 13 14 <INPUT> 15 16 <!--加CDATA头--> 17 18 19 <xsl:text disable-output-escaping="yes"><![CDATA[</xsl:text> 20 21 <!--节点完全复制--> 22 23 24 <xsl:copy-of select="./*"/> 25 26 <!--加CDATA尾--> 27 28 29 <xsl:text disable-output-escaping="yes">]]></xsl:text> 30 31 </INPUT> 32 33 </m:MT_SHARE_SGWMS2ERP_RESP> 34 35 </xsl:template> 36 37 </xsl:stylesheet>
REQUEST:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 3 <xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/> 4 <xsl:template match="/"> 5 <ns1:MT_TS01_MM2CEERP_REQ xmlns:ns1="http://www.sgcc.com.cn/sghrerp/hrxc"> 6 <HEADER> 7 <WERKS> 8 <xsl:value-of select="HEADER/WERKS"/> 9 </WERKS> 10 </HEADER> 11 <xsl:for-each select="ITEM"> 12 <ITEM> 13 <MATNR> 14 <xsl:value-of select="MATNR"/> 15 </MATNR> 16 <WERKS> 17 <xsl:value-of select="WERKS"/> 18 </WERKS> 19 <LGORT> 20 <xsl:value-of select="LGORT"/> 21 </LGORT> 22 </ITEM> 23 </xsl:for-each> 24 </ns1:MT_TS01_MM2CEERP_REQ> 25 </xsl:template> 26 </xsl:stylesheet>
根据外围系统传入报文路径取数拼接到集中部署messagetyeps的报文结构中
RESPONSE:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 3 <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 4 <xsl:template match="/"> 5 <xsl:apply-templates select="*"/> 6 </xsl:template> 7 <xsl:template match="*"> 8 <MESG> 9 <xsl:value-of select="RETURN/MESG"/> 10 </MESG> 11 <xsl:for-each select="ITEM"> 12 <ITEM> 13 <MATNR> 14 <xsl:value-of select="MATNR"/> 15 </MATNR> 16 <WERKS> 17 <xsl:value-of select="WERKS"/> 18 </WERKS> 19 <LGORT> 20 <xsl:value-of select="LGORT"/> 21 </LGORT> 22 <MAKTX> 23 <xsl:value-of select="MAKTX"/> 24 </MAKTX> 25 <LABST> 26 <xsl:value-of select="LABST"/> 27 </LABST> 28 </ITEM> 29 </xsl:for-each> 30 </xsl:template> 31 </xsl:stylesheet>
同理,将集中部署侧messagetypes的返回报文的值拼入到外围返回报文中去
5. 创建Operation Mapping
B. 配置integration builder
1. 创建Configuration Scenario(场景)
CS_TS01_MM2CEERP_GETMSG
2. 导入Business System
3. 创建发送方Communication Channel
CC_TS01_MM_GETMSG
4. 创建Sender Agreement,发送方
发送方为:BS_SGHRERP
5. 创建Receiver Determination
确认接收方系统
接收方:集中部署201
6. 创建Interface Determination,
确认接收方系统的接收接口
7. 创建接收方Communication Channel
(代理类用XI,RFC类型用RFC)
8. 创建Receiver Agreement,接收方
9. 激活CS,并导出wsdl
所有的组件均要导入CS场景CS_TS01_MM2CEERP_GETMSG中,一步一激活确认所有组件均激活后导出wsdl进行测试。有一种情况的报错需要把场景及其组件删掉重新配置注册的情况,请注意。
按照如下格式修改URL并填入
http://10.1.169.34:50000/XISOAPAdapter/MessageServlet?channel=:BS_SGHRERP:CC_TS01_MM_GETMSG
选择对应的接口,外围系统调用
外围系统调用即:SIO_TS01_MM_GETMSG
填写CC:BS_SGHRERP,并导出wsdl即可供外围系统调用。
三、 GUI侧接口开发
前文部分为PI接口java端的开发配置,接下来开发基于abap的服务提供方接口(既ERP侧)的逻辑代码。
事物代码:sproxy
1. 根据组件名称、命名空间、接口名找到对应的接口
由于服务提供方为集中部署,我们只需开发ceerp侧的接口即可
2. 双击创建,分配包、请求号、前缀,系统自动根据PI的配置生成输入输出参数及其参考数据结构
3. 双击方法,在其内编写逻辑代码即可,注意导入导出的参数使用方式,一般接口data types都会定义成string类型,遇到数字型QUAN、DEC可能出现转换错误,可在代码中进行转换
4. 实例参考代码
1 METHOD zpi00_ii_sii_ts01_ceerp_getmsg~sii_ts01_ceerp_getmsg. 2 *** **** INSERT IMPLEMENTATION HERE **** *** 3 4 DATA p_werks TYPE mard-werks. 5 6 TYPES:BEGIN OF ty_out, 7 matnr TYPE mard-matnr, 8 werks TYPE mard-werks, 9 lgort TYPE mard-lgort, 10 maktx TYPE makt-maktx, 11 labst TYPE mard-labst, 12 END OF ty_out. 13 14 DATA:lw_out TYPE ty_out, 15 lt_out TYPE TABLE OF ty_out. 16 17 DATA: lw_header TYPE zpi00_dt_ts01_mm2ceerp_req_hea, "输入参数抬头信息 18 lt_input_item TYPE TABLE OF zpi00_dt_ts01_mm2ceerp_req_ite, "输入参数内表 19 lw_input_item TYPE zpi00_dt_ts01_mm2ceerp_req_ite, "输入参数工作区 20 lw_return TYPE zpi00_dt_ts01_mm2ceerp_resp_re, "输出参数返回消息 21 lt_output_item TYPE TABLE OF zpi00_dt_ts01_mm2ceerp_resp_it, "输出参数内表 22 lw_output_item TYPE zpi00_dt_ts01_mm2ceerp_resp_it "输出参数工作区 23 . 24 25 DATA:lw_t001w TYPE t001w, 26 zmsg TYPE string. 27 28 MOVE-CORRESPONDING input-mt_ts01_mm2ceerp_req-header TO lw_header. 29 p_werks = lw_header-werks. 30 31 SELECT SINGLE werks name1 FROM t001w INTO CORRESPONDING FIELDS OF lw_t001w WHERE werks = p_werks AND spras = sy-langu. 32 33 IF lw_t001w-werks IS NOT INITIAL. 34 CONCATENATE lw_t001w-werks '工厂名称为' lw_t001w-name1 INTO zmsg. 35 lw_return-mesg = zmsg. 36 output-MT_TS01_MM2CEERP_RESP-RETURN = lw_return. 37 ELSE. 38 lw_return-mesg = '该工厂不存在'. 39 output-MT_TS01_MM2CEERP_RESP-RETURN = lw_return. 40 ENDIF. 41 42 43 LOOP AT input-mt_ts01_mm2ceerp_req-item INTO lw_input_item. 44 CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT' "增加前导零 45 EXPORTING 46 input = lw_input_item-matnr 47 IMPORTING 48 output = lw_input_item-matnr. 49 APPEND lw_input_item TO lt_input_item. 50 ENDLOOP. 51 52 LOOP AT lt_input_item INTO lw_input_item. 53 SELECT SINGLE 54 a~matnr 55 a~werks 56 a~lgort 57 b~maktx 58 a~labst 59 FROM mard AS a INNER JOIN makt AS b 60 ON a~matnr = b~matnr 61 INTO CORRESPONDING FIELDS OF lw_output_item 62 WHERE a~matnr = lw_input_item-matnr AND 63 a~werks = lw_input_item-werks AND 64 a~lgort = lw_input_item-lgort AND 65 b~spras = sy-langu. 66 67 IF sy-subrc eq 0. 68 APPEND lw_output_item TO output-mt_ts01_mm2ceerp_resp-item. 69 CLEAR: lw_output_item. 70 ENDIF. 71 ENDLOOP. 72 73 ENDMETHOD.