SAP SAP 交货单批导三部走(带批次)
第一步 CALL FUNCTION 'BAPI_OUTB_DELIVERY_CREATE_SLS'
这个参数少,没有库位,批号信息
第二步 BADI 增强内部传值
第三步 修改交货单加上批次
源码:
*&---------------------------------------------------------------------*
REPORT zsd017.
TABLES: sscrfields,pbim.
DATA: ls_functxt TYPE smp_dyntxt. "功能代码文本
DATA: gv_flag TYPE c LENGTH 2 .
TYPES: BEGIN OF ty_upload,
vbeln LIKE vbap-vbeln , " 订单号
posnr LIKE vbap-posnr , " 订单行项目
posnr2 LIKE vbap-posnr , " 订单行项目
erdat LIKE lips-erdat,
posnr3 LIKE lips-posnr,
lgort LIKE lips-lgort,
lfimg LIKE lips-lfimg,
charg TYPE lips-charg,
pc02 TYPE c LENGTH 10,
vbeln_dn TYPE lips-vbeln,
icon TYPE icon_d,
zmsg TYPE char255,
zmsg2 TYPE char255,
END OF ty_upload.
DATA: lf_vbeln TYPE vbeln_vl,
lf_num TYPE vbnum,
ls_deli TYPE bapishpdelivnumb,
lt_deli TYPE TABLE OF bapishpdelivnumb,
lt_order TYPE TABLE OF bapidlvreftosalesorder,
ls_order TYPE bapidlvreftosalesorder,
ls_itm TYPE bapidlvitemcreated,
lt_itm TYPE TABLE OF bapidlvitemcreated,
ls_ext TYPE bapiparex,
lt_extin TYPE TABLE OF bapiparex,
lt_extout TYPE TABLE OF bapiparex,
ls_ret TYPE bapiret2,
lt_return TYPE TABLE OF bapiret2.
TYPES:BEGIN OF ty_vbap,
vbeln LIKE vbap-vbeln,
posnr LIKE vbap-posnr,
kwmeng LIKE vbap-kwmeng,
meins LIKE vbap-meins,
END OF ty_vbap.
DATA:it_vbap TYPE TABLE OF ty_vbap.
DATA:ws_vbap TYPE ty_vbap.
DATA: gt_out TYPE TABLE OF ty_upload,
gs_out TYPE ty_upload.
DATA: gt_fieldcat TYPE TABLE OF slis_fieldcat_alv.
DATA: gs_fieldcat TYPE slis_fieldcat_alv.
DATA: gs_layout TYPE slis_layout_alv .
PARAMETERS: p_erdat LIKE vbak-erdat OBLIGATORY .
SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE TEXT-001.
PARAMETERS: p_path LIKE rlgrap-filename MODIF ID m1.
SELECTION-SCREEN END OF BLOCK blk1.
INITIALIZATION.
SELECTION-SCREEN: FUNCTION KEY 1.
ls_functxt-icon_id = icon_export. "给FUNCTXT_01按钮设置图标
ls_functxt-quickinfo = '模版选择下载'. "给FUNCTXT_01按钮设置指针悬停文本
ls_functxt-icon_text = '模板选择下载'. "给FUNCTXT_01按钮设置显示文本
sscrfields-functxt_01 = ls_functxt.
AT SELECTION-SCREEN.
IF sy-ucomm = 'FC01'.
PERFORM frm_download.
ENDIF.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path.
DATA: l_filename LIKE rlgrap-filename.
CALL FUNCTION 'WS_FILENAME_GET'
EXPORTING
* DEF_FILENAME = ',*.XLSX,*.XLSX;,*.XLS,*.XLS;'
* DEF_PATH = ' '
mask = ',Excel file,*.xls;*.xlsx;' "
mode = 'O'
* TITLE = ' '
IMPORTING
filename = l_filename
* RC =
EXCEPTIONS
inv_winsys = 1
no_batch = 2
selection_cancel = 3
selection_error = 4
OTHERS = 5.
IF sy-subrc = 0.
p_path = l_filename.
ENDIF.
START-OF-SELECTION.
"提示选择导入文件
IF p_path IS INITIAL.
MESSAGE '请选择导入文件!' TYPE 'S' DISPLAY LIKE 'E'.
LEAVE LIST-PROCESSING.
RETURN.
ENDIF.
PERFORM frm_upload.
PERFORM check_data .
PERFORM display_alv .
*----------------------------------------------------------------------*
* END-OF-SELECTION *
*----------------------------------------------------------------------*
END-OF-SELECTION.
*&---------------------------------------------------------------------*
*& Form FRM_UPLOAD
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_upload .
DATA:
lt_excel_data TYPE zsalsmex_tabline2 OCCURS 0 WITH HEADER LINE,
ls_excel_data TYPE zsalsmex_tabline2,
ls_result TYPE TY_upload,
lr_cx_sy_conversion_no_number TYPE REF TO cx_sy_conversion_no_number.
FIELD-SYMBOLS:
<fs_value>.
CALL FUNCTION 'ZALSM_EXCEL_TO_INTERNAL_TABLE'
EXPORTING
filename = p_path
i_begin_col = 1
i_begin_row = 2 "读取开始行:
i_end_col = 90 "读取的列数
i_end_row = 50000 "最多读取5万行 "65535.
TABLES
intern = lt_excel_data
EXCEPTIONS
inconsistent_parameters = 1
upload_ole = 2
OTHERS = 3.
LOOP AT lt_excel_data INTO ls_excel_data.
AT NEW row.
CLEAR ls_result.
ENDAT.
TRY.
ASSIGN COMPONENT ls_excel_data-col OF STRUCTURE LS_result TO <fs_value>.
MOVE ls_excel_data-value TO <fs_value>.
CATCH cx_sy_conversion_no_number INTO lr_cx_sy_conversion_no_number.
ENDTRY.
AT END OF row.
APPEND ls_result TO gt_out .
ENDAT.
ENDLOOP.
* MOVE-CORRESPONDING gt_upload[] TO gt_alv[].
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DOWNLOAD
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_download .
DATA: lw_key TYPE wwwdatatab,
l_filename TYPE string,
l_path TYPE string,
l_fullpath TYPE string,
l_destination TYPE rlgrap-filename.
DATA: lv_objid TYPE w3objid VALUE 'ZSD017',
lv_fieldname TYPE string.
lv_fieldname = '交货单批导模板'.
* 判断模版是否存在
SELECT SINGLE *
INTO CORRESPONDING FIELDS OF lw_key
FROM wwwdata
WHERE relid EQ 'MI'
AND objid EQ lv_objid.
IF sy-subrc NE 0.
* MESSAGE S000(ZZZCOMMON001) WITH UV_OBJID.
RETURN.
ENDIF.
* 调用函数打开文件选择框
CALL METHOD cl_gui_frontend_services=>file_save_dialog
EXPORTING
default_extension = cl_gui_frontend_services=>filetype_excel
default_file_name = lv_fieldname
file_filter = 'EXCEL文件(*.XLS)|*.XLS|全部文件 (*.*)|*.*|'
CHANGING
filename = l_filename
path = l_path
fullpath = l_fullpath
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
not_supported_by_gui = 3
invalid_default_file_name = 4
OTHERS = 5.
IF sy-subrc <> 0.
ENDIF.
CHECK l_fullpath NE ''.
* 下载模版
l_destination = l_fullpath.
CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
EXPORTING
key = lw_key
destination = l_destination.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_dn_create
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_dn_create .
DATA: i_vbkok TYPE vbkok.
DATA: lv_vstel LIKE likp-vstel,
lv_vbeln LIKE likp-vbeln.
DATA: lt_soitem LIKE bapidlvreftosalesorder OCCURS 0 WITH HEADER LINE,
lt_return LIKE bapiret2 OCCURS 0 WITH HEADER LINE,
lt_extension LIKE bapiparex OCCURS 0 WITH HEADER LINE.
DATA: lv_mseg(220).
DATA:lt_out LIKE TABLE OF gs_out .
DATA: ls_out LIKE gs_out .
DATA: lv_vygid TYPE likp-itm_vygid .
lt_out = gt_out .
SORT lt_out BY vbeln posnr posnr2 .
DELETE ADJACENT DUPLICATES FROM lt_out COMPARING vbeln posnr posnr2 .
LOOP AT lt_out INTO ls_out .
lv_vygid = 'BADI2' .
LOOP AT gt_out INTO gs_out WHERE vbeln = ls_out-vbeln AND posnr = ls_out-posnr AND posnr2 = ls_out-posnr2 AND posnr3 EQ '10' .
lv_vstel = 'Z001'.
REFRESH: lt_soitem, lt_return.
CLEAR: lt_soitem, lt_return.
lt_soitem-ref_doc = gs_out-vbeln.
lt_soitem-ref_item = gs_out-posnr.
lt_soitem-dlv_qty = gs_out-lfimg.
SELECT SINGLE meins INTO lt_soitem-sales_unit FROM vbap WHERE vbeln = GS_out-vbeln AND posnr = gs_out-posnr .
APPEND lt_soitem.
CLEAR lt_soitem.
ENDLOOP.
"传值给内存
EXPORT ls_out-lgort TO MEMORY ID 'zsd0117lgort'.
EXPORT lv_vygid TO MEMORY ID 'zsd0117vygid'.
IF lt_soitem[] IS NOT INITIAL.
CALL FUNCTION 'BAPI_OUTB_DELIVERY_CREATE_SLS'
EXPORTING
ship_point = lv_vstel
due_date = p_erdat
IMPORTING
delivery = lv_vbeln
TABLES
sales_order_items = lt_soitem
return = lt_return.
READ TABLE lt_return WITH KEY type = 'E'.
IF sy-subrc <> 0.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
LOOP AT gt_out INTO gs_out WHERE vbeln = ls_out-vbeln AND posnr = ls_out-posnr AND posnr2 = ls_out-posnr2 .
* SELECT * INTO TABLE gt_lips FROM lips WHERE vbeln = lv_vbeln AND posnr < '900000'.
* LOOP AT gt_Out WHERE refno = gt_do-refno AND vstel = gt_do-vstel.
gs_out-vbeln_dn = lv_vbeln.
gs_out-zmsg = '导入成功,批次未成功'.
gs_out-icon = icon_led_yellow.
* CLEAR: gt_lips.
* READ TABLE gt_lips WITH KEY vgbel = gt_result-vbeln vgpos = gt_result-posnr.
* gt_result-posnr_vl = gt_lips-posnr.
MODIFY gt_out FROM gs_out TRANSPORTING vbeln_dn zmsg icon.
ENDLOOP.
* IF p_pgi = 'X'.
* CLEAR lv_mseg.
* PERFORM pgi_dn USING lv_vbeln CHANGING lv_mseg.
* IF lv_mseg IS NOT INITIAL.
* gt_result-zmsg = '自动过帐失败!' && lv_mseg.
* gt_result-icon = icon_led_green.
* MODIFY gt_result TRANSPORTING zmsg icon WHERE refno = gt_do-refno AND vstel = gt_do-vstel.
* ENDIF.
* ENDIF.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
CLEAR: lv_mseg.
LOOP AT lt_return WHERE type = 'E'.
CONCATENATE lv_mseg lt_return-message INTO lv_mseg SEPARATED BY '|'.
ENDLOOP.
LOOP AT gt_out INTO gs_out WHERE vbeln = ls_out-vbeln AND posnr = ls_out-posnr AND posnr2 = ls_out-posnr2 .
gs_out-vbeln_dn = ''.
gs_out-icon = icon_led_red.
gs_out-zmsg = lv_mseg.
MODIFY gt_out FROM gs_out TRANSPORTING zmsg icon .
ENDLOOP .
ENDIF.
ENDIF.
FREE MEMORY ID 'zsd0117lgort'.
ENDLOOP .
"拆分批次
WAIT UP TO 2 SECONDS .
DATA:
lit_header_partner LIKE TABLE OF bapidlvpartnerchg , "交货:合作伙伴更改
lit_header_deadlines LIKE TABLE OF bapidlvdeadln , "交货截止日期
lit_item_data LIKE TABLE OF bapiobdlvitemchg , "更改外向交货拣配数据项目等级
lit_item_control LIKE TABLE OF bapiobdlvitemctrlchg , "外向交货项目级别控制数据
lit_ret LIKE TABLE OF bapiret2 WITH HEADER LINE , "返回参数
lit_item_data_spl LIKE TABLE OF /spe/bapiobdlvitemchg , "更改向外交货拣配数据项目等级(SPE)
is_header_data LIKE bapiobdlvhdrchg , "更改外向交货拣配数据表头等级
is_header_control LIKE bapiobdlvhdrctrlchg , "外向交货标题级别控制数据
iv_delivery LIKE bapiobdlvhdrchg-deliv_numb . "交货
DATA:
lwa_header_partner LIKE bapidlvpartnerchg , "交货:合作伙伴更改
lwa_header_deadlines LIKE bapidlvdeadln , "交货截止日期
lwa_item_data LIKE bapiobdlvitemchg , "更改外向交货拣配数据项目等级
lwa_item_control LIKE bapiobdlvitemctrlchg , "外向交货项目级别控制数据
lwa_return LIKE bapiret2 . "返回参数
DATA: l_techn_control TYPE bapidlvcontrol.
DATA:
ls_item TYPE bapiobdlvitemchg,
ls_item_t TYPE bapiobdlvitemchg,
ls_item_control TYPE bapiobdlvitemctrlchg,
ls_deadlines TYPE bapidlvdeadln.
CLEAR : ls_out ,lt_out[] .
lt_out = gt_out .
SORT lt_out BY vbeln posnr posnr2 .
DELETE ADJACENT DUPLICATES FROM lt_out COMPARING vbeln posnr posnr2 .
DATA : lv_lfimg LIKE lips-lfimg .
* DATA : lv_posnr_old LIKE lwa_item_data-hieraritem .
DATA : lv_posnr_old LIKE lips-posnr .
LOOP AT lt_out INTO ls_out WHERE vbeln_dn <> '' .
"抬头信息
iv_delivery = ls_out-vbeln_dn .
is_header_data-deliv_numb = ls_out-vbeln_dn . "交货单号
is_header_control-deliv_numb = ls_out-vbeln_dn .
lv_lfimg = 0 .
"拆分批次项目
"获取原来行项目
SELECT SINGLE posnr INTO lv_posnr_old
FROM lips
WHERE vbeln = ls_out-vbeln_dn
AND vgbel = ls_out-vbeln
AND vgpos = ls_out-posnr .
LOOP AT gt_out INTO gs_out WHERE posnr3+0(1) EQ '9' AND vbeln_dn = ls_out-vbeln_dn .
CLEAR lwa_item_data.
lwa_item_data-deliv_numb = gs_out-vbeln_dn.
lwa_item_data-deliv_item = gs_out-posnr3. "拆分后的新行项目
"上级行项目(交货单行项目)
lwa_item_data-hieraritem = lv_posnr_old. "上级行项目
lwa_item_data-batch = gs_out-charg. "新批次
lwa_item_data-dlv_qty = gs_out-lfimg. "自己重新计算拆分后的数量,
lwa_item_data-dlv_qty_imunit = gs_out-lfimg.
lwa_item_data-fact_unit_nom = 1. "销售数量转换成SKU的分子(因子)
lwa_item_data-fact_unit_denom = 1. "销售数量转换为 SKU 的值(除数)
*lwa_item_data-base_uom = 'KG'. "基本单位
*lwa_item_data-sales_unit = 'KG'. "销售单位
lwa_item_data-usehieritm = '1'.
"ctrol
CLEAR lwa_item_control.
lwa_item_control-deliv_numb = gs_out-vbeln_dn.
lwa_item_control-deliv_item = gs_out-posnr3. . "拆分后的新行项目
lwa_item_control-chg_delqty = 'X'. "数量修改标志
APPEND lwa_item_control TO lit_item_control .
APPEND lwa_item_data TO lit_item_data.
lv_lfimg = lv_lfimg + gs_out-lfimg .
ENDLOOP.
"原来行项目修改
CLEAR lwa_item_data.
lwa_item_data-deliv_numb = ls_out-vbeln_dn.
lwa_item_data-deliv_item = lv_posnr_old. "原行项目
lwa_item_data-batch = ls_out-charg.
lwa_item_data-dlv_qty = ls_out-lfimg - lv_lfimg .
lwa_item_data-dlv_qty_imunit = ls_out-lfimg - lv_lfimg ..
*lwa_item_data-base_uom = 'KG'. "基本单位
*lwa_item_data-sales_unit = 'KG'. "销售单位
lwa_item_data-fact_unit_nom = 1. "销售数量转换成SKU的分子(因子)
lwa_item_data-fact_unit_denom = 1. "销售数量转换为 SKU 的值(除数)
APPEND lwa_item_data TO lit_item_data .
CLEAR lwa_item_control.
lwa_item_control-deliv_numb = ls_out-vbeln_dn.
lwa_item_control-deliv_item = lv_posnr_old. "原行项目
lwa_item_control-chg_delqty = 'X'. "数量修改标志
APPEND lwa_item_control TO lit_item_control.
CALL FUNCTION 'BAPI_OUTB_DELIVERY_CHANGE'
EXPORTING
header_data = is_header_data
header_control = is_header_control
delivery = iv_delivery
TABLES
header_partner = lit_header_partner
header_deadlines = lit_header_deadlines
item_data = lit_item_data
item_control = lit_item_control
return = lit_ret.
CLEAR : lit_item_data[] .
CLEAR : lit_item_control[] .
IF lit_ret[] IS INITIAL.
COMMIT WORK AND WAIT.
LOOP AT gt_out INTO gs_out WHERE vbeln_dn = ls_out-vbeln_dn .
gs_out-zmsg2 = '批次拆分成功' .
gs_out-zmsg = '导入成功'.
gs_out-icon = icon_led_green.
MODIFY gt_out FROM gs_out .
ENDLOOP .
ELSE .
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ENDIF.
CLEAR : lit_ret[] .
ENDLOOP .
ENDFORM.
*&---------------------------------------------------------------------*
*& Form display_alv
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM display_alv .
DEFINE append_field.
gs_fieldcat-fieldname = &1.
gs_fieldcat-seltext_l = &2.
APPEND gs_fieldcat TO gt_fieldcat.
CLEAR: gs_fieldcat.
END-OF-DEFINITION.
append_field: 'ICON' '状态' .
append_field: 'ZMSG' '创建消息' .
append_field: 'ZMSG2' '拆分消息' .
append_field: 'VBELN_DN' '交货单号' .
append_field: 'VBELN' '销售订单号' .
append_field: 'POSNR' '销售订单行项目' .
" append_field: 'ZZNME' '物料名称' .
append_field: 'POSNR2' '自定义交货单号' .
append_field: 'ERDAT' '送货日期' .
append_field: 'POSNR3' '交货单行项目'.
append_field: 'LGORT' '库位' .
append_field: 'LFIMG' '出货数量' .
append_field: 'CHARG' '生产批次' .
* gs_layout-box_fieldname = 'MARK'.
gs_layout-colwidth_optimize = 'X'.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = sy-repid
i_callback_pf_status_set = 'FRM_STATUS_SET'
i_callback_user_command = 'FRM_USER_COMMAND'
*
* I_GRID_SETTINGS =
is_layout = gs_layout
it_fieldcat = gt_fieldcat
* ES_EXIT_CAUSED_BY_USER =
TABLES
t_outtab = gt_out
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
ENDFORM.
FORM frm_status_set USING ut_extab TYPE slis_t_extab.
SET PF-STATUS 'PF_001'.
ENDFORM.
FORM frm_user_command USING uv_ucomm LIKE sy-ucomm
us_selfield TYPE slis_selfield.
IF sy-ucomm EQ 'IMPORT' .
IF gv_flag <> 'NG' .
PERFORM frm_dn_create.
us_selfield-refresh = 'X'.
ELSE .
MESSAGE '导入数据有问题,请修正后再导入' TYPE 'E' .
ENDIF .
ENDIF .
ENDFORM .
*&---------------------------------------------------------------------*
*& Form check_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM check_data .
DATA: lt_out LIKE TABLE OF gs_out .
DATA: ls_out LIKE gs_out .
DATA : lv_charg LIKE mchb-charg .
DATA : lv_matnr LIKE mara-matnr .
LOOP AT gt_out INTO gs_out .
SELECT SINGLE matnr INTO lv_matnr FROM vbap WHERE vbeln = gs_out-vbeln AND posnr = gs_out-posnr .
CLEAR : lv_charg .
SELECT SINGLE charg INTO lv_charg
FROM mch1
WHERE matnr = lv_matnr
AND charg = gs_out-charg.
IF lv_charg IS INITIAL .
gs_out-icon = icon_led_red .
gs_out-zmsg = '批次不存在' .
Gv_flag = 'NG' .
ELSE.
gs_out-icon = icon_led_green .
gs_out-zmsg = '批次检查通过' .
ENDIF .
MODIFY gt_out FROM gs_out .
ENDLOOP .
SORT gt_out BY posnr posnr .
LOOP AT gt_out INTO gs_out .
IF gs_out+0(1) <> '9'.
ls_out-lfimg = ls_out-lfimg + gs_out-lfimg .
ENDIF .
ls_out-vbeln = gs_out-vbeln .
ls_out-posnr = gs_out-posnr .
AT END OF posnr .
APPEND ls_out TO lt_out .
CLEAR :ls_out .
ENDAT .
ENDLOOP .
ENDFORM.
文章来自于网络,如果侵犯了您的权益,请联系站长删除!