背景
实现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 ).