与植物相关的UIBB的跨实体派生

2020-09-24 21:20发布

         点击此处--->   EasySAP.com群内免费提供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 t_d_data = lr_t_upd).ASSIGN lr_t_ins-> * TO .ASSIGN lr_t_upd-> * TO 。 *仅在返回数据时继续 I

F 未分配或初始。

RETURN.ELSE.READ表分配索引1.IF sy-subrc = 0.将结构的'材料'分配到 .ASSIGN的结构'MTART'分配到 TO .ASSIGN组件'USMDX_S_UPDATE'结构 TO 。 *仅当BU_HEADER具有值 IF IS INITIAL.RETURN.ENDIF.ENDIF.ENDIF时,才继续操作。
**确保在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 。 *将实体分配给表。 如果已填充将用于删除数据 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-werks ='0001'。 "此时无需添加工厂,因此注释掉 * wa_tab-dismm ='ND'。"此时无需添加MRP类型。 如果需要,取消注释并传递要求的值。如果 ='FERT'或
='HALB'。
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-> *至。 *填充以写入数据 LOOP AT lt_tab进入wa_tab.MOVE-CORRESPONDING wa_tab TO .APPEND .ENDLOOP。
*填充属性表创建数据lr_descr_struc类似的行。
lo_structdescr?= cl_abap_structdescr => describe_by_data_ref(p_data_ref = lr_descr_struc)。LOOPAT lo_structdescr->组件AS .INSERT -名称INTO TABLE lt_attribute.ENDLOOP。
*删除旧值(如果有) *如果不是INITIAL且不是INITIAL。/em>如果不是初始的。
io_write_data-> delete_data(EXPORTING
i_entity ='MARCMRPPP'
it_data = ).ENDIF。
*写入MRP配置文件 如果不是INITIAL.TRY。
io_write_data-> write_data(EXP ORTING
i_entity ='MARCMRPPP'
it_attribute = lt_attribute
it_data = ).CATCH cx_usmd_write_error。 "写入访问期间发生错误 RETURN.ENDTRY.ENDIF。

         点击此处--->   EasySAP.com群内免费提供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 t_d_data = lr_t_upd).ASSIGN lr_t_ins-> * TO .ASSIGN lr_t_upd-> * TO 。 *仅在返回数据时继续 I

F 未分配或初始。

RETURN.ELSE.READ表分配索引1.IF sy-subrc = 0.将结构的'材料'分配到 .ASSIGN的结构'MTART'分配到 TO .ASSIGN组件'USMDX_S_UPDATE'结构 TO 。 *仅当BU_HEADER具有值 IF IS INITIAL.RETURN.ENDIF.ENDIF.ENDIF时,才继续操作。
**确保在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 。 *将实体分配给表。 如果已填充将用于删除数据 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-werks ='0001'。 "此时无需添加工厂,因此注释掉 * wa_tab-dismm ='ND'。"此时无需添加MRP类型。 如果需要,取消注释并传递要求的值。如果 ='FERT'或
='HALB'。
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-> *至。 *填充以写入数据 LOOP AT lt_tab进入wa_tab.MOVE-CORRESPONDING wa_tab TO .APPEND .ENDLOOP。
*填充属性表创建数据lr_descr_struc类似的行。
lo_structdescr?= cl_abap_structdescr => describe_by_data_ref(p_data_ref = lr_descr_struc)。LOOPAT lo_structdescr->组件AS .INSERT -名称INTO TABLE lt_attribute.ENDLOOP。
*删除旧值(如果有) *如果不是INITIAL且不是INITIAL。/em>如果不是初始的。
io_write_data-> delete_data(EXPORTING
i_entity ='MARCMRPPP'
it_data = ).ENDIF。
*写入MRP配置文件 如果不是INITIAL.TRY。
io_write_data-> write_data(EXP ORTING
i_entity ='MARCMRPPP'
it_attribute = lt_attribute
it_data = ).CATCH cx_usmd_write_error。 "写入访问期间发生错误 RETURN.ENDTRY.ENDIF。

1条回答
灬番茄
1楼 · 2020-09-24 21:52.采纳回答

您好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实体的派生。

干杯

罗希特

一周热门 更多>