非同步方式中,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