*&---------------------------------------------------------------------*
*& Report ZUPLOAD_TEST
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT zupload_test.
*----------------------------------------------------------------------*
* 类型池声明
*----------------------------------------------------------------------*
TYPE-POOLS: slis,
ole2,
vrm,
icon.
*----------------------------------------------------------------------*
* 数据库表声明
*----------------------------------------------------------------------*
TABLES: sscrfields. " 选择屏幕上的字段
DATA: l_filetab TYPE filetable,
l_rc TYPE i.
DATA: gt_tab TYPE TABLE OF makt WITH HEADER LINE.
DATA: BEGIN OF i_excel OCCURS 0.
INCLUDE STRUCTURE alsmex_tabline.
DATA: END OF i_excel.
DATA: l_answer(1) TYPE c.
DATA: l_column TYPE i.
FIELD-SYMBOLS: <fs>.
DATA: l_pathname LIKE rlgrap-filename.
DATA: gv_ucomm TYPE sy-ucomm.
CONSTANTS:
c_begin_row TYPE i VALUE 1, "Beginning row of excel file
c_begin_col TYPE i VALUE 1, "Beginning column of excel file
c_end_row TYPE i VALUE 9999, "Ending row of excel file
c_end_col TYPE i VALUE 55. "Ending column of excel file
DATA: gt_fieldcat TYPE STANDARD TABLE OF lvc_s_fcat. " 字段目录的内表
DATA: ls_fieldcat TYPE lvc_s_fcat. " 字段目录的工作区
DATA: gs_layout TYPE lvc_s_layo. " ALV布局
DATA: c_path TYPE char128 .
*----------------------------------------------------------------------*
* 宏定义
*----------------------------------------------------------------------*
DEFINE fillfiedcat.
ls_fieldcat-fieldname = &1. " ALV 控制: 内部表字段的字段名称
ls_fieldcat-scrtext_l = &2. " 长字段标签
ls_fieldcat-no_zero = &3. " 无前导零
ls_fieldcat-outputlen = &4. " 输出长度
append ls_fieldcat to gt_fieldcat.
clear ls_fieldcat.
END-OF-DEFINITION.
*&---------------------------------------------------------------------*
*& Selection Screen/选择屏幕
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK bl01 WITH FRAME TITLE text-000.
PARAMETERS: p_fname LIKE rlgrap-filename MEMORY ID m01. " 获取文件路径
SELECTION-SCREEN END OF BLOCK bl01.
SELECTION-SCREEN: FUNCTION KEY 1.
*&---------------------------------------------------------------------*
*& INITIALIZATION/选择屏幕前初始化
*&---------------------------------------------------------------------*
INITIALIZATION.
"初始化屏幕
PERFORM frm_init_sel_screen.
AT SELECTION-SCREEN.
"响应选择屏幕的按钮功能
PERFORM frm_excue_button.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_fname.
PERFORM get_p_fname USING p_fname. "把需要导入的文件的路径存放在P_name 中
START-OF-SELECTION.
* 上载数据
PERFORM frm_uploaddata.
END-OF-SELECTION.
*&---展示ALV
PERFORM frm_display_alv.
*&---------------------------------------------------------------------*
*& Form frm_init_sel_screen
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_init_sel_screen .
DATA: lv_functxt TYPE smp_dyntxt.
lv_functxt-icon_id = icon_xxl.
lv_functxt-icon_text = '导入模板下载'.
sscrfields-functxt_01 = lv_functxt.
ENDFORM. " frm_init_sel_screen
*&---------------------------------------------------------------------*
*& Form frm_excue_button
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_excue_button .
CLEAR: gv_ucomm.
CASE sscrfields-ucomm.
WHEN 'FC01'.
PERFORM frm_download_template.
WHEN OTHERS.
ENDCASE.
ENDFORM. " frm_excue_button
*&---------------------------------------------------------------------*
*& Form frm_download_template
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_download_template .
DATA: ls_wwwdatatab LIKE wwwdatatab,
lt_mime LIKE w3mime OCCURS 10,
lv_filename TYPE string,
lv_path TYPE string,
lv_fullpath TYPE string,
window_title TYPE string,
default_file_name TYPE string.
DATA: lv_destination TYPE rlgrap-filename,
lv_subrc TYPE sy-subrc.
CLEAR: ls_wwwdatatab,lt_mime[],lv_filename,lv_path,lv_fullpath,window_title,default_file_name.
ls_wwwdatatab-relid = 'MI'. "IMPORT/EXPORT 数据表中的区域
ls_wwwdatatab-objid = ''. "这里写入刚刚让记住的模板对象名
ls_wwwdatatab-text = ''. "WWWDATA 对象的短文本
window_title = '下载导入模板'.
default_file_name = 'SAP批量导入模板'.
CALL FUNCTION 'WWWDATA_IMPORT' "#EC *
EXPORTING
key = ls_wwwdatatab
TABLES
mime = lt_mime
EXCEPTIONS
wrong_object_type = 1
import_error = 2
OTHERS = 3.
CALL METHOD cl_gui_frontend_services=>file_save_dialog
EXPORTING
window_title = window_title
default_extension = 'xlsx'
default_file_name = default_file_name
* file_filter = 'EXCEL'
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 sy-subrc <> 0.
STOP.
ENDIF.
IF lv_fullpath IS NOT INITIAL.
lv_destination = lv_fullpath.
CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
EXPORTING
key = ls_wwwdatatab
destination = lv_destination
IMPORTING
rc = lv_subrc.
IF lv_subrc <> 0.
MESSAGE '下载失败' TYPE 'S' DISPLAY LIKE 'E'.
ENDIF.
ENDIF.
ENDFORM. " frm_download_template
*&---------------------------------------------------------------------*
*& Form get_p_fname
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_P_FNAME text
*----------------------------------------------------------------------*
FORM get_p_fname USING p_p_fname.
CLEAR l_filetab.
REFRESH l_filetab.
* Open dialog
CALL METHOD cl_gui_frontend_services=>file_open_dialog
EXPORTING
* WINDOW_TITLE = 'SAP Custom - Open File'
* DEFAULT_EXTENSION =
default_filename = '*.xls'
* FILE_FILTER = '*.xls'
initial_directory = 'd:\'
multiselection = ''
CHANGING
file_table = l_filetab
rc = l_rc
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
not_supported_by_gui = 3
OTHERS = 4.
* Get file path
CHECK l_rc EQ 1.
READ TABLE l_filetab INDEX 1 INTO p_fname.
ENDFORM. " get_p_fname
*&---------------------------------------------------------------------*
*& Form frm_uploaddata
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_uploaddata .
DATA :v1(20) TYPE c,
v2(20) TYPE n,
v3 LIKE vbap-netwr.
CLEAR i_excel[].
MOVE p_fname TO l_pathname.
CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
EXPORTING
filename = l_pathname
i_begin_col = c_begin_col
i_begin_row = c_begin_row
i_end_col = c_end_col
i_end_row = c_end_row
TABLES
intern = i_excel
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 i_excel[] IS INITIAL.
CALL FUNCTION 'POPUP_TO_CONFIRM_WITH_MESSAGE'
EXPORTING
* DEFAULTOPTION = 'Y'
diagnosetext1 = 'No data in excel'
* DIAGNOSETEXT2 = ' '
* DIAGNOSETEXT3 = ' '
textline1 = 'No data in excel'
* TEXTLINE2 = ' '
titel = 'Confirm'
* START_COLUMN = 25
* START_ROW = 6
* CANCEL_DISPLAY = 'X'
IMPORTING
answer = l_answer.
ELSE.
DELETE i_excel WHERE row = '0001'.
SORT i_excel BY row col.
LOOP AT i_excel.
MOVE i_excel-col TO l_column.
ASSIGN COMPONENT l_column OF STRUCTURE gt_tab TO <fs>.
MOVE i_excel-value TO <fs>.
AT END OF row.
APPEND gt_tab.
CLEAR gt_tab.
ENDAT.
ENDLOOP.
ENDIF.
ENDIF.
ENDFORM. " frm_uploaddata
*&---------------------------------------------------------------------*
*& Form frm_display_alv
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_display_alv .
gs_layout-zebra = 'X'. " 表格斑马线
gs_layout-cwidth_opt = 'X'.
*&---设置ALV的字段目录
PERFORM frm_set_fieldcat.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-repid
is_layout_lvc = gs_layout
it_fieldcat_lvc = gt_fieldcat
i_save = 'A'
i_callback_pf_status_set = 'PF_STATUS_SET'
i_callback_user_command = 'USER_COMMAND'
TABLES
t_outtab = gt_tab
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. " frm_display_alv
*&---------------------------------------------------------------------*
*& Form frm_set_fieldcat
*&---------------------------------------------------------------------*
* 设置ALV的字段目录
*----------------------------------------------------------------------*
FORM frm_set_fieldcat.
fillfiedcat 'MANDT' text-001 '' 25 .
fillfiedcat 'MATNR' text-002 '' 25 .
fillfiedcat 'SPRAS' text-003 '' 25 .
fillfiedcat 'MAKTX' text-004 '' 25 .
fillfiedcat 'MAKTG' text-005 '' 25 .
ENDFORM. "frm_set_fieldcat
*&---------------------------------------------------------------------*
*& Form pf_status_set
*&---------------------------------------------------------------------*
* ALV工具栏状态
*----------------------------------------------------------------------*
* -->RT_EXTAB text
*----------------------------------------------------------------------*
FORM pf_status_set USING rt_extab TYPE slis_t_extab.
SET PF-STATUS '1000' .
ENDFORM. "pf_status_set
*&---------------------------------------------------------------------*
*& Form user_command
*&---------------------------------------------------------------------*
* ALV工具栏命令
*----------------------------------------------------------------------*
* -->R_UCOMM text
* -->RS_SELFIELD text
*----------------------------------------------------------------------*
FORM user_command USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield.
rs_selfield-col_stable = 'X'.
rs_selfield-row_stable = 'X'.
rs_selfield-refresh = 'X'.
CASE r_ucomm.
WHEN 'CHECK'.
WHEN 'POST'.
WHEN 'BACK'.
LEAVE TO SCREEN 0.
WHEN 'EXIT' OR 'CANCEL'.
LEAVE PROGRAM.
ENDCASE.
ENDFORM. "user_command