/* POPUP INI */
/* POPUP FIM */

Conteúdo

Somar horas na data

Não é muito comum querer somar horas em uma data, mas as vezes acontece. Sim, existem funções que fazem parte deste procedimento, mas o ideal é entender e não utilizar funções.
REPORT ZSAPeiros.

PARAMETERS:
  p_hora(3)         TYPE c.                           "Hora a adicionar

DATA:
  lv_hh(5)          TYPE n,                           "Horas
  lv_mm(5)          TYPE n,                           "Minutos
  lv_ss(5)          TYPE n,                           "Segundos
  lv_msg(20)        TYPE c,                           "Mensagem
  lv_ss_tot(10)     TYPE c,                           "Total de segundos
  lv_dd_tot(10)     TYPE c,                           "Total de dias
  lv_hrprv          TYPE sy-uzeit,                    "Hora prevista
  lv_dtprv          TYPE sy-datum.                    "Data prevista

INITIALIZATION.
  %_p_hora_%_app_%-text = 'Horas a somar:'.

END-OF-SELECTION.
  lv_hh       = sy-uzeit+0(2) + p_hora.
  lv_mm       = sy-uzeit+2(2).
  lv_ss       = sy-uzeit+4(2).
  lv_ss_tot   = ( lv_hh * 3600 ) + ( lv_mm * 60 ) + lv_ss.

* 86400 é o total de segundos de 1 dia
  IF lv_ss_tot > 86400.
    lv_dd_tot = TRUNC( lv_ss_tot / 86400 ).
    lv_dtprv  = sy-datum + lv_dd_tot.
  ELSE.
    lv_dtprv  = sy-datum.
  ENDIF.

  lv_hrprv    = sy-uzeit.

* Utilizar a soma da hora real, ou seja, subtraindo a cada 24hs
  IF lv_hh >= 24.
    DO.
      IF lv_hh >= 24.
        lv_hh = lv_hh - 24.
      ELSE.
        EXIT.
      ENDIF.
    ENDDO.
  ENDIF.

  lv_hrprv(2) = lv_hh.

* Data
  lv_msg = 'Data atual:'.
  WRITE: / lv_msg, sy-datum.

  CLEAR lv_msg.
  CONCATENATE 'Data +' p_hora 'Horas:' INTO lv_msg SEPARATED BY space.
  WRITE: / lv_msg, lv_dtprv.

* Hora
  lv_msg = 'Hora atual:'.
  WRITE: / lv_msg, sy-uzeit.

  CLEAR lv_msg.
  CONCATENATE 'Hora +' p_hora 'Horas:' INTO lv_msg SEPARATED BY space.
  WRITE: / lv_msg, lv_hrprv.

Calcular milisegundos do tempo de execução

Certa vez eu precisei calcular a diferença que o programa leva do trecho A ao trecho B, porém este era executado tão rapidamente que o resultado final era impreciso, então o cálculo foi necessário em milissegundos.
REPORT ZSAPeiros.

DATA: lv_char     TYPE i,
      lv_char2    TYPE i,
      lv_retorno  TYPE i.

*--------------------------------------------------

* Horário de início em milisegundos
GET RUN TIME FIELD lv_char.

WAIT UP TO 2 SECONDS.

* Horário de fim em milisegundos
GET RUN TIME FIELD lv_char2.

WRITE: / 'INI',lv_char.

WRITE: / 'FIM',lv_char2.

lv_retorno =  ( lv_char2 - lv_char ).

WRITE: / 'TOT',lv_retorno.

* Transforma em segundos
lv_retorno =  lv_retorno * ( 10 ** -6 ).

WRITE: / 'SEG',lv_retorno.

*--------------------------------------------------
WRITE: / sy-uline.
*--------------------------------------------------

* Horário de início em milisegundos
GET RUN TIME FIELD lv_char.

WAIT UP TO 3 SECONDS.

* Horário de fim em milisegundos
GET RUN TIME FIELD lv_char2.

WRITE: / 'INI',lv_char.

WRITE: / 'FIM',lv_char2.

lv_retorno =  ( lv_char2 - lv_char ).

WRITE: / 'TOT',lv_retorno.

* Transforma em segundos
lv_retorno =  lv_retorno * ( 10 ** -6 ).

WRITE: / 'SEG',lv_retorno.
/* POPUP INI */ /* POPUP FIM */