我的第一个SAP PROXY ABAP Program(SAP PO 开发五)

登陆PO服务器,启动JAVA客户端三步(SAP PO 开发一)

搭建一个WebService接口环境(SAP PO 开发 二)

用SAP PO连通一个WebService接口(SAP PO 开发 三)

ERP系统RFC协议发送端通过PO连通WebService接口(SAP PO 开发四)

我的第一个SAP PROXY ABAP Program(SAP PO 开发五)

SAP PO (Process Orchestration) 中间件接口管理平台(SAP PO 开发六)

接口开发技术概念与名词术语解释(SAP PO 开发七)

C# 调用SAP PO中间件的WebService接口(SAP PO 开发八)

 

 

SAP PO 开发系列接近尾声,当然最后还需要一个压轴大戏DEMO006:PROXY2SOAP。

这次我们要使用久违的PROXY,通过使用PROXY我们才知道SAP 接口开发中RFC和PROXY的本质区别,

而网上那篇SAP IDOC、RFC、PROXY协议比较的表格终归讲得太浅。

 

一、DEMO006的场景:

SAP HCM系统中通过PROXY方式传出一个数据给PO,PO把这个数据传给一个WebService。

WebService收到数据后,把数据放到一段文本中返回PO,PO再返回到SAP HCM系统中。

二、DEMO006在PO上SLD的配置内容:

三、打开PO的Enterprise Services Builder配置:

1、同SAP HCM相关的接口内容DT、MT、SI:

发出变量定义int

收到返回的字符串

向上封装成MT

带出SI

2、同WebSerivce相关的接口内容DT、MT、SI:

因为WS是有接口描述文件xsdl的,我们就偷懒不用创建DT、MT了。

直接用xsdl创建ED,ED再创建SI就好。

创建MM的请求和返回

 

创建OM

四、打开PO的Integration Builder配置:

建一个demo006集成环境,空的就行。

建一个CC通道,注意看协议是基于HTTP的XI3.0,

说明SAP ABAP端是把数据封装到基于HTTP的XI协议发给PO的:

建一个CC通道,在WebService这边,注意看协议是标准的WS的SOAP协议:

最后建IC的1~4页签:

PO端配置完成。

 

 

五、在SAP服务器的ABAP环境中作一个proxy程序

SPROXY事务代码中,可以看到已经有了DEMO006

在Service_Consumers中,点SI_demo006_sender,创建一个proxy:

这个proxy的参数,我们看到有MT:

点一个MT进去,里面还有一个DT类型,这些都是SAP根据PO创建的数据结构自己创建的

DT里面有我们的一个变量:

 

写一个ABAP程序,调用这个proxy接口:

DATA  LO_PROXY TYPE REF TO ZPOCO_SI_DEMO006_SENDER.
DATA  Z1 TYPE ZPOMT_DEMO006_RESPONE.
DATA  Z2 TYPE ZPOMT_DEMO006_REQUEST.

Z2-MT_DEMO006_REQUEST-ZVALUE  = 3.

CREATE OBJECT LO_PROXY.

  TRY.
    CATCH CX_AI_SYSTEM_FAULT.
  ENDTRY.


  TRY.
      LO_PROXY->SI_DEMO006_SENDER(
        EXPORTING
        OUTPUT = Z2
        IMPORTING
        INPUT  = Z1
        ).
    CATCH CX_ROOT INTO DATA(LCX_ERROR).
      DATA(ERR_TEXT) = LCX_ERROR->GET_TEXT( ). "得到错误信息
  ENDTRY.


WRITE:/ ERR_TEXT.
WRITE:/ Z1-MT_DEMO006_RESPONE-ZRETURN.

运行程序,得到WS的返回文本:

 

SAP RFC协议工作在SOCKET底层,它的使用环境是ABAP,C#的NCO、JAVA的JCO类库。

SAP PROXY的XI协议,工作在上面的HTTP层,它的环境是借助PI、PO系统提供上层的基于SOAP的服务。

我想这是RFC和PROXY的本质区别。

既然DEMO007是RFC的,DEMO006是PROXY的,他们都是发给同一个WS接口,那我们就来作一个性能测试:

 

对同一个WS接口,发收数据100次,我们看看他们的时间差别:

我想,PROXY的耗时主要用在对HTTP协议转换上了。

--------------2019-6-3-------------------------------------------------

我一直在思考一个问题,如果RFC工作在底层,它的效率最高,那为什么SAP还会推出PROXY,

而且从SAP项目选择来看,SAP-RFC的接口技术正在被PROXY所取代。

随做对PROXY认识的加深,我终于明白了。

单纯的比较性能,肯定是RFC工作在底层,RFC最厉害。

但要实现RFC有很多前提:

1、需要外围系统使用RFC的类库编程,这个虽然很简单,但是并不被大量的开发工程师所掌握。

2、除了外围系统,SAP系统使用RFC,需要在系统内定义自己表的结构,这个工作虽然也简单,但是它还是需要人天。

3、使用RFC,是2份工作要协同:SAP系统内ABAP工作,外围系统NCO、JCO工作大家要一起调试。

而PROXY呢:

1、PO顾问会按外围系统的WebService接口描述wsdl,导入PO中,创建接口DateType数据定义,然后啪啪配置一番联通。

2、SAP系统中是带入PO的数据定义,不用自己创建,然后ABAP代码直接调用。

3、基本不需要2个系统的调试,这个主动权会掌握在PO集成开发顾问这里。

RFC和PROXY的差别也体现在工作量上,PROXY的工作量会远远小于使用RFC。

 

 

 

 

 

 

下面是2段公平的测试程序代码:

 

*&---------------------------------------------------------------------*
*& Report ZDEMO007
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZDEMO007.

DATA GV_VALUE TYPE /BCV/FND_INT1.
DATA GV_GETDATARESULT TYPE /ASU/TEXT.


*请按系统实际情况填写如下信息
WRITE: /'****************************'.
WRITE: / 'SAP系统: RFC'.
WRITE: /'****************************'.
WRITE: /.




DATA: T1 TYPE I,
      T2 TYPE I,
      T TYPE P DECIMALS 0.

DATA: GV_C(6) TYPE C .


DATA N TYPE I VALUE 100.
DATA ALL TYPE I.
DATA TMP TYPE I.


T = 0.


 GET RUN TIME FIELD T1.

 DO N TIMES.



*****************************
* Code to be tested *
*****************************

GV_VALUE = 9.


  CALL FUNCTION 'ZDEMO007' DESTINATION 'ZDEMO007'
    EXPORTING
      VALUE               =   GV_VALUE
   IMPORTING
     GETDATARESULT       =  GV_GETDATARESULT .



ENDDO.

GET RUN TIME FIELD T2.



T = ( T2 - T1 ) / 1000000.

GV_C = T.
CONDENSE GV_C NO-GAPS.


WRITE: /'耗时:' , GV_C , '秒'.

 

===============

 

*&---------------------------------------------------------------------*
*& Report ZDEMO006
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZDEMO006.

DATA  LO_PROXY TYPE REF TO ZPOCO_SI_DEMO006_SENDER.
DATA  Z1 TYPE ZPOMT_DEMO006_RESPONE.
DATA  Z2 TYPE ZPOMT_DEMO006_REQUEST.


*请按系统实际情况填写如下信息
WRITE: /'****************************'.
WRITE: / 'SAP系统: PROXY'.
WRITE: /'****************************'.
WRITE: /.


DATA: T1 TYPE I,
      T2 TYPE I,
      T TYPE P DECIMALS 0.

DATA: GV_C(6) TYPE C .


DATA N TYPE I VALUE 100.
DATA ALL TYPE I.
DATA TMP TYPE I.


T = 0.



Z2-MT_DEMO006_REQUEST-ZVALUE  = 3.


  CREATE OBJECT LO_PROXY.
  TRY.

    CATCH CX_AI_SYSTEM_FAULT.
  ENDTRY.


GET RUN TIME FIELD T1.

DO N TIMES.

*     TRY .

      LO_PROXY->SI_DEMO006_SENDER(
        EXPORTING
        OUTPUT = Z2
        IMPORTING
        INPUT  = Z1
        ).
* CATCH CX_ROOT INTO DATA(LCX_ERROR).
*      DATA(ERR_TEXT) = LCX_ERROR->GET_TEXT( ). "得到错误信息
*     ENDTRY.

ENDDO.


GET RUN TIME FIELD T2.
T = ( T2 - T1 ) / 1000000.

GV_C = T.
CONDENSE GV_C NO-GAPS.


WRITE: /'耗时:' , GV_C , '秒'.



*WRITE:/ ERR_TEXT.
*  WRITE:/ Z1-MT_DEMO006_RESPONE-ZRETURN.

 

 

 

 

好的,下面是经过优化后的代码: ```sql CREATE TABLE `xt_framework` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `user_id` int(11) NOT NULL DEFAULT '0' COMMENT '用户', `user_name` varchar(20) NOT NULL DEFAULT '' COMMENT '主管名称', `name` varchar(30) NOT NULL DEFAULT '' COMMENT '名称', `left` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT '左', `right` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT '右', `p_names` varchar(128) NOT NULL DEFAULT '' COMMENT '全部父级部门名称', `level` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '等级', `is_proxy` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '是否是上级代理', `del_at` int(10) unsigned NOT NULL DEFAULT '0', `is_del` tinyint(1) unsigned NOT NULL DEFAULT '0', PRIMARY KEY (`id`), KEY `user_id` (`user_id`), KEY `name` (`name`), KEY `left_right` (`left`,`right`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='公司组织架构'; ``` 这里对表结构进行了如下优化: 1. 将varchar类型的字段长度根据实际需要进行调整,减少存储空间的浪费,例如将`user_name`字段长度从30调整为20,将`p_names`字段长度从256调整为128。 2. 将索引的使用进行优化,例如将原来的联合索引`INDEX `left` (`left`,`right`)`调整为单列索引`INDEX `left_right` (`left`,`right`)`,同时添加了对`left`和`right`字段的索引,以提高查询效率。 3. 对于经常进行查询的字段,例如`user_id`和`name`,添加了单列索引,以提高查询效率。 4. 字段类型进行了调整,例如将`level`字段从`smallint`调整为`tinyint`,将`is_proxy`和`is_del`字段从`tinyint(1)`调整为`tinyint(1) unsigned`,以减少存储空间的浪费。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘欣的博客

你将成为第一个打赏博主的人!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值