S4 BOM批量修改

本文介绍如何在SAP环境中使用ABAP语言批量修改物料清单(BOM)的组件信息,通过调用BAPI并逐行传递参数来实现高效操作。

1.针对BOM组件批量修改。传入BAPI的值一行行传入。

********************************************************************************************
*
********************************************************************************************
*   Program	: ZPP023
*   Title : BOM 批量更改
*   Description :
*   Author : LIU某某
********************************************************************************************
*   Amendment Log
*   -----------------------
*   Name(Cor# )  Date         Request No.         Description
********************************************************************************************
REPORT zpp023  MESSAGE-ID zcust.
TABLES:sscrfields.
DATA: gw_fieldcat TYPE slis_fieldcat_alv,

      gt_fieldcat TYPE slis_t_fieldcat_alv,

      g_layout    TYPE slis_layout_alv.
"For selection-screen
DATA csap_mbom TYPE csap_mbom.
DATA stpo_api02 TYPE stpo_api02."

DATA t_stpo TYPE STANDARD TABLE OF stpo_api02 WITH HEADER LINE.
DATA t_matnr TYPE STANDARD TABLE OF matnr WITH HEADER LINE.
DATA: itab  TYPE kcde_cells OCCURS 0 WITH HEADER LINE.
DATA marc TYPE marc.
DATA:BEGIN OF gt_data OCCURS 0,
       matnr      TYPE matnr,
       item_no    TYPE sposn,
       mat_provis TYPE beikz,
     END OF gt_data.
DATA:BEGIN OF gt_out OCCURS 0,
       sel        TYPE char1,
       matnr      TYPE matnr,
       item_no    TYPE sposn,
       mat_provis TYPE beikz,
     END OF gt_out.


*&---------------------------------------------------------------------*
*&      选择屏幕
*&---------------------------------------------------------------------*
*在屏幕定义功能码
SELECTION-SCREEN:FUNCTION KEY 1.
SELECTION-SCREEN BEGIN OF BLOCK block1 WITH FRAME TITLE b1_title .  "B1_TITLE = '请指定选择条件'.

  "BOM 选择条件
*  SELECT-OPTIONS s_matnr FOR csap_mbom-matnr.
  PARAMETERS p_matnr LIKE csap_mbom-matnr.
  PARAMETERS p_plant LIKE csap_mbom-werks MEMORY ID wrk.
  PARAMETERS p_usage LIKE csap_mbom-stlan DEFAULT '1'.
  PARAMETERS p_alt LIKE csap_mbom-stlal DEFAULT '1'.
  PARAMETERS p_datuv LIKE csap_mbom-datuv DEFAULT sy-datum.

  SELECTION-SCREEN SKIP.

SELECTION-SCREEN END OF BLOCK block1.
SELECTION-SCREEN BEGIN OF BLOCK bn1 WITH FRAME TITLE TEXT-001.
  PARAMETERS: p_file LIKE rlgrap-filename ."导入路径
SELECTION-SCREEN END OF BLOCK bn1.
*&---------------------------------------------------------------------*
*& 初始化
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
INITIALIZATION.

  sscrfields-functxt_01 = '下载数据模板'.

AT SELECTION-SCREEN.
  IF sscrfields-ucomm = 'FC01'.
    PERFORM  down_templete.
  ENDIF.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
  PERFORM dir.


*&---------------------------------------------------------------------*
*&      主程序
*&---------------------------------------------------------------------*
START-OF-SELECTION.
  "批量录入数据.
  PERFORM frm_excel.
  "展示数据
  PERFORM frm_display.




*&---------------------------------------------------------------------*
*&      Form  ITAB_GET_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM add_mat_to_bom.

  SELECT matnr INTO TABLE t_matnr FROM marc
    WHERE matnr = p_matnr
    AND werks = p_plant.
  CALL FUNCTION 'ENQUEUE_ECMASTE' "DEQUEUE
    EXPORTING
      matnr          = p_matnr
      werks          = p_plant
      stlan          = '1'
"     X_WERKS        = KREUZ
    EXCEPTIONS
      foreign_lock   = 2
      system_failure = 3.
  LOOP AT t_matnr INTO marc-matnr.

    CLEAR: t_stpo,t_stpo[].

    CALL FUNCTION 'CSAP_MAT_BOM_OPEN'
      EXPORTING
        material    = marc-matnr
        plant       = p_plant
        bom_usage   = p_usage
        alternative = p_alt
        valid_from  = p_datuv
      TABLES
        t_stpo      = t_stpo[]
      EXCEPTIONS
        error       = 1
        OTHERS      = 2.
    IF sy-subrc <> 0.
      WRITE: /'E:','打开',marc-matnr, '的BOM失败。'.
      EXIT.
    ENDIF.
    LOOP AT t_stpo.
      READ TABLE gt_out WITH KEY item_no = t_stpo-item_no.
      IF sy-subrc = 0.
        t_stpo-mat_provis = gt_out-mat_provis.
        MODIFY t_stpo.
      ENDIF.
    ENDLOOP.
    LOOP AT t_stpo.
      CALL FUNCTION 'CSAP_BOM_ITEM_MAINTAIN'
        EXPORTING
          i_stpo = t_stpo "Headline
        EXCEPTIONS
          error  = 1
          OTHERS = 2.
    ENDLOOP.

    CALL FUNCTION 'CSAP_MAT_BOM_CLOSE'
      EXCEPTIONS
        error  = 1
        OTHERS = 2.
    IF sy-subrc = 0.
      WRITE: /'S:',marc-matnr, '的BOM更改己更新。'.
    ENDIF.
    CALL FUNCTION 'DEQUEUE_ECMASTE' "DEQUEUE
      EXPORTING
        matnr          = p_matnr
        werks          = p_plant
        stlan          = '1'
      EXCEPTIONS
        foreign_lock   = 2
        system_failure = 3.

  ENDLOOP.

ENDFORM.                    ""ITAB_GET_DATA

*&---------------------------------------------------------------------*
*&      Form  PLANT_AUTHORITY_CHECK
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_PLANT    text
*----------------------------------------------------------------------*
FORM plant_authority_check
  USING p_werks.

  AUTHORITY-CHECK OBJECT 'C_STUE_WRK'
  ID 'ACTVT' FIELD '03'
  ID 'CSWRK' FIELD p_werks.

  IF sy-subrc <> 0.
    MESSAGE e001(00) WITH '你没有工厂 ' p_werks ' 的权限.'.
  ENDIF.

ENDFORM.                    "PLANT_AUTHORITY_CHECK
*&---------------------------------------------------------------------*
*&      FORM FRM_EXCEL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM frm_excel.
  REFRESH: itab,gt_data.
  CLEAR  : itab,gt_data.
  CALL FUNCTION 'KCD_EXCEL_OLE_TO_INT_CONVERT'
    EXPORTING
      filename    = p_file
      i_begin_col = 1
      i_begin_row = 2
      i_end_col   = 3
      i_end_row   = 9999
    TABLES
      intern      = itab
    EXCEPTIONS
      upload_ole  = 1.
  IF sy-subrc = 0.
    SORT itab BY row col DESCENDING.
    LOOP AT itab.
      CASE itab-col.
        WHEN '3'.
          gt_data-mat_provis = itab-value.
        WHEN '2'.
          gt_data-item_no = itab-value.
        WHEN '1'.
          gt_data-matnr = itab-value.

          APPEND gt_data.
          CLEAR gt_data.
      ENDCASE.
    ENDLOOP.
  ENDIF.
  MOVE-CORRESPONDING gt_data[] TO gt_out[].
ENDFORM.
*---------------------------------------------------------------------*
*       FORM dir                                                      *
*---------------------------------------------------------------------*
*       EXCEL文件路径                                                 *
*---------------------------------------------------------------------*
FORM dir.

  CALL FUNCTION 'F4_FILENAME'
    EXPORTING
      dynpro_number = syst-dynnr
      field_name    = 'PATH'
    IMPORTING
      file_name     = p_file.

ENDFORM.                    "dir
*&---------------------------------------------------------------------*
*&      Form  down_templete
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM down_templete .
  DATA: lv_fname        LIKE rlgrap-filename.
  DATA: l_exceltemplate LIKE wwwdatatab.

  DATA: filename TYPE string,
        path     TYPE string,
        fullpath TYPE string.
  DATA: user_action TYPE i.

  CALL METHOD cl_gui_frontend_services=>file_save_dialog
    EXPORTING
      default_extension = 'XLS'
      default_file_name = 'ZPP023.XLS'
      initial_directory = 'D:\'
    CHANGING
      filename          = filename
      path              = path
      fullpath          = fullpath
      user_action       = user_action.

  IF user_action = cl_gui_frontend_services=>action_ok.
    lv_fname = fullpath.
    l_exceltemplate =  'MI'.
    l_exceltemplate-objid = 'ZPP023'.
    CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
      EXPORTING
        text = '下载EXCEL模板文件中...'.

    CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
      EXPORTING
        key         = l_exceltemplate
        destination = lv_fname
      CHANGING
        temp        = lv_fname.

    IF lv_fname IS NOT INITIAL.
      MESSAGE s107 WITH lv_fname '数据模板下载完成'.
    ENDIF.

  ENDIF.
ENDFORM.                    " DOWN_TEMPLETE
FORM frm_display.
  PERFORM frm_layout_build.

  PERFORM frm_field_build.

  PERFORM frm_data_out.
ENDFORM.
*&---------------------------------------------------------------------*

*&      Form  FRM_LAYOUT_BUILD

*&---------------------------------------------------------------------*

*       "  设置表格样式

*----------------------------------------------------------------------*

FORM frm_layout_build .

  g_layout-box_fieldname        = 'SEL'.  " 选择模式,在最左端有选择按钮

  g_layout-colwidth_optimize    = 'X'.    " 自动调整列宽

  g_layout-zebra                = 'X'.    " 表格斑马线

  g_layout-info_fieldname       = 'CLR'.

ENDFORM.
*&---------------------------------------------------------------------*

*&      Form  FRM_FIELD_BUILD

*&---------------------------------------------------------------------*

*       "  建立表头数据

*----------------------------------------------------------------------*

FORM frm_field_build .

  CLEAR gt_fieldcat.

  PERFORM field_set:

                     USING 'MATNR'  '表头物料号'  '' ,

                     USING 'ITEM_NO'  '项目号'   '' ,

                     USING 'MAT_PROVIS'  '物料供应标识'   '' .


ENDFORM.
*&---------------------------------------------------------------------*

*&      Form  FRM_DATA_OUT

*&---------------------------------------------------------------------*

*       输出数据

*----------------------------------------------------------------------*

FORM frm_data_out.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program       = sy-repid
      is_layout                = g_layout
      it_fieldcat              = gt_fieldcat
      i_save                   = 'X'
      i_callback_pf_status_set = 'FRM_STATE'
      i_callback_user_command  = 'FRM_USER_COMMAND'
    TABLES
      t_outtab                 = gt_out
    EXCEPTIONS
      program_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.

  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*

*&      Form  FIELD_SET

*&---------------------------------------------------------------------*

FORM field_set USING p_fieldname

                     p_seltext_l

                     p_hotspot.

  gw_fieldcat-fieldname     = p_fieldname .

  gw_fieldcat-seltext_l     = p_seltext_l .

  gw_fieldcat-hotspot   = p_hotspot.

  APPEND gw_fieldcat TO gt_fieldcat.

  CLEAR gw_fieldcat.

ENDFORM.
*&---------------------------------------------------------------------*

*&      Form  FRM_SET_PF_STATUS

*&---------------------------------------------------------------------*

FORM frm_state USING rt_extab TYPE slis_t_extab.

  SET PF-STATUS '100'.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_USER_COMMAND
*&---------------------------------------------------------------------*
*       User command
*----------------------------------------------------------------------*
FORM frm_user_command USING r_ucomm LIKE sy-ucomm
                            rs_selfield TYPE slis_selfield.

  rs_selfield-refresh    = 'X'.
  rs_selfield-col_stable = 'X'.
  rs_selfield-row_stable = 'X'.
  PERFORM plant_authority_check USING p_plant.

  CHECK sy-ucomm EQ '&MODIFY'.
  PERFORM add_mat_to_bom.
ENDFORM.
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值