上传模板
下达失败的原因是因为在事务码 OPJK 对对应订单类型设置了检查,如果不需要,可以关掉它
另外还可以在 OPKP 中设置生产订单创建并下达,一步执行.
源代码:
*&---------------------------------------------------------------------*
*& Report ZPP044
*&---------------------------------------------------------------------*
*& 开发者 :cycle
*& 需求方 :计划
*& 程序目的 :批量创建生产订单(组件自动带出)
*& 开发时间 :20230213
*&---------------------------------------------------------------------*
REPORT zpp044.
TABLES:sscrfields,mara,marc.
"定义上载的EXCEL表
DATA:gs_upload TYPE zalsmex_tabline,
gt_upload TYPE TABLE OF zalsmex_tabline.
TYPES : BEGIN OF ty_data,
zygdh TYPE string, "原工单号'.
matnr TYPE mara-matnr, "物料号'.
werks TYPE werks_d, "生产工厂'.
dauat TYPE afpo-dauat, "订单类型'.
gamng TYPE afko-gamng, "总数量'.
terkz TYPE afko-terkz, "计划类型'.
gstrp TYPE afko-gstrp, "开始时间'.
gltrp TYPE afko-gltrp, "结束时间'.
gmein TYPE co_gmein, "单位
maktx TYPE makt-maktx, "物料描述'.
relstt TYPE string, "生产订单下达状态
msgrel TYPE string, "生产订单下达文本
sel TYPE c,
icon TYPE icon_d,
aufnr TYPE aufnr,
flag TYPE c,
msg TYPE string,
END OF ty_data.
DATA:gt_list TYPE TABLE OF ty_data,
gs_list TYPE ty_data.
*----------------------------------------------------------------------*
* ALV定义
*----------------------------------------------------------------------*
DATA:ref_grid TYPE REF TO cl_gui_alv_grid.
DATA:it_fieldcat TYPE lvc_t_fcat,
wa_fieldcat LIKE LINE OF it_fieldcat,
it_layout TYPE TABLE OF lvc_s_layo,
wa_layout TYPE lvc_s_layo,
it_events TYPE slis_t_event,
wa_events LIKE LINE OF it_events.
*----------------------------------------------------------------------*
* 定义宏
*----------------------------------------------------------------------*
DEFINE init_fieldcat.
CLEAR wa_fieldcat.
wa_fieldcat-fieldname = &1.
wa_fieldcat-coltext = &2.
wa_fieldcat-ref_table = &3.
wa_fieldcat-ref_field = &4.
* wa_fieldcat-checkbox = &5.
* wa_fieldcat-edit = &6.
* wa_fieldcat-key = &7.
* wa_fieldcat-emphasize = &8.
APPEND wa_fieldcat TO it_fieldcat.
END-OF-DEFINITION.
SELECTION-SCREEN FUNCTION KEY 1. "按钮“默认模板下载”
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
PARAMETERS:p_fn TYPE string MODIF ID i1 . "路径
SELECTION-SCREEN END OF BLOCK b1.
INITIALIZATION.
sscrfields-functxt_01 = '@EZ@导入模板'.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_fn.
PERFORM frm_fn."路径搜索帮助打开
AT SELECTION-SCREEN.
DATA: ld_str TYPE string.
IF sy-ucomm = 'FC01'.
CALL FUNCTION 'ZJH_DOWNLOAD_FILE_SMW0'
EXPORTING
im_objname = 'ZPP044'
im_filename_def = '生产工单批量创建模板(自动带出组件).xlsx'
IMPORTING
ex_fullname = ld_str.
IF ld_str IS NOT INITIAL.
CONCATENATE '已经下载到' ld_str INTO ld_str SEPARATED BY space.
MESSAGE ld_str TYPE 'I'.
ENDIF.
ENDIF.
START-OF-SELECTION.
PERFORM frm_ge. "开始导入
PERFORM frm_process_data. "转换到内表
PERFORM frm_layout.
PERFORM frm_fieldcat.
PERFORM frm_output.
FORM frm_fn .
CALL FUNCTION 'WS_FILENAME_GET' "Get file name
EXPORTING
mask = ',*.* ,*.*.' "',*.xls,*.xlsx.'
mode = '0'
title = TEXT-h10
IMPORTING
filename = p_fn
EXCEPTIONS
inv_winsys = 1
no_batch = 2
selection_cancel = 3
selection_error = 4
OTHERS = 5.
IF sy-subrc <> 0.
* MESSAGE E016 WITH I_PATH.
ENDIF.
ENDFORM.
FORM frm_ge .
DATA: lv_xls LIKE rlgrap-filename .
IF p_fn IS INITIAL.
MESSAGE '导入文件地址不能为空!' TYPE 'E'.
STOP.
ENDIF.
CLEAR lv_xls.
lv_xls = p_fn.
"从第二行第一列开始读取
CALL FUNCTION 'ZALSM_EXCEL_TO_INTERNAL_TABLE'
EXPORTING
filename = lv_xls
i_begin_col = 1
i_begin_row = 2
i_end_col = 8 " 读取多少列
i_end_row = 55555 "读取多少行
TABLES
intern = gt_upload
EXCEPTIONS
inconsistent_parameters = 1
upload_ole = 2
OTHERS = 3.
IF sy-subrc NE 0 .
MESSAGE '从本地文件导入到SAP失败' TYPE 'E'.
ENDIF.
CLEAR gs_upload.
SORT gt_upload BY row col.
ENDFORM.
FORM frm_process_data .
DATA num TYPE i.
DATA s_zylqx TYPE RANGE OF zylqx.
s_zylqx = VALUE #( sign = 'I' option = 'EQ' ( low = 'I类' )
( low = 'II类' )
( low = 'III类' )
( low = 'IIa类' )
( low = 'IIb类' )
( low = 'others' )
).
DATA l_index TYPE i.
DATA l_type TYPE c.
FIELD-SYMBOLS : <fs>.
LOOP AT gt_upload INTO gs_upload .
MOVE gs_upload-col TO l_index.
ASSIGN COMPONENT l_index OF STRUCTURE gs_list TO <fs>.
DESCRIBE FIELD <fs> TYPE l_type.
CASE l_type.
WHEN 'C'.
<fs> = gs_upload-value.
CONDENSE <fs>.
WHEN 'I' "数字串
OR 's'
OR 'b'
OR 'N'
OR 'F'
OR 'P'.
CATCH SYSTEM-EXCEPTIONS arithmetic_errors = 5
conversion_errors = 6
bcd_overflow = 7
bcd_field_overflow = 8
.
<fs> = gs_upload-value.
ENDCATCH.
IF sy-subrc <> 0.
MESSAGE e001(00) WITH gs_upload-row '行' gs_upload-col '列数据转换错误'.
ENDIF.
WHEN OTHERS.
<fs> = gs_upload-value.
ENDCASE.
AT END OF row.
APPEND gs_list TO gt_list.
CLEAR gs_list.
ENDAT.
ENDLOOP.
LOOP AT gt_list INTO gs_list.
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
input = gs_list-matnr
IMPORTING
output = gs_list-matnr.
SELECT SINGLE * FROM mara WHERE matnr = gs_list-matnr AND lvorm = ''.
IF sy-subrc <> 0.
gs_list-flag = 'E'.
gs_list-msg = '物料' && gs_list-matnr && '不存在或已删除!'.
gs_list-icon = icon_led_red.
MODIFY gt_list FROM gs_list.
CONTINUE.
ENDIF.
SELECT SINGLE * FROM marc WHERE matnr = gs_list-matnr AND werks = gs_list-werks AND lvorm = ''.
IF sy-subrc <> 0.
gs_list-flag = 'E'.
gs_list-msg = '物料' && gs_list-matnr && '在工厂' && gs_list-werks && '里不存在或已删除!'.
gs_list-icon = icon_led_red.
MODIFY gt_list FROM gs_list.
CONTINUE.
ENDIF.
SELECT SINGLE meins INTO gs_list-gmein FROM mara WHERE matnr = gs_list-matnr.
SELECT SINGLE maktx INTO gs_list-maktx FROM makt WHERE matnr = gs_list-matnr AND spras = sy-langu.
MODIFY gt_list FROM gs_list.
ENDLOOP.
SORT gt_list BY zygdh matnr werks dauat .
ENDFORM.
FORM frm_layout .
wa_layout-cwidth_opt = 'X'.
wa_layout-zebra = 'X'.
wa_layout-sel_mode = 'D'.
wa_layout-box_fname = 'SEL'.
ENDFORM.
FORM frm_fieldcat .
init_fieldcat 'ICON' '指示灯' '' '' .
init_fieldcat 'FLAG' 'FLAG' '' '' .
init_fieldcat 'MSG' '返回信息' '' '' .
init_fieldcat 'AUFNR' '创建的工单号' 'AUFK' 'AUFNR' .
init_fieldcat 'ZYGDH' '原工单号' '' '' .
init_fieldcat 'MATNR' '物料编码' 'AFPO' 'MATNR' .
init_fieldcat 'MAKTX' '物料描述' '' '' .
init_fieldcat 'WERKS' '生产工厂' 'MARC' 'WERKS' .
init_fieldcat 'DAUAT' '订单类型' 'AFPO' 'DAUAT' .
init_fieldcat 'GAMNG' '总数量' '' '' .
init_fieldcat 'TERKZ' '计划类型' '' '' .
init_fieldcat 'GSTRP' '开始时间' '' '' .
init_fieldcat 'GLTRP' '结束时间' '' '' .
init_fieldcat 'GMEIN' '单位' '' '' .
init_fieldcat 'RELSTT' '生产订单下达状态' '' '' .
init_fieldcat 'MSGREL' '生产订单下达文本' '' '' .
ENDFORM.
FORM frm_output .
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-repid
i_callback_pf_status_set = 'ALV_PF_STATUS'
i_callback_user_command = 'USER_COMMAND'
is_layout_lvc = wa_layout
it_fieldcat_lvc = it_fieldcat
TABLES
t_outtab = gt_list
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 alv_pf_status USING rt_extab TYPE slis_t_extab.
SET PF-STATUS 'ZCYCLE' EXCLUDING rt_extab.
ENDFORM.
FORM user_command USING p_ucomm TYPE sy-ucomm
i_selfield TYPE slis_selfield.
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.
"对于输出字段优化列宽
CALL METHOD lr_grid->get_frontend_layout
IMPORTING
es_layout = wa_layout.
wa_layout-cwidth_opt = 'X'.
CALL METHOD lr_grid->set_frontend_layout
EXPORTING
is_layout = wa_layout.
CASE p_ucomm."判断按钮代码
WHEN 'ZCREATE'.
READ TABLE gt_list INTO gs_list WITH KEY sel = 'X'.
IF sy-subrc <> 0.
MESSAGE '至少选择一行创建!' TYPE 'I'.
ELSE.
READ TABLE gt_list INTO gs_list WITH KEY sel = 'X' flag = 'E'.
IF sy-subrc = 0.
MESSAGE 'FLAG 为 E 的项目不允许创建' TYPE 'I'.
ELSE.
READ TABLE gt_list INTO gs_list WITH KEY sel = 'X' flag = 'S'.
IF sy-subrc = 0.
MESSAGE 'FLAG 为 S 的项目表示本次已经创建了,不需要再次创建' TYPE 'I'.
ELSE.
PERFORM z_create_wo.
ENDIF.
ENDIF.
ENDIF.
WHEN OTHERS.
ENDCASE.
i_selfield-refresh = 'X'. "自动刷新
i_selfield-col_stable = 'X'.
i_selfield-row_stable = 'X'.
ENDFORM.
FORM z_create_wo.
"创建生产订单
DATA:ls_orderdata TYPE bapi_pp_order_create,
ls_return TYPE bapiret2,
lv_wo TYPE bapi_order_key-order_number.
"激活生产订单
DATA:BEGIN OF orderlist OCCURS 0,
aufnr TYPE aufnr,
END OF orderlist.
DATA:release_return TYPE TABLE OF bapi_order_return.
DATA:l_release_return LIKE LINE OF release_return.
LOOP AT gt_list ASSIGNING FIELD-SYMBOL(<fs_alv>) .
AT NEW dauat.
ls_orderdata-material = <fs_alv>-matnr. "物料
ls_orderdata-plant = <fs_alv>-werks. "工厂
ls_orderdata-order_type = <fs_alv>-dauat. "订单类型
ls_orderdata-basic_start_date = <fs_alv>-gstrp. "开始时间
ls_orderdata-basic_end_date = <fs_alv>-gltrp. "结束时间
ls_orderdata-quantity = <fs_alv>-gamng. "总数量
ls_orderdata-quantity_uom = <fs_alv>-gmein. "单位
"创建生产订单
CALL FUNCTION 'BAPI_PRODORD_CREATE'
EXPORTING
orderdata = ls_orderdata
* FSH_PRODORD_SEASON =
IMPORTING
return = ls_return
order_number = lv_wo.
* ORDER_TYPE =
IF lv_wo IS NOT INITIAL.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
orderlist-aufnr = lv_wo.
APPEND orderlist.
CLEAR orderlist.
<fs_alv>-msg = '创建成功:' && lv_wo.
<fs_alv>-flag = 'S'.
<fs_alv>-icon = icon_green_light.
<fs_alv>-aufnr = lv_wo.
<fs_alv>-aufnr = |{ <fs_alv>-aufnr ALPHA = IN }|.
"将原工单号写入抬头文本
UPDATE aufk SET ltext = '1' WHERE aufnr = lv_wo.
COMMIT WORK AND WAIT.
PERFORM frm_create_text USING lv_wo.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
<fs_alv>-flag = 'E'.
<fs_alv>-msg = '失败:' && ls_return-message.
<fs_alv>-icon = icon_red_light.
ENDIF.
ENDAT.
MODIFY gt_list FROM <fs_alv> TRANSPORTING aufnr msg icon WHERE zygdh = <fs_alv>-zygdh.
CLEAR:ls_orderdata,
ls_return,
lv_wo.
ENDLOOP.
"等待10s 否则会有生产订单不存在的提示
CALL FUNCTION 'AB_SLEEP'
EXPORTING
wait_time = 5.
"激活生产订单
IF NOT orderlist[] IS INITIAL.
CALL FUNCTION 'BAPI_PRODORD_RELEASE'
EXPORTING
release_control = '1'
TABLES
orders = orderlist
detail_return = release_return.
LOOP AT gt_list INTO gs_list.
SHIFT gs_list-aufnr LEFT DELETING LEADING '0'.
LOOP AT release_return INTO l_release_return WHERE message_v1 = gs_list-aufnr.
gs_list-relstt = l_release_return-type. "WO激活下达状态
gs_list-msgrel = l_release_return-message. "WO激活下达文本
MODIFY gt_list FROM gs_list.
ENDLOOP.
ENDLOOP.
ENDIF.
ENDFORM.
FORM frm_create_text USING cv_wo.
DATA:lv_fid LIKE thead-tdid,
lv_fname LIKE thead-tdname,
lv_fobject LIKE thead-tdobject,
lv_text TYPE string.
DATA : lt_flines LIKE TABLE OF tline WITH HEADER LINE .
"将原工单号写入抬头文本
lv_fid = 'KOPF'.
CONCATENATE sy-mandt cv_wo INTO lv_fname.
lv_fobject = 'AUFK'.
lv_text = gs_list-zygdh.
lt_flines-tdline = lv_text.
APPEND lt_flines .
CLEAR:lt_flines .
CALL FUNCTION 'CREATE_TEXT'
EXPORTING
fid = lv_fid
flanguage = sy-langu
fname = lv_fname
fobject = lv_fobject
TABLES
flines = lt_flines
EXCEPTIONS
no_init = 1
no_save = 2
OTHERS = 3.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
CLEAR:lv_fid,
lv_fname,
lv_fobject,
lt_flines,
lt_flines[].
ENDFORM.