点击此处---> 群内免费提供SAP练习系统(在群公告中)
加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)
大家好,
我在跨实体Badi中编写了与植物相关的UIBB的派生。我面临的技术挑战很小。
我的派生基于材料类型。但是,当我选择"在植物之间"时,有。 禁用了植物UIBB,则派生材料类型无效。当我选择植物时,我在交叉实体badi中编写的派生材料无效。
当我添加工厂时,派生必须基于材料类型来工作。有人可以帮助我如何实现此目标。正是我在Cross Entity badi中犯了一个错误。 快速帮助将不胜感激。
*获取材料数据
io_changed_data-> read_data(EXPORTING
i_entity ='MATERIAL'
i_struct = io_model-> gc_struct_key_attrIMPORTING
er_t_data_ins = lr_t_ins_br
F
RETURN.ELSE.READ表
**确保在UI上更改BU_header值 *检查
*为实体类型BP_TAXNUM创建数据引用 呼叫方法io_model-> create_data_referenceEXPORTING
i_fieldname ='MARCMRPPP'
i_struct ='KATTR'"根据IT_ATTRIBUTE的键和属性
i_tabtype = if_usmd_model_ext => gc_tabtype_standardIMPORT br_ er_data = lrt_entity_data。 *将实体分配给表。如果填充了该表,则将用于写入数据 ASSIGN lrt_entity_data-> * TO
*使用上下文类获取更改请求编号
go_context = cl_usmd_app_context => get_context()。调用方法go_context-> get_attributesIMPORTING
ev_crequest_id = iv_cr_number。
ls_sel-sign = lc_incl。
ls_sel-option = lc_equal。
ls_sel-fieldname = usmd0_cs_fld-crequest。
ls_sel-low = iv_cr_number.INSERT ls_sel输入到表lt。 *使用上面派生的变更请求编号获取实体。 这是多余的,以后可能会删除。 **我们从上面的io_model-> read_data获取BP编号调用方法io_model-> read_char_valueEXPORTING
i_fieldname = usmd0_cs_fld-crequest
it_sel = lt_sel
if_use_edtn_slice = abap_falseIMPORTING
et_data = lt_objlist.READ TABLE lt_objlist INTO ls_objlist INDEX 1.
lv_matnr = ls_objlist-usmd_value。
ls_selinsign =。 -option = lc_equal。
ls_sel-fieldname ='MATERIAL'。 "'DISPR'。"'DISMM'。
ls_sel-low = lv_matnr.INSERT ls_sel插入表lt_sel。 *如果有的话,将分配给BP_TAXNUM的taxnum。 io_model-> read_char_valueEXPORTING
i_fieldname ='MARCMRPPP'
it_sel = lt_selIMPORTING
et_data =
*在这里,我们可以输入进一步的逻辑以根据材料类型分配不同的MRP配置文件 清除wa_tab。
wa_tab-material =
wa_tab-dismm ='PD'.ELSE。
wa_tab -dismm =''.ENDIF。
附加wa_tab到lt_tab。
*为新实体创建动态结构的逻辑 *
gs_comp-name ='材料'。
gs_comp-type?= cl_abap_elemdescr => describe_by_name('MATNR')。将gs_comp添加到gt_comp。
gs_comp-name ='WERKS'。
gs_comp- 类型?= cl_abap_elemdescr => describe_by_name('WERKS_D')。APPEND gs_comp至gt_comp。
gs_comp-name ='MARCMRPPP'。
gs_comp-type?= cl_abap_elemdescr => describe_by_name('DISMM')。 附加gs_comp至gt_comp。
gs_comp-name ='DISMM'。
gs_comp-type?= cl_abap_elemdescr => describe_by_name('DISMM').APPEND gs_comp至gt_comp。
尝试。
r_type_struct = cl_abap_structdescr => create(
p_components = gt_comp).CATCH cx_sy_struct_creation .ENDTRY。 * TRY。
r_type_table = cl_abap_tabledescr => create(r_type_struct)。
捕获cx_sy _creation .ENDTRY。 * 创建数据:r_data_tab TYPE HANDLE r_type_table,
r_data_str TYPE HANDLE r_type_struct。 * ASSIGN:r_data_tab-> * TO
r_data_str-> *至
*填充属性表创建数据lr_descr_struc类似
lo_structdescr?= cl_abap_structdescr => describe_by_data_ref(p_data_ref = lr_descr_struc)。LOOPAT lo_structdescr->组件AS .INSERT
*删除旧值(如果有) *如果
io_write_data-> delete_data(EXPORTING
i_entity ='MARCMRPPP'
it_data =
*写入MRP配置文件 如果
io_write_data-> write_data(EXP ORTING
i_entity ='MARCMRPPP'
it_attribute = lt_attribute
it_data =
您好Vidya,
在此代码中发现错误,肯定有人需要时间来首先分析:-)。
但是,我不确定您使用的方法是否足够好。 添加/更改工厂时,需要进行派生。(基于材料类型),这意味着您需要基于工厂实体而非材料实体的代码。
*获取材料数据
io_changed_data-> read_data(EXPORTING
i_entity ='MATERIAL'
i_struct = io_model-> gc_struct_key_attrIMPORTING
er_t_data_ins = lr_t_ins
er_t_data_upd = lr/em>
在对Plant实体进行更改时,lr_t_ins和lr_t_upd始终为空白。
如果您需要阅读材料类型,请使用以下代码:-
lo_model-> create_data_reference(导出i_fieldname = IF_MDG_BS_MAT_GEN_C => GC_FIELDNAME_MATERIAL
i_struct = if_usmd_model_ext => gc_struct_key_attr
it_attribute = VALUE#((fieldname ='MTART'))
if_table = abap_true
i_tabtype = if_usmd_model_ext => gc_tabtype_sorted
IMPORT (lo_data))。
字段符号:类型排序表。
ASSIGN lo_data-> * TO。
*读取属性数据
DATA:lv_matnr类型MATNR。 "您现有的物料编号
lo_model-> read_char_value(导出i_fieldname = IF_MDG_BS_MAT_GEN_C => GC_FIELDNAME_MATERIAL
it_sel = VALUE#(FOR LINE IN lt_object(sign ='I'option ='EQ'fieldname = IF_MDG_BS_MAT_GEN_C => GC_FIELDNAME_MATERIAL low = = lv_matnr))
if_use_edtn_slice = abap_false)。
导入et_data =
现在,在读取"材料类型"(在中)之后,您可以通过使用 io_changed_data-> read_data 检查MARC实体的数据来进行MARC实体的派生。
干杯
罗希特
一周热门 更多>