导语:在ALV中处理大量数据的时候,可能要等很久,很多时候不知道处理了多少,再即将处理完的时候手动结束了进程,下面分享一下处理ALV时展示进度条。
一、复杂版
根据需要处理数据的总条目数,以及开始时间,上一条的执行时间,来推算所有的条目执行完需要多少时间、当前执行多少条,还剩多少条,以及进度条
1、代码
*&---------------------------------------------------------------------*
*& Report Z_JYH_SECOND
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT z_jyh_second.
TABLES : vbak.
*--------------------------------------------------------------------*
*定义
DATA: lf_int TYPE int4,
lf_int_p TYPE int4,
tl_int TYPE i.
DATA: lv_timlo_s TYPE sy-timlo, "运行开始时间;
lv_timlo_c TYPE sy-timlo, "运行当前时间;
lv_datlo_s TYPE sy-datlo, "运行开始日期;
lv_datlo_c TYPE sy-datlo, "运行当前日期;
lv_time_s TYPE i, "运行开始时间转换为数量;
lv_time_c TYPE i, "运行当前时间转换为数量;
lv_runtime_c TYPE i, "当前运行时间(秒)
lv_runtime_p TYPE i, "前一运行时间(秒)
lv_runtime_r TYPE i. "预计剩余时间(秒)
DATA: gv_stime TYPE tims. "运行开始时间
DATA: gv_total TYPE i. "运行总计时长 单位秒
DATA :lt_vbak TYPE TABLE OF vbak.
DATA :lw_vbak LIKE vbak.
SELECT-OPTIONS : s_vbeln FOR vbak-vbeln.
START-OF-SELECTION.
GET TIME.
lv_timlo_s = sy-timlo.
lv_datlo_s = sy-datlo.
SELECT * FROM vbak INTO TABLE lt_vbak WHERE vbeln IN s_vbeln.
DESCRIBE TABLE lt_vbak LINES tl_int.
LOOP AT lt_vbak INTO lw_vbak.
PERFORM frm_dispaly_time.
ENDLOOP.
*&---------------------------------------------------------------------*
*& Form SHOW_PROGRESSBAR
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> upct text
* --> total text
* --> tm text
* <-- p2 text
*----------------------------------------------------------------------*
FORM show_progressbar
USING upct total tm tm1 TYPE i
w_name TYPE string.
DATA: fbar TYPE c LENGTH 13,
fmsg TYPE c LENGTH 150.
CONSTANTS:
percent1 TYPE c VALUE '▏',
percent2 TYPE c VALUE '▎',
percent3 TYPE c VALUE '▍',
percent4 TYPE c VALUE '▌',
percent5 TYPE c VALUE '▋',
percent6 TYPE c VALUE '▊',
percent7 TYPE c VALUE '▉',
percent8 TYPE c VALUE '█'.
DATA:
fmod TYPE n,
ftim TYPE i,
fcnt TYPE p DECIMALS 3,
ffield TYPE c LENGTH 10,
fidx TYPE c LENGTH 3,
frtoal TYPE c LENGTH 8,
ftoal TYPE c LENGTH 8,
fcur TYPE c LENGTH 8,
ftm TYPE c LENGTH 8,
ftm1 TYPE c LENGTH 8.
FIELD-SYMBOLS: <fs> TYPE c.
fcnt = ( upct / total ) * 100.
ftim = fcnt DIV 8.
fmod = fcnt MOD 8.
CLEAR: fbar.
DO ftim TIMES.
CONCATENATE fbar percent8 INTO fbar.
ENDDO.
IF fmod NE 0.
CONCATENATE 'percent' fmod INTO ffield.
ASSIGN (ffield) TO <fs>.
CONCATENATE fbar <fs> INTO fbar.
ENDIF.
fidx = ( upct / total ) * 100.
ftoal = total.
fcur = upct.
ftm = tm.
ftm1 = tm1.
gv_total = sy-uzeit - gv_stime.
frtoal = gv_total.
CASE sy-langu.
WHEN 'E'.
CONCATENATE w_name 'Total:' ftoal ' FQTY: '
fcur ' RUNTIME:' ftm 'S Res.:' ftm1 'S Per:' fidx '% ' fbar
INTO fmsg.
WHEN '1'.
CONCATENATE w_name '总条数: ' ftoal ' 完成数: '
fcur ' 运行: ' ftm 'S 剩余:' ftm1 'S 进度: ' fidx '% ' fbar
INTO fmsg.
WHEN OTHERS.
CONCATENATE w_name '总条数: ' ftoal ' 完成数: '
fcur ' 运行: ' ftm 'S 剩余:' ftm1 'S 进度: ' fidx '% ' fbar
INTO fmsg.
ENDCASE.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
percentage = total
text = fmsg.
ENDFORM. "SHOW_PROGRESSBAR
*&---------------------------------------------------------------------*
*& Form frm_dispaly_time
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_dispaly_time .
GET TIME.
lv_timlo_c = sy-timlo.
lv_datlo_c = sy-datlo.
IF lv_datlo_s EQ lv_datlo_c.
lv_time_s = lv_timlo_s+0(2) * 3600 + lv_timlo_s+2(2) * 60 + lv_timlo_s+4(2).
lv_time_c = lv_timlo_c+0(2) * 3600 + lv_timlo_c+2(2) * 60 + lv_timlo_c+4(2).
lv_runtime_c = lv_time_c - lv_time_s. "运行时间
ELSE.
lv_time_s = lv_timlo_s+0(2) * 3600 + lv_timlo_s+2(2) * 60 + lv_timlo_s+4(2).
lv_time_c = lv_timlo_c+0(2) * 3600 + lv_timlo_c+2(2) * 60 + lv_timlo_c+4(2) + 86400.
lv_runtime_c = lv_time_c - lv_time_s. "运行时间
ENDIF.
lf_int = lf_int + 1.
IF lv_runtime_p NE lv_runtime_c.
lv_runtime_r = ( tl_int - lf_int ) * ( lv_runtime_c - lv_runtime_p ) / ( lf_int - lf_int_p ). "剩余运行时间
lf_int_p = lf_int.
lv_runtime_p = lv_runtime_c.
PERFORM show_progressbar USING lf_int tl_int
lv_runtime_c lv_runtime_r '订单查询中'.
ENDIF.
WAIT UP TO '0.05' SECONDS.
ENDFORM.
2、效果展示
以上代码可直接贴到程序中进行测试,效果见左下角
二、简单版
1、代码
这种比简单,进度百分比 = 当前条目 / 总条目,变成图标进行展示,并根据需求展示当前处理的单据编号。
*&---------------------------------------------------------------------*
*& Report Z_JYH_SECOND
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT z_jyh_second2.
TABLES : vbak.
DATA :lt_vbak TYPE TABLE OF vbak.
DATA :lw_vbak LIKE vbak.
DATA: g_perc TYPE p.
DATA: g_stxt TYPE string.
DATA: g_sperc(3) TYPE c.
DATA: gv_lines TYPE i.
SELECT-OPTIONS : s_vbeln FOR vbak-vbeln.
START-OF-SELECTION.
SELECT * FROM vbak INTO TABLE lt_vbak WHERE vbeln IN s_vbeln.
gv_lines = lines( lt_vbak ).
LOOP AT lt_vbak INTO lw_vbak.
g_perc = sy-tabix / gv_lines * 100.
g_sperc = g_perc.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
percentage = g_sperc
text = '处理订单:' && lw_vbak-vbeln
EXCEPTIONS
OTHERS = 1.
WAIT UP TO '0.05' SECONDS.
ENDLOOP.
2、效果
以上代码可直接贴到程序中进行测试,效果见左下角
作者:小飞猪猪猪猪猪猪猪–CSDN