• SAP PI开发手册-ERP发布服务供外部系统调用(sproxy代理类)


    转自:https://www.cnblogs.com/fanjb/p/10829858.html

    一、      接口内容

    接口详细信息

    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,'&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;')">
     9                 <xsl:value-of select="substring-after($xmlStr,'&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;')" disable-output-escaping="yes"/>
    10             </xsl:when>
    11             <xsl:when test="contains($xmlStr,'&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;')">
    12                 <xsl:value-of select="substring-after($xmlStr,'&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;')" 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.

  • 相关阅读:
    2013 年最不可思议的 10 个硬件开源项目
    三款SDR平台对比:HackRF,bladeRF和USRP
    形同虚设:花费700美元便可突破门禁
    oracle timestamp和date区别
    linux服务器性能——CPU、内存、流量、磁盘使用率的监控
    通过安装memadmin对memcache进行可视化管理
    SNMP MIBs and IPv6
    使用 cacti 监控 windows 服务器硬盘的 I/O 状况
    snmp对超过16T的磁盘大小识别不对的解决办法
    源码编译安装net-snmp
  • 原文地址:https://www.cnblogs.com/BruceKing/p/11341060.html
Copyright © 2020-2023  润新知