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.