MDG 设置实体字段默认值的三种方法

15 篇文章 2 订阅
5 篇文章 1 订阅

开发需求

MDG 主数据维护界面,需要在新建时将实体编码(主键)设置为默认的流水号

实现原理

  • 增强FPM控件的feeder class
  • 增强BOL entity类CL_FPM_BOL_BASE
  • 实现rule service增强点

实现方式

  1. 通过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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值