"Навороченные" часики:
Code:
LOOP AT lt_data.
PERFORM progress_indicator
USING sy-tabix sy_tfill_save 'Сохранение' lt_data-name.
ENDLOOP.
FORM progress_indicator
USING n TYPE i
nall TYPE i
name TYPE c
object_name type c
.
CONSTANTS: c_delta_t_min type i value '3' " Минимальное время обновления в секундах
, c_delta_n_min type i value '0' " Минимальное количество усреднения для прогноза
.
STATICS: start_timestamp TYPE timestamp
, start_n TYPE i
, last_timestamp TYPE timestamp
, last_n TYPE i
.
DATA: percent TYPE i
, idiff TYPE i
, i TYPE i
, rate TYPE f
, unit(3)
, unit_v(3)
, text(200)
, c_n(11)
, c_nall(11)
, c_idiff(11)
, c_rate(11)
, curr_timestamp TYPE timestamp
, delta_n type i
.
IF nall <= 0 or n <= 0 or n > nall.
exit.
elseif n = 1 or start_timestamp is initial.
last_n = n.
GET TIME STAMP FIELD start_timestamp.
last_timestamp = start_timestamp.
EXIT.
ENDIF.
GET TIME STAMP FIELD curr_timestamp.
CALL FUNCTION 'TIMECALC_DIFF'
EXPORTING
timestamp1 = last_timestamp
timestamp2 = curr_timestamp
timezone = ''
IMPORTING
difference = idiff.
IF idiff > c_delta_t_min. " в секундах
percent = ( n - 1 ) * 100 / nall.
delta_n = n - last_n.
if c_delta_n_min > 0 and delta_n > c_delta_n_min. " в штуках
rate = ( n - last_n ) / idiff.
else.
CALL FUNCTION 'TIMECALC_DIFF'
EXPORTING
timestamp1 = start_timestamp
timestamp2 = curr_timestamp
timezone = ''
IMPORTING
difference = idiff.
rate = ( n - 1 ) / idiff.
endif.
idiff = ( nall - ( n - 1 ) ) / rate.
IF idiff >= 60.
unit = 'мин'. idiff = ( idiff + 30 ) / 60.
ELSE.
unit = 'с'.
ENDIF.
WRITE idiff TO c_idiff LEFT-JUSTIFIED NO-GROUPING.
WRITE n TO c_n LEFT-JUSTIFIED NO-GROUPING.
WRITE nall TO c_nall LEFT-JUSTIFIED NO-GROUPING.
IF rate < '0.001'.
rate = rate * 3600.
WRITE rate TO c_rate LEFT-JUSTIFIED NO-GROUPING NO-SIGN.
unit_v = 'час'.
ELSEIF rate < '0.1'.
rate = rate * 60.
WRITE rate TO c_rate LEFT-JUSTIFIED NO-GROUPING NO-SIGN.
unit_v = 'мин'.
ELSEIF rate < 10.
WRITE rate TO c_rate LEFT-JUSTIFIED DECIMALS 1 EXPONENT 0 NO-GROUPING NO-SIGN.
unit_v = 'c'.
ELSE.
WRITE rate TO c_rate LEFT-JUSTIFIED DECIMALS 0 EXPONENT 0 NO-GROUPING NO-SIGN.
unit_v = 'c'.
ENDIF.
text = name.
CONCATENATE name `: ` c_n ` из ` c_nall
`. Осталось ` c_idiff ` ` unit `. V=` c_rate ` шт/с. `
object_name INTO text.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
percentage = percent
text = text.
last_timestamp = curr_timestamp.
last_n = n.
CALL FUNCTION 'TH_REDISPATCH'
* EXPORTING
* CHECK_RUNTIME = 0
.
ENDIF.
ENDFORM. "progress_indicator