SAP SD交货单批导功能分享
一、功能逻辑











二、批导模板

三、功能代码

*&---------------------------------------------------------------------*
*& 程序名: ZRPSD_0001
*& 创建者(公司)/日期:*
*& 程序描述:
*&
*&---------------------------------------------------------------------*
*& 版本/修改者(公司)/日期//修改描述
*&
*&---------------------------------------------------------------------*
REPORT zrpsd_0001 MESSAGE-ID 00.
INCLUDE zrpsd_0001_top."变量定义
INCLUDE zrpsd_0001_f01."核心业务代码
INCLUDE zrpsd_0001_f02."响应事件的代码
INCLUDE zrpsd_0001_c01."Class Definition
INCLUDE zrpsd_0001_s01."ALV显示与控制
INITIALIZATION.
PERFORM frm_init_screen.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_fpath.
PERFORM frm_get_filepath CHANGING p_fpath.
AT SELECTION-SCREEN.
CASE sscrfields-ucomm.
WHEN 'FC01'.
PERFORM frm_download_template USING 'ZRPSD_0001'.
ENDCASE.
START-OF-SELECTION.
PERFORM frm_upload_file USING p_fpath.
PERFORM frm_check_data.
PERFORM frm_process_data.
PERFORM frm_show_alv USING gt_alv.
*&---------------------------------------------------------------------*
*& 包含 ZRPSD_0001_TOP
*&---------------------------------------------------------------------*
TABLES sscrfields.
* Switch for list display yes / no
DATA:gv_list_display TYPE sap_bool.
* Reference for container control
DATA:gr_cont TYPE REF TO cl_gui_custom_container.
* Reference for ALV instance
DATA:gr_alv TYPE REF TO cl_salv_table.
* Reference for error situations
DATA:gr_error TYPE REF TO cx_salv_error.
DATA:gs_functxt TYPE smp_dyntxt.
DATA:gt_excel TYPE TABLE OF zssd_batch_input_002,
gs_excel TYPE zssd_batch_input_002.
DATA: lt_credit LIKE STANDARD TABLE OF zssd_input_025 WITH HEADER LINE.
DATA:gt_alv TYPE TABLE OF zssd_batch_input_001,
gs_alv TYPE zssd_batch_input_001.
DATA: ls_color TYPE lvc_s_scol,
lt_color TYPE lvc_t_scol.
SELECTION-SCREEN BEGIN OF BLOCK b_01 WITH FRAME TITLE TEXT-002.
PARAMETERS:p_fpath TYPE rlgrap-filename.
SELECTION-SCREEN END OF BLOCK b_01.
PARAMETERS p_typ1 AS CHECKBOX .
SELECTION-SCREEN:FUNCTION KEY 1.
*&---------------------------------------------------------------------*
*& 包含 ZRPSD_0001_F01
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form FRM_INIT_SCREEN
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_init_screen .
CLEAR:gs_functxt.
gs_functxt-icon_id = icon_export.
gs_functxt-icon_text = TEXT-001.
sscrfields-functxt_01 = gs_functxt.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_get_filepath
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& <-- P_FPATH
*&---------------------------------------------------------------------*
FORM frm_get_filepath CHANGING c_path.
FIELD-SYMBOLS:<fs_file_table> TYPE file_table.
DATA:lt_file_table TYPE filetable,
lv_rc TYPE i.
CALL METHOD cl_gui_frontend_services=>file_open_dialog
CHANGING
file_table = lt_file_table
rc = lv_rc.
IF lt_file_table IS INITIAL.
MESSAGE s001 WITH TEXT-m01 DISPLAY LIKE 'E'.
RETURN.
ENDIF.
LOOP AT lt_file_table ASSIGNING <fs_file_table>.
CONCATENATE c_path <fs_file_table>-filename INTO c_path.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_download_template
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> P_
*&---------------------------------------------------------------------*
FORM frm_download_template USING u_template.
DATA:lv_fname TYPE string,
lv_title TYPE string,
lv_path TYPE string,
lv_fpath TYPE string,
lv_file TYPE rlgrap-filename.
DATA:ls_wdatb LIKE wwwdatatab.
DATA:lv_subrc TYPE sy-subrc.
lv_title = '模板下载' .
lv_fname = '交货单批量导入模板.xlsx'.
CALL METHOD cl_gui_frontend_services=>file_save_dialog
EXPORTING
window_title = lv_title
default_extension = 'xlsx'
default_file_name = lv_fname
* INITIAL_DIRECTORY = 'C:\'
file_filter = 'Excel文件(*.xls)|*.xls|全部文件 (*.*)|*.*|'
prompt_on_overwrite = 'X'
CHANGING
filename = lv_fname
path = lv_path
fullpath = lv_fpath
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
not_supported_by_gui = 3
OTHERS = 4.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.
SELECT SINGLE relid objid FROM wwwdata INTO CORRESPONDING FIELDS OF ls_wdatb
WHERE srtf2 = 0
AND relid = 'MI'
AND objid = u_template.
IF ls_wdatb IS INITIAL.
MESSAGE e398(00) WITH '模板文件不存在!'.
ELSE.
lv_file = lv_fpath.
IF lv_file IS NOT INITIAL.
CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
EXPORTING
key = ls_wdatb
destination = lv_file
IMPORTING
rc = lv_subrc.
IF lv_subrc NE 0.
MESSAGE e398(00) WITH '模板下载失败!'.
ELSE.
MESSAGE s398(00) WITH '下载成功'.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form pf_upload_file
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> P_FPATH
*&---------------------------------------------------------------------*
FORM frm_upload_file USING u_fpath TYPE rlgrap-filename.
DATA:lt_alsmex_tabline TYPE TABLE OF zalsmex_tabline.
DATA:lv_posex TYPE vbap-posex.
DATA:lv_result TYPE string.
FIELD-SYMBOLS:<fs_row_value> TYPE any.
CLEAR:gt_excel.
CALL FUNCTION 'ZALSM_EXCEL_TO_INTERNAL_TABLE'
EXPORTING
filename = u_fpath
i_begin_col = 1
i_begin_row = 6
i_end_col = 14
i_end_row = 9999
TABLES
intern = lt_alsmex_tabline
EXCEPTIONS
inconsistent_parameters = 1
upload_ole = 2
OTHERS = 3.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
MESSAGE '数据读取异常,请联系管理员' TYPE 'E'.
ENDIF.
IF lt_alsmex_tabline IS NOT INITIAL.
TRY .
LOOP AT lt_alsmex_tabline INTO DATA(gs_intern).
AT NEW row.
CLEAR:gs_excel.
gs_excel-zindex = gs_intern-row.
ENDAT.
ASSIGN COMPONENT gs_intern-col OF STRUCTURE gs_excel TO <fs_row_value>.
IF gs_intern-col EQ 10.
REPLACE ALL OCCURRENCES OF ',' IN gs_intern-value WITH space.
CONDENSE gs_intern-value NO-GAPS.
<fs_row_value> = gs_intern-value.
ELSE.
<fs_row_value> = gs_intern-value.
ENDIF.
AT END OF row.
IF gs_excel-vkorg EQ '1001' OR gs_excel-vkorg = '1101'.
gs_excel-werks = '1001'.
ELSEIF gs_excel-vkorg EQ '1002' OR gs_excel-vkorg = '1102'.
gs_excel-werks = '1002'.
ENDIF.
IF p_typ1 = 'X'.
DATA(tmp_bldat) = gs_excel-bldat .
ELSE.
tmp_bldat = '' .
ENDIF.
gs_excel-str = gs_excel-auart && gs_excel-vkorg &&
gs_excel-kunnr && gs_excel-kondm && gs_excel-zcsperson &&
gs_excel-kunwe && gs_excel-kvgr1 && gs_excel-lfdat &&
gs_excel-matnr && gs_excel-bstkd && gs_excel-posex && tmp_bldat.
CONDENSE gs_excel-str NO-GAPS. "str用于校验数据是否有重复行
gs_excel-str1 = gs_excel-auart && gs_excel-vkorg && gs_excel-kunnr
&& gs_excel-kondm && gs_excel-zcsperson && gs_excel-werks && gs_excel-matnr
&& gs_excel-bstkd && gs_excel-posex.
CONDENSE gs_excel-str1 NO-GAPS. "str1用于形成组合,方便分配未清交货数量
gs_excel-str2 = gs_excel-auart && gs_excel-vkorg && gs_excel-kunnr
&& gs_excel-kondm && gs_excel-zcsperson && gs_excel-kunwe && gs_excel-kvgr1
&& gs_excel-lfdat && gs_excel-werks "&& gs_excel-bstkd&& gs_excel-posex
&& tmp_bldat .
* && GS_EXCEL-MATNR
* && GS_EXCEL-BSTKD && GS_EXCEL-POSEX.
CONDENSE gs_excel-str2 NO-GAPS. "str2用于形成产生DN组合,同一组合产生一张DN
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
input = gs_excel-matnr
IMPORTING
output = gs_excel-matnr.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = gs_excel-kunnr
IMPORTING
output = gs_excel-kunnr.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = gs_excel-kunwe
IMPORTING
output = gs_excel-kunwe.
IF gs_excel-posex IS NOT INITIAL.
lv_posex = gs_excel-posex.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = lv_posex
IMPORTING
output = gs_excel-posex.
ENDIF.
APPEND gs_excel TO gt_excel.
CLEAR gs_excel.
ENDAT.
ENDLOOP.
CATCH cx_root INTO DATA(lo_root) .
CALL METHOD lo_root->if_message~get_text
RECEIVING
result = lv_result.
"报错提示
WRITE:/ '导入文件出现错误:' .
WRITE:/ '内容行:' && gs_intern-row && ',' && lv_result && '请检查以下数据: '.
ULINE.
LOOP AT lt_alsmex_tabline INTO gs_intern WHERE row = gs_intern-row .
WRITE:/ gs_intern-value .
ENDLOOP.
ENDTRY.
ENDIF.
SORT gt_excel ASCENDING BY str1.
MOVE-CORRESPONDING gt_excel TO gt_alv.
CLEAR:lt_alsmex_tabline.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_check_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_check_data .
DATA:lv_msg TYPE bapiret2-message,
lv_ordqty_bu TYPE ordqty.
DATA:lv_matnr TYPE mara-matnr.
SELECT kunnr,vkorg,vtweg,spart INTO TABLE @DATA(lt_knvv) FROM knvv
WHERE vtweg = '00'
AND cassd = ''
ORDER BY kunnr.
IF gt_alv IS NOT INITIAL.
SELECT matnr,vkorg,vtweg INTO TABLE @DATA(lt_mvke) FROM mvke
FOR ALL ENTRIES IN @gt_alv
WHERE matnr = @gt_alv-matnr
AND vkorg = @gt_alv-vkorg
AND vtweg = '00'.
SELECT mara~matnr,maktx,meins INTO TABLE @DATA(lt_makt) FROM mara
INNER JOIN makt ON makt~matnr = mara~matnr
AND spras = @sy-langu
FOR ALL ENTRIES IN @gt_alv
WHERE mara~matnr = @gt_alv-matnr.
SELECT kunnr,name1,name2 FROM kna1 INTO TABLE @DATA(lt_kna1)
FOR ALL ENTRIES IN @gt_alv
WHERE kunnr = @gt_alv-kunnr
OR kunnr = @gt_alv-kunwe.
** MODIFY BY HELQ 20210819>>>
* SELECT * INTO TABLE @DATA(lt_vbep_001) FROM zvsdvbep001
* FOR ALL ENTRIES IN @gt_alv
* WHERE kunnr = @gt_alv-kunnr
* AND matnr = @gt_alv-matnr
* AND bstkd = @gt_alv-bstkd.
SELECT a~auart ,
a~vkorg,
a~kunnr,
a~kondm,
a~zcsperson,
a~kunwe,
a~kvgr1 ,
a~lfdat,
a~matnr,
a~bstkd,
a~posex,
a900~kappl FROM a900
* FOR ALL ENTRIES IN @GT_ALV
INNER JOIN @gt_alv AS a ON a~vkorg = a900~vkorg
AND a~kunnr = a900~kunnr
AND a~kondm = a900~kondm
AND a~matnr = a900~matnr
INNER JOIN konp ON a900~knumh = konp~knumh
WHERE a900~kappl = 'V'
AND a900~kschl = 'ZPR0'
AND vtweg = '00'
AND loevm_ko = ''
AND auart IN ( 'ZOR1','ZOR5','ZOR6' )
AND datab <= a~lfdat
AND datbi >= a~lfdat
INTO TABLE @DATA(lt_a900).
SELECT a~auart ,
a~vkorg,
a~kunnr,
a~kondm,
a~zcsperson,
a~kunwe,
a~kvgr1 ,
a~lfdat,
a~matnr,
