涉及到的相关类: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方法的重写,此处需要配置对应的触发配置。