批量修改物料BOM组件替代料(可更改对应排序字符串)

*&---------------------------------------------------------------------*
*& Report Z_BATCH_BOM
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT z_batch_bom.

TYPES:BEGIN OF gy_bom,
        matnr TYPE  mast-matnr, "物料
        werks TYPE  mast-werks, "工厂
        stlan TYPE  mast-stlan, "用途
        stlal TYPE  mast-stlal, "备选


        postp TYPE  stpo-postp, "ICT
        posnr TYPE  stpo-posnr, "项目号
        idnrk TYPE  stpo-idnrk, "组件物料
        menge TYPE  string,     "数量
        sortf TYPE  stpo-sortf, "排序标识
        itmid TYPE  stpo-itmid, "项目ID
        alpgr TYPE  stpo-alpgr, "组
        alprf TYPE  stpo-alprf, "优先级
        alpst TYPE  stpo-alpst, "策略
        ewahr TYPE  string,     "使用概率
        meins TYPE  stpo-meins, "单位

        stlnr TYPE  mast-stlnr, "物料清单

        box   TYPE string,
        del   ,
      END OF gy_bom.

DATA:gs_bom TYPE gy_bom.
DATA: filetab TYPE filetable WITH HEADER LINE .
DATA: rc TYPE i.
DATA: outtab  TYPE TABLE OF gy_bom WITH HEADER LINE  .
DATA: outtab1 TYPE TABLE OF gy_bom WITH HEADER LINE  .
DATA: itab TYPE TABLE OF alsmex_tabline WITH HEADER LINE.         "alsmex_tabline标准表 (Excel 数据的表行)
DATA: g_file TYPE rlgrap-filename.
FIELD-SYMBOLS: <fs>.
DATA :i_message_tab TYPE  esp1_message_tab_type WITH HEADER LINE.
DATA :bdcdata TYPE TABLE OF  bdcdata WITH HEADER LINE.
DATA :messtab LIKE bdcmsgcoll OCCURS 0 WITH HEADER LINE.





TABLES: sscrfields.

INITIALIZATION.
  sscrfields-functxt_01 = '模板下载'.
  SELECTION-SCREEN FUNCTION KEY 1.

  PARAMETERS: p_file TYPE string.

AT SELECTION-SCREEN.
  CASE sscrfields-ucomm.
    WHEN 'FC01'.
      PERFORM frm_download_excel.
    WHEN OTHERS.
  ENDCASE.

*&---------------------------------------------------------------------*
*& Form frm_download_excel
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_download_excel .
  DATA: lv_file              TYPE rlgrap-filename,
        lv_objid             TYPE wwwdata-objid,
        ls_key               LIKE wwwdatatab,
        lv_subrc             TYPE sy-subrc,
        lv_filename          TYPE string,
        lv_path              TYPE string,
        lv_fullpath          TYPE string,
        lv_default_file_name TYPE string.


  lv_default_file_name = '批量修改BOM组件.xlsx'.  "默认的文件名
*&--------获得要保存文件的路径名
  CALL METHOD cl_gui_frontend_services=>file_save_dialog
    EXPORTING
      window_title         = '请选择路径'
      default_file_name    = lv_default_file_name
      file_filter          = 'Excel 文件 (*.xlsx)'
    CHANGING
      filename             = lv_filename
      path                 = lv_path
      fullpath             = lv_fullpath
    EXCEPTIONS
      cntl_error           = 1
      error_no_gui         = 2
      not_supported_by_gui = 3
      OTHERS               = 4.

  IF lv_path IS INITIAL.
    MESSAGE '已取消下载' TYPE 'E'. "如果用户取消选择下载路径,那么相当于取消下载,结束程序
    EXIT.
  ENDIF.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
               WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    EXIT.
  ENDIF.

  lv_file = lv_fullpath.
  lv_objid = 'ZBATCHBOM'. "sap系统中存储的资源对象名

  SELECT SINGLE *
    FROM wwwdata
    INTO CORRESPONDING FIELDS OF ls_key
    WHERE objid = lv_objid
  AND relid = 'MI'.

  CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
    EXPORTING
      key         = ls_key
      destination = lv_file
    IMPORTING
      rc          = lv_subrc.
  IF lv_subrc = 0.
    MESSAGE '模板下载成功' TYPE 'S'.
  ENDIF.

ENDFORM.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.                  "选择屏幕上的搜索帮助

*----------------------------------------------------------------------
  CALL METHOD cl_gui_frontend_services=>file_open_dialog          "调用方法获取文件路径
    EXPORTING
      default_filename        = p_file
    CHANGING
      rc                      = rc                                       "函数的返回值
      file_table              = filetab[]                                "文件表名
    EXCEPTIONS
      file_open_dialog_failed = 1
      cntl_error              = 2
      error_no_gui            = 3
      not_supported_by_gui    = 4
      OTHERS                  = 5.

  READ TABLE  filetab INDEX  1.                                   "读取内表中存放的第一个表名
  IF sy-subrc EQ 0.
    p_file = filetab-filename.
  ENDIF.
*------------------------------------------------------------------------
START-OF-SELECTION.
  g_file = p_file.       "注意两个文件用于不同的函数,所以类型不同



  CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
    EXPORTING
      filename    = g_file
      i_begin_col = 1                                            "开始列
      i_begin_row = 2                                            "开始行
      i_end_col   = 255                                          "结束列
      i_end_row   = 65535                                        "结束行
    TABLES
      intern      = itab[].
**  DELETE itab WHERE row = 1.                                   "删除字段名行
*"------------------------------------------------------------------------"
  LOOP AT itab.
    ON CHANGE OF itab-row.                                       "判断行的变化
      IF sy-tabix NE 1.
        APPEND outtab.
        CLEAR outtab.                                            "工作区清空是为了更加准确的放数据,不然可能会有上一条数据的残留
      ENDIF.
    ENDON.
    ASSIGN COMPONENT itab-col OF STRUCTURE outtab TO <fs>.       "动态方法将值传到相应的内表
    <fs> = itab-value.                                           "结束列值定位
  ENDLOOP.
  APPEND outtab.                                                 "这句不要忘记,要把最后一条APPEND到内表中
**--------------------------------------------------------------------------------*

  IF outtab IS INITIAL.
    MESSAGE s001(00) WITH '未导入任何数据!' DISPLAY LIKE 'E'.
  ELSE.

    PERFORM get_data.
  ENDIF.
*&---------------------------------------------------------------------*
*& Form get_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM get_data .
  "获取物料清单号
  SELECT matnr,
         werks,
         stlan,
         stlnr,
         stlal
  FROM mast
  INTO TABLE @DATA(lt_mast)
  FOR ALL ENTRIES IN @outtab[]
  WHERE matnr = @outtab-matnr
    AND werks = @outtab-werks
    AND stlan = @outtab-stlan
  AND stlal = @outtab-stlal.

  IF lt_mast IS  NOT INITIAL.
    SELECT stlty,stlnr,stlkn,stpoz, posnr,idnrk,sortf,itmid
      FROM stpo
      INTO TABLE @DATA(lt_stpo)
      FOR ALL ENTRIES IN @lt_mast
      WHERE stlty = 'M'
    AND stlnr = @lt_mast-stlnr.
  ENDIF.

  "获取单位
  SELECT meins,
         matnr
FROM mara
INTO TABLE @DATA(lt_mara)
FOR ALL ENTRIES IN @outtab[]
  WHERE matnr = @outtab-idnrk.

  LOOP AT outtab .
    DATA:lv_tabix TYPE string.
    CLEAR:lv_tabix.
    lv_tabix = sy-tabix + 1.

    outtab-box = lv_tabix.




    "获取物料清单号
    READ TABLE lt_mast INTO DATA(ls_mast) WITH KEY matnr = outtab-matnr
                                                   werks = outtab-werks
                                                   stlan = outtab-stlan
                                                   stlal = outtab-stlal.


    IF sy-subrc = 0.
      outtab-stlnr = ls_mast-stlnr.
    ELSE.

      i_message_tab-msgid = '00'.      "消息
      i_message_tab-msgty = 'E' .      "错误类型
      i_message_tab-msgno = '001'.     "消息号
      i_message_tab-msgv1 = '在EXCEL表第' && lv_tabix  && '行,未找到对应物料BOM数据' .
      APPEND i_message_tab.
    ENDIF.

    "获取物料单位
    READ TABLE lt_mara INTO DATA(ls_mara) WITH KEY matnr = outtab-idnrk.

    IF sy-subrc = 0 .
      outtab-meins   = ls_mara-meins .
    ELSE.
      i_message_tab-msgid = '00'.      "消息
      i_message_tab-msgty = 'E' .      "错误类型
      i_message_tab-msgno = '001'.     "消息号
      i_message_tab-msgv1 = '在EXCEL表第' && lv_tabix  && '行,未找到对应组件物料单位' .
      APPEND i_message_tab.

    ENDIF.



    MODIFY outtab.

        ""检查是否存在  项目号 * 组件 * 排序字符串 * 项目ID
    READ TABLE lt_stpo INTO DATA(ls_stpo) WITH KEY posnr = outtab-posnr
                                                   idnrk = outtab-idnrk
                                                   stlnr = outtab-stlnr
                                                   itmid = outtab-itmid.
    IF sy-subrc = 0.
      outtab-del = 'X'.
    ENDIF.
     MODIFY outtab.
  ENDLOOP.

  MOVE-CORRESPONDING outtab[] TO outtab1[].
  DELETE outtab[]  WHERE del IS NOT INITIAL.
  DELETE outtab1[] WHERE del IS  INITIAL.

  IF i_message_tab[] IS NOT INITIAL.

    PERFORM show_message .

  ELSE.

    PERFORM csap_bom_item_maintain.

  ENDIF.
ENDFORM.

*&---------------------------------------------------------------------*
*& Form CSAP_BOM_ITEM_MAINTAIN
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM csap_bom_item_maintain .

  DATA:lv_tabix TYPE string.

  ""新增
  LOOP AT outtab.

    CLEAR:bdcdata,bdcdata[],             "执行循环注意清空
    messtab,messtab[],lv_tabix.
    lv_tabix = sy-tabix + 1.

    "CS02进入修改界面
    PERFORM append_screen USING 'SAPLCSDI'     '0100'.  "屏幕
    PERFORM append_fields USING 'BDC_OKCODE'   '/00'. "字段
    PERFORM append_fields USING 'RC29N-MATNR'  outtab-matnr. "字段
    PERFORM append_fields USING 'RC29N-WERKS'  outtab-werks. "字段
    PERFORM append_fields USING 'RC29N-STLAN'  outtab-stlan. "字段
    PERFORM append_fields USING 'RC29N-STLAL'  outtab-stlal. "字段
*    PERFORM append_fields USING 'RC29N-DATUV'  sy-datum. "字段

    "跳至最新行
    PERFORM append_screen USING 'SAPLCSDI'     '0150'.  "屏幕
    PERFORM append_fields USING 'BDC_CURSOR'   'RC29P-POSNR(01)'. "字段
    PERFORM append_fields USING 'BDC_OKCODE'   '=FCNP'. "字段
    PERFORM append_fields USING 'BDC_SUBSCR'   'SAPLCSDI                                0802STLKOPF'. "字段
    PERFORM append_fields USING 'BDC_SUBSCR'   'SAPLCSDI                                0820BER_BTCI'. "字段

    "添加新增数据
    PERFORM append_screen USING 'SAPLCSDI'          '0140'.  "屏幕
    PERFORM append_fields USING 'BDC_CURSOR'        'RC29P-IDENT(02)'. "字段
    PERFORM append_fields USING 'BDC_OKCODE'        '/00'. "字段
    PERFORM append_fields USING 'RC29P-POSNR(02)'   outtab-posnr. "字段
    PERFORM append_fields USING 'RC29P-IDNRK(02)'   outtab-idnrk. "字段
    PERFORM append_fields USING 'RC29P-MENGE(02)'   outtab-menge. "字段
    PERFORM append_fields USING 'RC29P-POSTP(02)'   outtab-postp. "字段
    PERFORM append_fields USING 'BDC_SUBSCR'        'SAPLCSDI                                0802STLKOPF'. "字段



    "定义基本数据
    PERFORM append_screen USING 'SAPLCSDI'           '0130'.  "屏幕
    PERFORM append_fields USING 'BDC_OKCODE'         '/00'. "字段
    PERFORM append_fields USING 'BDC_SUBSCR'         'SAPLCSDI                                0830POS_PHPT'. "字段
    PERFORM append_fields USING 'BDC_CURSOR'         'RC29P-ALPGR'. "字段
    PERFORM append_fields USING 'RC29P-IDENT'        outtab-itmid. "字段

    PERFORM append_fields USING 'RC29P-SORTF'        outtab-sortf. "字段
    PERFORM append_fields USING 'RC29P-ALPGR'        outtab-alpgr. "字段

    "设置组
    PERFORM append_screen USING 'SAPLCSDI'           '0716'.  "屏幕
    PERFORM append_fields USING 'BDC_CURSOR'         'RC29P-EWAHR'. "字段
    PERFORM append_fields USING 'BDC_OKCODE'         '=CLWI'. "字段
    PERFORM append_fields USING 'RC29P-ALPGR'        outtab-alpgr. "字段
    PERFORM append_fields USING 'RC29P-ALPRF'        outtab-alprf. "字段
    PERFORM append_fields USING 'RC29P-ALPST'        outtab-alpst. "字段
    PERFORM append_fields USING 'RC29P-EWAHR'        outtab-ewahr. "字段

    "回车到开始界面
    PERFORM append_screen USING 'SAPLCSDI'           '0131'.  "屏幕
    PERFORM append_fields USING 'BDC_OKCODE'         '/00'. "字段

    "点击保存
    PERFORM append_screen USING 'SAPLCSDI'           '0140'.  "屏幕
    PERFORM append_fields USING 'BDC_OKCODE'         '=FCBU'. "字段


    CALL TRANSACTION 'CS02' USING bdcdata
                             MODE   'N'
                             UPDATE 'S' MESSAGES INTO messtab[].

    READ TABLE messtab INDEX 1.
    IF messtab-msgtyp = 'S'.

      i_message_tab-msgid = '00'.       "消息
      i_message_tab-msgty = messtab-msgtyp.     "错误类型
      i_message_tab-msgno = '001'.   "消息号
      i_message_tab-msgv1 = '物料 :' && outtab-matnr && ':在EXCEL表第' && outtab-box  && '行BOM数据新增成功' .
      APPEND i_message_tab.

    ELSE.

      i_message_tab-msgid = '00'.       "消息
      i_message_tab-msgty = messtab-msgtyp.     "错误类型
      i_message_tab-msgno = '001'.   "消息号
      i_message_tab-msgv1 = '物料 :' && outtab-matnr && ':在EXCEL表第' && outtab-box  && '行BOM数据新增失败' .
      APPEND i_message_tab.

    ENDIF.

  ENDLOOP.



  WAIT UP TO  '0.2' SECONDS.

  "”修改

  DATA:t_stpo LIKE  TABLE OF stpo_api02.
  DATA:i_stpo TYPE  stpo_api02.
  DATA:o_stpo LIKE  stpo_api02.
  DATA:valid_from LIKE  csap_mbom-datuv .
  DATA:fl_warning LIKE  capiflag-flwarning.
  valid_from = sy-datum.


  LOOP AT outtab1.
    CALL FUNCTION 'CSAP_MAT_BOM_OPEN'
      EXPORTING
        material       = outtab1-matnr
        plant          = outtab1-werks
        bom_usage      = outtab1-stlan
        alternative    = outtab1-stlal
        valid_from     = valid_from
        change_no      = ''
        revision_level = ''
*       fl_no_change_doc = 'X'
      TABLES
        t_stpo         = t_stpo[]
      EXCEPTIONS
        error          = 1
        OTHERS         = 2.

    IF t_stpo[] IS  NOT INITIAL.

      LOOP AT t_stpo INTO DATA(s_stpo) WHERE itm_ident = outtab1-itmid .
        s_stpo-sortstring = outtab1-sortf.  "排序字符串
        s_stpo-ai_group   = outtab1-alpgr.  "组
        s_stpo-ai_strateg = outtab1-alpst.  "策略
        s_stpo-usage_prob = outtab1-ewahr.  "概率
        s_stpo-ai_prio    = outtab1-alprf.  "优先


        CALL FUNCTION 'CSAP_BOM_ITEM_MAINTAIN'
          EXPORTING
            i_stpo     = s_stpo
          IMPORTING
*           o_stpo     = o_stpo
            fl_warning = fl_warning
          EXCEPTIONS
            error      = 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.

          i_message_tab-msgid = sy-msgid.       "消息
          i_message_tab-msgty = sy-msgty.     "错误类型
          i_message_tab-msgno = sy-msgno.   "消息号
          i_message_tab-msgv1 = sy-msgv1 && '的' && 'EXCEL表第' && outtab1-box && '数据发生错误'.
          APPEND i_message_tab.
          ROLLBACK WORK.

        ELSE.


          i_message_tab-msgid = '00'.       "消息
          i_message_tab-msgty = 'S'.     "错误类型
          i_message_tab-msgno = '001'.   "消息号
          i_message_tab-msgv1 = '物料 :' && outtab1-matnr && ':在EXCEL表第' && outtab1-box  && '行BOM数据修改成功' .
          APPEND i_message_tab.
          COMMIT WORK AND WAIT.
        ENDIF.

      ENDLOOP.

    ENDIF.

    " 关闭BOM
    CALL FUNCTION 'CSAP_MAT_BOM_CLOSE'
      EXCEPTIONS
        error  = 1
        OTHERS = 2.
  ENDLOOP.

  PERFORM show_message .

ENDFORM.
*&---------------------------------------------------------------------*
*& Form show_message
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM show_message .
  CALL FUNCTION 'C14Z_MESSAGES_SHOW_AS_POPUP'
    TABLES
      i_message_tab = i_message_tab[].

  LEAVE PROGRAM.
ENDFORM.


FORM append_screen USING VALUE(p_program)
                        VALUE(p_dynpro).
  CLEAR bdcdata.
  bdcdata-program     = p_program.
  bdcdata-dynpro      = p_dynpro.
  bdcdata-dynbegin    = 'X'.
  APPEND bdcdata.

ENDFORM.

FORM append_fields USING VALUE(p_field)
                         VALUE(p_value).

  CLEAR bdcdata.
  bdcdata-fnam      = p_field.
  bdcdata-fval      = p_value.
  APPEND bdcdata.
ENDFORM.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ABAP 成

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值