*&---------------------------------------------------------------------*
*& 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.
批量修改物料BOM组件替代料(可更改对应排序字符串)
于 2024-06-25 15:31:01 首次发布