SAP动态获取RFC函数配置

跟前端交互涉及很多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.
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值