ABAP/Java PROXY 同步调用 and 异步调用(转)

原文链接:http://blog.sina.com.cn/s/blog_c0978c9b0102va9z.html

一:同步调用

Proxy分为两种,ABAP ProxyJAVA Proxy。他们之间的不同不仅在于语言,ABAP Proxy在应用端(R/3)生成的,JAVAProxy是从IR中生成的.JAR文件。但是它们都是依据message interface中的WSDL产生的。
       Proxy具有与message interface相同的属性:Inbound, Outbound, Synchronous, Asynchronous
ABAP Proxy之前,要用 RZ70去建立R/3PI的连接。这里还可能需要用SM59去定义相应的RFC Destination。用SMGW可以在PI的端找到相应的Service
     TableSPROXSET,是用来设置SPROXY权限的,可以查找在这张表里查找自己是不是有权限。
     T-CODESPROXY就是在Application端生成PROXY的主要工具,在这之前,你需要在PI端设置好相应的Message InterfaceSAP端才能根据Message InterfaceWSDL生成ABAP Proxy。
 
         JAVAProxy相对简单,只要在Message Interface中右击相应的Message Interface,会有Java Proxy Generation选项,就可以自动生成JAVAProxy.JAR文件,开发人员可以对其进行部署。
 
这里我不再对proxy做介绍,只是讲调用过程。
 
首先创建了功能函数,没必要是rfc。(当然,可以在proxy代理类内直接写功能代码,不推荐)
比如:创建外向交货单的fm: ZFM_IF_OUT_DELIVERY_CREATE_SLS
 
然后进入proxy创建代理
 
t-code:sproxy
 
进入如下初始:

 大概的层级如下:

到 点开 service interfaces,
中文是

 找到对应的代理(接口那边会告诉你具体名称),未生成的代理和已经生成的,图标是不一样的。

 找到需要生成的代理,双击,提示如下界面,然后按要求填上就行了

 

然后保存,然后激活。会提示如下:
这个时候双击proxy的 class,不是proxy name。
如果双击class提示什么不存在,说明没激活,全部激活就可以了
尽到类里面,双击method就行了。然后里面写代码。

 在里面实现功能代码即可

最后保存,激活即可。
如果接口有任何变动,记得激活后重新生成代理

 或者:

这里需要注意的是参数,
传入参数,都是string类型的
然后需要根据名称,转换为咱们需要的类型,然后再去调用接口函数。
最后把返回结果转为string。再赋给代理
 
这是同步的,比较简单
 
 
 
二:异步调用
同步调用的时候,都行选的后缀是in的代理
比如:
后最是out的,是异步调用的。
 
到这里以后,同样是双击,创建,弹出界面也一样,然后保存,保存后激活。
然后这里,发现没有同步时的那个proxy class、
这里直接双击proxy name即可

 然后双击out的方法

 会跳到如下界面,代码是自动生成的,不用处理

全部激活就行了
如果接口有改动,记得重新生成。
异步的,不像同步,执行完了就直接返回了
需要写代码执行。
 
大部分代码是固定的。
FORM frm_call_proxy  TABLES   pt_data STRUCTURE zsdslh0515.

***&调用代理返回日志
***&执行ABAP  PROXY返回EC5.0日志信息
  DATA: ls_output TYPE zfmmm_qth_if00020_input,
        lt_zmroskjxylogl TYPE zmmshg00520_tab.

  DATA: ls_proxy TYPE REF TO zco_si_djz_hg_erp_rph_data_a_o,
        ls_sys_exception TYPE REF TO cx_ai_system_fault,
        lv_subrc  TYPE sy-subrc,
        lv_errlog TYPE string.

***&给返回代理赋值
  CLEAR ls_output.

  REFRESH lt_zmroskjxylogl.
  CALL FUNCTION 'ZFM_CA_STRING_TB_STRUCT'“这里是自己封装的一个函数,把结构里字段转为string
    EXPORTING
      iv_type = '2'
    TABLES
      it_data = pt_data               """""""""
      et_data = lt_zmroskjxylogl.

  IF NOT lt_zmroskjxylogl[] IS INITIAL.
    ls_output-it_zmmthg00520-item = lt_zmroskjxylogl.
  ENDIF.

**&调用反馈代理
  IF ls_output IS NOT INITIAL.
    TRY.
        CREATE OBJECT ls_proxy .  "端口
      CATCH cx_ai_system_fault INTO ls_sys_exception.
        lv_subrc = '4'.
        lv_errlog = ls_sys_exception->get_text( ).
      CATCH cx_ai_application_fault.
        lv_subrc = 4.

    ENDTRY.
    IF lv_subrc <> '4'.
      "传输数据
      TRY.
          CALL METHOD ls_proxy->si_djz_hg_erp_rph_data_a_out ”代理名称
            EXPORTING
              output = ls_output.

        CATCH cx_ai_system_fault INTO ls_sys_exception.
          lv_subrc = '4'.
          lv_errlog = ls_sys_exception->get_text( ).
        CATCH cx_ai_application_fault.
          lv_subrc = 4.
      ENDTRY.
    ENDIF.
  ENDIF.
ENDFORM.                    " FRM_CALL_PROXY

 

 
 
posted @ 2020-05-28 08:47  不渡之人  阅读(770)  评论(0)    收藏  举报