/* 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.

Calendário de fábrica - Dias úteis - Intervalo de datas

Função que retorna os dias úteis e o total de dias úteis de acordo com o calendário de fábrica desejado.
REPORT ZSAPeiros.

DATA:
  lt_rke_dat  TYPE TABLE OF rke_dat,        "Tab. com os dias úteis
  ls_rke_dat  TYPE          rke_dat.        "Tab. com os dias úteis

DATA:
  lv_datab    TYPE          kona-datab,     "Data De
  lv_datbi    TYPE          kona-datbi,     "Data até
  lv_days     TYPE          sy-tabix.       "Index / Days

lv_datab = sy-datum.      "Data de (hoje)
lv_datbi = sy-datum + 30. "Data até (mais 30 dias)

CLEAR lt_rke_dat[].

CALL FUNCTION 'RKE_SELECT_FACTDAYS_FOR_PERIOD'
  EXPORTING
    i_datab               = lv_datab
    i_datbi               = lv_datbi
    i_factid              = 'BR' "Factory id (calendário)
  TABLES
    eth_dats              = lt_rke_dat
  EXCEPTIONS
    date_conversion_error = 1
    OTHERS                = 2.

IF sy-subrc IS INITIAL.
  DESCRIBE TABLE lt_rke_dat LINES lv_days.
ENDIF.

WRITE: / sy-uline.

WRITE: / 'Dias úteis:'.

WRITE: / sy-uline.

LOOP AT lt_rke_dat INTO ls_rke_dat.
  WRITE: / ls_rke_dat-periodat.
ENDLOOP.

WRITE: / sy-uline.

WRITE: / 'Total de dias úteis:'.

WRITE: / sy-uline.

WRITE: / lv_days.

Popup com campos, preenchimento obrigatório, etc

Pode parecer besteira, mas se um dia você quiser um programa para gravar algumas informações no meio de um processo qualquer, se você puder abrir um popup com os campos para preencher seria ótimo. Você pode dar uma viajada e gerar isto dinâmico para realizar um select posteriormente, ou buscar informações, etc. Faça bom proveito.
REPORT ZSAPeiros.

DATA:
  t_fields TYPE TABLE OF sval, "Atributos tabela
  w_fields TYPE          sval. "Atributos tabela

w_fields-tabname   = 'MARA'.
w_fields-fieldname = 'MATNR'.
w_fields-field_obl = abap_true.
APPEND w_fields TO t_fields.
CLEAR w_fields.

w_fields-tabname   = 'MARA'.
w_fields-fieldname = 'MEINS'.
APPEND w_fields TO t_fields.
CLEAR w_fields.

CALL FUNCTION 'POPUP_GET_VALUES'
  EXPORTING
    popup_title = 'Informe os dados corretamente'
  IMPORTING
    returncode  = lv_retcode
  TABLES
    fields      = t_fields.

IF lv_retcode NE 'E'. "Cancelar
  LOOP AT t_fields INTO w_fields.
    WRITE:/ w_fields-value.
  ENDLOOP.
ENDIF.

Data por extenso, feriado, dia da semana, etc

Vamos deixar seu sapscript ou algum resultado mais bunitinho? Utilize esta função para gerar uma data por extenso, feriado, dia da semana, entre outras opções.
REPORT ZSAPeiros.

DATA: dt_extenso TYPE TABLE OF casdayattr WITH HEADER LINE.

CALL FUNCTION 'DAY_ATTRIBUTES_GET'
  EXPORTING
    date_from      = '20121225'
    date_to        = '20121225'
    language       = sy-langu
  TABLES
    day_attributes = dt_extenso.

WRITE: / dt_extenso-day_string, 
       / dt_extenso-freeday, 
       / dt_extenso-holiday.
/* POPUP INI */ /* POPUP FIM */