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.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM