MDG跨实体校验(cross entity validation)

背景

实现BADI USMD_RULE_SERVICE进行实体合法性校验时,常需要依赖于其他实体的数据

实现原理

check entity方法的输入参数IO_MODEL包含模型运行时信息,调用对应的read_model方法即可

参考代码

data:lr_data     type ref to data,
         lt_messages type usmd_t_message,
         lt_sel      type usmd_ts_sel,
         ls_sel      type usmd_s_sel.
         
    assign component 'COAREA' of structure is_data to field-symbol(<fs_area>).
    if <fs_area> is assigned.
      clear ls_sel.
      ls_sel-sign = 'I'.
      ls_sel-option = 'EQ'.
      ls_sel-fieldname = 'COAREA'.
      ls_sel-low = <fs_area>.
      insert ls_sel into table lt_sel.
    endif.

    assign component 'PCTR' of structure is_data to field-symbol(<fs_pctr>).
    if <fs_area> is assigned.
      clear ls_sel.
      ls_sel-sign = 'I'.
      ls_sel-option = 'EQ'.
      ls_sel-fieldname = 'PCTR'.
      ls_sel-low = <fs_pctr>.
      insert ls_sel into table lt_sel.
    endif.

    clear ls_sel.
    ls_sel-sign = 'I'.
    ls_sel-option = 'EQ'.
    ls_sel-fieldname = 'USMD_EDITION'.
    ls_sel-low = id_edition.
    insert ls_sel into table lt_sel.

    field-symbols:<fs_table> type any table.

    io_model->create_data_reference(
    exporting
      i_fieldname      = conv usmd_fieldname( id_entitytype )
      i_struct = if_usmd_model_ext=>gc_struct_key_txt
      i_tabtype = if_usmd_model_ext=>gc_tabtype_sorted
    importing
      er_data = lr_data
      et_message = lt_messages
    ).

    assign lr_data->* to <fs_table>.

    io_model->read_char_value(
    exporting
      i_fieldname = conv usmd_fieldname( id_entitytype )
      it_sel = lt_sel
      if_edition_logic =  if_usmdz_cons_general=>gc_yes
      i_readmode =  if_usmd_model_ext=>gc_readmode_all_inact
      if_use_edtn_slice = space
      if_no_flush = abap_true
      importing
        et_data           = <fs_table>
        et_message        = lt_messages
    ).

或尝试以下代码(0G模型亲测可用)

data:lr_data     type ref to data,
         lt_messages type usmd_t_message,
         lt_sel      type usmd_ts_sel,
         ls_sel      type usmd_s_sel.

    data(lo_model_services) = cl_usmdz_object_factory=>get_instance_model_services( io_model = io_model ).

    assign component 'COAREA' of structure is_data to field-symbol(<fs_area>).
    if <fs_area> is assigned.
      clear ls_sel.
      ls_sel-sign = 'I'.
      ls_sel-option = 'EQ'.
      ls_sel-fieldname = 'COAREA'.
      ls_sel-low = <fs_area>.
      insert ls_sel into table lt_sel.
    endif.

    assign component 'PCTR' of structure is_data to field-symbol(<fs_pctr>).
    if <fs_area> is assigned.
      clear ls_sel.
      ls_sel-sign = 'I'.
      ls_sel-option = 'EQ'.
      ls_sel-fieldname = 'PCTR'.
      ls_sel-low = <fs_pctr>.
      insert ls_sel into table lt_sel.
    endif.

    clear ls_sel.
    ls_sel-sign = 'I'.
    ls_sel-option = 'EQ'.
    ls_sel-fieldname = 'USMD_EDITION'.
    ls_sel-low = id_edition.
    insert ls_sel into table lt_sel.

        lo_model_services->read_model(
        exporting
          id_fieldname      = conv usmd_fieldname( id_entitytype )
          id_struct         = if_usmd_model_ext=>gc_struct_key_txt
          id_tabtype        = if_usmd_model_ext=>gc_tabtype_sorted
          if_edition_logic  = if_usmdz_cons_general=>gc_yes
          id_readmode       = if_usmd_model_ext=>gc_readmode_all_inact
          if_use_edtn_slice = space
          it_sel            = lt_sel
          if_no_flush       = abap_true
        importing
          er_data           = lr_data
          et_message        = lt_messages ).

猜你喜欢

转载自blog.csdn.net/u012232542/article/details/114693441
今日推荐