一、问题背景
在日常为了更加明确程序进度,有时会要求显示当前的任务进度情况;或者说,在进行程序运行的时候,在代码调试中无法很好地查看整体运行情况,这时,会需要用到显示进度的方式。
二、显示进度的方法
1.调用 FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
实现流程
1.调用该函数,将函数放入程序循环内即可。只需要再添加自定义文本,以及完成进度情况即可。为了更加清晰地展示,这里将数值放大了100倍,并添加'%'符号,以生成百分比数值,便于查看。
lv_per = sy-index / lines * 100. "计算当前进度
lv_text = |正在加载中,当前进度......{ lv_per }% |."编写显示文本
2.在调用函数时,放入自定义参数即可。
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR' "调用函数
EXPORTING
percentage = lv_per "添加进度
text = lv_text "添加展示文本
EXCEPTIONS
OTHERS = 1.
3.防止出现显示异常,加上一定的等待时长。
WAIT UP TO 1 SECONDS.
效果展示
选择要执行的总时长,点击执行。可以看到左下角对应出现进度图案和自定义的文本。
代码展示
REPORT test01.
PARAMETERS: p_sec TYPE n LENGTH 3 ."加载时间设置
START-OF-SELECTION.
"定义需要的变量
DATA:lv_per TYPE p . "定义进度变量
DATA:lv_text TYPE string. "定义文本变量
DATA:lines TYPE i. "定义循环次数变量
lines = p_sec. "赋予循环次数变量
"循环输出
DO lines TIMES.
lv_per = sy-index / lines * 100. "计算当前进度
lv_text = |正在加载中,当前进度......{ lv_per }% |. "编写显示文本
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR' "调用函数
EXPORTING
percentage = lv_per "添加进度
text = lv_text "添加展示文本
EXCEPTIONS
OTHERS = 1.
WAIT UP TO 1 SECONDS. "添加等待时间防止卡顿
CLEAR:lv_per,lv_text.
ENDDO.
2.使用类方法CL_PROGRESS_INDICATOR
实现流程
1.类的使用方法与调用函数类似,主要使用到的是其中的4个功能:
①i_text (显示文本)
②i_processed(显示进程)
③i_total(总进程)
④i_output_immediately(是否立即显示)
cl_progress_indicator=>progress_indicate(
EXPORTING "添加展示文本
i_text = | 正在加载中,当前进度...... { sy-index } / { lines } |
* i_msgid = i_msgid " Message Class (If I_TEXT is not transferred)
* i_msgno = i_msgno " Message Number (If I_TEXT is not transferred)
* i_msgv1 = i_msgv1 " Message Variable (Maximum of 50 Characters)
* i_msgv2 = i_msgv2 " Message Variable (Maximum of 50 Characters)
* i_msgv3 = i_msgv3 " Message Variable (Maximum of 50 Characters)
* i_msgv4 = i_msgv4 " Message Variable (Maximum of 50 Characters)
"当前进程
i_processed = sy-index " Number of Objects Already Processed
"总进程
i_total = lines " Total Number of Objects to Be Processed
"是否立即展示:abap_ture/abap_false
i_output_immediately = abap_true " X = Display Progress Immediately
* importing
* e_progress_sent = e_progress_sent " X = Progress Information Was Displayed
).
2.在该类方法中,需要留意的是i_output_immediately的功能。当选择立即执行时,此时,会立即展示数值随着每次的调用而展示,与第一种方式类似,效果基本一致。
i_output_immediately = abap_true
3.同样的,当选择立即执行的方式时,最好也添加一定的等待时长,防止异常。
WAIT UP TO 1 SECONDS.
4.若选择不立即执行的话,哪怕短时间内调用多次。它也会按照每隔10秒刷新一次的频率修改展示界面。
i_output_immediately = abap_false
效果展示
代码展示
PARAMETERS:p_sec TYPE n LENGTH 3. "设置加载时长
START-OF-SELECTION.
"定义变量
DATA:lv_per TYPE p , "定义进度变量
lv_text TYPE string, "定义文本变量
lines TYPE i. "定义循环次数变量
lines = p_sec. "赋予循环次数变量
"循环输出
DO lines TIMES.
cl_progress_indicator=>progress_indicate(
EXPORTING "添加展示文本
i_text = | 正在加载中,当前进度...... { sy-index } / { lines } |
* i_msgid = i_msgid " Message Class (If I_TEXT is not transferred)
* i_msgno = i_msgno " Message Number (If I_TEXT is not transferred)
* i_msgv1 = i_msgv1 " Message Variable (Maximum of 50 Characters)
* i_msgv2 = i_msgv2 " Message Variable (Maximum of 50 Characters)
* i_msgv3 = i_msgv3 " Message Variable (Maximum of 50 Characters)
* i_msgv4 = i_msgv4 " Message Variable (Maximum of 50 Characters)
"当前进程
i_processed = sy-index " Number of Objects Already Processed
"总进程
i_total = lines " Total Number of Objects to Be Processed
"是否立即展示:abap_ture/abap_false
i_output_immediately = abap_true " X = Display Progress Immediately
* importing
* e_progress_sent = e_progress_sent " X = Progress Information Was Displayed
).
WAIT UP TO 1 SECONDS.
ENDDO.
三、注意事项
1.在使用该函数的时候,调用函数本身需要一定的时间,因此数据量过大时,最好不要每次都调用,否则反而会使得运行更加缓慢。
2.为了防止出现卡顿,出现显示异常的情况,建议加上等待时长,时长可按需求设置。不必非要设置为1秒,这仅为了演示需求。倘若可以确保无异常,也可不添加。