Skip to content

进度条工具

有时报表运行时间长,为了避免用户以为程序出问题,不妨加个进度条。

ZCL_PROGRESS
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
class ZCL_PROGRESS definition
  public
  final
  create public .

public section.

  data M_TOTAL type I .
  data M_CURRENT type I .
  data M_TIME_START type TIMESTAMPL .
  data M_TIME type TIMESTAMPL .
  data M_INTERVAL type I .
  data M_NAME type STRING .

  methods START
    importing
      !TOTAL type I optional
    returning
      value(RESULT) type ref to ZCL_PROGRESS .
  methods NEXT
    importing
      !DELTA type I default 1
    returning
      value(RESULT) type ref to ZCL_PROGRESS .
  methods FINISH
    returning
      value(RESULT) type ref to ZCL_PROGRESS .
  methods current
    importing
      !TEXT type STRING optional .
  methods PERCENTAGE
    returning
      value(RESULT) type F .
  methods DURATION
    returning
      value(RESULT) type F .
  class-methods WRITE
    importing
      !I_TEXT type STRING .
protected section.
private section.
ENDCLASS.



CLASS ZCL_PROGRESS IMPLEMENTATION.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_PROGRESS->DURATION
* +-------------------------------------------------------------------------------------------------+
* | [<-()] RESULT                         TYPE        F
* +--------------------------------------------------------------------------------------</SIGNATURE>
  method DURATION.

    result = cl_abap_tstmp=>subtract( tstmp1 = m_time
                                      tstmp2 = m_time_start ).

  endmethod.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_PROGRESS->FINISH
* +-------------------------------------------------------------------------------------------------+
* | [<-()] RESULT                         TYPE REF TO ZCL_PROGRESS
* +--------------------------------------------------------------------------------------</SIGNATURE>
  method FINISH.

    result = me.
    GET TIME STAMP FIELD m_time.
    show( ).

  endmethod.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_PROGRESS->NEXT
* +-------------------------------------------------------------------------------------------------+
* | [--->] DELTA                          TYPE        I (default =1)
* | [<-()] RESULT                         TYPE REF TO ZCL_PROGRESS
* +--------------------------------------------------------------------------------------</SIGNATURE>
  method NEXT.

    result = me.
    m_current = m_current + delta.

    DATA l_time TYPE timestampl.
    GET TIME STAMP FIELD l_time.
    IF m_current = m_total.
      m_time = l_time.
    ENDIF.

    IF m_time <= l_time.
      show( ).
      IF m_interval > 0.
        m_time = cl_abap_tstmp=>add( tstmp = l_time
                                     secs  = m_interval ).
      ELSE.
        m_time = l_time.
      ENDIF.
    ENDIF.

  endmethod.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_PROGRESS->PERCENTAGE
* +-------------------------------------------------------------------------------------------------+
* | [<-()] RESULT                         TYPE        F
* +--------------------------------------------------------------------------------------</SIGNATURE>
  method PERCENTAGE.

    IF m_total <> 0.
      result = m_current / m_total * 100.
    ENDIF.

  endmethod.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_PROGRESS->current
* +-------------------------------------------------------------------------------------------------+
* | [--->] TEXT                           TYPE        STRING(optional)
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD current.

    DATA(l_text) = text.
    IF l_text IS INITIAL.
      l_text = |{ percentage( ) DECIMALS = 0 }% [ {
          m_current NUMBER = USER } / { m_total NUMBER = USER } ] {
          duration( ) DECIMALS = 0 }s|.
      IF m_name IS NOT INITIAL.
        l_text = |{ m_name } : { l_text }|.
      ENDIF.
    ENDIF.
    write( l_text ).

  ENDMETHOD.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_PROGRESS->START
* +-------------------------------------------------------------------------------------------------+
* | [--->] TOTAL                          TYPE        I(optional)
* | [<-()] RESULT                         TYPE REF TO ZCL_PROGRESS
* +--------------------------------------------------------------------------------------</SIGNATURE>
  method START.

    result = me.
    m_total = total.
    m_current = 0.
    GET TIME STAMP FIELD m_time_start.
    m_time = m_time_start.

  endmethod.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Static Public Method ZCL_PROGRESS=>WRITE
* +-------------------------------------------------------------------------------------------------+
* | [--->] I_TEXT                         TYPE        STRING
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD write.

    IF sy-batch = ''.
      CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
        EXPORTING
          text = i_text.
    ELSE.
      MESSAGE i_text TYPE 'S'.
    ENDIF.

  ENDMETHOD.
ENDCLASS.
示例代码
1
2
3
4
5
6
7
8
DATA(lo_progress) = NEW zcl_progress( ).
lo_progress->m_name = 'DMEO'. " 计时器名称,不设置也行,这里只是为了展示全部可设置项
lo_progress->m_interval = 5. " 实际上进度条太频繁也会影响性能,这里设置刷新频率
lo_progress->start( lines( lt_data ) ).
LOOP AT lt_data INTO DATA(ls_data).
  lo_progress->next( 1 ). " 步进数,不设置默认1
ENDLOOP.
lo_progress->finish( ). " 进度直接跳到100,不加也不影响