RERCS系统-WDA+BOPF框架实战例子 PART 3-Feeder Class 方法处理与解释

涉及到的相关类:1)List UIBB对应的Feeder Class 2)BOPF对应的Determination的实施类

1、SE24把新建的Feeder Class类进行主要处理,List UIBB的Feeder Class参照超类:/BOFU/CL_FBI_GUIBB_LIST;
在这里插入图片描述
接口页签自动带出继承的接口,方法页签自动带出继承的方法;
在这里插入图片描述在这里插入图片描述
对应Feeder Class几个方法的说明:
1)IF_FPM_GUIBB~INITIALIZE:初始化页面数据,获取服务前端页面数据。

  METHOD IF_FPM_GUIBB~INITIALIZE.
    CALL METHOD SUPER->IF_FPM_GUIBB~INITIALIZE
      EXPORTING
        IT_PARAMETER      = IT_PARAMETER
        IO_APP_PARAMETER  = IO_APP_PARAMETER
        IV_COMPONENT_NAME = IV_COMPONENT_NAME
        IS_CONFIG_KEY     = IS_CONFIG_KEY
        IV_INSTANCE_ID    = IV_INSTANCE_ID.

    MO_FPM ?= CL_FPM_FACTORY=>GET_INSTANCE( ).
  ENDMETHOD.

2)IF_FPM_GUIBB_LIST~PROCESS_EVENT:页面按钮等触发型的动作事件。

  METHOD IF_FPM_GUIBB_LIST~PROCESS_EVENT.
*CALL METHOD SUPER->IF_FPM_GUIBB_LIST~PROCESS_EVENT
*  EXPORTING
*    IO_EVENT            = IO_EVENT
**    IV_RAISED_BY_OWN_UI = IV_RAISED_BY_OWN_UI
*    IV_LEAD_INDEX       = IV_LEAD_INDEX
*    IV_EVENT_INDEX      = IV_EVENT_INDEX
*    IT_SELECTED_LINES   = IT_SELECTED_LINES
**    IO_UI_INFO          = IO_UI_INFO
**  IMPORTING
**    EV_RESULT           = EV_RESULT
**    ET_MESSAGES         = ET_MESSAGES
*    .
    DATA:
      LO_ENTITY_COLLECTION TYPE REF TO  /BOFU/IF_FBI_ENTITY_COLLECTION,
      LS_SELECTED_LINE     LIKE LINE OF IT_SELECTED_LINES,
      LT_SELECTED_LINES    LIKE         IT_SELECTED_LINES,
      LR_TABLE_DESCR       TYPE REF TO  CL_ABAP_TABLEDESCR,
      LR_DATA_DESCR        TYPE REF TO  CL_ABAP_DATADESCR,
      LV_TAB_KEYS          TYPE         ABAP_TABLE_KEYDESCR_TAB,
      LR_DATA_STRUC        TYPE REF TO  DATA,
      LR_VALUE             TYPE REF TO  DATA,
      LT_KEYS              TYPE         /BOBF/T_FRW_KEY.

    FIELD-SYMBOLS:
      <FT_DATA> TYPE INDEX TABLE,
      <FS_DATA> TYPE              DATA,
      <FV_KEY>  TYPE              /BOBF/CONF_KEY.

    LR_TABLE_DESCR ?= CL_ABAP_TYPEDESCR=>DESCRIBE_BY_DATA_REF( P_DATA_REF = MT_DATA ).
    LR_DATA_DESCR = LR_TABLE_DESCR->GET_TABLE_LINE_TYPE( ).

    CREATE DATA LR_DATA_STRUC TYPE HANDLE LR_DATA_DESCR.
    ASSIGN LR_DATA_STRUC->* TO <FS_DATA>.
    ASSIGN MT_DATA->* TO <FT_DATA>.

    IF IO_EVENT->MV_EVENT_ID EQ CL_FPM_EVENT=>GC_EVENT_LEAVE_INITIAL_SCREEN.
*      fill_select_line_on_leave_scrn(
*        EXPORTING
*          io_event      =   io_event  " CL_FPM_EVENT
*          iv_lead_index =   iv_lead_index  " Index of Internal Tables
*      ).
    ENDIF.

    IO_EVENT->MO_EVENT_DATA->GET_VALUE(
        EXPORTING
          IV_KEY   = /BOFU/IF_FBI_RUNTIME_C=>SC_EVENT_PARAMETERS-COMMON_PARAMS-ACT_CONF_KEY
        IMPORTING
           ER_VALUE = LR_VALUE ).
*The action is a BO action
    IF  LR_VALUE IS NOT INITIAL.
*Filter out the rows that correspond to empty keys
      LOOP AT IT_SELECTED_LINES INTO LS_SELECTED_LINE.
        READ TABLE <FT_DATA> INTO <FS_DATA> INDEX LS_SELECTED_LINE-TABIX.
        ASSIGN COMPONENT 'KEY' OF STRUCTURE <FS_DATA> TO <FV_KEY>.
        READ TABLE MT_EMPTY_KEYS WITH TABLE KEY KEY = <FV_KEY> TRANSPORTING NO FIELDS.
        IF SY-SUBRC <> 0.
          INSERT LS_SELECTED_LINE INTO TABLE LT_SELECTED_LINES.
        ENDIF.
      ENDLOOP.
*      mv_is_filtered = abap_true.
      PROCESS_EVENT(
        EXPORTING
          IO_EVENT            = IO_EVENT
          IV_RAISED_BY_OWN_UI = IV_RAISED_BY_OWN_UI
          IT_SELECTED_LINES   = LT_SELECTED_LINES
          IT_DATA             = MT_DATA
        IMPORTING
          EV_RESULT           = EV_RESULT
      ).
    ELSE.
*      mv_is_filtered = abap_false.
      PROCESS_EVENT(
        EXPORTING
          IO_EVENT            = IO_EVENT
          IV_RAISED_BY_OWN_UI = IV_RAISED_BY_OWN_UI
          IT_SELECTED_LINES   = IT_SELECTED_LINES
          IT_DATA             = MT_DATA
        IMPORTING
          EV_RESULT           = EV_RESULT
      ).
    ENDIF.
* Return messages
*--------------------------------------------------------------------*
* Messages dispatched in process event doesn't get highlighted
    IF MS_DEFAULTS-MSGS_IN_PE = ABAP_TRUE.
      GET_MESSAGES(
      EXPORTING
        IT_DATA     = MT_DATA
      IMPORTING
        ET_MESSAGES = ET_MESSAGES
    ).
    ENDIF.


*    DATA: LV_AMT      TYPE /RER/AMT,
*          LS_TAX      TYPE /RER/S_BO_CONT_TAX_C,
*          LS_MESSAGES TYPE FPMGB_S_T100_MESSAGE.

    CASE IO_EVENT->MV_EVENT_ID.

      WHEN 'FPM_SAVE'.
*        IF <ft_data> IS NOT INITIAL.
*          CLEAR lv_amt.
*          LOOP AT <ft_data> ASSIGNING <fs_data>.
*            MOVE-CORRESPONDING <fs_data> TO ls_tax.
*            lv_amt = lv_amt + ls_tax-amt_intax.
*          ENDLOOP.
*
*          IF lv_amt <> /rer/cl_cont_toolbar=>ms_root-conamt.
*            ls_messages-msgid = '/RER/CO'.
*            ls_messages-msgno = '449'.
*            ls_messages-severity = 'W'.
*            APPEND ls_messages TO et_messages.
*            IF 1 = 2.
*              MESSAGE s449(yrre_co).
*            ENDIF.
*          ENDIF.
*        ENDIF.

    ENDCASE.
  ENDMETHOD.

3)IF_FPM_GUIBB_LIST~GET_DATA:获取数据,此处触发bopf去获取数据库表数据。

  METHOD IF_FPM_GUIBB_LIST~GET_DATA.
    GET_DATA(
          EXPORTING
            IV_EVENTID                = IV_EVENTID    " ID of the FPM Event
            IT_SELECTED_FIELDS        = IT_SELECTED_FIELDS    " Selected(Used) Fields
            IV_RAISED_BY_OWN_UI       = IV_RAISED_BY_OWN_UI    " Data element for domain BOOLE: TRUE (='X') and FALSE (=' ')
            IV_VISIBLE_ROWS           = IV_VISIBLE_ROWS
            IV_EDIT_MODE              = IV_EDIT_MODE    " FPM: Edit Mode
            IO_EXTENDED_CTRL          = IO_EXTENDED_CTRL    " Provides extended List ATS specific configuration options
          IMPORTING
            ET_MESSAGES               = ET_MESSAGES    " FPMGB Messages (T100 & Plaintext)
            EV_DATA_CHANGED           = EV_DATA_CHANGED    " Boolean Variable (X=True, -=False, Space=Unknown)
            EV_FIELD_USAGE_CHANGED    = EV_FIELD_USAGE_CHANGED    " Boolean Variable (X=True, -=False, Space=Unknown)
            EV_ACTION_USAGE_CHANGED   = EV_ACTION_USAGE_CHANGED    " Boolean Variable (X=True, -=False, Space=Unknown)
            EV_SELECTED_LINES_CHANGED = EV_SELECTED_LINES_CHANGED    " Boolean Variable (X=True, -=False, Space=Unknown)
            EV_DND_ATTR_CHANGED       = EV_DND_ATTR_CHANGED    " Data element for domain BOOLE: TRUE (='X') and FALSE (=' ')
            EO_ITAB_CHANGE_LOG        = EO_ITAB_CHANGE_LOG    " Change log for internal tables
          CHANGING
            CT_DATA                   = CT_DATA
            CT_FIELD_USAGE            = CT_FIELD_USAGE    " Field Usage
            CT_ACTION_USAGE           = CT_ACTION_USAGE    " Action Definition
            CT_SELECTED_LINES         = CT_SELECTED_LINES    " Repository Infosystem: Tabix
            CV_LEAD_INDEX             = CV_LEAD_INDEX    " Index of Internal Tables
            CV_FIRST_VISIBLE_ROW      = CV_FIRST_VISIBLE_ROW
            CS_ADDITIONAL_INFO        = CS_ADDITIONAL_INFO    " Additinal info on the GUIBB table
            CT_DND_ATTRIBUTES         = CT_DND_ATTRIBUTES    " Drag and Drop Attributes Definition
        ).

    DATA: LO_FPM     TYPE REF TO IF_FPM,
          LO_SRV_MGR TYPE REF TO /BOBF/IF_TRA_SERVICE_MANAGER,
          LO_MESSAGE TYPE REF TO /BOBF/IF_FRW_MESSAGE,
          LO_CHANGE  TYPE REF TO /BOBF/IF_TRA_CHANGE.
    DATA: LT_MODIFY     TYPE /BOBF/T_FRW_MODIFICATION,
          LS_MODIFY     TYPE /BOBF/S_FRW_MODIFICATION,
          LT_KEY        TYPE /BOBF/T_FRW_KEY,
          LS_KEY        TYPE /BOBF/S_FRW_KEY,
          LV_UG_REF_KEY TYPE /BOBF/CONF_KEY,
          LV_XMJD       TYPE ZRRE_XMJD,
          LT_MESSAGE    TYPE /BOBF/T_FRW_MESSAGE_K,
          LS_MESSAGE    TYPE /BOBF/S_FRW_MESSAGE_K.

    FIELD-SYMBOLS:<FS_LHTDW> TYPE ZRRE_S_GCLX_LHTDW.
    DATA:LT_LHTDW TYPE ZRRE_T_GCLX_LHTDW,
         LR_LHTDW TYPE REF TO DATA.
    DATA:LT_SORT TYPE ABAP_SORTORDER_TAB.

    DATA: LV_CHANGE_MODE TYPE    CHAR1,
          LV_IS_JGC      TYPE CHAR1.
    FIELD-SYMBOLS: <FT_DATA> TYPE STANDARD TABLE,
                   <FS_KEY>  TYPE /BOBF/CONF_KEY,
                   <FS_DATA> TYPE ANY.

    ASSIGN CT_DATA TO <FT_DATA>."列表数据存至临时动态内表 <FT_DATA>

    MOVE-CORRESPONDING ZRRE_CL_FD_PROJ_ROOT=>MS_ROOT TO MS_ROOT.

    LO_FPM     ?= CL_FPM_FACTORY=>GET_INSTANCE( ).
    LO_SRV_MGR = /BOBF/CL_TRA_SERV_MGR_FACTORY=>GET_SERVICE_MANAGER( ZRRE_IF_PROJ_CONSTANTS=>SC_BO_KEY ).

    CALL METHOD LO_FPM->MO_APP_PARAMETER->GET_VALUE
      EXPORTING
        IV_KEY   = 'XMJD'
      IMPORTING
        EV_VALUE = LV_XMJD.

    CASE IV_EVENTID->MV_EVENT_ID.
      WHEN  CL_FPM_EVENT=>GC_EVENT_LEAVE_INITIAL_SCREEN.
        IF LV_XMJD = '05' AND IV_EDIT_MODE = 'E'."工程立项-调整
          CALL METHOD LO_FPM->MO_APP_PARAMETER->GET_VALUE
            EXPORTING
              IV_KEY   = 'XM_UG_REF_KEY'
            IMPORTING
              EV_VALUE = LV_UG_REF_KEY. "原工程立项的DB_KEY

          APPEND VALUE #( KEY = LV_UG_REF_KEY ) TO LT_KEY.
          CALL METHOD LO_SRV_MGR->RETRIEVE_BY_ASSOCIATION
            EXPORTING
              IV_NODE_KEY    = ZRRE_IF_PROJ_CONSTANTS=>SC_NODE-ROOT
              IT_KEY         = LT_KEY
              IV_ASSOCIATION = ZRRE_IF_PROJ_CONSTANTS=>SC_ASSOCIATION-ROOT-GCLX_LHTDW
              IV_FILL_DATA   = ABAP_TRUE
            IMPORTING
              ET_DATA        = LT_LHTDW.
          CLEAR:LT_MODIFY.
          IF LT_LHTDW IS NOT INITIAL AND <FT_DATA> IS INITIAL.
            LOOP AT LT_LHTDW INTO DATA(LS_LHTDW).
              CREATE DATA LR_LHTDW TYPE ZRRE_S_GCLX_LHTDW.
              ASSIGN LR_LHTDW->* TO <FS_LHTDW>.
              <FS_LHTDW>-KEY = /BOBF/CL_FRW_FACTORY=>GET_NEW_KEY( ).
              <FS_LHTDW>-ROOT_KEY = MS_ROOT-KEY.
              <FS_LHTDW>-PARENT_KEY = MS_ROOT-KEY.
              <FS_LHTDW>-ZLHTDW_ID = LS_LHTDW-ZLHTDW_ID.
              <FS_LHTDW>-ZLHTDW_NAME = LS_LHTDW-ZLHTDW_NAME.
              <FS_LHTDW>-ZNOTE = LS_LHTDW-ZNOTE.
              <FS_LHTDW>-CREA_UNAME = LS_LHTDW-CREA_UNAME.
              <FS_LHTDW>-CREA_DATE = LS_LHTDW-CREA_DATE.
              <FS_LHTDW>-CREA_TIME = LS_LHTDW-CREA_TIME.
              <FS_LHTDW>-UPDATE_UNAME = LS_LHTDW-UPDATE_UNAME.
              <FS_LHTDW>-UPDATE_DATE = LS_LHTDW-UPDATE_DATE.
              <FS_LHTDW>-UPDATE_TIME = LS_LHTDW-UPDATE_TIME.

              APPEND <FS_LHTDW> TO <FT_DATA>.


              LS_MODIFY-KEY = <FS_LHTDW>-KEY.
              LS_MODIFY-NODE = ZRRE_IF_PROJ_CONSTANTS=>SC_NODE-GCLX_LHTDW.
              LS_MODIFY-CHANGE_MODE = /BOBF/IF_FRW_C=>SC_MODIFY_CREATE.
              LS_MODIFY-ROOT_KEY = <FS_LHTDW>-PARENT_KEY.
              LS_MODIFY-SOURCE_KEY = <FS_LHTDW>-PARENT_KEY.
              LS_MODIFY-SOURCE_NODE = ZRRE_IF_PROJ_CONSTANTS=>SC_NODE-ROOT.
              LS_MODIFY-ASSOCIATION = ZRRE_IF_PROJ_CONSTANTS=>SC_ASSOCIATION-ROOT-GCLX_LHTDW.
              LS_MODIFY-DATA = LR_LHTDW.
              APPEND LS_MODIFY TO LT_MODIFY.
              CLEAR LS_MODIFY.

            ENDLOOP.

            CALL METHOD LO_SRV_MGR->MODIFY
              EXPORTING
                IT_MODIFICATION = LT_MODIFY
              IMPORTING
                EO_MESSAGE      = LO_MESSAGE
                EO_CHANGE       = LO_CHANGE.

            IF LO_MESSAGE->CHECK( ) = ABAP_TRUE.
              LO_MESSAGE->GET_MESSAGES( IMPORTING ET_MESSAGE = LT_MESSAGE ).
              LOOP AT LT_MESSAGE INTO LS_MESSAGE.
                LO_FPM->MO_MESSAGE_MANAGER->REPORT_OBJECT_MESSAGE(
                  EXPORTING
                   IR_MESSAGE_OBJECT = LS_MESSAGE-MESSAGE
                   IO_COMPONENT = LO_FPM->MO_MESSAGE_MANAGER
                ).
              ENDLOOP.
            ELSE.
              MO_CONTROLLER->POST_SYNCUP_DATA( IV_BO_KEY  = ZRRE_IF_PROJ_CONSTANTS=>SC_BO_KEY IO_CHANGE  = LO_CHANGE ).
            ENDIF.
          ENDIF.

        ENDIF.
    ENDCASE.
    "因为BOPF的Determination 数据重更新,此处对<FT_DATA> 做去重处理
    LT_SORT = VALUE #(
                      ( NAME = 'KEY' DESCENDING = '' ) ).
    SORT <FT_DATA> BY (LT_SORT)."动态内表按指定字段排序
    "删除连续重复项
    DELETE ADJACENT DUPLICATES FROM <FT_DATA>.


    UPDATE_FIELD_STATUS( EXPORTING IV_EDIT_MODE = IV_EDIT_MODE
                          CHANGING CT_DATA  = CT_DATA
                                   CT_FIELD_USAGE = CT_FIELD_USAGE
                                   CT_ACTION_USAGE = CT_ACTION_USAGE ).

*---Shared dictionary---------------------------------------------
    DATA: LV_CONFIG_ID TYPE        WDY_CONFIG_ID,
          LO_DIC       TYPE REF TO /RER/CL_SHARED_DIC.
    IF LO_FPM IS INITIAL.
      LO_FPM ?= CL_FPM_FACTORY=>GET_INSTANCE( ).
    ENDIF.
    IF LO_FPM IS NOT INITIAL.
      CALL METHOD LO_FPM->MO_APP_PARAMETER->GET_VALUE
        EXPORTING
          IV_KEY   = /RER/IF_CCM_CONSTANTS=>GC_WD_CONFIGID  "'SAP-WD-CONFIGID'
        IMPORTING
          EV_VALUE = LV_CONFIG_ID.

      CREATE OBJECT LO_DIC EXPORTING IV_CONFIG_ID = LV_CONFIG_ID .

      IF LO_DIC IS NOT INITIAL.
        CALL METHOD LO_DIC->CHG_USG
          IMPORTING
            EV_FIELD_USAGE_CHANGED  = EV_FIELD_USAGE_CHANGED
            EV_ACTION_USAGE_CHANGED = EV_ACTION_USAGE_CHANGED
          CHANGING
            CT_ACTION_USAGE         = CT_ACTION_USAGE
*           ct_row_act              =
            CT_FIELD_USAGE          = CT_FIELD_USAGE.

      ENDIF.
    ENDIF.
*-----------------------------------------------------------

    EV_DATA_CHANGED = ABAP_TRUE.
    EV_FIELD_USAGE_CHANGED = ABAP_TRUE.
    EV_ACTION_USAGE_CHANGED = ABAP_TRUE.
  ENDMETHOD.

4)IF_FPM_GUIBB_LIST~GET_DEFINITION:此方法针对字段属性进行控制,例如必输、只读、隐藏、搜索帮助等设置。

  METHOD IF_FPM_GUIBB_LIST~GET_DEFINITION.
    DATA: LV_CONFIG_ID TYPE        WDY_CONFIG_ID,
          LO_DIC       TYPE REF TO /RER/CL_SHARED_DIC.
    DATA: LO_FPM TYPE REF TO IF_FPM.
    DATA: LS_ACTION_DEF   TYPE FPMGB_S_ACTIONDEF.

    CALL METHOD SUPER->IF_FPM_GUIBB_LIST~GET_DEFINITION
      IMPORTING
        EO_FIELD_CATALOG         = EO_FIELD_CATALOG
        ET_FIELD_DESCRIPTION     = ET_FIELD_DESCRIPTION
        ET_ACTION_DEFINITION     = ET_ACTION_DEFINITION
        ET_SPECIAL_GROUPS        = ET_SPECIAL_GROUPS
        ES_MESSAGE               = ES_MESSAGE
        EV_ADDITIONAL_ERROR_INFO = EV_ADDITIONAL_ERROR_INFO
        ET_DND_DEFINITION        = ET_DND_DEFINITION
        ET_ROW_ACTIONS           = ET_ROW_ACTIONS
        ES_OPTIONS               = ES_OPTIONS.


*    CLEAR LS_ACTION_DEF.
*    LS_ACTION_DEF-ID = GC_LIFNR_ENTERED. "'LIFNR_ENTERED'.
*    LS_ACTION_DEF-ACTION_TYPE = IF_FPM_CONSTANTS=>GC_ACTION_TYPE-VALIDATION_INDEPENDENT.
*    LS_ACTION_DEF-ENABLED = ABAP_TRUE.
*    LS_ACTION_DEF-IS_IMPLICIT_EDIT = ABAP_TRUE.
*    INSERT LS_ACTION_DEF INTO TABLE ET_ACTION_DEFINITION.


    IF LO_FPM IS INITIAL.
      LO_FPM ?= CL_FPM_FACTORY=>GET_INSTANCE( ).
    ENDIF.
    IF LO_FPM IS NOT INITIAL.
      CALL METHOD LO_FPM->MO_APP_PARAMETER->GET_VALUE
        EXPORTING
          IV_KEY   = /RER/IF_CCM_CONSTANTS=>GC_WD_CONFIGID  "'SAP-WD-CONFIGID'
        IMPORTING
          EV_VALUE = LV_CONFIG_ID.

      CREATE OBJECT LO_DIC EXPORTING IV_CONFIG_ID = LV_CONFIG_ID.
      IF LO_DIC IS NOT INITIAL.
        CALL METHOD LO_DIC->CHG_DEF
          CHANGING
            CT_ACT      = ET_ACTION_DEFINITION
            CT_LIST_FLD = ET_FIELD_DESCRIPTION.
      ENDIF.
    ENDIF.
  ENDMETHOD.

此处例子是增强实施实现字段的搜索帮助:

  METHOD IPO_ZRRE_EHI_GCLX_LHTDW~GET_DEFINITION.
*"------------------------------------------------------------------------*
*" Declaration of POST-method, do not insert any comments here please!
*"
*"methods GET_DEFINITION
*"  changing
*"    value(EO_FIELD_CATALOG) type ref to CL_ABAP_TABLEDESCR
*"    !ET_FIELD_DESCRIPTION type FPMGB_T_LISTFIELD_DESCR
*"    !ET_ACTION_DEFINITION type FPMGB_T_ACTIONDEF
*"    !ET_SPECIAL_GROUPS type FPMGB_T_SPECIAL_GROUPS
*"    !ES_MESSAGE type FPMGB_S_T100_MESSAGE
*"    !EV_ADDITIONAL_ERROR_INFO type DOKU_OBJ
*"    !ET_DND_DEFINITION type FPMGB_T_DND_DEFINITION
*"    !ET_ROW_ACTIONS type FPMGB_T_ROW_ACTION
*"    !ES_OPTIONS type FPMGB_S_LIST_OPTIONS .
*"------------------------------------------------------------------------*
    READ TABLE ET_FIELD_DESCRIPTION ASSIGNING FIELD-SYMBOL(<FS_FIELD_DESC>) WITH KEY NAME = 'ZLHTDW_ID'.
    IF SY-SUBRC = 0.
      <FS_FIELD_DESC>-DDIC_SHLP_NAME = 'ZRRE_H_VEND_04'.
    ENDIF.
  ENDMETHOD.

5)UPDATE_FIELD_STATUS:该方法为自定义方法,只要实现根据字段值实现对字段的属性控制,一般在get_data方法中调用。

  METHOD IOW_ZRRE_EHI_GCLX_LHTDW~UPDATE_FIELD_STATUS.
*"------------------------------------------------------------------------*
*" Declaration of Overwrite-method, do not insert any comments here please!
*"
*"methods UPDATE_FIELD_STATUS
*"  importing
*"    !IV_EDIT_MODE type FPM_EDIT_MODE optional
*"  changing
*"    !CT_ACTION_USAGE type FPMGB_T_ACTIONUSAGE optional
*"    !CT_DATA type DATA optional
*"    !CT_FIELD_USAGE type FPMGB_T_FIELDUSAGE optional .
*"------------------------------------------------------------------------*
    FIELD-SYMBOLS <FS_FIELD> TYPE FPMGB_S_FIELDUSAGE.
    FIELD-SYMBOLS: <FT_DATA> TYPE STANDARD TABLE,
                   <FS_DATA> TYPE ANY.
    FIELD-SYMBOLS: <FS_FIELD_DESC>   TYPE FPMGB_S_TREEFIELD_DESCR,
                   <FS_ACTION_USAGE> TYPE FPMGB_S_ACTIONUSAGE.
    FIELD-SYMBOLS:<FV_FIELD>    TYPE ANY,
                  <FV_VALUE>    TYPE ANY,
                  <FV_TAX_TYPE> TYPE ANY.

    DATA: LS_ROOT TYPE ZRRE_S_XMTT.

    MOVE-CORRESPONDING ZRRE_CL_FD_PROJ_GCLX=>MS_ROOT TO LS_ROOT.

    ASSIGN CT_DATA TO <FT_DATA>.

    IF IV_EDIT_MODE = 'E'. "AND LS_ROOT-XMJD <> '05'."工程立项-调整 不允许编辑联合体单位明细

      LOOP AT <FT_DATA> ASSIGNING <FS_DATA>.
        LOOP AT CT_FIELD_USAGE ASSIGNING <FS_FIELD>.     "#EC CI_NESTED
          CASE <FS_FIELD>-NAME .
            WHEN  'ZLHTDW_NAME'.
              READ TABLE CORE_OBJECT->MT_FIELD_DESCRIPTION ASSIGNING <FS_FIELD_DESC> WITH KEY NAME = <FS_FIELD>-NAME.
              IF SY-SUBRC = 0.
                ASSIGN COMPONENT 'READ_ONLY_REF' OF STRUCTURE <FS_FIELD_DESC> TO <FV_FIELD>.
                ASSIGN COMPONENT <FV_FIELD> OF STRUCTURE <FS_DATA> TO <FV_VALUE>.
                <FV_VALUE> = ABAP_FALSE.
              ENDIF.
          ENDCASE.
        ENDLOOP.
      ENDLOOP.

      LOOP AT CT_ACTION_USAGE ASSIGNING <FS_ACTION_USAGE> WHERE ID = /RER/IF_CCM_CONSTANTS=>GC_EVENT-FBI_CREATE "'FBI_CREATE'
        OR ID = /RER/IF_CCM_CONSTANTS=>GC_EVENT-FBI_DELETE. "'FBI_DELETE' .
        <FS_ACTION_USAGE>-ENABLED = ABAP_TRUE.
      ENDLOOP.
    ELSE.
      LOOP AT <FT_DATA> ASSIGNING <FS_DATA>.
        LOOP AT CT_FIELD_USAGE ASSIGNING <FS_FIELD>.     "#EC CI_NESTED
          READ TABLE CORE_OBJECT->MT_FIELD_DESCRIPTION ASSIGNING <FS_FIELD_DESC> WITH KEY NAME = <FS_FIELD>-NAME.
          IF SY-SUBRC = 0.
            ASSIGN COMPONENT 'READ_ONLY_REF' OF STRUCTURE <FS_FIELD_DESC> TO <FV_FIELD>.
            ASSIGN COMPONENT <FV_FIELD> OF STRUCTURE <FS_DATA> TO <FV_VALUE>.
            <FV_VALUE> = ABAP_TRUE.
          ENDIF.
        ENDLOOP.
      ENDLOOP.

      LOOP AT CT_ACTION_USAGE ASSIGNING <FS_ACTION_USAGE> WHERE ID = /RER/IF_CCM_CONSTANTS=>GC_EVENT-FBI_CREATE "'FBI_CREATE'
        OR ID = /RER/IF_CCM_CONSTANTS=>GC_EVENT-FBI_DELETE. "'FBI_DELETE'.
        <FS_ACTION_USAGE>-ENABLED = ABAP_FALSE.
      ENDLOOP.
    ENDIF.
  ENDMETHOD.

2、bopf后端对应的Determination的类:ZRRE_EHI_LHTDW_PSTDET,此处主要实现页面修改过程中对数据的处理,例如:创建人、创建日期等字段的赋值,同时更新数据同步到前端页面,保证前后端数据的一致性。
1)类的参考:
在这里插入图片描述2)继承的接口:
在这里插入图片描述3)继承的方法:
在这里插入图片描述4)重写方法AFTER_MODIFICATION:保证修改页面过程中数据的同步更新。

  METHOD AFTER_MODIFICATION.
**TRY.
*CALL METHOD SUPER->AFTER_MODIFICATION
*  EXPORTING
*    IS_CTX        = IS_CTX
*    IT_KEY        = IT_KEY
*    IO_READ       = IO_READ
*    IO_MODIFY     = IO_MODIFY
**  IMPORTING
**    ET_FAILED_KEY = ET_FAILED_KEY
*    .
**  CATCH /RER/CX_FATAL.
**ENDTRY.

    SET_VALUE(
    EXPORTING
      IS_CTX        = IS_CTX
      IT_KEY        = IT_KEY
      IO_READ       = IO_READ
      IO_MODIFY     = IO_MODIFY
    IMPORTING
        ET_FAILED_KEY = ET_FAILED_KEY

).

  ENDMETHOD.

5)自定义方法SET_VALUE的实现:

  METHOD SET_VALUE.
    DATA: LV_ALAND TYPE ALAND,
          LV_WAERS TYPE WAERS,
          LT_KEY   TYPE /BOBF/T_FRW_KEY,
          LS_KEY   TYPE /BOBF/S_FRW_KEY,
          LR_DATA  TYPE REF TO DATA,
          LR_ROOT  TYPE REF TO DATA,
          LV_COUNT TYPE I,
          LT_LHTDW TYPE ZRRE_T_GCLX_LHTDW,
          LT_ROOT  TYPE ZRRE_T_XMTT,
          LS_ROOT  TYPE ZRRE_S_XMTT.


    FIELD-SYMBOLS: <FS_LHTDW> TYPE ZRRE_S_GCLX_LHTDW,
                   <FS_ROOT>  TYPE ZRRE_S_XMTT,
                   <FV_FIELD> TYPE ANY,
                   <FS_DATA>  TYPE ANY.


    CHECK IT_KEY IS NOT INITIAL.
    CALL METHOD IO_READ->RETRIEVE
      EXPORTING
        IV_NODE       = IS_CTX-NODE_KEY
        IT_KEY        = IT_KEY
        IV_FILL_DATA  = ABAP_TRUE
      IMPORTING
        ET_DATA       = LT_LHTDW
        ET_FAILED_KEY = ET_FAILED_KEY.

    CLEAR LT_KEY.
    LOOP AT LT_LHTDW ASSIGNING <FS_LHTDW>.
      LS_KEY-KEY = <FS_LHTDW>-PARENT_KEY.
      APPEND LS_KEY TO LT_KEY.
    ENDLOOP.
    SORT LT_KEY BY KEY.
    DELETE ADJACENT DUPLICATES FROM LT_KEY COMPARING KEY.

    IO_READ->RETRIEVE(
   EXPORTING
     IV_NODE                 =  ZRRE_IF_PROJ_CONSTANTS=>SC_NODE-ROOT
     IT_KEY                  =  LT_KEY
      IV_FILL_DATA           = ABAP_TRUE
    IMPORTING
      ET_DATA                =  LT_ROOT
    ).

    READ TABLE LT_ROOT ASSIGNING <FS_ROOT> INDEX 1.
    "Calculate tax amount
    LOOP AT LT_LHTDW ASSIGNING <FS_LHTDW> .
      IF <FS_LHTDW>-ZLHTDW_ID IS NOT INITIAL.
        SELECT SINGLE BPNAM
          FROM ZRRE_D_BP
          INTO <FS_LHTDW>-ZLHTDW_NAME
          WHERE BPTYP = '04'
          AND APPSTATUS = '40'
          AND ZXZT = '01'
          AND BPNUM =  <FS_LHTDW>-ZLHTDW_ID
          AND DELFLAG = ''.
      ENDIF.

      IF <FS_LHTDW>-CREA_UNAME IS INITIAL .
        <FS_LHTDW>-CREA_UNAME = SY-UNAME.
      ENDIF.

      IF <FS_LHTDW>-CREA_DATE IS INITIAL .
        <FS_LHTDW>-CREA_DATE = SY-DATUM.
      ENDIF.

      IF <FS_LHTDW>-CREA_TIME IS INITIAL .
        <FS_LHTDW>-CREA_TIME = SY-UZEIT.
      ENDIF.

      <FS_LHTDW>-UPDATE_UNAME = SY-UNAME.
      <FS_LHTDW>-UPDATE_DATE = SY-DATUM.
      <FS_LHTDW>-UPDATE_TIME = SY-UZEIT.

      GET REFERENCE OF <FS_LHTDW> INTO LR_DATA.
      IO_MODIFY->UPDATE( EXPORTING IV_NODE = IS_CTX-NODE_KEY IV_KEY = <FS_LHTDW>-KEY  IS_DATA = LR_DATA ).

    ENDLOOP.

  ENDMETHOD.

6)配置触发的Determination Configuration:由于前面是进行了AFTER_MODIFICATION方法的重写,此处需要配置对应的触发配置。
在这里插入图片描述

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

混沌破晓

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值