开发需求
MDG 主数据维护界面,需要在新建时将实体编码(主键)设置为默认的流水号
实现原理
- 增强FPM控件的feeder class
- 增强BOL entity类CL_FPM_BOL_BASE
- 实现rule service增强点
实现方式
- 通过post-exit 增强方法flush或process event方法
METHOD ipo_ypwk_acc_default_value~process_event. *"------------------------------------------------------------------------* *" Declaration of POST-method, do not insert any comments here please! *" *"methods PROCESS_EVENT *" importing *" !IO_EVENT type ref to CL_FPM_EVENT *" !IV_RAISED_BY_OWN_UI type BOOLE_D optional *" changing *" !EV_RESULT type FPM_EVENT_RESULT *" !ET_MESSAGES type FPMGB_T_MESSAGES . *"------------------------------------------------------------------------* DATA:ls_account TYPE /mdg/_s_0g_pp_account. CONSTANTS:lc_default_account_table TYPE ktopl VALUE 'SY00'. "设置科目默认值 by wilbur peng on 20210426 IF me->core_object->mo_entity IS BOUND. me->core_object->mo_entity->get_properties( IMPORTING es_attributes = ls_account ). IF ls_account-coa IS INITIAL. me->core_object->mo_entity->set_property( EXPORTING iv_attr_name = 'COA' iv_value = lc_default_account_table ). ENDIF. IF ls_account-account IS INITIAL AND ls_account-coa IS not INITIAL and ls_account-accgrpacc IS NOT INITIAL."科目组 SELECT SINGLE FROM t077s FIELDS vonnr AS acc_low, bisnr AS acc_high where KTOPL eq @ls_account-coa and KTOKS eq @ls_account-accgrpacc INTO @DATA(ls_acc_range). SELECT MAX( /1md/0gaccount ) FROM /1md/md______02m INTO @DATA(lv_acc_max) WHERE /1md/0gaccount GE @ls_acc_range-acc_low AND /1md/0gaccount LE @ls_acc_range-acc_high. DATA(lv_acc_new) = lv_acc_max + 1. me->core_object->mo_entity->set_property( EXPORTING iv_attr_name = 'ACCOUNT' iv_value = lv_acc_new ). ENDIF. ENDIF. ENDMETHOD.
- 增强 get_data方法
me->core_object->ms_cust_data = corresponding #( me->core_object->ms_cust_data ).
if me->core_object->ms_cust_data-active eq abap_true.
assign component 'ZZBPNM' of structure cs_data to field-symbol(<fs_name>).
if sy-subrc eq 0.
me->core_object->ms_cust_data-zzbpnm = <fs_name>.
endif.
assign component 'ZZFRDM' of structure cs_data to field-symbol(<fs_zzfrdm>).
if sy-subrc eq 0.
<fs_zzfrdm> = me->core_object->ms_cust_data-zzfrdm.
endif.
assign component 'ZZCZJ' of structure cs_data to field-symbol(<fs_zzczj>).
if sy-subrc eq 0.
<fs_zzczj> = me->core_object->ms_cust_data-zzczj.
endif.
assign component 'ZZCBZ' of structure cs_data to field-symbol(<fs_zzcbz>).
if sy-subrc eq 0.
<fs_zzcbz> = me->core_object->ms_cust_data-zzcbz.
endif.
assign component 'FOUNDATIONDATE' of structure cs_data to field-symbol(<fs_fdate>).
if sy-subrc eq 0.
<fs_fdate> = me->core_object->ms_cust_data-foundationdate.
endif.
"更新change log
data:lt_change_log type fpmgb_t_changelog,
ls_change_log type fpmgb_s_changelog.
clear ls_change_log.
ls_change_log-line_index = 1.
ls_change_log-name = 'ZZBPNM'.
get reference of <fs_name> into ls_change_log-new_value.
insert ls_change_log into table lt_change_log.
clear ls_change_log.
ls_change_log-line_index = 1.
ls_change_log-name = 'ZZFRDM'.
get reference of <fs_zzfrdm> into ls_change_log-new_value.
insert ls_change_log into table lt_change_log.
clear ls_change_log.
ls_change_log-line_index = 1.
ls_change_log-name = 'ZZCZJ'.
get reference of <fs_zzczj> into ls_change_log-new_value.
insert ls_change_log into table lt_change_log.
clear ls_change_log.
ls_change_log-line_index = 1.
ls_change_log-name = 'ZZCBZ'.
get reference of <fs_zzcbz> into ls_change_log-new_value.
insert ls_change_log into table lt_change_log.
clear ls_change_log.
ls_change_log-line_index = 1.
ls_change_log-name = 'FOUNDATIONDATE'.
get reference of <fs_fdate> into ls_change_log-new_value.
insert ls_change_log into table lt_change_log.
me->core_object->flush( exporting it_changelog = lt_change_log ).
endif.
- 增强底层类CL_FPM_BOL_BASE->CREATE_ROOT_ENTITY方法
(本例使用的是implicit enhancement, 但是增强类方法建议用Exit实现(pre, post, overwrite))
METHOD create_root_entity.
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(1) Class CL_FPM_BOL_BASE, Method CREATE_ROOT_ENTITY, Start A
*$*$-Start: (1)---------------------------------------------------------------------------------$*$*
ENHANCEMENT 1 ZIM_PRO_ORGANIZATION_NO. "active version
IF iv_object_name = 'ZPROPORG'. "Entity name
DATA:
zlo_bol_core type ref to cl_crm_bol_core,
zlo_entity_factory type ref to cl_crm_bol_entity_factory,
zlt_param type crmt_name_value_pair_tab,
l_num type c LENGTH 5.
FIELD-SYMBOLS:
<zls_param> like line of zlt_param.
*----- root objects are created via entity factory
zlo_bol_core = cl_crm_bol_core=>get_instance( ).
zlo_entity_factory = zlo_bol_core->get_entity_factory( iv_object_name ).
zlt_param = zlo_entity_factory->get_parameter_table( ).
LOOP AT zlt_param ASSIGNING <zls_param>.
ASSIGN COMPONENT 'NAME' OF STRUCTURE <zls_param> TO FIELD-SYMBOL(<name>).
ASSIGN COMPONENT 'VALUE' OF STRUCTURE <zls_param> TO FIELD-SYMBOL(<value>).
IF <name> IS ASSIGNED AND <value> IS ASSIGNED.
CASE <name>.
WHEN 'ZPROPORG'.
CALL FUNCTION 'NUMBER_RANGE_ENQUEUE'
EXPORTING
object = 'ZW_GSCQBM'
EXCEPTIONS
foreign_lock = 1
object_not_found = 2
system_failure = 3
OTHERS = 4.
IF sy-subrc = 0.
CALL FUNCTION 'NUMBER_GET_NEXT'
EXPORTING
nr_range_nr = '02'
object = 'ZW_GSCQBM'
IMPORTING
number = l_num
EXCEPTIONS
interval_not_found = 1
number_range_not_intern = 2
object_not_found = 3
quantity_is_0 = 4
quantity_is_not_1 = 5
interval_overflow = 6
buffer_overflow = 7
OTHERS = 8.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.
CALL FUNCTION 'NUMBER_RANGE_DEQUEUE'
EXPORTING
object = 'ZW_GSCQBM'
EXCEPTIONS
object_not_found = 1
OTHERS = 2.
ENDIF.
<value> = l_num.
ENDIF.
WHEN OTHERS.
ENDCASE.
ENDIF.
ENDLOOP.
ro_created_entity = zlo_entity_factory->create( zlt_param ).
CHECK ro_created_entity IS BOUND.
TRY.
ro_created_entity->reread( ).
CATCH cx_bol_exception.
IF ro_created_entity->alive( ) = abap_false.
CLEAR ro_created_entity.
RETURN.
ENDIF.
ENDTRY.
EXIT.
ENDIF.
ENDENHANCEMENT.
*$*$-End: (1)---------------------------------------------------------------------------------$*$*
DATA:
lo_bol_core TYPE REF TO cl_crm_bol_core,
lo_entity_factory TYPE REF TO cl_crm_bol_entity_factory,
lt_param TYPE crmt_name_value_pair_tab,
lo_rtti TYPE REF TO cl_abap_typedescr.
FIELD-SYMBOLS:
<ls_dvalues> TYPE any,
<lt_dvalues> TYPE ANY TABLE,
<ls_param> LIKE LINE OF lt_param,
<lv_value> TYPE simple,
<lv_name> TYPE clike.
*----- root objects are created via entity factory
lo_bol_core = cl_crm_bol_core=>get_instance( ).
lo_entity_factory = lo_bol_core->get_entity_factory( iv_object_name ).
lt_param = lo_entity_factory->get_parameter_table( ).
*----- get runtime type descriptor
IF ir_default_values IS BOUND.
lo_rtti = cl_abap_typedescr=>describe_by_data_ref( ir_default_values ).
*----- which type cateogry?
CASE lo_rtti->kind.
*----- structure
WHEN cl_abap_typedescr=>kind_struct.
ASSIGN ir_default_values->* TO <ls_dvalues>.
*----- table
WHEN cl_abap_typedescr=>kind_table.
ASSIGN ir_default_values->* TO <lt_dvalues>.
ENDCASE.
ENDIF.
*------ structure?
IF <ls_dvalues> IS ASSIGNED.
LOOP AT lt_param ASSIGNING <ls_param>.
ASSIGN COMPONENT <ls_param>-name OF STRUCTURE <ls_dvalues> TO <lv_value>.
IF sy-subrc = 0.
<ls_param>-value = <lv_value>.
ENDIF.
ENDLOOP.
*----- name-value table?
ELSEIF <lt_dvalues> IS ASSIGNED.
LOOP AT <lt_dvalues> ASSIGNING <ls_dvalues>.
ASSIGN COMPONENT cv_comp_name OF STRUCTURE <ls_dvalues> TO <lv_name>.
IF sy-subrc <> 0.
EXIT.
ENDIF.
ASSIGN COMPONENT cv_comp_value OF STRUCTURE <ls_dvalues> TO <lv_value>.
IF sy-subrc <> 0.
EXIT.
ENDIF.
READ TABLE lt_param
WITH KEY
name = <lv_name>
ASSIGNING <ls_param>.
CHECK sy-subrc = 0.
<ls_param>-value = <lv_value>.
ENDLOOP.
ENDIF.
*------ create from entity factory
ro_created_entity = lo_entity_factory->create( lt_param ).
CHECK ro_created_entity IS BOUND.
TRY.
ro_created_entity->reread( ).
CATCH cx_bol_exception.
IF ro_created_entity->alive( ) = abap_false.
CLEAR ro_created_entity.
RETURN.
ENDIF.
ENDTRY.
ENDMETHOD.