一、功能逻辑








二、功能界面



三、功能代码
*&---------------------------------------------------------------------*
*& Report ZRPMM_0005
*&---------------------------------------------------------------------*
*& 程序名:ZRPMM_0005
*& 创建者(公司)/日期:
*& 程序描述:采购信息记录批导
*&---------------------------------------------------------------------*
*& 版本/修改者(公司)/日期/修改描述
*&
*&---------------------------------------------------------------------*
REPORT zrpmm_0005 MESSAGE-ID zmm01.
INCLUDE zrpmm_0005_top.
INCLUDE zrpmm_0005_scr.
INCLUDE zrpmm_0005_f01.
INCLUDE zrpmm_0005_f02.
INCLUDE zrpmm_0005_c01.
INCLUDE zrpmm_0005_s01.
INCLUDE bdcrecxy.
INITIALIZATION.
PERFORM frm_init_data.
AT SELECTION-SCREEN.
IF sscrfields-ucomm = 'FC01'.
PERFORM frm_download_template.
ENDIF.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
PERFORM frm_file_open_dialog CHANGING p_file.
START-OF-SELECTION.
PERFORM frm_check_authority.
PERFORM frm_get_data_by_excel.
PERFORM frm_process_data.
IF p_rbtn1 EQ abap_true.
PERFORM frm_show_alv USING gt_alv_01.
ELSE.
PERFORM frm_show_alv USING gt_alv_02.
ENDIF.
*&---------------------------------------------------------------------*
*& 包含 ZRPMM_0005_TOP
*&---------------------------------------------------------------------*
TABLES:sscrfields.
* Switch for list display yes / no
DATA: 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:gt_alv_01 TYPE TABLE OF zsmm_0006, "物料信息记录
gt_alv_02 TYPE TABLE OF zsmm_0007. "物料组信息记录
DATA:gv_flag(10) TYPE c.
*&---------------------------------------------------------------------*
*& 包含 ZRPMM_0005_SCR
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK b01 WITH FRAME TITLE TEXT-001.
PARAMETERS p_file TYPE rlgrap-filename.
SELECTION-SCREEN END OF BLOCK b01.
SELECTION-SCREEN BEGIN OF BLOCK b02 WITH FRAME TITLE TEXT-002.
PARAMETERS:p_rbtn1 RADIOBUTTON GROUP g1 USER-COMMAND uc1 MODIF ID mf1,
p_rbtn2 RADIOBUTTON GROUP g1.
SELECTION-SCREEN END OF BLOCK b02.
SELECTION-SCREEN FUNCTION KEY 1.
*&---------------------------------------------------------------------*
*& 包含 ZRPMM_0005_F01
*&---------------------------------------------------------------------*
DEFINE mac_add_message.
IF &1 IS INITIAL.
CONCATENATE &2 &3 INTO &3.
ENDIF.
END-OF-DEFINITION.
DEFINE mac_set_record.
IF &1 IS INITIAL.
&3 = &2.
ENDIF.
END-OF-DEFINITION.
*&---------------------------------------------------------------------*
*& Form frm_check_authority
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_check_authority .
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_get_data_by_excel
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_get_data_by_excel .
DATA:lv_begin_row TYPE i, "开始行
lv_begin_col TYPE i, "开始列
lv_end_row TYPE i, "结束行
lv_end_col TYPE i. "结束列
DATA:lv_table(10) TYPE c.
DATA lv_column TYPE i.
FIELD-SYMBOLS:<fs_row_values> TYPE any.
DATA lv_pathname LIKE rlgrap-filename .
DATA:lt_intern TYPE TABLE OF zalsmex_tabline.
DATA:lv_sheet_name(50) TYPE c.
DATA:ls_excel_data_01 TYPE zsmm_0002, "物料信息记录
lt_excel_data_01 TYPE TABLE OF zsmm_0002.
DATA:ls_excel_data_02 TYPE zsmm_0004, "物料组信息记录
lt_excel_data_02 TYPE TABLE OF zsmm_0004.
CLEAR:ls_excel_data_01,lt_excel_data_01,ls_excel_data_02,lt_excel_data_02.
IF p_file IS INITIAL.
MESSAGE '请选择导入的文件' TYPE 'S' DISPLAY LIKE 'E'.
LEAVE LIST-PROCESSING.
ENDIF.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
text = '数据导入中...'.
MOVE p_file TO lv_pathname.
lv_begin_col = 1.
lv_begin_row = 4.
IF p_rbtn1 EQ abap_true.
lv_end_col = 43.
lv_sheet_name = '物料信息记录'.
ELSE.
lv_sheet_name = '物料组信息记录'.
lv_end_col = 44.
ENDIF.
lv_end_row = 20000.
CALL FUNCTION 'ZALSM_EXCEL_TO_INTERNAL_TABLE'
EXPORTING
filename = lv_pathname
i_begin_col = lv_begin_col
i_begin_row = lv_begin_row
i_end_col = lv_end_col
i_end_row = lv_end_row
i_sheetname = lv_sheet_name
TABLES
intern = lt_intern
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.
ELSE.
IF lt_intern IS INITIAL.
MESSAGE s000 WITH 'Excel无数据' DISPLAY LIKE 'E'.
LEAVE LIST-PROCESSING.
ENDIF.
LOOP AT lt_intern INTO DATA(ls_intern).
IF p_rbtn1 EQ abap_true.
ASSIGN COMPONENT ls_intern-col OF STRUCTURE ls_excel_data_01 TO <fs_row_values>.
ELSE.
ASSIGN COMPONENT ls_intern-col OF STRUCTURE ls_excel_data_02 TO <fs_row_values>.
ENDIF.
IF <fs_row_values> IS ASSIGNED.
<fs_row_values> = ls_intern-value.
UNASSIGN:<fs_row_values>.
ENDIF.
AT END OF row.
IF p_rbtn1 EQ abap_true.
* ls_excel_data_01-matnr = |{ ls_excel_data_01-matnr ALPHA = IN }|.
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
input = ls_excel_data_01-matnr
IMPORTING
output = ls_excel_data_01-matnr
EXCEPTIONS
length_error = 1
OTHERS = 2.
CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
EXPORTING
input = ls_excel_data_01-meins
language = sy-langu
IMPORTING
output = ls_excel_data_01-meins
EXCEPTIONS
unit_not_found = 1
OTHERS = 2.
IF ls_excel_data_01-kpein IS INITIAL.
ls_excel_data_01-kpein = 1.
ENDIF.
ls_excel_data_01-lifnr = |{ ls_excel_data_01-lifnr ALPHA = IN }|.
APPEND ls_excel_data_01 TO lt_excel_data_01.
ELSE.
CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
EXPORTING
input = ls_excel_data_02-meins
language = sy-langu
IMPORTING
output = ls_excel_data_02-meins
EXCEPTIONS
unit_not_found = 1
OTHERS = 2.
IF ls_excel_data_02-kpein IS INITIAL.
ls_excel_data_02-kpein = 1.
ENDIF.
ls_excel_data_02-lifnr = |{ ls_excel_data_02-lifnr ALPHA = IN }|.
APPEND ls_excel_data_02 TO lt_excel_data_02.
ENDIF.
CLEAR:ls_excel_data_01,ls_excel_data_02.
ENDAT.
CLEAR:ls_intern.
ENDLOOP.
IF p_rbtn1 EQ abap_true.
MOVE-CORRESPONDING lt_excel_data_01 TO gt_alv_01.
ELSE.
MOVE-CORRESPONDING lt_excel_data_02 TO gt_alv_02.
ENDIF.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_process_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_process_data .
DATA:lv_message TYPE string.
IF p_rbtn1 EQ abap_true.
LOOP AT gt_alv_01 ASSIGNING FIELD-SYMBOL(<fs_alv_01>).
CLEAR:lv_message.
mac_add_message:<fs_alv_01>-lifnr '供应商必输' lv_message.
mac_add_message:<fs_alv_01>-matnr '物料编码必输' lv_message.
mac_add_message:<fs_alv_01>-ekorg '采购组织必输' lv_message.
mac_add_message:<fs_alv_01>-esokz '采购信息记录分类必输' lv_message.
mac_add_message:<fs_alv_01>-aplfz '计划交货时间必输' lv_message.
mac_add_message:<fs_alv_01>-ekgrp '采购组必输' lv_message.
mac_add_message:<fs_alv_01>-webre '基于收货的发票验证必输' lv_message.
mac_add_message:<fs_alv_01>-mwskz '税码必输' lv_message.
mac_add_message:<fs_alv_01>-kbetr '净价必输' lv_message.
mac_add_message:<fs_alv_01>-datab '价格有效开始日期必输' lv_message.
mac_add_message:<fs_alv_01>-datbi '价格有效截止日期必输' lv_message.
IF lv_message IS NOT INITIAL.
<fs_alv_01>-message = lv_message.
<fs_alv_01>-icon = icon_red_light.
ENDIF.
ENDLOOP.
ELSE.
LOOP AT gt_alv_02 ASSIGNING FIELD-SYMBOL(<fs_alv_02>).
CLEAR:lv_message.
mac_add_message:<fs_alv_02>-lifnr '供应商必输' lv_message.
mac_add_message:<fs_alv_02>-ekorg '采购组织必输' lv_message.
mac_add_message:<fs_alv_02>-esokz '采购信息记录分类必输' lv_message.
mac_add_message:<fs_alv_02>-txz01 '采购信息记录的短文本必输' lv_message.
mac_add_message:<fs_alv_02>-matkl '物料组必输' lv_message.
mac_add_message:<fs_alv_02>-meins '采购单位必输' lv_message.
mac_add_message:<fs_alv_02>-sortl '排序字符必输' lv_message.
mac_add_message:<fs_alv_02>-aplfz '计划交货时间必输' lv_message.
mac_add_message:<fs_alv_02>-ekgrp '采购组必输' lv_message.
mac_add_message:<fs_alv_02>-webre '基于收货的发票验证必输' lv_message.
mac_add_message:<fs_alv_02>-mwskz '税码必输' lv_message.
mac_add_message:<fs_alv_02>-kbetr '净价必输' lv_message.
mac_add_message:<fs_alv_02>-datab '价格有效开始日期必输' lv_message.
mac_add_message:<fs_alv_02>-datbi '价格有效截止日期必输' lv_message.
IF lv_message IS NOT INITIAL.
<fs_alv_02>-message = lv_message.
<fs_alv_02>-icon = icon_red_light.
ENDIF.
ENDLOOP.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_init_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_init_data .
DATA:ls_functxt TYPE smp_dyntxt.
ls_functxt-icon_id = icon_export.
ls_functxt-quickinfo = '采购信息记录导入模板'.
ls_functxt-icon_text = '采购信息记录导入模板'.
sscrfields-functxt_01 = ls_functxt.
sscrfields-ucomm = 'FC01'.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_get_path
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_get_path .
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_file_open_dialog
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_file_open_dialog CHANGING cv_name TYPE rlgrap-filename.
DATA:lt_filetable TYPE filetable,
ls_filetable TYPE file_table,
lv_rc TYPE i.
CALL METHOD cl_gui_frontend_services=>file_open_dialog
* EXPORTING
* window_title =
* default_extension =
* default_filename =
* file_filter =
* with_encoding =
* initial_directory =
* multiselection =
CHANGING
file_table = lt_filetable
rc = lv_rc
* user_action =
* file_encoding =
EXCEPTIONS
file_open_dialog_failed = 1
cntl_error = 2
error_no_gui = 3
not_supported_by_gui = 4
OTHERS = 5.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
IF lv_rc = 1.
READ TABLE lt_filetable INTO ls_filetable INDEX 1.
cv_name = ls_filetable-filename.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_download_template
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_download_template .
DATA:lv_fullpath TYPE string,
ls_key TYPE wwwdatatab,
lv_des TYPE rlgrap-filename,
lv_filename TYPE string,
lv_path TYPE string,
lv_user_action TYPE i.
CALL METHOD cl_gui_frontend_services=>file_save_dialog
EXPORTING
* window_title =
default_extension = 'xls'
default_file_name = '信息记录批导模板'
* with_encoding =
* file_filter =
* initial_directory =
* prompt_on_overwrite = 'X'
CHANGING
filename = lv_filename
path = lv_path
fullpath = lv_fullpath
user_action = lv_user_action
* file_encoding =
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 lv_user_action = cl_gui_frontend_services=>action_ok.
CHECK lv_fullpath IS NOT INITIAL.
lv_des = lv_fullpath.
ls_key-relid = 'MI'.
ls_key-objid = 'ZRPMM_0005'.
CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
EXPORTING
key = ls_key
destination = lv_des
* IMPORTING
* RC =
* CHANGING
* TEMP =
.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_excel_to_abap
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_excel_to_abap .
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_record_by_materials
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_record_by_materials .
DATA:lv_datab(15) TYPE c,
lv_datbi(15) TYPE c.
DATA:lt_messtab TYPE TABLE OF bdcmsgcoll,
ls_msg TYPE bdcmsgcoll.
DATA:lv_tcode TYPE sy-tcode.
DATA:lt_old TYPE TABLE OF zsmm_0006,
ls_old TYPE zsmm_0006.
DATA:ls_data_me12 TYPE zsmm_0006.
DEFINE mac_set_konm.
ls_konm-kstbm = &1.
ls_konm-kbetr = &2.
APPEND ls_konm TO lt_konm.
CLEAR:ls_konm.
END-OF-DEFINITION.
IF gt_alv_01 IS NOT INITIAL.
CLEAR:lt_old.
SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_old FROM eine
INNER JOIN eina ON eina~infnr = eine~infnr
FOR ALL ENTRIES IN gt_alv_01
WHERE matnr EQ gt_alv_01-matnr
AND lifnr EQ gt_alv_01-lifnr
AND ekorg EQ gt_alv_01-ekorg.
ENDIF.
LOOP AT gt_alv_01 ASSIGNING FIELD-SYMBOL(<fs_data>).
* Date Format
CLEAR:lv_datab,lv_datbi,lv_tcode,ls_old,gv_flag.
WRITE <fs_data>-datab TO lv_datab.
WRITE <fs_data>-datbi TO lv_datbi.
IF <fs_data>-werks IS INITIAL.
READ TABLE lt_old INTO ls_old
WITH KEY lifnr = <fs_data>-lifnr matnr = <fs_data>-matnr ekorg = <fs_data>-ekorg.
IF sy-subrc EQ 0.
READ TABLE lt_old INTO ls_old
WITH KEY lifnr = <fs_data>-lifnr matnr = <fs_data>-matnr ekorg = <fs_data>-ekorg esokz = <fs_data>-esokz.
IF sy-subrc EQ 0.
lv_tcode = 'ME12'.
ELSE.
lv_tcode = 'ME11'.
gv_flag = abap_true."已有基础视图,无采购视图
ENDIF.
ELSE.
lv_tcode = 'ME11'.
ENDIF.
ELSE.
READ TABLE lt_old INTO ls_old
WITH KEY lifnr = <fs_data>-lifnr matnr = <fs_data>-matnr ekorg = <fs_data>-ekorg werks = <fs_data>-werks.
IF sy-subrc EQ 0.
lv_tcode = 'ME12'.
ELSE.
lv_tcode = 'ME11'.
ENDIF.
ENDIF.
CLEAR:lt_messtab,ls_msg.
IF lv_tcode EQ 'ME11'.
PERFORM frm_call_me11 TABLES lt_messtab USING lv_datab lv_datbi <fs_data>.
READ TABLE lt_messtab INTO ls_msg WITH KEY msgid = '06' msgtyp = 'S' msgnr = '331'.
ELSE.
CLEAR:ls_data_me12.
MOVE-CORRESPONDING <fs_data> TO ls_data_me12.
mac_set_record:<fs_data>-lifnr ls_old-lifnr ls_data_me12-lifnr.
mac_set_record:<fs_data>-matnr ls_old-matnr ls_data_me12-matnr.
mac_set_record:<fs_data>-ekorg ls_old-ekorg ls_data_me12-ekorg.
mac_set_record:<fs_data>-werks ls_old-werks ls_data_me12-werks.
mac_set_record:<fs_data>-esokz ls_old-esokz ls_data_me12-esokz.
mac_set_record:<fs_data>-idnlf ls_old-idnlf ls_data_me12-idnlf.
mac_set_record:<fs_data>-ltsnr ls_old-ltsnr ls_data_me12-ltsnr.
mac_set_record:<fs_data>-verkf ls_old-verkf ls_data_me12-verkf.
mac_set_record:<fs_data>-telf1 ls_old-telf1 ls_data_me12-telf1.
mac_set_record:<fs_data>-meins ls_old-meins ls_data_me12-meins.
mac_set_record:<fs_data>-aplfz ls_old-aplfz ls_data_me12-aplfz.
mac_set_record:<fs_data>-ekgrp ls_old-ekgrp ls_data_me12-ekgrp.
mac_set_record:<fs_data>-minbm ls_old-minbm ls_data_me12-minbm.
* mac_set_record:<fs_data>-evers ls_old-evers ls_data_me12-evers.
mac_set_record:<fs_data>-zshbx ls_old-zshbx ls_data_me12-zshbx.
mac_set_record:<fs_data>-rdprf ls_old-rdprf ls_data_me12-rdprf.
mac_set_record:<fs_data>-webre ls_old-webre ls_data_me12-webre.
mac_set_record:<fs_data>-mwskz ls_old-mwskz ls_data_me12-mwskz.
mac_set_record:<fs_data>-bstae ls_old-bstae ls_data_me12-bstae.
mac_set_record:<fs_data>-kbetr ls_old-kbetr ls_data_me12-kbetr.
mac_set_record:<fs_data>-kpein ls_old-kpein ls_data_me12-kpein.
mac_set_record:<fs_data>-waers ls_old-waers ls_data_me12-waers.
mac_set_record:<fs_data>-datab ls_old-datab ls_data_me12-datab.
mac_set_record:<fs_data>-datbi ls_old-datbi ls_data_me12-datbi.
mac_set_record:<fs_data>-text ls_old-text ls_data_me12-text.
PERFORM frm_call_me12 TABLES lt_messtab USING lv_datab lv_datbi ls_data_me12.
READ TABLE lt_messtab INTO ls_msg WITH KEY msgid = '06' msgtyp = 'S' msgnr = '335'.
ENDIF.
IF sy-subrc EQ 0.
<fs_data>-infnr = ls_msg-msgv1.
<fs_data>-icon = icon_green_light.
MESSAGE ID ls_msg-msgid TYPE ls_msg-msgtyp NUMBER ls_msg-msgnr
WITH ls_msg-msgv1 ls_msg-msgv2 ls_msg-msgv3 ls_msg-msgv4 INTO <fs_data>-message.
ELSE.
<fs_data>-icon = icon_red_light.
LOOP AT lt_messtab INTO ls_msg WHERE msgtyp NE 'W'.
MESSAGE ID ls_msg-msgid TYPE ls_msg-msgtyp NUMBER ls_msg-msgnr
WITH ls_msg-msgv1 ls_msg-msgv2 ls_msg-msgv3 ls_msg-msgv4 INTO DATA(lv_msgtxt).
<fs_data>-message = <fs_data>-message && lv_msgtxt.
CLEAR:ls_msg.
ENDLOOP.
ENDIF.
CONDENSE <fs_data>-message NO-GAPS.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_record_by_matkl
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_record_by_matkl .
DATA:lt_messtab TYPE TABLE OF bdcmsgcoll,
ls_msg TYPE bdcmsgcoll.
DATA:lv_datab(15) TYPE c,
lv_datbi(15) TYPE c.
DATA:lt_old TYPE TABLE OF zsmm_0007,
ls_old TYPE zsmm_0007.
DATA:ls_data_me12 TYPE zsmm_0007.
DEFINE mac_set_konm.
ls_konm-kstbm = &1.
ls_konm-kbetr = &2.
APPEND ls_konm TO lt_konm.
CLEAR:ls_konm.
END-OF-DEFINITION.
IF gt_alv_02 IS NOT INITIAL.
CLEAR:lt_old.
SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_old FROM eine
INNER JOIN eina ON eina~infnr = eine~infnr
FOR ALL ENTRIES IN gt_alv_02
WHERE eine~infnr = gt_alv_02-infnr.
ENDIF.
LOOP AT gt_alv_02 ASSIGNING FIELD-SYMBOL(<fs_alv_02>).
* Date Format
CLEAR:lv_datab,lv_datbi.
WRITE <fs_alv_02>-datab TO lv_datab.
WRITE <fs_alv_02>-datbi TO lv_datbi.
CLEAR:ls_msg,lt_messtab.
IF <fs_alv_02>-infnr IS INITIAL.
&nb


900

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



