MDG跨实体校验(cross entity validation)读取entity text

16 篇文章 0 订阅
15 篇文章 2 订阅

背景

实现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 ).
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值