跟前端交互涉及很多RFC接口时,对应SAP后台接口函数可作为可配置项,动态获取
CALL FUNCTION 'ZHRFM_GET_FUNC_INFO'
EXPORTING
IV_IFNUM = IV_IFNUM
IV_IFNAM = LV_IFNAM
IV_LANGU = IV_LANGU
IMPORTING
ES_MESSAGE = ES_MESSAGE
TABLES
ET_PARAM_INFO = ET_PARAM_INFO.
IF ES_MESSAGE IS INITIAL.
ES_MESSAGE-MSGTY = 'S'.
ES_MESSAGE-MSGTX = TEXT-000.
ENDIF.
FUNCTION ZHRFM_GET_FUNC_INFO.
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" REFERENCE(IV_IFNUM) TYPE ZHRIFNUM
*" REFERENCE(IV_IFNAM) TYPE ZHRSFUNC
*" REFERENCE(IV_LANGU) TYPE LANGU DEFAULT '1'
*" EXPORTING
*" REFERENCE(ES_MESSAGE) TYPE ZSHR_MESSAGE
*" TABLES
*" ET_PARAM_INFO STRUCTURE ZSHR_FUC_PARAMS
*"----------------------------------------------------------------------
DATA:LT_PARAMS TYPE STANDARD TABLE OF RFC_FUNINT,
LS_PARAMS TYPE RFC_FUNINT.
DATA:LS_PARAM_INFO TYPE ZSHR_FUC_PARAMS.
DATA:LV_TYPENAME TYPE DD40L-TYPENAME.
DATA:LV_TABNAME TYPE TABNAME.
DATA:LT_FIELDS TYPE ICL_DFIES_TAB,
LS_FIELDS TYPE DFIES.
*获取函数参数
REFRESH LT_PARAMS.
CALL FUNCTION 'RFC_GET_FUNCTION_INTERFACE_US'
EXPORTING
FUNCNAME = IV_IFNAM
LANGUAGE = IV_LANGU
TABLES
PARAMS = LT_PARAMS
EXCEPTIONS
FU_NOT_FOUND = 1
NAMETAB_FAULT = 2
OTHERS = 3.
IF SY-SUBRC <> 0.
ES_MESSAGE-MSGTY = 'E'.
MESSAGE S001(ZMSG_HR) INTO ES_MESSAGE-MSGTX WITH IV_IFNAM .
RETURN.
ENDIF.
*获取函数参数
REFRESH ET_PARAM_INFO.
CLEAR LS_PARAM_INFO.
LOOP AT LT_PARAMS INTO LS_PARAMS.
CLEAR LS_PARAM_INFO.
LS_PARAM_INFO-IFNUM = IV_IFNUM.
LS_PARAM_INFO-PARAM = LS_PARAMS-PARAMETER.
LS_PARAM_INFO-PKIND = LS_PARAMS-PARAMCLASS.
LS_PARAM_INFO-OPTIO = LS_PARAMS-OPTIONAL.
LS_PARAM_INFO-PARAT = LS_PARAMS-PARAMTEXT.
LS_PARAM_INFO-INTTY = LS_PARAMS-EXID.
LS_PARAM_INFO-STRUC = LS_PARAMS-TABNAME.
LS_PARAM_INFO-RFIED = LS_PARAMS-FIELDNAME.
IF LS_PARAM_INFO-PKIND = 'T'.
LS_PARAM_INFO-ZTABL = 'X'.
ELSE.
CLEAR LV_TYPENAME.
SELECT SINGLE TYPENAME INTO LV_TYPENAME FROM DD40L WHERE TYPENAME = LS_PARAMS-TABNAME.
IF SY-SUBRC EQ 0.
LS_PARAM_INFO-ZTABL = 'X'.
ENDIF.
ENDIF.
*特殊类型处理
IF LS_PARAMS-EXID = 'u' OR LS_PARAMS-EXID = 'h' OR LS_PARAMS-EXID = 'v'.
LV_TABNAME = LS_PARAMS-TABNAME.
IF LS_PARAMS-EXID = 'h'.
SELECT SINGLE ROWTYPE INTO LV_TABNAME FROM DD40L WHERE TYPENAME = LS_PARAMS-TABNAME.
ENDIF.
REFRESH LT_FIELDS.
CALL FUNCTION 'ICL_GET_DDIC_INFO'
EXPORTING
IV_TABNAME = LV_TABNAME
IMPORTING
ET_DFIES = LT_FIELDS
EXCEPTIONS
WRONG_CALL = 1
ERRONEOUS_INPUT_DATA = 2
DDIC_DATA_READ_FAILED = 3
ERROR_OCCURRED = 4
OTHERS = 5.
LOOP AT LT_FIELDS INTO LS_FIELDS WHERE FIELDNAME NE 'INCLUDE.'.
LS_PARAM_INFO-FIELD = LS_FIELDS-FIELDNAME.
LS_PARAM_INFO-PARAT = LS_FIELDS-FIELDTEXT.
LS_PARAM_INFO-LENGT = LS_FIELDS-LENG.
LS_PARAM_INFO-POSIT = LS_FIELDS-POSITION.
LS_PARAM_INFO-INTTY = LS_FIELDS-INTTYPE.
LS_PARAM_INFO-DECIM = LS_FIELDS-DECIMALS.
APPEND LS_PARAM_INFO TO ET_PARAM_INFO.
ENDLOOP.
ELSE.
LS_PARAM_INFO-FIELD = ''.
LS_PARAM_INFO-PARAT = LS_PARAMS-PARAMTEXT.
LS_PARAM_INFO-LENGT = LS_PARAMS-INTLENGTH / 2.
LS_PARAM_INFO-INTTY = LS_PARAMS-EXID.
LS_PARAM_INFO-DECIM = LS_PARAMS-DECIMALS.
APPEND LS_PARAM_INFO TO ET_PARAM_INFO.
ENDIF.
ENDLOOP.
ENDFUNCTION.