*&---------------------------------------------------------------------* *& Report Name : /EUTIN/RFC_CHECK_AND_TEST *& Title : ABAP-Demo: RFC Configuration and Error Analysis *& Developer : Michael Eutin - 06.12.2025 *& Development Class : $TMP *& Description : *& Call rfc-enabled function module RFC_PING or RFC_SYSTEM_INFO in *& requested RFC destination to check the RFC connection and availability *& of the destination server. *& *& Display of the RFC destination configuration and system configuration, *& logon information and allowed users for the RFC call. *& *& Provide list of transaction codes for problem alanysis. *& *& Define dynamic RFC destination using parametes from selection screen *& to call either a remote logon via SAP GUI or execute specific RFC-enabled *& function modules in this generic RFC destination... *& *&---------------------------------------------------------------------* *& CHANGE HISTORY *&---------------------------------------------------------------------* *& Date Description *&---------------------------------------------------------------------* *& *& *& *&---------------------------------------------------------------------* REPORT /eutin/rfc_check_and_test NO STANDARD PAGE HEADING LINE-SIZE 1023. *---------------------------------------------------------------------- * definition of local macros *---------------------------------------------------------------------- DEFINE check_mandatory_parameter. IF mv&1 IS INITIAL. MESSAGE |Angabe fehlt: { %_p&1_%_app_%-text }='{ mv&1 }'!| TYPE 'S' DISPLAY LIKE 'E'. RETURN. ENDIF. END-OF-DEFINITION. *---------------------------------------------------------------------- * definition of local classes *---------------------------------------------------------------------- CLASS lcl_main DEFINITION FINAL. PUBLIC SECTION. CLASS-DATA: mv_ucomm TYPE sy-ucomm, mv_rdest TYPE rfcdes-rfcdest, mv_lclie TYPE sy-mandt, mv_luser TYPE rfcuser, mv_lpass TYPE rfcauth, mv_llang TYPE sy-langu, mv_sid TYPE rfcsysid, mv_servh TYPE rfchost, mv_sysno TYPE rfcservice, mv_group TYPE rfcload, mv_nogui TYPE abap_bool, mv_unico TYPE abap_bool, mv_icone TYPE abap_bool, mv_authc TYPE abap_bool, mv_nolsn TYPE abap_bool, mv_remote TYPE abap_bool, mv_callfu TYPE abap_bool, mv_destination TYPE rfcdest. CLASS-METHODS: init, pbo_1000, pai_1000 IMPORTING iv_ucomm TYPE syucomm iv_rdest TYPE rfcdes-rfcdest iv_lclie TYPE symandt iv_luser TYPE rfcuser iv_lpass TYPE rfcauth iv_llang TYPE sylangu iv_sid TYPE rfcsysid iv_servh TYPE rfchost iv_sysno TYPE rfcservice iv_group TYPE rfcload iv_nogui TYPE abap_bool iv_unico TYPE abap_bool iv_icone TYPE abap_bool iv_authc TYPE abap_bool iv_nolsn TYPE abap_bool iv_remote TYPE abap_bool iv_callfu TYPE abap_bool, call_rfc_ping, call_rfc_system_info, create_generic_rfcdest, remote_login, execute_rfc_call. ENDCLASS. *---------------------------------------------------------------------- * selection screen 1000 *---------------------------------------------------------------------- SELECTION-SCREEN BEGIN OF TABBED BLOCK tbl FOR 20 LINES. SELECTION-SCREEN TAB (25) b00 USER-COMMAND tab1 DEFAULT SCREEN 9000. SELECTION-SCREEN TAB (25) b01 USER-COMMAND tab2 DEFAULT SCREEN 9001. SELECTION-SCREEN TAB (50) b02 USER-COMMAND tab3 DEFAULT SCREEN 9010. SELECTION-SCREEN END OF BLOCK tbl. SELECTION-SCREEN BEGIN OF SCREEN 9000 AS SUBSCREEN. PARAMETERS p_rdest TYPE rfcdes-rfcdest. SELECTION-SCREEN SKIP 1. SELECTION-SCREEN PUSHBUTTON /2(68) rfc_ping USER-COMMAND rfc_ping. SELECTION-SCREEN PUSHBUTTON /2(68) rfc_info USER-COMMAND rfc_system_info. SELECTION-SCREEN PUSHBUTTON /2(68) rfctscma USER-COMMAND $_rfc_t_scma_rfc. SELECTION-SCREEN END OF SCREEN 9000. SELECTION-SCREEN BEGIN OF SCREEN 9001 AS SUBSCREEN. SELECTION-SCREEN PUSHBUTTON /2(68) sm59 USER-COMMAND $_sm59. SELECTION-SCREEN PUSHBUTTON /2(68) rsrfcchk USER-COMMAND $_rsrfcchk. SELECTION-SCREEN PUSHBUTTON /2(68) sping USER-COMMAND $_sping. SELECTION-SCREEN PUSHBUTTON /2(68) os01 USER-COMMAND $_os01. SELECTION-SCREEN PUSHBUTTON /2(68) sm49 USER-COMMAND $_sm49. SELECTION-SCREEN PUSHBUTTON /2(68) sm69 USER-COMMAND $_sm69. SELECTION-SCREEN PUSHBUTTON /2(68) rsrfctrc USER-COMMAND $_rsrfctrc. SELECTION-SCREEN PUSHBUTTON /2(68) rsrfcstx USER-COMMAND $_rsrfcstx. SELECTION-SCREEN PUSHBUTTON /2(68) strfctra USER-COMMAND $_strfctrace. SELECTION-SCREEN PUSHBUTTON /2(68) rspfparr USER-COMMAND $_rspfpar_rfc. SELECTION-SCREEN PUSHBUTTON /2(68) rsusraud USER-COMMAND $_rsusr002_audit_rfc. SELECTION-SCREEN PUSHBUTTON /2(68) slg1 USER-COMMAND $_slg1. SELECTION-SCREEN PUSHBUTTON /2(68) st22 USER-COMMAND $_st22. SELECTION-SCREEN PUSHBUTTON /2(68) se16rfcd USER-COMMAND $_se16rfcdessecu. SELECTION-SCREEN END OF SCREEN 9001. SELECTION-SCREEN BEGIN OF SCREEN 9010 AS SUBSCREEN. SELECTION-SCREEN BEGIN OF BLOCK dyn WITH FRAME TITLE dyn_sel. PARAMETERS: p_lclie TYPE sy-mandt DEFAULT sy-mandt, p_luser TYPE rfcuser DEFAULT sy-uname, p_lpass TYPE rfcauth, p_llang TYPE sy-langu DEFAULT sy-langu, p_sid TYPE rfcsysid DEFAULT sy-sysid, p_servh TYPE rfchost DEFAULT sy-host, p_sysno TYPE rfcservice, p_group TYPE rfcload DEFAULT 'PUBLIC', p_nogui TYPE abap_bool DEFAULT abap_true, p_unico TYPE abap_bool DEFAULT abap_true, p_icone TYPE abap_bool DEFAULT abap_true, p_authc TYPE abap_bool DEFAULT abap_true, p_nolsn TYPE abap_bool DEFAULT abap_true. SELECTION-SCREEN BEGIN OF BLOCK opt WITH FRAME TITLE dyn_opt. PARAMETERS: p_remote RADIOBUTTON GROUP opt USER-COMMAND $$$dummy$$$, p_callfu RADIOBUTTON GROUP opt DEFAULT 'X'. SELECTION-SCREEN END OF BLOCK opt. SELECTION-SCREEN PUSHBUTTON /2(58) rfc_gen USER-COMMAND rfc_gen. SELECTION-SCREEN END OF BLOCK dyn. SELECTION-SCREEN END OF SCREEN 9010. *---------------------------------------------------------------------- * screen 0100: dummy screen for HTML output *---------------------------------------------------------------------- SELECTION-SCREEN BEGIN OF SCREEN 0100. SELECTION-SCREEN END OF SCREEN 0100. *----------------------------------------------------------------------* *--- Event INITIALIZATION *----------------------------------------------------------------------* INITIALIZATION. *----------------------------------------------------------------------* lcl_main=>init( ). *----------------------------------------------------------------------* *--- Event Selection Screen 1000: Process Before Output (PBO) *----------------------------------------------------------------------* AT SELECTION-SCREEN OUTPUT. lcl_main=>pbo_1000( ). *----------------------------------------------------------------------* *--- Event Selection Screen 1000: Process After Input (PAI) *----------------------------------------------------------------------* AT SELECTION-SCREEN. lcl_main=>pai_1000( EXPORTING iv_ucomm = sy-ucomm iv_rdest = p_rdest iv_lclie = p_lclie iv_luser = p_luser iv_lpass = p_lpass iv_llang = p_llang iv_sid = p_sid iv_servh = p_servh iv_sysno = p_sysno iv_group = p_group iv_nogui = p_nogui iv_unico = p_unico iv_icone = p_icone iv_authc = p_authc iv_nolsn = p_nolsn iv_remote = p_remote iv_callfu = p_callfu ). *----------------------------------------------------------------------* *--- Event START-OF-SELECTION *----------------------------------------------------------------------* START-OF-SELECTION. RETURN. *---------------------------------------------------------------------- * implementation of local classes *---------------------------------------------------------------------- CLASS lcl_main IMPLEMENTATION. METHOD init. DATA: lv_instance_number TYPE instanz-systemnr. *--- default texts and valus on generated selection screen 1000 sy-title = 'Demo: RFC Konfiguration und Fehlersuche'. b00 = 'Testverbindung'. rfc_ping = |{ icon_execute_object } RFC_PING im Ziel "RFC-Destination" ausführen|. rfc_info = |{ icon_execute_object } RFC_SYSTEM_INFO im Ziel "RFC-Destination" ausführen|. rfctscma = |{ icon_execute_object } Transaktion im Ziel "RFC-Destination" aufrufen (RFC_T_SCMA_RFC)|. b01 = 'Konfig & Fehlersuche'. sm59 = |{ icon_execute_object } RFC Destinations (Display/Edit) (SM59)|. rsrfcchk = |{ icon_execute_object } RFC Destinations mit Anmeldedaten (RSRFCCHK)|. sping = |{ icon_execute_object } Transaktion SPING (SPING)|. os01 = |{ icon_execute_object } LAN-Prüfung mit PING (OS01)|. sm49 = |{ icon_execute_object } Ausführen externer OS-Kommandos "niping" (SAP-Note 2986631) (SM49)|. sm69 = |{ icon_execute_object } Pflegen externer OS-Kommandos "niping" (SAP-Note 2986631) (SM69)|. rsrfctrc = |{ icon_execute_object } RFC-Trace (RSRFCTRC)|. rsrfcstx = |{ icon_execute_object } RFC-Statistik (RSRFCSTX)|. strfctra = |{ icon_execute_object } RFC Statistiksätze auswerten (STRFCTRACE)|. rspfparr = |{ icon_execute_object } RFC Profile-Parameter anzeigen (RSPFPAR_RFC)|. rsusraud = |{ icon_execute_object } Benutzer, die RFCs ausführen dürfen (RSUSR002_AUDIT_RFC)|. slg1 = |{ icon_execute_object } Anwendungs-Log: Protokolle anzeigen (SLG1)|. st22 = |{ icon_execute_object } ABAP-Laufzeitfehler anzeigen (ST22)|. se16rfcd = |{ icon_execute_object } Data Browser RFCDESSECU (SE16RFCDESSECU)|. b02 = 'Definition "generische RFC-Destination" ohne SM59'. dyn_sel = 'Zielsystem: Host- und Anmeldeinformation'. dyn_opt = 'Optionen'. rfc_gen = |{ icon_execute_object } RFC_SYSTEM_INFO in gererischer RFC-Destination ausführen|. p_rdest = 'NONE'. p_lclie = sy-mandt. p_luser = sy-uname. p_lpass = '***'. p_llang = sy-langu. p_sid = sy-sysid. p_servh = sy-host. CALL FUNCTION 'GET_SYSTEM_NUMBER' IMPORTING instancenumber = lv_instance_number. p_sysno = lv_instance_number. p_group = 'PUBLIC'. p_nogui = abap_true. p_unico = abap_true. p_icone = abap_true. p_authc = abap_true. p_nolsn = abap_true. ENDMETHOD. METHOD pbo_1000. %_p_rdest_%_app_%-text = 'RFC-Destination'. %_p_lclie_%_app_%-text = 'Mandant'. %_p_luser_%_app_%-text = 'Benutzername'. %_p_lpass_%_app_%-text = 'Kennwort'. %_p_llang_%_app_%-text = 'Sprache'. %_p_sid_%_app_%-text = 'System-ID'. %_p_servh_%_app_%-text = 'Hostname/IP'. %_p_sysno_%_app_%-text = 'Servicenummer'. %_p_group_%_app_%-text = 'Gruppe'. %_p_nogui_%_app_%-text = 'kein GUI'. %_p_unico_%_app_%-text = 'Unicode'. %_p_icone_%_app_%-text = 'Konv-Fehler ignorieren'. %_p_authc_%_app_%-text = 'keine Berechtiungsprüfung'. %_p_nolsn_%_app_%-text = 'kein Anmeldebild'. %_p_remote_%_app_%-text = 'SAP GUI Remote Login'. %_p_callfu_%_app_%-text = 'Funktionsbaustein ausführen'. LOOP AT SCREEN. IF screen-name EQ 'P_LPASS'. screen-invisible = '1'. "ensure hidden input of the password MODIFY SCREEN. ENDIF. ENDLOOP. ENDMETHOD. METHOD pai_1000. * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *--- pai_1000 IMPORTING iv_ucomm TYPE syucomm *--- iv_rdest TYPE rfcdes-rfcdest *--- iv_fname TYPE tfdir-funcname *--- iv_lclie TYPE symandt *--- iv_luser TYPE rfcuser *--- iv_lpass TYPE rfcauth *--- iv_llang TYPE sylangu *--- iv_sid TYPE rfcsysid *--- iv_servh TYPE rfchost *--- iv_sysno TYPE rfcservice *--- iv_group TYPE rfcload *--- iv_nogui TYPE abap_bool *--- iv_unico TYPE abap_bool *--- iv_icone TYPE abap_bool *--- iv_authc TYPE abap_bool *--- iv_nolsn TYPE abap_bool *--- iv_remote TYPE abap_bool *--- iv_callfu TYPE abap_bool, * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - mv_ucomm = iv_ucomm. mv_rdest = iv_rdest. mv_lclie = iv_lclie. mv_luser = iv_luser. mv_lpass = iv_lpass. mv_llang = iv_llang. mv_sid = iv_sid. mv_servh = iv_servh. mv_sysno = iv_sysno. mv_group = iv_group. mv_nogui = iv_nogui. mv_unico = iv_unico. mv_icone = iv_icone. mv_authc = iv_authc. mv_nolsn = iv_nolsn. mv_remote = iv_remote. mv_callfu = iv_callfu. CLEAR mv_destination. CASE mv_ucomm. WHEN '$$$DUMMY$$$'. CASE abap_true. WHEN p_remote. "SAP GUI Remote Login p_nogui = abap_false. "With GUI WHEN p_callfu. "Call RFC-enabled function modules p_nogui = abap_true. "No GUI WHEN OTHERS. RETURN. ENDCASE. WHEN 'RFC_PING'. call_rfc_ping( ). RETURN. WHEN 'RFC_SYSTEM_INFO'. call_rfc_system_info( ). RETURN. WHEN 'RFC_GEN'. create_generic_rfcdest( ). WHEN OTHERS. *--- execute transactioncode IF mv_ucomm IS NOT INITIAL AND mv_ucomm+0(2) = '$_'. DATA lv_tcode TYPE sytcode. lv_tcode = mv_ucomm+2. CALL FUNCTION 'ABAP4_CALL_TRANSACTION' EXPORTING tcode = lv_tcode EXCEPTIONS call_transaction_denied = 1 tcode_invalid = 2 OTHERS = 3. IF sy-subrc IS NOT INITIAL. IF sy-msgty IS NOT INITIAL. MESSAGE ID sy-msgid TYPE 'I' NUMBER sy-msgno DISPLAY LIKE 'E' WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. MESSAGE |Fehler beim Aufruf der Transaktion { mv_ucomm }| TYPE 'S' DISPLAY LIKE 'E'. RETURN. ENDIF. ENDIF. ENDCASE. ENDMETHOD. METHOD call_rfc_ping. DATA: lv_message TYPE c LENGTH 255. *--- ensure mandatory parameters are provided check_mandatory_parameter _rdest. CALL FUNCTION 'RFC_PING' DESTINATION mv_rdest EXCEPTIONS communication_failure = 1 MESSAGE lv_message system_failure = 2 MESSAGE lv_message OTHERS = 3. IF sy-subrc IS NOT INITIAL. IF lv_message IS NOT INITIAL. MESSAGE lv_message TYPE 'S' DISPLAY LIKE 'E'. RETURN. ENDIF. MESSAGE |RFC_PING: error code = '{ sy-subrc }'| TYPE 'S' DISPLAY LIKE 'E'. ENDIF. MESSAGE 'RFC_PING wurde erfolgreich bestätigt' TYPE 'S'. RETURN. ENDMETHOD. METHOD call_rfc_system_info. DATA: ls_rfcsi_export TYPE rfcsi, lv_current_resources TYPE syindex, lv_maximal_resources TYPE syindex, lv_recommended_delay TYPE syindex, lv_s4_hana TYPE char1, lv_fast_ser_vers TYPE int4, lv_fqhn TYPE string, lv_message TYPE c LENGTH 255. *--- ensure mandatory parameters are provided check_mandatory_parameter _rdest. CALL FUNCTION 'RFC_SYSTEM_INFO' DESTINATION mv_rdest IMPORTING rfcsi_export = ls_rfcsi_export current_resources = lv_current_resources maximal_resources = lv_maximal_resources recommended_delay = lv_recommended_delay s4_hana = lv_s4_hana fast_ser_vers = lv_fast_ser_vers fqhn = lv_fqhn EXCEPTIONS communication_failure = 1 MESSAGE lv_message system_failure = 2 MESSAGE lv_message OTHERS = 3. IF sy-subrc IS NOT INITIAL. IF lv_message IS NOT INITIAL. MESSAGE lv_message TYPE 'S' DISPLAY LIKE 'E'. RETURN. ENDIF. MESSAGE |RFC_SYSTEM_INFO: error code = '{ sy-subrc }'| TYPE 'S' DISPLAY LIKE 'E'. ENDIF. cl_demo_output=>write_data( ls_rfcsi_export ). cl_demo_output=>write_data( lv_current_resources ). cl_demo_output=>write_data( lv_maximal_resources ). cl_demo_output=>write_data( lv_recommended_delay ). cl_demo_output=>write_data( lv_s4_hana ). cl_demo_output=>write_data( lv_fast_ser_vers ). cl_demo_output=>write_data( lv_fqhn ). DATA(lv_html) = cl_demo_output=>get( ). cl_abap_browser=>show_html( EXPORTING title = 'RFC_SYSTEM_INFO' html_string = lv_html container = cl_gui_container=>default_screen ). cl_abap_list_layout=>suppress_toolbar( ). CALL SELECTION-SCREEN 0100. cl_abap_browser=>close_browser( ). MESSAGE 'RFC_SYSTEM_INFO wurde erfolgreich beantwortet' TYPE 'S'. RETURN. ENDMETHOD. METHOD create_generic_rfcdest. *--- ensure mandatory parameters are provided check_mandatory_parameter _lclie. check_mandatory_parameter _luser. check_mandatory_parameter _lpass. check_mandatory_parameter _llang. check_mandatory_parameter _sid. check_mandatory_parameter _servh. check_mandatory_parameter _sysno. DATA: lv_in TYPE string, lv_in_out TYPE string, lv_out TYPE string, lv_message TYPE c LENGTH 272. CLEAR mv_destination. COMMIT WORK AND WAIT. cl_dynamic_destination=>create_rfc_destination( EXPORTING logon_client = mv_lclie logon_user = mv_luser logon_password = mv_lpass logon_language = mv_llang sid = mv_sid server = mv_servh system_number = mv_sysno no_gui = mv_nogui unicode = mv_unico ignore_conversion_errors = mv_icone suppress_authority_check = mv_authc no_logon_screen = mv_nolsn RECEIVING destination = mv_destination EXCEPTIONS wrong_parmeter_combination = 1 illegal_input = 2 register_error = 3 kernel_too_old = 4 no_authority = 5 OTHERS = 6 ). IF sy-subrc IS NOT INITIAL. ROLLBACK WORK. MESSAGE |cl_dynamic_destination=>create_rfc_destination: error code = { sy-subrc }| TYPE 'E'. ENDIF. IF mv_destination IS INITIAL. ROLLBACK WORK. MESSAGE 'cl_dynamic_destination=>create_rfc_destination: returned with initial RFC destination!' TYPE 'E'. ENDIF. *--- do not allow any RFC callbacks from called destination! CALL FUNCTION 'RFC_CALLBACK_REJECTED' EXPORTING reject_option = 'S' set_reject_state = 'X' * IMPORTING * GET_REJECT_STATE = EXCEPTIONS invalid_reject_option = 1 invalid_reject_state = 2 function_not_supported = 3 internal_error = 4 OTHERS = 5. IF sy-subrc NE 0. *--- close opened RFC connection and unregister this dynamic RFC destination CALL METHOD cl_dynamic_destination=>unregister_destination EXPORTING destination = mv_destination EXCEPTIONS unregister_error = 1 kernel_too_old = 2 OTHERS = 3. IF sy-subrc NE 0. ROLLBACK WORK. MESSAGE |CL_DYNAMIC_DESTINATION=>UNREGISTER_DESTINATION: error code = { sy-subrc }| TYPE 'E'. ENDIF. *--- ensure RFC connection is closed CALL FUNCTION 'RFC_CONNECTION_CLOSE' EXPORTING destination = mv_destination * TASKNAME = EXCEPTIONS destination_not_open = 1 OTHERS = 2. IF sy-subrc GT 1. ROLLBACK WORK. MESSAGE |RFC_CONNECTION_CLOSE: error code = { sy-subrc }| TYPE 'E'. ENDIF. ROLLBACK WORK. MESSAGE |RFC_CALLBACK_REJECTED: error code = { sy-subrc }| TYPE 'E'. ENDIF. lv_in = p_lclie && ' - ' && p_luser && ' - ' && p_llang && ' - ' && p_sid && ' - ' && p_servh && ' - ' && p_sysno && ' - ' && p_group. lv_in_out = lv_in. CLEAR lv_out. CALL FUNCTION 'DEMO_RFM_PARAMETERS' DESTINATION mv_destination EXPORTING p_in = lv_in IMPORTING p_out = lv_out CHANGING p_in_out = lv_in_out EXCEPTIONS system_failure = 98 MESSAGE lv_message communication_failure = 99 MESSAGE lv_message OTHERS = 1. CASE sy-subrc. WHEN 0. MESSAGE |DEMO_RFM_PARAMETERS: P_IN='{ lv_in }, P_OUT='{ lv_out },P_IN_OUT='{ lv_in_out }| TYPE 'I'. WHEN OTHERS. *--- close opened RFC connection and unregister this dynamic RFC destination CALL METHOD cl_dynamic_destination=>unregister_destination EXPORTING destination = mv_destination EXCEPTIONS unregister_error = 1 kernel_too_old = 2 OTHERS = 3. IF sy-subrc NE 0. ROLLBACK WORK. MESSAGE |CL_DYNAMIC_DESTINATION=>UNREGISTER_DESTINATION: error code = { sy-subrc }| TYPE 'E'. ENDIF. *--- ensure RFC connection is closed CALL FUNCTION 'RFC_CONNECTION_CLOSE' EXPORTING destination = mv_destination * TASKNAME = EXCEPTIONS destination_not_open = 1 OTHERS = 2. IF sy-subrc GT 1. ROLLBACK WORK. MESSAGE |RFC_CONNECTION_CLOSE: error code = { sy-subrc }| TYPE 'E'. ENDIF. ROLLBACK WORK. MESSAGE |DEMO_RFM_PARAMETERS:' error code = { sy-subrc } { lv_message }| TYPE 'E'. ENDCASE. CASE abap_true. WHEN p_remote. "SAP GUI Remote Login remote_login( ). WHEN p_callfu. "Call RFC-enabled function modules execute_rfc_call( ). WHEN OTHERS. RETURN. ENDCASE. *--- close opened RFC connection and unregister this dynamic RFC destination CALL METHOD cl_dynamic_destination=>unregister_destination EXPORTING destination = mv_destination EXCEPTIONS unregister_error = 1 kernel_too_old = 2 OTHERS = 3. IF sy-subrc NE 0. ROLLBACK WORK. MESSAGE |CL_DYNAMIC_DESTINATION=>UNREGISTER_DESTINATION: error code = { sy-subrc }| TYPE 'E'. ENDIF. *--- ensure RFC connection is closed CALL FUNCTION 'RFC_CONNECTION_CLOSE' EXPORTING destination = mv_destination * TASKNAME = EXCEPTIONS destination_not_open = 1 OTHERS = 2. IF sy-subrc GT 1. ROLLBACK WORK. MESSAGE |RFC_CONNECTION_CLOSE: error code = { sy-subrc }| TYPE 'E'. ENDIF. ENDMETHOD. METHOD remote_login. *--- Open interactive SAP GUI connection to requested RFC destination DATA: lv_error_message TYPE rfcdes-rfcoptions. IF mv_destination IS INITIAL. RETURN. ENDIF. *--- instead of using programm RSLOGIN do it directly to skip the authorization check... ;-) *--- or either use method REMOTE_LOGIN of class CL_GRAC_REMOTE_LOGIN in SAP Standard depending *--- on your version and release level. * SUBMIT rsrlogin WITH dest = iv_destination AND RETURN. CLEAR lv_error_message. CALL FUNCTION 'SYSTEM_REMOTE_LOGIN' EXPORTING * SYSTEM = SY-SYSID * HOST = ' ' * SERVICE = '00' destination = mv_destination IMPORTING error_message = lv_error_message EXCEPTIONS cannot_start = 1 parameter_incomplete = 2 OTHERS = 3. IF sy-subrc NE 0 OR lv_error_message IS NOT INITIAL. IF lv_error_message IS NOT INITIAL. MESSAGE lv_error_message TYPE 'I' DISPLAY LIKE 'E'. ENDIF. MESSAGE |CALL FUNCTION 'SYSTEM_REMOTE_LOGIN' retured with error code: { sy-subrc }| TYPE 'S' DISPLAY LIKE 'E'. RETURN. ENDIF. ENDMETHOD. METHOD execute_rfc_call. *--- Execute RFC-enabled function call on requested RFC destination DATA: lt_server_list_v4 TYPE STANDARD TABLE OF msxxlist WITH DEFAULT KEY, lt_server_list_v6 TYPE STANDARD TABLE OF msxxlist WITH DEFAULT KEY, lt_users TYPE STANDARD TABLE OF uinfo WITH DEFAULT KEY, lv_dialog_user_type TYPE answer, lv_ip_user TYPE c LENGTH 50, lv_message TYPE c LENGTH 272, lv_message1 TYPE symsgv, lv_message2 TYPE symsgv, lv_rfc_subrc TYPE sysubrc, lv_rfc_login_complete TYPE answer. IF mv_destination IS INITIAL. RETURN. ENDIF. *--- check RFC destination is reachable CLEAR: lv_message1, lv_message2, lv_rfc_subrc. CALL FUNCTION 'CAT_CHECK_RFC_DESTINATION' EXPORTING rfcdestination = mv_destination IMPORTING msgv1 = lv_message1 msgv2 = lv_message2 rfc_subrc = lv_rfc_subrc. MESSAGE |CAT_CHECK_RFC_DESTINATION: MSGV1='{ lv_message1 }' / MSGV2='{ lv_message2 }'| TYPE 'I'. IF lv_rfc_subrc IS NOT INITIAL. MESSAGE |CAT_CHECK_RFC_DESTINATION: error code: { lv_rfc_subrc }| TYPE 'S' DISPLAY LIKE 'E'. RETURN. ENDIF. CLEAR: lv_rfc_login_complete, lv_dialog_user_type. CALL FUNCTION 'RFC_LOGON_INFO' DESTINATION mv_destination IMPORTING rfc_login_complete = lv_rfc_login_complete dialog_user_type = lv_dialog_user_type EXCEPTIONS system_failure = 98 MESSAGE lv_message communication_failure = 99 MESSAGE lv_message OTHERS = 1. CASE sy-subrc. WHEN 0. MESSAGE |RFC_LOGON_INFO: RFC_LOGIN_COMPLETE='{ lv_rfc_login_complete }' / DIALOG_USER_TYPE='{ lv_dialog_user_type }'| TYPE 'I'. WHEN OTHERS. IF lv_message IS NOT INITIAL. MESSAGE lv_message TYPE 'I' DISPLAY LIKE 'E'. ENDIF. MESSAGE |RFC_LOGON_INFO: error code: { sy-subrc }| TYPE 'S' DISPLAY LIKE 'E'. RETURN. ENDCASE. *--- get user information from current RFC user *--- determine all local servers attached to the RFC destination CLEAR: lt_server_list_v4[], lt_server_list_v6[]. CALL FUNCTION 'TH_SERVER_LIST' DESTINATION mv_destination TABLES list = lt_server_list_v4 list_ipv6 = lt_server_list_v6 EXCEPTIONS system_failure = 98 MESSAGE lv_message communication_failure = 99 MESSAGE lv_message no_server_list = 1 OTHERS = 2. CASE sy-subrc. WHEN 0. LOOP AT lt_server_list_v6 ASSIGNING FIELD-SYMBOL(). CLEAR lt_users[]. CALL FUNCTION 'THUSRINFO' DESTINATION -name TABLES usr_tabl = lt_users EXCEPTIONS system_failure = 98 communication_failure = 99 OTHERS = 1. IF sy-subrc EQ 0. READ TABLE lt_users TRANSPORTING NO FIELDS WITH KEY bname = mv_luser. IF sy-subrc EQ 0. WRITE: / |Function Module THUSRINFO ==> DESTINATION { -name }|. ENDIF. LOOP AT lt_users ASSIGNING FIELD-SYMBOL() WHERE bname EQ mv_luser. IF xstrlen( -hostadr ) EQ 4. *--- in case IP contains 4x HEX values convert HEX value into integer lv_ip_user = |{ CONV i( -hostadr+0(1) ) }.{ CONV i( -hostadr+1(1) ) }.{ CONV i( -hostadr+2(1) ) }.{ CONV i( -hostadr+3(1) ) }|. ELSE. lv_ip_user = -hostadr. ENDIF. WRITE: / ' USR_TABL[{ sy-tabix }]-BNAME =', -bname, 'TERM =', -term, 'HOSTADR =', lv_ip_user. ENDLOOP. ENDIF. ENDLOOP. WHEN OTHERS. WRITE: / |CALL FUNCTION 'RFC_LOGON_INFO' returned with error code: { sy-subrc }|. IF lv_message IS NOT INITIAL. WRITE: / lv_message. ENDIF. RETURN. ENDCASE. *--- possible use of function module RFC_ABAP_INSTALL_AND_RUN to do some *--- special thinks including sending collected data via CALLBACK * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ENDMETHOD. ENDCLASS. *--- The End!