SAP MDG —— 使用DIF导入物料主数据 Part4 开发篇

文章目录

  • 通过CSV文件创建物料主数据的一些建议
  • 在DIF中使用CSV文件
    • 文件转换器类型
    • BAdI
    • BAdI 示例代码
    • 测试
  • DIF全篇总结

通过CSV文件创建物料主数据的一些建议

  1. 在Staging Area中创建/修改小批量的物料主数据,推荐使用标准文件上载功能(USMD_FILE_UPLOAD)。

  2. 使用Data Import Framework (DIF),配合转换器也可以实现在Staging Area中上传物料:

    • 所有治理范围内的实体都将基于给定的主键而创建(工厂,分销链等)。
    • 这可能导致出现大量的Maintenance Status数据。
    • 这可能导致一些意料之外的必输字段检查,比如由于扩展出销售视图,导致重量单位必填。
  3. 如果你想直接在Active Area中创建完整的物料主数据,你也可以选择其他方式,比如开发自定义批导程序,使用LSMW,使用Migration Cockpit,使用MDG-合并模块等。

下面的章节将详细解释如何基于DIF根据CSV文件批量创建物料主数据。
记住,想要使用DIF在Staging Area中修改物料主数据是不可能的;DIF只允许直接在Active Area中修改物料主数据。

在DIF中使用CSV文件

DIF必须经过一些配置才可以使用CSV文件进行物料主数据导入。下面的步骤展现了如何定义一个新的自定义转换器,并创建对应的BAdI实施。

文件转换器类型

  • 定义文件转换器
    自定义的文件转换器将在文件导入之后立即执行(可以用于从XML文件匹配字段)
  • 文件转换器的BAdI
    实施文件转换器

SAP MDG —— 使用DIF导入物料主数据 Part4 开发篇_第1张图片
SAP MDG —— 使用DIF导入物料主数据 Part4 开发篇_第2张图片

BAdI

SAP MDG —— 使用DIF导入物料主数据 Part4 开发篇_第3张图片
创建新的BAdI实施
SAP MDG —— 使用DIF导入物料主数据 Part4 开发篇_第4张图片
增强点:MDG_FILECONVERTER
BAdI定义:BADI_MDG_FILECONVERTER

SAP MDG —— 使用DIF导入物料主数据 Part4 开发篇_第5张图片
SAP MDG —— 使用DIF导入物料主数据 Part4 开发篇_第6张图片
SAP MDG —— 使用DIF导入物料主数据 Part4 开发篇_第7张图片
SAP MDG —— 使用DIF导入物料主数据 Part4 开发篇_第8张图片
为你的转换器设置过滤器
SAP MDG —— 使用DIF导入物料主数据 Part4 开发篇_第9张图片
备注:如果你想直接使用Excel文件取代CSV文件用于数据导入,你同样需要自己编写转换器代码。相关代码可参考自SRM包 /SAPSRM/EXCEL,你可以从这个包中复制标准代码,用于在Webdynpro上处理Excel文件。

备注:如果你想支持物料编码的内部给号,可以调用BAPI_STDMATERIAL_GETINTNUMBER来获取新的物料编号,以便在该BAdI中使用。

BAdI 示例代码

METHOD if_ex_mdg_fileconverter~get_data.
* 将文件加载到String字符串
* 按行按列分割字符串得到各字段值
* 转换到IDoc结构
* 包含了MARAMAKT(默认使用当前登录语言),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物料类型使用内部给号。
SAP MDG —— 使用DIF导入物料主数据 Part4 开发篇_第10张图片
导入结果日志:
SAP MDG —— 使用DIF导入物料主数据 Part4 开发篇_第11张图片
物料主数据:
SAP MDG —— 使用DIF导入物料主数据 Part4 开发篇_第12张图片

SAP MDG —— 使用DIF导入物料主数据 Part4 开发篇_第13张图片

SAP MDG —— 使用DIF导入物料主数据 Part4 开发篇_第14张图片

DIF全篇总结

DIF系列文章到此告一段落,本系列从最初的什么是DIF,是否该使用DIF,到DIF的应用、配置和开发都有一些详细的介绍和演示。DIF工具对于标准数据对象,例如物料、客户、供应商、及其他对象(SAP提供了26种标准数据对象)的批量导入有着得天独厚的优势。在导入方式上,大部分标准对象都使用了标准的IDoc或Webservice接口进行数据导入,针对MDG管控范围内的对象,还可选择导入MDG Staging Area生成变更申请。此外,在多并发处理、导入排程管理、导入结果日志监控等方面也都有标准功能支撑。顾问在使用时只需关注导入模板设计,及导入模板字段映射标准IDoc/Webervice结构的相关开发。这些都是使用DIF工具的优点。

缺点方面,一是该工具有一些上手难度,国内缺乏实践和相关资料。二是DIF较为小众,相较于更广为人知的LSMW,MM16,甚至是Migration Cockpit或自开发程序,国内几乎无人知道DIF的存在。此外,针对大批量的数据导入,由于底层还是使用的IDoc或Webservice接口,在效率上比传统BAPI会更慢一些。

你可能感兴趣的:(SAP-MDG-HOWTO,MDG,SAP,DIF)