该批导特点:
- 发布到fiori后,仍能正常导入excel内容
- 启动批导后,能提示用户预估运行时间及运行进度
代码如下:
*&---------------------------------------------------------------------*
*& Report ZDEMO_SEELE
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zdemo_seele.
*&---------------------------------------------------------------------*
* 池
*&---------------------------------------------------------------------*
TYPE-POOLS:slis.
*&---------------------------------------------------------------------*
* 表
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
* 申明数据类型
*&---------------------------------------------------------------------*
TYPES:
* AVL显示
BEGIN OF ty_alv,
box TYPE char1, " 选择
status TYPE char20, " 状态
posid1 TYPE ps_posid, " 项目编号
posid2 TYPE ps_posid, " 上层WBS
posid3 TYPE ps_posid, " WBS元素
post1 TYPE prps-post1, " WBS描述
werks TYPE prps-werks, " 公司/工厂
kostl TYPE prps-kostl, " 成本中心
prctr TYPE prps-prctr, " 利润中心
vernr TYPE prps-vernr, " 负责人
func_area TYPE prps-func_area, " 功能范围
message TYPE char100, " 消息
END OF ty_alv,
* 数据模版
BEGIN OF ty_data,
posid1 TYPE char30, " 项目编号
posid2 TYPE char30, " 上层WBS
posid3 TYPE char30, " WBS元素
post1 TYPE char30, " WBS描述
werks TYPE char30, " 公司/工厂
kostl TYPE char30, " 成本中心
prctr TYPE char10, " 利润中心
vernr TYPE char10, " 负责人
func_area TYPE char20, " 功能范围
END OF ty_data.
*&---------------------------------------------------------------------*
* 定义全局内表
*&---------------------------------------------------------------------*
DATA:
gt_alv TYPE STANDARD TABLE OF ty_alv, " ALV显示数据
gt_upload TYPE STANDARD TABLE OF ty_data, " 上传数据
gt_download TYPE STANDARD TABLE OF ty_data, " 下载模版
gt_excel TYPE STANDARD TABLE OF ty_data.
*&---------------------------------------------------------------------*
* 定义全局工作区
*&---------------------------------------------------------------------*
DATA:
gs_alv TYPE ty_alv, " ALV显示数据
gs_download TYPE ty_data, " 下载模版
gs_excel TYPE ty_data,
gv_tabix TYPE char1, " 序号
gv_line TYPE i, " 行号
gv_start TYPE timestamp. " 开始时间
*----------------------------------------------------------------------*
* 定义全局FS
*----------------------------------------------------------------------*
FIELD-SYMBOLS : <gt_data> TYPE STANDARD TABLE .
*----------------------------------------------------------------------*
* 定义全局变量
*----------------------------------------------------------------------*
* 参数设置变量
DATA:
gv_mod TYPE wwwdata-objid . " 下载文件名SMW0
*----------------------------------------------------------------------*
* 定义alv数据
*----------------------------------------------------------------------*
DATA:
gs_layout_alv TYPE slis_layout_alv,
gt_fieldcat_alv TYPE slis_t_fieldcat_alv,
gs_fieldcat_alv TYPE slis_fieldcat_alv,
gs_layout_log TYPE slis_layout_alv,
gt_fieldcat_log TYPE slis_t_fieldcat_alv,
gs_fieldcat_log TYPE slis_fieldcat_alv,
gv_ref_grid TYPE REF TO cl_gui_alv_grid.
*&---------------------------------------------------------------------*
* 选择屏幕
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE TEXT-001.
PARAMETERS:p1 RADIOBUTTON GROUP rb_1 DEFAULT 'X' USER-COMMAND create, "EXCEL导入
p2 RADIOBUTTON GROUP rb_1. "EXCEL下载
PARAMETERS:p_file TYPE rlgrap-filename MODIF ID m1."文件名
SELECTION-SCREEN END OF BLOCK blk1 .
*&---------------------------------------------------------------------*
* Initialization
*&---------------------------------------------------------------------*
INITIALIZATION.
" 初始化下载模版路径参数
PERFORM frm_init_download.
*&---------------------------------------------------------------------*
* At selection screen output
*&---------------------------------------------------------------------*
AT SELECTION-SCREEN OUTPUT.
" 初始化选择屏幕
PERFORM frm_init_screen.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
" 获取文件路径
PERFORM frm_get_path CHANGING p_file.
*&---------------------------------------------------------------------*
* At selection screen
*&---------------------------------------------------------------------*
AT SELECTION-SCREEN.
*&---------------------------------------------------------------------*
* Start of selection
*&---------------------------------------------------------------------*
START-OF-SELECTION.
IF p1 = 'X' .
*&---EXCEL导入数据文件名为空检查
IF p_file IS INITIAL.
MESSAGE TEXT-002 TYPE 'S' DISPLAY LIKE 'E'.
LEAVE LIST-PROCESSING.
ENDIF.
*&---上载EXCLE数据
PERFORM frm_upload.
*&---内表ALV导入数据整理
PERFORM frm_set_data.
*&---ALV 展示(file data VS itab data check)
PERFORM frm_alv_dis.
*&---EXCEL模板下载
ELSEIF p2 = 'X' .
PERFORM frm_download.
ENDIF.
*&---------------------------------------------------------------------*
* End of selection
*&---------------------------------------------------------------------*
END-OF-SELECTION.
*&---------------------------------------------------------------------*
*& FORM frm_init_download
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_init_download .
gv_mod = 'ZFIC_WBS_IMPORT'. " 下载文件名SMW0(该程序名称
ENDFORM. " FRM_INIT_DOWNLOAD
*&---------------------------------------------------------------------*
*& FORM frm_init_screen
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_init_screen .
*&---控制选择条件显示设置M1/M2
LOOP AT SCREEN.
IF screen-group1 = 'M1'.
*&---下载/日志隐藏
IF p2 = 'X'.
screen-active = 0.
ENDIF.
MODIFY SCREEN.
ENDIF.
ENDLOOP.
ENDFORM. " FRM_INIT_SCREEN
*&---------------------------------------------------------------------*
*& FORM frm_get_path
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* <--p_flname text
*----------------------------------------------------------------------*
FORM frm_get_path CHANGING pv_filename TYPE rlgrap-filename.
DATA: lt_file_table TYPE filetable,
ls_file_table TYPE file_table,
lv_rc TYPE i.
" 获取文件路径
CALL METHOD cl_gui_frontend_services=>file_open_dialog
EXPORTING
window_title = 'File Path'
initial_directory = 'E:\'
CHANGING
file_table = lt_file_table
rc = lv_rc
EXCEPTIONS
file_open_dialog_failed = 1
cntl_error = 2
error_no_gui = 3
not_supported_by_gui = 4
OTHERS = 5.
IF sy-subrc = 0.
READ TABLE lt_file_table INTO ls_file_table INDEX 1.
IF sy-subrc = 0.
pv_filename = ls_file_table-filename. " 文件路径
ENDIF.
ELSE.
* Implement suitable error handling here
ENDIF.
ENDFORM. " FRM_GET_PATH
*&---------------------------------------------------------------------*
*& FORM frm_upload
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_upload .
*&---文件数据处理
DATA:t_raw_data TYPE truxs_t_text_data.
DATA : lt_return TYPE bapiret2_t.
PERFORM frm_upload_data_v1 TABLES gt_upload.
IF sy-subrc <> 0.
* MESSAGE '读取数据失败!' TYPE 'I' DISPLAY LIKE 'E'.
MESSAGE TEXT-013 TYPE 'S' DISPLAY LIKE 'E'.
LEAVE LIST-PROCESSING.
ENDIF.
ENDFORM. " FRM_UPLOAD
*&---------------------------------------------------------------------*
*& FORM frm_set_data
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_set_data .
MOVE-CORRESPONDING gt_upload TO gt_alv.
gs_alv-status = icon_yellow_light. " 黄灯
MODIFY gt_alv FROM gs_alv
TRANSPORTING status
WHERE posid1 IS NOT INITIAL.
ENDFORM. " FRM_SET_DATA
*&---------------------------------------------------------------------*
*& FORM frm_alv_dis
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_alv_dis .
" 设置输出格式
PERFORM frm_init_layout.
" 设置输出字段
PERFORM frm_fill_fieldcat.
" 输出ALV
PERFORM frm_output_alv.
ENDFORM. " FRM_ALV_DIS
*&---------------------------------------------------------------------*
*& FORM frm_init_layout
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_init_layout .
CLEAR gs_layout_alv.
gs_layout_alv-colwidth_optimize = 'X'. " 优化列宽
gs_layout_alv-zebra = 'X'. " 行信息按颜色交叉显示
gs_layout_alv-f2code = '&ETA'. " 双击显示详细信息
gs_layout_alv-box_fieldname = 'BOX'.
* gs_layout_alv-INFO_FIELDNAME = 'COLOR'. " 行颜色字段
ENDFORM. " FRM_INIT_LAYOUT
*&---------------------------------------------------------------------*
*& FORM frm_fill_fieldcat
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_fill_fieldcat .
CLEAR gt_fieldcat_alv.
PERFORM frm_set_fieldcat USING '' 'STATUS' '' '' '状态' ''.
PERFORM frm_set_fieldcat USING '' 'POSID1' '' '' '项目编号' ''.
PERFORM frm_set_fieldcat USING '' 'POSID2' '' '' '上层WBS' ''.
PERFORM frm_set_fieldcat USING '' 'POSID3' '' '' 'WBS元素' ''.
PERFORM frm_set_fieldcat USING '' 'POST1' 'PRPS' 'POST1' 'WBS描述' ''.
PERFORM frm_set_fieldcat USING '' 'WERKS' 'PRPS' 'WERKS' '工厂' ''.
PERFORM frm_set_fieldcat USING '' 'KOSTL' 'PRPS' 'KOSTL' '成本中心' ''.
PERFORM frm_set_fieldcat USING '' 'PRCTR' 'PRPS' 'PRCTR' '利润中心' ''.
PERFORM frm_set_fieldcat USING '' 'VERNR' 'PRPS' 'VERNR' '成本中心' ''.
PERFORM frm_set_fieldcat USING '' 'FUNC_AREA' 'PRPS' 'FUNC_AREA' '功能范围' ''.
PERFORM frm_set_fieldcat USING '' 'MESSAGE' '' '' '消息' ''.
ENDFORM. " FRM_FILL_FIELDCAT
*&---------------------------------------------------------------------*
*& FORM frm_set_fieldcat
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->p_0823 text
* -->p_0824 text
* -->p_0825 text
* -->p_0826 text
*----------------------------------------------------------------------*
FORM frm_set_fieldcat USING pv_key TYPE char1
pv_fieldname TYPE slis_fieldname
pv_table TYPE dd03p-tabname
pv_field TYPE dd03p-fieldname
pv_fieldtext TYPE dd03p-scrtext_l
pv_zero TYPE char1.
CLEAR gs_fieldcat_alv.
gs_fieldcat_alv-key = pv_key.
gs_fieldcat_alv-fieldname = pv_fieldname.
gs_fieldcat_alv-ref_tabname = pv_table.
gs_fieldcat_alv-ref_fieldname = pv_field.
gs_fieldcat_alv-seltext_s = pv_fieldtext.
gs_fieldcat_alv-seltext_l = pv_fieldtext.
gs_fieldcat_alv-seltext_m = pv_fieldtext.
gs_fieldcat_alv-no_zero = pv_zero.
IF pv_fieldname = 'STATUS'.
gs_fieldcat_alv-icon = 'X'.
ENDIF.
APPEND gs_fieldcat_alv TO gt_fieldcat_alv.
ENDFORM. " FRM_SET_FIELDCAT
*&---------------------------------------------------------------------*
*& FORM frm_output_alv
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_output_alv .
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = sy-repid
i_callback_pf_status_set = 'FRM_SET_PF_STATUS'
i_callback_user_command = 'FRM_USER_COMMAND'
is_layout = gs_layout_alv
it_fieldcat = gt_fieldcat_alv
i_save = 'X'
TABLES
t_outtab = gt_alv
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
ENDFORM. " FRM_OUTPUT_ALV
*&---------------------------------------------------------------------*
*& FORM frm_download
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_download .
*&---变量定义
DATA:lv_text TYPE string, " message
lv_filename TYPE string, " download file name
lv_path TYPE string, " download file path
lv_functxt TYPE smp_dyntxt, " menu name
lv_filepath TYPE rlgrap-filename VALUE 'c', " file patch
lv_title TYPE string , " title
lv_title_name TYPE string, " title name
lv_mod(20), " model
lv_fullpath TYPE string, " full path
lv_object TYPE wwwdatatab, " object name
lv_rc TYPE sy-subrc. " return code
*&---SMWO 模板名称
lv_mod = gv_mod. "下载文件名
*&---调用OS 操作系统对话框
lv_title = TEXT-006.
lv_title_name = TEXT-007.
CALL METHOD cl_gui_frontend_services=>file_save_dialog
EXPORTING
window_title = lv_title " 保存'
default_file_name = lv_title_name " 客户合作伙伴导入模板
CHANGING
filename = lv_filename
path = lv_path
fullpath = lv_fullpath.
*&---操作系统文件路径
CONCATENATE lv_path
lv_filename
'.xlsx'
INTO lv_filepath.
*&---OS长度控制/*&---下载模板
IF strlen( lv_filepath ) <> 4.
*&---查询模板.
SELECT SINGLE relid
objid
FROM wwwdata
INTO CORRESPONDING FIELDS OF lv_object
WHERE srtf2 = '0'
AND objid = lv_mod. "smw0里对象名称
IF sy-subrc <> 0 OR lv_object-objid = space .
CONCATENATE TEXT-008"'模板文件:'
lv_mod
TEXT-009"'不存在,请用smw0进行加载.'
INTO lv_text.
MESSAGE lv_text TYPE 'E'.
STOP.
ENDIF.
*&---下载模板
CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
EXPORTING
key = lv_object
destination = lv_filepath
IMPORTING
rc = lv_rc.
IF lv_rc <> 0.
CONCATENATE TEXT-008"''模板文件:'
lv_mod
TEXT-010"''下载失败,请与开发人员联系.'
INTO lv_text.
MESSAGE lv_text TYPE 'E'.
STOP.
ENDIF.
*&---'已下载'
MESSAGE TEXT-011 TYPE 'S'.
ELSE.
*&---'已取消下载'
MESSAGE TEXT-012 TYPE 'S'.
ENDIF.
ENDFORM. " FRM_DOWNLOAD
*&---------------------------------------------------------------------*
*& FORM frm_set_pf_status
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->i_t_extab text
*----------------------------------------------------------------------*
FORM frm_set_pf_status USING i_t_extab TYPE slis_t_extab.
SET PF-STATUS 'ZPF_STATUS1000'.
ENDFORM. "FRM_SET_PF_STATUS
*&---------------------------------------------------------------------*
*& FORM frm_user_command
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->r_ucomm text
* -->rs_selfield text
*----------------------------------------------------------------------*
FORM frm_user_command USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield.
PERFORM frm_alv_changed.
CASE r_ucomm.
" 创建WBS元素
WHEN 'IPT'.
PERFORM frm_ct_wbs.
ENDCASE.
rs_selfield-refresh = 'X'.
ENDFORM. "FRM_USER_COMMAND
*&---------------------------------------------------------------------*
*& FORM frm_ct_wbs
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_ct_wbs .
DATA:
lt_data LIKE gt_alv,
ls_data LIKE gs_alv,
lv_project TYPE bapi_bus2001_new-project_definition,
lt_wbs_element TYPE STANDARD TABLE OF bapi_bus2054_new WITH HEADER LINE,
et_return TYPE STANDARD TABLE OF bapiret2 WITH HEADER LINE,
et_wbs_element TYPE STANDARD TABLE OF bapi_bus2054_detail WITH HEADER LINE.
lt_data = gt_alv.
DELETE lt_data WHERE box <> 'X' OR message IS NOT INITIAL.
SORT lt_data BY posid1.
DELETE ADJACENT DUPLICATES FROM lt_data
COMPARING posid1.
IF lt_data IS INITIAL.
MESSAGE '请至少选择一条有效数据!' TYPE 'S' DISPLAY LIKE 'E'.
EXIT.
ENDIF.
CLEAR:gv_tabix,gv_line.
* &---Initialization
" 获取计时器条码数和初始时间
DESCRIBE TABLE lt_data LINES gv_line.
GET TIME STAMP FIELD gv_start.
LOOP AT lt_data INTO ls_data.
CLEAR:lv_project,et_wbs_element[],et_return[],et_wbs_element,et_return.
" 项目号
lv_project = ls_data-posid1.
" 获取项目WBS信息
CALL FUNCTION 'BAPI_BUS2054_GETDATA'
EXPORTING
i_project_definition = lv_project
TABLES
et_wbs_element = et_wbs_element[]
et_return = et_return[].
" 处理导入的WBS元素数据
CLEAR:lt_wbs_element,lt_wbs_element[].
LOOP AT gt_alv INTO gs_alv
WHERE posid1 = ls_data-posid1
AND box = 'X'.
CLEAR lt_wbs_element.
" 获取上层WBS元素信息
READ TABLE et_wbs_element
WITH KEY wbs_element = gs_alv-posid2.
IF sy-subrc = 0.
MOVE-CORRESPONDING et_wbs_element TO lt_wbs_element.
lt_wbs_element-wbs_element = gs_alv-posid3. " WBS元素
lt_wbs_element-description = gs_alv-post1. " WBS描述
lt_wbs_element-request_cctr = gs_alv-kostl. " 成本中心
lt_wbs_element-wbs_up = gs_alv-posid2. " 上层WBS元素
lt_wbs_element-plant = gs_alv-werks. " 工厂
* lt_wbs_element-company_code = gs_alv-werks. " 公司
lt_wbs_element-wbs_cctr_posted_actual = gs_alv-kostl. "成本中心
lt_wbs_element-profit_ctr = gs_alv-prctr. "利润中心
lt_wbs_element-responsible_no = gs_alv-vernr. "负责人
lt_wbs_element-func_area = gs_alv-func_area. "功能范围
CLEAR lt_wbs_element-wbs_left. " 清空左WBS元素
APPEND lt_wbs_element.
ELSE.
" 如果查询不到上层WBS元素信息,则将WBS挂载到顶层项目下
lt_wbs_element-wbs_element = gs_alv-posid3. " WBS元素
lt_wbs_element-description = gs_alv-post1. " WBS描述
lt_wbs_element-request_cctr = gs_alv-kostl. " 成本中心
lt_wbs_element-plant = gs_alv-werks. " 工厂
* lt_wbs_element-company_code = gs_alv-werks. " 公司
lt_wbs_element-wbs_cctr_posted_actual = gs_alv-kostl. "成本中心
lt_wbs_element-profit_ctr = gs_alv-prctr. "利润中心
lt_wbs_element-responsible_no = gs_alv-vernr. "负责人
lt_wbs_element-func_area = gs_alv-func_area. "功能范围
APPEND lt_wbs_element.
ENDIF.
ENDLOOP.
" 初始化
CHECK lt_wbs_element[] IS NOT INITIAL.
REFRESH et_return[].
CALL FUNCTION 'BAPI_PS_INITIALIZATION'.
" 创建WBS
CALL FUNCTION 'BAPI_BUS2054_CREATE_MULTI'
EXPORTING
i_project_definition = lv_project
TABLES
it_wbs_element = lt_wbs_element[]
et_return = et_return.
READ TABLE et_return WITH KEY type = 'E'.
IF sy-subrc <> 0.
CLEAR:et_return[],et_return.
" 提交
CALL FUNCTION 'BAPI_PS_PRECOMMIT'
TABLES
et_return = et_return.
READ TABLE et_return WITH KEY type = 'E'.
IF sy-subrc <> 0.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
" 更新日志信息
gs_alv-message = 'WBS创建成功'.
gs_alv-status = icon_green_light.
MODIFY gt_alv FROM gs_alv
TRANSPORTING status message
WHERE box = 'X' AND posid1 = ls_data-posid1.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
" 更新日志信息
gs_alv-message = 'WBS创建失败,'.
gs_alv-status = icon_red_light.
" 错误日志
LOOP AT et_return.
gs_alv-message = gs_alv-message && et_return-message && ';'.
ENDLOOP.
MODIFY gt_alv FROM gs_alv
TRANSPORTING status message
WHERE box = 'X' AND posid1 = ls_data-posid1.
ENDIF.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
" 更新日志信息
gs_alv-message = 'WBS创建失败,'.
gs_alv-status = icon_red_light.
" 错误日志
LOOP AT et_return.
gs_alv-message = gs_alv-message && et_return-message && ';'.
ENDLOOP.
MODIFY gt_alv FROM gs_alv
TRANSPORTING status message
WHERE box = 'X' AND posid1 = ls_data-posid1.
ENDIF.
" 指示器计时
gv_tabix = gv_tabix + 1.
WAIT UP TO 5 SECONDS.
PERFORM frm_indicator USING gv_tabix.
ENDLOOP.
ENDFORM. " FRM_CT_WBS
*&---------------------------------------------------------------------*
*& FORM frm_alv_changed
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_alv_changed .
*--------------------------------------------------------------------*
* 将前台数据更新至内表中
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = gv_ref_grid.
CALL METHOD gv_ref_grid->check_changed_data.
ENDFORM. " FRM_ALV_CHANGED
*&---------------------------------------------------------------------*
*& FORM frm_indicator
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_indicator USING pv_index TYPE char1.
*&---data declaration/进度条变量
DATA: lv_linec TYPE c LENGTH 20, "total records to be processed of string
lv_index TYPE i, "current records being processed
lv_percentage TYPE f, "percentage of processed records
lv_text TYPE c LENGTH 80. "info displayed at progress indicator
*&---process logic
lv_index = pv_index.
*&---show progress indicator/显示进度条
*&---当前占比%
lv_percentage = lv_index / gv_line * 100.
*&---剩余条目数
* lv_remaining = gv_line - lv_index.
*&---数字文本强制转换
WRITE gv_line TO lv_linec LEFT-JUSTIFIED.
WRITE lv_index TO lv_text LEFT-JUSTIFIED.
*&---进度条(记录)
CONCATENATE TEXT-003 "'Processing remaining'(005)
lv_text
'/'
lv_linec
TEXT-004"'items'(007)
INTO lv_text SEPARATED BY space.
*&---时间记录
PERFORM estimate_remaining_time USING gv_start
lv_index
gv_line
CHANGING lv_text.
*&---SAP GUI 进度条
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
percentage = lv_percentage
text = lv_text.
ENDFORM.
*&---------------------------------------------------------------------*
*& FORM estimate_remaining_time
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_gv_start text
* -->p_lv_index text
* -->P_gv_line text
* <--p_lv_text text
*----------------------------------------------------------------------*
FORM estimate_remaining_time USING pv_start TYPE p "timestamp of start processing
pv_index TYPE i "current record being processed
pv_total TYPE i "total number of records to be processed
CHANGING pv_text TYPE c."text to display remaining time
*&---Data declaration/进度条时间变量
DATA:lv_current TYPE timestamp, "当前时间戳
lv_duration TYPE tzntstmpl, "持续时间
lv_remaining TYPE c LENGTH 15, "剩余时间
lv_hours TYPE c LENGTH 4, "换算小时数
lv_minutes TYPE n LENGTH 2, "换算分钟数
lv_seconds TYPE n LENGTH 2. "换算秒数
*&---Get current time stamp/获取当前时间戳
GET TIME STAMP FIELD lv_current.
*&---calculate execution time (so far)/计算持续时间
TRY.
CALL METHOD cl_abap_tstmp=>subtract
EXPORTING
tstmp1 = lv_current
tstmp2 = pv_start
RECEIVING
r_secs = lv_duration.
CATCH cx_parameter_invalid_range . "#EC NO_HANDLER
CATCH cx_parameter_invalid_type . "#EC NO_HANDLER
ENDTRY.
*&---estimate remaining execution time/剩余执行时间
lv_remaining = lv_duration * ( pv_total - pv_index ) / pv_index.
*&---整小时数
lv_hours = lv_remaining DIV 3600.
*&---剩余分钟数
lv_remaining = lv_remaining MOD 3600.
*&---整分钟数
lv_minutes = lv_remaining DIV 60.
*&---剩余秒数
lv_seconds = lv_remaining MOD 60.
*&---append to the text/文本
CONCATENATE pv_text
' ('
TEXT-005" 'estimated remaining time:'(006)
lv_hours
':'
lv_minutes
':'
lv_seconds
')'
INTO pv_text.
ENDFORM. " ESTIMATE_REMAINING_TIME
FORM frm_upload_data_v1 TABLES et_tab STRUCTURE gs_download.
DATA : lv_filename TYPE string,
lt_records TYPE solix_tab,
lv_headerxstring TYPE xstring,
lv_filelength TYPE i.
lv_filename = p_file.
CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
filename = lv_filename
filetype = 'BIN'
IMPORTING
filelength = lv_filelength
header = lv_headerxstring
TABLES
data_tab = lt_records
EXCEPTIONS
file_open_error = 1
file_read_error = 2
no_batch = 3
gui_refuse_filetransfer = 4
invalid_type = 5
no_authority = 6
unknown_error = 7
bad_data_format = 8
header_not_allowed = 9
separator_not_allowed = 10
header_too_long = 11
unknown_dp_error = 12
access_denied = 13
dp_out_of_memory = 14
disk_full = 15
dp_timeout = 16
OTHERS = 17.
IF sy-subrc = 0.
"CONVERT BINARY DATA TO XSTRING
"IF YOU ARE USING CL_FDT_XL_SPREADSHEET IN ODATA THEN SKIPS THIS STEP
"AS EXCEL FILE WILL ALREADY BE IN XSTRING
CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
EXPORTING
input_length = lv_filelength
IMPORTING
buffer = lv_headerxstring
TABLES
binary_tab = lt_records
EXCEPTIONS
failed = 1
OTHERS = 2.
IF sy-subrc <> 0.
"IMPLEMENT SUITABLE ERROR HANDLING HERE
ENDIF.
DATA : lo_excel_ref TYPE REF TO cl_fdt_xl_spreadsheet .
TRY .
lo_excel_ref = NEW cl_fdt_xl_spreadsheet(
document_name = lv_filename
xdocument = lv_headerxstring ) .
CATCH cx_fdt_excel_core.
"IMPLEMENT SUITABLE ERROR HANDLING HERE
ENDTRY .
"GET LIST OF WORKSHEETS
lo_excel_ref->if_fdt_doc_spreadsheet~get_worksheet_names(
IMPORTING
worksheet_names = DATA(lt_worksheets) ).
IF NOT lt_worksheets IS INITIAL.
READ TABLE lt_worksheets INTO DATA(lv_woksheetname) INDEX 1.
DATA(lo_data_ref) = lo_excel_ref->if_fdt_doc_spreadsheet~get_itab_from_worksheet(
lv_woksheetname ).
"NOW YOU HAVE EXCEL WORK SHEET DATA IN DYANMIC INTERNAL TABLE
ASSIGN lo_data_ref->* TO <gt_data>.
ENDIF.
*文件转换
PERFORM process_file TABLES et_tab .
ELSE.
* MESSAGE e027(zfi02) WITH 'PLEASE CLOSE EXCEL BEFORE UPLOAD'.
MESSAGE '未从excel读取到数据!' TYPE 'S' DISPLAY LIKE 'E'."查询不到数据!
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
FORM process_file TABLES et_tab STRUCTURE gs_download.
DATA : lv_numberofcolumns TYPE i,
lv_date_string TYPE string,
lv_target_date_field TYPE datum.
DATA: es_tab LIKE gs_download.
FIELD-SYMBOLS : <ls_data> TYPE any,
<lv_field> TYPE any,
<lv_field2> TYPE any. "内表字段
LOOP AT <gt_data> ASSIGNING <ls_data> .
IF <ls_data> IS INITIAL.
DELETE TABLE <gt_data> FROM <ls_data> .
ENDIF.
ENDLOOP.
"YOU COULD FIND OUT NUMBER OF COLUMNS DYNAMICALLY FROM TABLE <GT_DATA>
lv_numberofcolumns = 9 .
CLEAR:et_tab,gt_excel,gs_excel.
LOOP AT <gt_data> ASSIGNING <ls_data> FROM 2.
DO lv_numberofcolumns TIMES.
ASSIGN COMPONENT sy-index OF STRUCTURE <ls_data> TO <lv_field> .
ASSIGN COMPONENT sy-index OF STRUCTURE gs_excel TO <lv_field2>.
<lv_field2> = <lv_field>.
ENDDO.
MOVE-CORRESPONDING gs_excel TO es_tab.
APPEND es_tab TO et_tab.
CLEAR:es_tab.
ENDLOOP.
ENDFORM.