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

被折叠的 条评论
为什么被折叠?



