通过CSV文件创建物料主数据的一些建议
-
在Staging Area中创建/修改小批量的物料主数据,推荐使用标准文件上载功能(USMD_FILE_UPLOAD)。
-
使用Data Import Framework (DIF),配合转换器也可以实现在Staging Area中上传物料:
- 所有治理范围内的实体都将基于给定的主键而创建(工厂,分销链等)。
- 这可能导致出现大量的Maintenance Status数据。
- 这可能导致一些意料之外的必输字段检查,比如由于扩展出销售视图,导致重量单位必填。
-
如果你想直接在Active Area中创建完整的物料主数据,你也可以选择其他方式,比如开发自定义批导程序,使用LSMW,使用Migration Cockpit,使用MDG-合并模块等。
下面的章节将详细解释如何基于DIF根据CSV文件批量创建物料主数据。
记住,想要使用DIF在Staging Area中修改物料主数据是不可能的;DIF只允许直接在Active Area中修改物料主数据。
在DIF中使用CSV文件
DIF必须经过一些配置才可以使用CSV文件进行物料主数据导入。下面的步骤展现了如何定义一个新的自定义转换器,并创建对应的BAdI实施。
文件转换器类型
- 定义文件转换器
自定义的文件转换器将在文件导入之后立即执行(可以用于从XML文件匹配字段) - 文件转换器的BAdI
实施文件转换器
BAdI
创建新的BAdI实施
增强点:MDG_FILECONVERTER
BAdI定义:BADI_MDG_FILECONVERTER
为你的转换器设置过滤器
备注:如果你想直接使用Excel文件取代CSV文件用于数据导入,你同样需要自己编写转换器代码。相关代码可参考自SRM包 /SAPSRM/EXCEL,你可以从这个包中复制标准代码,用于在Webdynpro上处理Excel文件。
备注:如果你想支持物料编码的内部给号,可以调用BAPI_STDMATERIAL_GETINTNUMBER来获取新的物料编号,以便在该BAdI中使用。
BAdI 示例代码
METHOD if_ex_mdg_fileconverter~get_data.
* 将文件加载到String字符串
* 按行按列分割字符串得到各字段值
* 转换到IDoc结构
* 包含了MARA,MAKT(默认使用当前登录语言),MARC的内容
DATA: lo_conv TYPE REF TO cl_abap_conv_in_ce.
DATA: lv_file TYPE string.
DATA: lt_table_line TYPE STANDARD TABLE OF string.
DATA: lt_fields TYPE STANDARD TABLE OF string.
DATA: lt_content TYPE mdg_idoc_data_t.
DATA: ls_edidd TYPE edidd.
DATA: ls_maram TYPE e1maram.
DATA: ls_maktm TYPE e1maktm.
DATA: ls_marcm TYPE e1marcm.
DATA: lv_docnum TYPE edi_docnum.
DATA: lt_matnr TYPE TABLE OF bapimatinr.
FIELD-SYMBOLS: <ls_table_line> TYPE string.
FIELD-SYMBOLS: <ls_content> TYPE mdg_idoc_data.
CLEAR: et_content, es_message. " But not EV_CONTENT!
* 获取文件内容
* 使用UTF-8解码
lo_conv = cl_abap_conv_in_ce=>create( encoding = 'UTF-8'
input = iv_file_content_frontend ).
TRY.
CALL METHOD lo_conv->read( IMPORTING data = lv_file ).
CATCH cx_sy_conversion_codepage
cx_sy_codepage_converter_init
cx_parameter_invalid_type
cx_parameter_invalid_range.
RETURN.
ENDTRY.
* 从文件流中获取行
SPLIT lv_file AT gc_delimeter_line INTO TABLE lt_table_line.
* 忽略第一行的抬头信息
DELETE lt_table_line INDEX 1.
* 得到字段值
LOOP AT lt_table_line ASSIGNING <ls_table_line>.
CLEAR: lt_matnr.
SPLIT <ls_table_line> AT gc_delimeter_field INTO TABLE lt_fields.
CHECK NOT lt_fields IS INITIAL.
lv_docnum = lv_docnum + 1.
APPEND INITIAL LINE TO lt_content ASSIGNING <ls_content>.
" 将字段信息映射到IDoc结构
CLEAR: ls_maram, ls_maktm.
CALL METHOD fill_no_data_sign( EXPORTING iv_segment_name = gc_segment_mara CHANGING cs_segment = ls_maram ).
CALL METHOD fill_no_data_sign( EXPORTING iv_segment_name = gc_segment_makt CHANGING cs_segment = ls_maktm ).
CALL METHOD fill_no_data_sign( EXPORTING iv_segment_name = gc_segment_marc CHANGING cs_segment = ls_marcm ).
READ TABLE lt_fields INDEX 2 INTO ls_maram-matnr.
READ TABLE lt_fields INDEX 2 INTO ls_maram-matnr_long.
READ TABLE lt_fields INDEX 3 INTO ls_maram-mtart.
" 如果未输入物料号,则获取内部编号
IF ls_maram-matnr IS INITIAL.
CALL FUNCTION 'BAPI_STDMATERIAL_GETINTNUMBER'
EXPORTING
material_type = ls_maram-mtart
TABLES
material_number = lt_matnr.
ls_maram-matnr = lt_matnr[ 1 ]-material.
ls_maram-matnr_long = lt_matnr[ 1 ]-material.
ENDIF.
READ TABLE lt_fields INDEX 4 INTO ls_maram-mbrsh.
READ TABLE lt_fields INDEX 5 INTO ls_maram-meins.
READ TABLE lt_fields INDEX 6 INTO ls_maram-matkl.
READ TABLE lt_fields INDEX 7 INTO ls_maram-gewei.
READ TABLE lt_fields INDEX 8 INTO ls_maktm-maktx.
READ TABLE lt_fields INDEX 9 INTO ls_marcm-werks.
READ TABLE lt_fields INDEX 10 INTO ls_marcm-ekgrp.
READ TABLE lt_fields INDEX 11 INTO ls_marcm-mtvfp.
READ TABLE lt_fields INDEX 12 INTO ls_marcm-dismm.
READ TABLE lt_fields INDEX 13 INTO ls_marcm-dispo.
ls_maktm-spras = sy-langu.
" 填充 ET_CONTENT
ls_edidd-docnum = lv_docnum.
ls_edidd-segnam = gc_segment_mara.
ls_edidd-sdata = ls_maram.
ls_edidd-dtint2 = strlen( ls_maram ).
APPEND ls_edidd TO <ls_content>-idoc_data.
ls_edidd-docnum = lv_docnum.
ls_edidd-segnam = gc_segment_makt.
ls_edidd-sdata = ls_maktm.
ls_edidd-dtint2 = strlen( ls_maktm ).
APPEND ls_edidd TO <ls_content>-idoc_data.
ls_edidd-docnum = lv_docnum.
ls_edidd-segnam = gc_segment_marc.
ls_edidd-sdata = ls_marcm.
ls_edidd-dtint2 = strlen( ls_marcm ).
APPEND ls_edidd TO <ls_content>-idoc_data.
<ls_content>-idoc_control-docnum = lv_docnum.
<ls_content>-idoc_control-idoctp = gc_matmas.
<ls_content>-idoc_control-sndprn = gv_parnum. "MDG-M MATMAS loader 需要合作伙伴信息
<ls_content>-idoc_control-sndprt = gc_partyp. "MDG-M MATMAS loader 需要合作伙伴信息
ENDLOOP.
CLEAR: ev_content.
et_content = lt_content.
ENDMETHOD.
测试
你可以使用如下的CSV文件用于测试:
该文件中并没有输入物料号,因为FERT物料类型使用内部给号。
导入结果日志:
物料主数据:
DIF全篇总结
DIF系列文章到此告一段落,本系列从最初的什么是DIF,是否该使用DIF,到DIF的应用、配置和开发都有一些详细的介绍和演示。DIF工具对于标准数据对象,例如物料、客户、供应商、及其他对象(SAP提供了26种标准数据对象)的批量导入有着得天独厚的优势。在导入方式上,大部分标准对象都使用了标准的IDoc或Webservice接口进行数据导入,针对MDG管控范围内的对象,还可选择导入MDG Staging Area生成变更申请。此外,在多并发处理、导入排程管理、导入结果日志监控等方面也都有标准功能支撑。顾问在使用时只需关注导入模板设计,及导入模板字段映射标准IDoc/Webervice结构的相关开发。这些都是使用DIF工具的优点。文章来源:https://www.toymoban.com/news/detail-421466.html
缺点方面,一是该工具有一些上手难度,国内缺乏实践和相关资料。二是DIF较为小众,相较于更广为人知的LSMW,MM16,甚至是Migration Cockpit或自开发程序,国内几乎无人知道DIF的存在。此外,针对大批量的数据导入,由于底层还是使用的IDoc或Webservice接口,在效率上比传统BAPI会更慢一些。文章来源地址https://www.toymoban.com/news/detail-421466.html
到了这里,关于SAP MDG —— 使用DIF导入物料主数据 Part4 开发篇的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!