RFC同步和异步

非同步方式中,RECEIVE 子FORM中WRITE輸出都不會顯示在螢幕。
set user_command  'OKCD'也起不到觸發AT USER-COMMAND事件。
sy-ucomm = 'OKCD'. sy-ucomm的值?空。
一、先用SM59建立兩個系統間連接。
二、在被調用伺服器上建立RFC遠端調用函數。記得一定要釋放(不是啟動)
FUNCTION ZRFC_USER_READ.
*"----------------------------------------------------------------------
*"*"Local interface:
*"  IMPORTING
*"     VALUE(USER_NAME) TYPE  XUBNAME
*"  EXPORTING
*"     VALUE(USER_ADDR) TYPE  USER_ADDR
*"     VALUE(SYSTEM_ID) TYPE  SYSYSID
*"  TABLES
*"      USER_PARA STRUCTURE  USR05
*"----------------------------------------------------------------------
select single name_first name_last name_textc tel_extens kostl
into corresponding fields of
  user_addr
 from user_addr
 
where bname = user_name.
select * into table user_para from usr05
where bname = user_name.
system_id = sy-sysid.
ENDFUNCTION.
三、在調用伺服器上建立調用程式。
1)同步調用
DATA: user_addr TYPE user_addr,
system_id TYPE sysysid,
user_para LIKE TABLE OF usr05 WITH HEADER LINE,
msg_text(128).
*同步RFC調用
CALL FUNCTION 'ZRFC_USER_READ'
DESTINATION 'GS4CLNT100'
  EXPORTING
    user_name       = 'LU.X'
 IMPORTING
   USER_ADDR       = USER_ADDR
   SYSTEM_ID       = SYSTEM_ID
  tables
    user_para       = USER_PARA
  exceptions
    communication_failure = 1 message msg_txt
    system_failure = 2 message msg_txt.
          .
WRITE:USER_ADDR-NAME_FIRST, USER_ADDR-NAME_LAST.
2)非同步調用
*&---------------------------------------------------------------------*
*& Report  Z_RFC_USERGET                                               *
*&                                                                     *
*&---------------------------------------------------------------------*
*&                                                                     *
*&                                                                     *
*&---------------------------------------------------------------------*
REPORT  z_rfc_userget                           .
TABLES: usr05.
DATA: user_addr TYPE user_addr,
system_id TYPE sysysid,
user_para LIKE TABLE OF usr05 WITH HEADER LINE,
msg_text(128).
**非同步RFC調用取結果
CALL FUNCTION 'ZRFC_USER_READ'
  DESTINATION 'GS4CLNT100'
  STARTING NEW TASK 'B1'
  PERFORMING return_user ON END OF TASK 
      EXPORTING
         user_name             = 'LU.X'
       EXCEPTIONS
        communication_failure = 1  MESSAGE msg_text
        system_failure        = 2  MESSAGE msg_text.
.
IF sy-subrc = 0.
  WRITE: 'WAIT FOR REPLY.'.
ELSE.
  WRITE msg_text.
ENDIF.
WAIT UNTIL user_para[] IS NOT INITIAL.
IF user_para[] IS INITIAL.
  WRITE:/ 'DESTINATION NOT READY YET.'.
ELSE.
  WRITE:/ 'DESTINATION IS REACHED.'.
ENDIF.

AT USER-COMMAND.
  IF sy-ucomm = 'OKCD'.
    IF msg_text = space.
      WRITE: / 'DESTINATION SYSTEM',system_id.
      LOOP AT user_para.
        WRITE: / user_para-bname,
        user_para-parid,
        user_para-parva.
*        INSERT user_para." FROM TABLE USER_PARA .
      ENDLOOP.
      IF user_para[] IS NOT INITIAL.
        INSERT usr05 FROM TABLE  user_para.
        IF sy-subrc NE 0.
          MESSAGE 'insert usr05 failed!' TYPE 'E'.
        ENDIF.
      ELSE.
        WRITE msg_text.
      ENDIF.
    ENDIF.
  ENDIF.
*&--------------------------------------------------------------------*
*&      Form  RETURN_USER
*&--------------------------------------------------------------------*
*       text
*---------------------------------------------------------------------*
*      -->TASKNAME   text
*---------------------------------------------------------------------*
FORM. return_user USING taskname.
  RECEIVE RESULTS FROM FUNCTION 'ZRFC_USER_READ'
   IMPORTING
     user_addr             = user_addr
     system_id             = system_id
   TABLES
     user_para             = user_para
   EXCEPTIONS
     communication_failure = 1  MESSAGE msg_text
     system_failure        = 2  MESSAGE msg_text.
  IF user_para[] IS INITIAL.
    WRITE: 'NO OUTPUT FROM ARFC.'.
  ELSE.
      WRITE: 'RECEIVE RESULTS FROM FUNCTION ZRFC_USER_READ'.
    SET USER-COMMAND 'OKCD'.
  ENDIF.
ENDFORM.                    "RETURN_USER

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值