ALV处理进度条

导语:在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

猜你喜欢

转载自blog.csdn.net/JYH1999/article/details/128802935