" Fala aeeee, vou mostrar hoje uma função usada para retornar a diferença
" em segundos de duas datas e horas, juntamente com uma lógica muito
" interessante usando os segundos para converter em horas e minutos,
" gostaria de agradecer ao Alexandre Almeida por este post, valeuuu.
REPORT z_swi_duration_determine.
DATA :
valor TYPE string.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME.
PARAMETERS :
p_dini TYPE dats,
p_dfin TYPE dats,
p_hini TYPE tims,
p_hfin TYPE tims
.
SELECTION-SCREEN END OF BLOCK b1.
START-OF-SELECTION.
" Tratativa para calculo de horas entre as datas.
PERFORM f_tempo_lancamento USING p_dini
p_dfin
p_hini
p_hfin
CHANGING valor.
" Mostra retorno.
PERFORM f_show USING valor.
*&---------------------------------------------------------------------*
*& Form f_tempo_lancamento
*&---------------------------------------------------------------------*
FORM f_tempo_lancamento USING data_inicial
data_final
hora_inicial
hora_final
CHANGING total.
" Criação das variáveis locais.
DATA: vl_result TYPE sy-tabix, " retorno da função
vl_hor TYPE c LENGTH 10, " Horas
vl_min TYPE c LENGTH 10, " Minutos
vl_sec TYPE c LENGTH 10 " Segundos
.
BREAK-POINT.
" A função....
CALL FUNCTION 'SWI_DURATION_DETERMINE'
EXPORTING
start_date = data_inicial
end_date = data_final
start_time = hora_inicial
end_time = hora_final
IMPORTING
duration = vl_result.
"Resto da divisão por 60 (pegando os minutos e segundos)
vl_sec = vl_result MOD 60.
vl_min = vl_result DIV 60.
"Apagando os espaços vazios na string
SHIFT vl_sec LEFT DELETING LEADING space.
"Se o tamanho do campo for 1, formata para ficar com duas casas
IF STRLEN( vl_sec ) EQ 1.
CONCATENATE '0' vl_sec INTO vl_sec.
ENDIF.
"Se tiver mais de 60 minutos, transforma em horas
IF vl_min > 60.
vl_hor = vl_min DIV 60.
"Pega o que sobrou na divisão das horas
"Ex.: 65 minutos = 1hora e 5 minutos
vl_min = vl_min MOD 60.
ELSE.
vl_hor = '00'.
ENDIF.
"Apaga os espaços em branco
SHIFT vl_min LEFT DELETING LEADING space.
SHIFT vl_hor LEFT DELETING LEADING space.
IF STRLEN( vl_min ) EQ 1.
CONCATENATE '0' vl_min INTO vl_min.
ENDIF.
IF STRLEN( vl_hor ) EQ 1.
CONCATENATE '0' vl_hor INTO vl_hor.
ENDIF.
"Concatena o resultado final
CONCATENATE vl_hor vl_min vl_sec INTO total SEPARATED BY ':'.
ENDFORM. "f_tempo_lancamento
*&---------------------------------------------------------------------*
*& Form f_show
*&---------------------------------------------------------------------*
FORM f_show USING p_valor.
" Mostra o resultado.
WRITE p_valor.
ENDFORM. " f_show
Muito útil! Obrigado! ;) Parabéns pelo blog!
ResponderExcluirMuito obrigado Amanda.
ResponderExcluirParabens, o ruim é que esta funcão nao calcula período maiores, como por exemplo acima de 50 anos.
ResponderExcluir