关于进度显示

一、问题背景

在日常为了更加明确程序进度,有时会要求显示当前的任务进度情况;或者说,在进行程序运行的时候,在代码调试中无法很好地查看整体运行情况,这时,会需要用到显示进度的方式。

二、显示进度的方法

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秒,这仅为了演示需求。倘若可以确保无异常,也可不添加。

  • 12
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值