主数据批量导入变式物料(相应的特性值),并更新视图(MM03)

目录

项目需求:

难点和重点部分

实例


项目需求:

根据物料编码,批量更新变式物料及对应的特性值。

  

难点和重点部分

1、EXCEL导入的时候,特性是一行模式保存,需要进行行列转换以后才能更新特性值。

2、如果物料已经更新变式物料,而且存在一部分特性,那么需要做到没有的新增,有的修改成新值。

3、各个函数的参数的确定。

实例

*&---------------------------------------------------------------------*
*& Report
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zppr012.
"定义类型池
TYPE-POOLS: slis,icon.
TABLES:sscrfields.

*&---------------------------------------------------------------------&*
*&              ALV parameter   *&
*&---------------------------------------------------------------------&*
DATA:g_repid     LIKE sy-repid,
     it_fieldcat TYPE lvc_t_fcat WITH HEADER LINE,
     is_layout   TYPE lvc_s_layo.

DATA gt_exclud TYPE TABLE OF sy-ucomm WITH HEADER LINE.

DATA: is_functxt TYPE smp_dyntxt.
DATA: it_raw  TYPE truxs_t_text_data.
*&---------------------------------------------------------------------&*
*&              全局变量   *&
*&---------------------------------------------------------------------&*

"EXCEL导入数据对应模板的内表
DATA :BEGIN OF gs_record1.
        matnr    TYPE  matnr,   "物料
        werks    TYPE  werks_d, "工厂
        stdpd    TYPE  string,  "可配置物料
data:    
       INCLUDE TYPE zbts001.    "特性
END OF gs_record.
DATA gt_record LIKE TABLE OF gs_record.
"alv显示数据的内表
DATA:BEGIN OF gs_out.
       INCLUDE STRUCTURE gs_record.
DATA:
       sel,                          "可选行
       zlight(30),                   "指示灯
       zstatu     TYPE bapi_mtype,   "状态
       zmessg     TYPE bapi_msg,     "消息
     END OF gs_out.
DATA:gt_out LIKE TABLE OF gs_out.

*&

DATA:BEGIN OF ga_out,
       lvorm     LIKE marc-lvorm,    "删除标记
       werks     LIKE marc-werks ,   " 工厂
       matnr(40) TYPE c ,            " 物料编码
       maktx     LIKE makt-maktx,    "物料中文描述
       mtart     LIKE mara-mtart,    "物料类型
       matkl     LIKE mara-matkl,    "物料组
       stdpd     LIKE marc-stdpd,
       laeda     LIKE msta-laeda,
       ersda     LIKE msta-ersda,
       selt,
       objek     TYPE ausp-objek,
       zxgbs(1),
     END OF ga_out.

DATA:BEGIN OF ls_out.
       INCLUDE STRUCTURE ga_out.
       INCLUDE TYPE zbts001.

DATA:
END OF ls_out.


DATA  restrict TYPE sscr_restrict.
DATA : optlist TYPE sscr_opt_list,
       ass     TYPE sscr_ass.
*----------------------------------------------------------------------*
*          选择屏幕                                               *
*----------------------------------------------------------------------*
"SELECT-OPTIONS:s_werks FOR t001w-werks NO INTERVALS NO-EXTENSION OBLIGATORY.


SELECTION-SCREEN BEGIN OF BLOCK a2 WITH FRAME TITLE TEXT-002.
  PARAMETERS: p_file LIKE rlgrap-filename.
SELECTION-SCREEN END OF BLOCK a2.
SELECTION-SCREEN FUNCTION KEY 1.

INITIALIZATION.

  is_functxt-icon_id   = icon_xls.
  is_functxt-icon_text = '下载模板'.
  sscrfields-functxt_01 = is_functxt.
*----------------------------------------------------------------------*
*          AT SELECTION-SCREEN)                                        *
*----------------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
  PERFORM file_input CHANGING p_file .

*----------------------------------------------------------------------*
*          AT SELECTION-SCREEN)                                        *
*----------------------------------------------------------------------*

AT SELECTION-SCREEN.
  IF sscrfields-ucomm = 'FC01'.
    PERFORM downdload_template USING 'ZPPR012' '批量维护变式物料模板'.
  ENDIF.

**  权限检查 .
*  SELECT SINGLE werks FROM t001w INTO gv_werks WHERE werks IN s_werks.
*  AUTHORITY-CHECK OBJECT 'Z_BUKRS'
*   ID 'ACTVT' FIELD '03'
*   ID 'WERKS' FIELD s_werks.
*  IF sy-subrc <> 0.
*    MESSAGE '你没有此工厂的权限' TYPE  'E' DISPLAY LIKE 'S'.
*    LEAVE LIST-PROCESSING.
*  ENDIF.
*----------------------------------------------------------------------*
*       初始化                                           *
*----------------------------------------------------------------------*

AT SELECTION-SCREEN OUTPUT.

*----------------------------------------------------------------------*
*          START-OF-SELECTION 主程序                     *
*----------------------------------------------------------------------*
START-OF-SELECTION.

  PERFORM upload_data.
  PERFORM process_data.
  PERFORM disp_alv.

*&---------------------------------------------------------------------*
*& Form upload_data
*&---------------------------------------------------------------------*
*& 上传数据
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM upload_data .
  DATA:lt_excel TYPE TABLE OF zalsmex_tabline.
  DATA ls_excel LIKE LINE OF lt_excel.
  FIELD-SYMBOLS:<fs>.
  IF p_file IS INITIAL.
    MESSAGE '导入数据不能为空' TYPE 'S' DISPLAY LIKE 'E'.
    LEAVE LIST-PROCESSING.
  ELSE.
**上传数据
    CALL FUNCTION 'ZALSM_EXCEL_TO_INTERNAL_TABLE'
      EXPORTING
        filename                = p_file
        i_begin_col             = 1
        i_begin_row             = 3
        i_end_col               = 99
        i_end_row               = 19999
      TABLES
        intern                  = lt_excel
      EXCEPTIONS
        inconsistent_parameters = 1
        upload_ole              = 2
        OTHERS                  = 3.
    IF sy-subrc <> 0.
* implement suitable error handling here
    ENDIF.

    LOOP AT lt_excel INTO ls_excel.
      ASSIGN COMPONENT ls_excel-col OF STRUCTURE gs_record TO <fs>.
      CONDENSE ls_excel-value NO-GAPS.                  " 去掉空格
      <fs> = ls_excel-value.
      AT END OF row.
        "gs_tab-row = ls_excel-row.

        CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
          EXPORTING
            input        = gs_record-matnr
          IMPORTING
            output       = gs_record-matnr
          EXCEPTIONS
            length_error = 1
            OTHERS       = 2.
        MOVE-CORRESPONDING gs_record TO gs_out.
        APPEND gs_out TO gt_out.
        APPEND gs_record TO gt_record.
        CLEAR gs_out.
        CLEAR: gs_record.
      ENDAT.
    ENDLOOP.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form process_data
*&---------------------------------------------------------------------*
*& 处理数据
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM process_data .
  "检查数据是否存在
  "导入数据是否正确
ENDFORM.

*&---------------------------------------------------------------------*
*& Form disp_alv
*&---------------------------------------------------------------------*
*& alv显示
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM disp_alv.
  DATA: l_user_command  TYPE slis_formname,
        l_pf_status_set TYPE slis_formname.

  CLEAR it_fieldcat.REFRESH it_fieldcat.

  PERFORM get_catlog.

  l_user_command  = 'USER_COMMAND'.
  l_pf_status_set =  'SET_PF_STATUS'.

  is_layout-zebra = 'X'.
  is_layout-box_fname = 'SEL'.
  is_layout-cwidth_opt = 'X'.

  g_repid = sy-repid.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_interface_check        = ' '
      i_buffer_active          = ' '
      i_callback_pf_status_set = l_pf_status_set
      i_callback_user_command  = l_user_command
      i_callback_program       = g_repid
      is_layout_lvc            = is_layout      "it_events = lt_event
      it_fieldcat_lvc          = it_fieldcat[]
      i_save                   = 'A'
    TABLES
      t_outtab                 = gt_out[].
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  set_pf_status
*&---------------------------------------------------------------------*
*      status显示
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM set_pf_status USING pwa_extab TYPE slis_t_extab.
  SET PF-STATUS 'STATUS' EXCLUDING gt_exclud.
ENDFORM.                    " SET_PF_STATUS
**&---------------------------------------------------------------------*
**&      Form  user_command
**&---------------------------------------------------------------------*
**       command
**----------------------------------------------------------------------*
**      -->r_ucomm   like   sy-ucomm
**      -->rs_selfield  TYPE slis_selfield.
**----------------------------------------------------------------------*
FORM user_command USING pa_ucomm LIKE sy-ucomm
      pwa_selfield TYPE slis_selfield.
  DATA gv_out LIKE TABLE OF gs_out.

  DATA: lr_grid TYPE REF TO cl_gui_alv_grid.

  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = lr_grid.

  CALL METHOD lr_grid->check_changed_data.

  CASE pa_ucomm.
    WHEN 'ZCRT'.
      READ TABLE gt_out INTO gs_out WITH KEY sel = 'X'.
      IF sy-subrc = 0.
        PERFORM crt_wer_data.
      ELSE.
        MESSAGE '请选择有效行' TYPE 'E'.
      ENDIF.

    WHEN 'OTHER'.
  ENDCASE.

*& 处理后重新加载ALV
  CALL METHOD lr_grid->get_frontend_layout
    IMPORTING
      es_layout = is_layout.
  is_layout-cwidth_opt = 'X'.
  CALL METHOD lr_grid->set_frontend_layout
    EXPORTING
      is_layout = is_layout.
  CALL METHOD lr_grid->refresh_table_display.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form get_catlog
*&---------------------------------------------------------------------*
*&  fieldcat
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM get_catlog.
  DATA: it_fieldcatalog TYPE slis_t_fieldcat_alv WITH HEADER LINE.

  CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
    EXPORTING
      i_program_name         = sy-repid
*     I_INTERNAL_TABNAME     =
      i_structure_name       = 'ZBTS001'
*     I_CLIENT_NEVER_DISPLAY = 'X'
      i_inclname             = sy-repid
    CHANGING
      ct_fieldcat            = it_fieldcatalog[]
    EXCEPTIONS
      inconsistent_interface = 1
      program_error          = 2
      OTHERS                 = 3.
  IF sy-subrc <> 0.
* Implement suitable error handling here
  ENDIF.

  CALL FUNCTION 'LVC_TRANSFER_FROM_SLIS'
    EXPORTING
      it_fieldcat_alv = it_fieldcatalog[]
    IMPORTING
      et_fieldcat_lvc = it_fieldcat[]
    TABLES
      it_data         = gt_out[]
    EXCEPTIONS
      it_data_missing = 1
      OTHERS          = 2.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.


  DEFINE lit_fieldcat.
    it_fieldcat-tabname   = 'GT_OUT'.
    it_fieldcat-fieldname = &1.
    it_fieldcat-coltext   = &2.
    it_fieldcat-just      = &3.
    it_fieldcat-ref_field = &4.
    it_fieldcat-ref_table = &5.
    it_fieldcat-outputlen = &6.
    APPEND  it_fieldcat.
    CLEAR  it_fieldcat.
  END-OF-DEFINITION.   "lit_fieldcat

  lit_fieldcat :
  'ZLIGHT'  '标识'  'C' ''    ''   '4',
  'ZSTATU'  '状态'  'C' ''    ''   '6',
  'ZMESSG'  '消息'  'C' ''    ''   '100',
  'MATNR'   '物料编码'   'C' '' ''   '',
  'WERKS'   '工厂'       'C' '' ''   '',
  'STDPD'   '可配置物料' 'C' '' ''   ''.

ENDFORM.
FORM downdload_template USING p_objid TYPE wwwdatatab-objid
      p_filename TYPE string.

  DATA: w_objdata     LIKE wwwdatatab,
        w_mime        LIKE w3mime,
        "w_filename    TYPE string,
        w_fullpath    TYPE string VALUE 'C:/TEMP/',
        w_path        TYPE string VALUE 'C:/TEMP/',
        w_destination LIKE rlgrap-filename,
        w_objnam      TYPE string,
        w_rc          LIKE sy-subrc,
        w_errtxt      TYPE string,
        p_dest        LIKE sapb-sappfad,
        w_action      TYPE i.

  CALL METHOD cl_gui_frontend_services=>file_save_dialog
    EXPORTING
      window_title         = '下载导入模板'
      default_extension    = 'XLS;XLSX'
      default_file_name    = p_filename
      file_filter          = 'EXCEL文件|*.XLSX;*.XLS'
    CHANGING
      filename             = p_filename
      path                 = w_path
      fullpath             = w_fullpath
      user_action          = w_action
    EXCEPTIONS
      cntl_error           = 1
      error_no_gui         = 2
      not_supported_by_gui = 3
      OTHERS               = 4.

  IF sy-subrc = 0 AND w_action EQ 0.
    p_dest = w_fullpath.
    CONDENSE w_objnam NO-GAPS.
    SELECT SINGLE relid objid
    INTO CORRESPONDING FIELDS OF w_objdata
    FROM wwwdata
    WHERE srtf2 = 0 AND relid = 'MI' AND objid = p_objid.
    IF sy-subrc NE 0 OR w_objdata-objid EQ space.
      CONCATENATE '模板文件' w_objnam '不存在' INTO w_errtxt.
      MESSAGE w_errtxt TYPE 'I'.
    ENDIF.
    w_destination = p_dest.
    CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
      EXPORTING
        key         = w_objdata
        destination = w_destination
      IMPORTING
        rc          = w_rc.
    IF w_rc NE 0.
      CONCATENATE '模板文件:' w_objnam '下载失败' INTO w_errtxt.
      MESSAGE w_errtxt TYPE 'E'.
    ENDIF.
  ENDIF.
ENDFORM.

FORM file_input  CHANGING p_file.

  DATA:lt_tab         TYPE filetable,         "存放文件名的内表
       lv_file_filter TYPE string,            "file filter
       lv_rc          TYPE i.                 "函数返回值

  REFRESH:lt_tab.
  CLEAR:lv_file_filter,lv_rc.

  lv_file_filter = 'EXCEL文件|*.XLS;*.XLSX'.

  CALL METHOD cl_gui_frontend_services=>file_open_dialog
    EXPORTING
      window_title            = '选择数据文件'
      file_filter             = lv_file_filter
*initial_directory       = 'C:\'
    CHANGING
      file_table              = lt_tab
      rc                      = lv_rc
    EXCEPTIONS
      file_open_dialog_failed = 1
      cntl_error              = 2
      error_no_gui            = 3
      not_supported_by_gui    = 4
      OTHERS                  = 5.

  IF sy-subrc = 0 AND lv_rc = 1.
    READ TABLE lt_tab INTO p_file INDEX 1.
  ELSE.
    MESSAGE '没有选择文件或是选择文件错误!' TYPE 'S'.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form CRT_BOM_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM crt_wer_data.
  DATA:t_e1cucfg LIKE TABLE OF e1cucfg,
       s_e1cucfg LIKE e1cucfg,
       t_e1cuins LIKE TABLE OF e1cuins,
       s_e1cuins LIKE e1cuins,
       t_e1cuval LIKE TABLE OF e1cuval,
       t_e1adata LIKE TABLE OF e1cuval,
       s_e1cuval LIKE e1cuval,
       t_e1cucom LIKE TABLE OF e1cucom,
       s_e1cucom LIKE e1cucom.

  DATA bapi_matreturn2 LIKE TABLE OF bapi_matreturn2.
  FIELD-SYMBOLS <f3>.

  DATA: cuib_cuobj TYPE cuib_cuobj,
        cuobj      LIKE inob-cuobj,
        matnr      TYPE matnr,
        stdpd      TYPE stdpd,
        lt_tab     LIKE TABLE OF e1cuval,
        ls_tab     LIKE e1cuval.
  CLEAR:matnr,cuobj, stdpd,bapi_matreturn2,cuib_cuobj.

  DATA lt_vbule LIKE TABLE OF e1cuval.
  DATA ls_vbule LIKE e1cuval.

  DATA t_configuration LIKE TABLE OF conf_out.
  DATA s_configuration LIKE conf_out.

  SELECT cuobj,matnr ,werks
    FROM marc
    INTO TABLE @DATA(lt_marc)
    FOR ALL ENTRIES IN @gt_out
    WHERE matnr = @gt_out-matnr
      AND werks = @gt_out-werks.

*&行转换为列
  FIELD-SYMBOLS: <fs> TYPE any.
  FIELD-SYMBOLS:<fs_comp> TYPE abap_compdescr.

  DATA:cl_descr TYPE REF TO cl_abap_structdescr.

  cl_descr ?= cl_abap_typedescr=>describe_by_data( gs_record ).
  "获取内部结构的字段名
  IMPORT ls_out FROM MEMORY ID  'ZPPR015_D'.
  FREE MEMORY ID 'ZPPR015_D'.
  IF ls_out IS NOT INITIAL.
    MOVE-CORRESPONDING ls_out TO gs_out.
    MOVE-CORRESPONDING ls_out TO gs_record.
    gs_out-sel = 'X'.
    APPEND gs_out TO gt_out.
    APPEND gs_record TO gt_record.
  ENDIF.

  SORT lt_marc BY matnr werks.
  DATA i_num TYPE i.
  DATA i_num_1 TYPE i.
  CLEAR: i_num,i_num_1.
  DATA s_text TYPE string.
  DESCRIBE TABLE gt_out LINES i_num.
  LOOP AT gt_out INTO gs_out WHERE sel = 'X'.
    i_num_1 = i_num_1 + 1.
    CLEAR:lt_vbule[],t_e1cucfg[],t_e1cuins[],t_e1cuval[],t_e1cucom[].
    LOOP AT gt_record INTO gs_record WHERE matnr = gs_out-matnr AND werks = gs_out-werks.
      LOOP AT cl_descr->components ASSIGNING <fs_comp>.
        ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE gs_record TO <fs>.
        ls_vbule-charc = <fs_comp>-name.
        ls_vbule-value = <fs>.
        ls_vbule-inst_id = '00000001'.
        APPEND ls_vbule TO lt_vbule.
        CLEAR ls_vbule.
      ENDLOOP.
    ENDLOOP.
    DELETE lt_vbule WHERE charc = 'MATNR' OR  charc = 'WERKS' OR charc = 'STDPD' OR value IS INITIAL.

    READ TABLE lt_marc INTO DATA(ls_marc) WITH KEY matnr = gs_out-matnr
                                                   werks = gs_out-werks BINARY SEARCH.
    IF sy-subrc = 0.
      cuib_cuobj = ls_marc-cuobj.

      CALL FUNCTION 'CUXM_GET_CONFIGURATION'
        EXPORTING
          instance                     = cuib_cuobj
          werks                        = ls_marc-werks
        TABLES
          t_e1cucfg                    = t_e1cucfg
          t_e1cuins                    = t_e1cuins
          t_e1cuval                    = t_e1cuval
          t_e1cucom                    = t_e1cucom
        EXCEPTIONS
          instance_not_found           = 1
          internal_error               = 2
          instance_is_a_classification = 3
          OTHERS                       = 4.

*&增加导入数据进行创建。
      IF t_e1cuval[] IS NOT INITIAL.
        CLEAR:t_e1cucfg[],t_e1cuins[],t_e1cucom[].

        DATA lt_tabe LIKE TABLE OF e1cuval.

        LOOP AT t_e1cuval INTO s_e1cuval.
          READ TABLE lt_vbule INTO ls_vbule WITH KEY charc = s_e1cuval-charc.
          IF sy-subrc = 0.

          ELSE.
            ls_vbule-charc = s_e1cuval-charc.
            ls_vbule-value = s_e1cuval-value.
            ls_vbule-inst_id = s_e1cuval-inst_id.
            APPEND ls_vbule TO lt_vbule.
            CLEAR ls_vbule .
          ENDIF.
          CLEAR s_e1cuval.
        ENDLOOP.
      ENDIF.
    ENDIF.

*&----------------------------------------------------------
    DATA:material               LIKE mara-matnr,
         plant                  LIKE marc-werks,
         date                   LIKE sy-datum,
         classtype              LIKE klah-klart,
         class                  LIKE klah-class,
         objectkey_imp          LIKE bapi1003_key-object,
         objecttable_imp        LIKE bapi1003_key-objecttable,
         classtype_imp          LIKE bapi1003_key-classtype,


         match                  LIKE TABLE OF cusl_04 WITH HEADER LINE,
         s_match                LIKE cusl_04,
         objects_classification LIKE TABLE OF ausp,
         s_objects_c            LIKE ausp,
         selection              LIKE TABLE OF comw,
         s_selection            LIKE comw,
         objects                LIKE TABLE OF clsel_search_objects,
         s_objects              LIKE clsel_search_objects,
         alloclist              LIKE TABLE OF bapi1003_alloc_list WITH HEADER LINE,
         s_alloclist            LIKE bapi1003_alloc_list,
         lt_return              LIKE TABLE OF bapiret2 WITH HEADER LINE,
         ls_return              LIKE bapiret2.

    DATA:t_alloc_list LIKE TABLE OF bapi1003_alloc_list,
         t_alloc_char LIKE TABLE OF bapi1003_alloc_values_char,
         s_alloc_char LIKE bapi1003_alloc_values_char,
         t_return     LIKE TABLE OF bapiret2.

    CLEAR:t_e1cucfg[],t_e1cuins[],t_e1cuval[],t_e1cucom[],
          selection[],match[],objects_classification[],objects[],
          material,alloclist-classnum,lt_return[],alloclist[],objectkey_imp.

    s_e1cucfg-config_id = '000001'.
    s_e1cucfg-root_id   = '00000001'.
    APPEND s_e1cucfg TO t_e1cucfg.
    CLEAR s_e1cucfg.

    s_e1cuins-inst_id    = '00000001'.
    s_e1cuins-obj_type   = 'MARA'.
    s_e1cuins-class_type = '300'.

    CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
      EXPORTING
        input        = gs_out-stdpd
      IMPORTING
        output       = gs_out-stdpd
      EXCEPTIONS
        length_error = 1
        OTHERS       = 2.
    s_e1cuins-obj_key  = gs_out-stdpd.

    APPEND s_e1cuins TO t_e1cuins.
    CLEAR s_e1cuins.

    t_e1cuval[] = lt_vbule[].

    CLEAR:matnr,stdpd,material,objectkey_imp.

    matnr = gs_out-matnr.
    stdpd = gs_out-stdpd.
    material = gs_out-stdpd.
    objectkey_imp = gs_out-stdpd.


    LOOP AT lt_vbule INTO ls_vbule.

      CALL FUNCTION 'CONVERSION_EXIT_ATINN_INPUT'
        EXPORTING
          input  = ls_vbule-charc
        IMPORTING
          output = s_selection-atinn.

      s_selection-atcod = '1'.
      s_selection-slcod = '1'.

      SELECT SINGLE atfor FROM cabn INTO @DATA(ls_atfor) WHERE atinn = @s_selection-atinn.
      s_selection-atfor = ls_atfor.

      IF ls_atfor ='NUM'.
        s_selection-atflv =  ls_vbule-value.
      ELSE.
        s_selection-atwrt =  ls_vbule-value.
      ENDIF.

      APPEND s_selection TO selection.
      CLEAR:ls_vbule,ls_atfor.
    ENDLOOP.

    CALL FUNCTION 'BAPI_OBJCL_GETCLASSES'
      EXPORTING
        objectkey_imp   = objectkey_imp
        objecttable_imp = 'MARA'
        classtype_imp   = '300'
*       READ_VALUATIONS =
        keydate         = sy-datum
        language        = sy-langu
*       OBJECTKEY_IMP_LONG       =
      TABLES
        alloclist       = alloclist
*       ALLOCVALUESCHAR =
*       ALLOCVALUESCURR =
*       ALLOCVALUESNUM  =
        return          = lt_return.
    IF alloclist IS INITIAL.
      gs_out-zlight = icon_incomplete.
      gs_out-zstatu = 'E'.
      gs_out-zmessg = '创建失败,可配置物料不正确或未维护分类'.
      MODIFY gt_out FROM gs_out.
      CLEAR: gs_out,lt_return[],alloclist[],objectkey_imp.
      CONTINUE.
    ENDIF.

    CALL FUNCTION 'CUSE_SELECT_MATERIAL_VARIANTS'
      EXPORTING
        material               = material
        plant                  = ls_marc-werks
        date                   = sy-datum
        classtype              = '300'
        class                  = alloclist-classnum
        strategy               = 'X'
*       INCL_UNASSIGNED_CHARS  = ' '
      TABLES
        match                  = match
        objects_classification = objects_classification
        selection              = selection
        objects                = objects
      EXCEPTIONS
        no_class_found         = 1
        no_entry_found         = 2
        internal_error         = 3
        OTHERS                 = 4.
    DELETE match WHERE matnr = matnr.
    READ TABLE match TRANSPORTING NO FIELDS .

    IF sy-subrc = 0.
      gs_out-zlight = icon_incomplete.
      gs_out-zstatu = 'E'.
      gs_out-zmessg = '已有相同配置的变式物料,请检查'.
      MODIFY gt_out FROM gs_out.
      CLEAR: gs_out,selection[],match[],objects_classification[],objects[],material,alloclist-classnum.
      CONTINUE.
    ENDIF.


    CALL FUNCTION 'MATERIAL_SAVE_CONFIGURATION'
      EXPORTING
        material        = matnr
        plant           = ls_marc-werks
        conf_matl_plant = stdpd
      TABLES
        e1cucfg_w       = t_e1cucfg
        e1cuins_w       = t_e1cuins
        e1cuval_w       = t_e1cuval
        e1cucom_w       = t_e1cucom
        returnmessages  = bapi_matreturn2.

    CLEAR:stdpd, matnr.

    READ TABLE bapi_matreturn2 INTO DATA(ls_mess) WITH KEY type = 'E'.
    IF sy-subrc = 0.
      gs_out-zlight = icon_incomplete.
      gs_out-zstatu = 'E'.
      gs_out-zmessg = '创建失败' && ls_mess-message.
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
    ELSE.
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          wait = 'X'.
      gs_out-zlight = icon_checked.
      gs_out-zstatu = 'S'.
      gs_out-zmessg = '创建成功'.

*&同时更新分类视图
      DATA t_num_range LIKE TABLE OF bapi1003_class_num_range.
      DATA t_return_d LIKE TABLE OF bapiret2.
      DATA: v_object TYPE bapi1003_key-object_long,
            numnew   TYPE TABLE OF bapi1003_alloc_values_num WITH HEADER LINE,
            charnew  TYPE TABLE OF bapi1003_alloc_values_char WITH HEADER LINE,
            currnew  TYPE TABLE OF bapi1003_alloc_values_curr WITH HEADER LINE.

      CALL FUNCTION 'BAPI_OBJCL_GETOBJECTS'
        EXPORTING
          classtype     = '200'
          status        = ''
          maxrows       = ''
        TABLES
          classnumrange = t_num_range
          alloclist     = t_alloc_list
          return        = t_return_d.
      READ TABLE t_alloc_list INTO DATA(s_list) WITH KEY object = gs_out-matnr.
      IF sy-subrc = 0.
        LOOP AT t_e1cuval INTO DATA(s_elc).
          s_alloc_char-value_char      = s_elc-value.
          s_alloc_char-value_char_long = s_elc-value_long.
          s_alloc_char-charact         = s_elc-charc.
          APPEND s_alloc_char TO t_alloc_char.
          CLEAR s_alloc_char.
        ENDLOOP.

        v_object = gs_out-matnr.

        CALL FUNCTION 'BAPI_OBJCL_CHANGE'
          EXPORTING
            objecttable        = s_list-objtyp
            classnum           = s_list-classnum
            classtype          = '200'
            objectkey_long     = v_object
          TABLES
            allocvaluescharnew = t_alloc_char
            allocvaluesnumnew  = numnew
            allocvaluescurrnew = currnew
            return             = t_return.
        READ TABLE t_return INTO DATA(s_return) WITH KEY type = 'E'.
        IF sy-subrc <> 0.
          CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
            EXPORTING
              wait = 'X'.
        ENDIF.
      ENDIF.


    ENDIF.

    MODIFY gt_out FROM gs_out.
    CLEAR: bapi_matreturn2[],gs_out.

    CLEAR s_text.

    s_text = ( i_num_1 / i_num ) * 100 .
    s_text = s_text && '%'.

    CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
      EXPORTING
        percentage = 0
        text       = s_text
      EXCEPTIONS
        OTHERS     = 1.

    CLEAR:s_text.


  ENDLOOP.

ENDFORM.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值