quarta-feira, 9 de maio de 2012

Função - SWI_DURATION_DETERMINE

"  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 LENGTH 10, " Horas
        vl_min    TYPE LENGTH 10, " Minutos
        vl_sec    TYPE 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 STRLENvl_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 STRLENvl_min EQ 1.
    CONCATENATE '0' vl_min INTO vl_min.
  ENDIF.

  IF STRLENvl_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

3 comentários:

  1. Muito útil! Obrigado! ;) Parabéns pelo blog!

    ResponderExcluir
  2. Parabens, o ruim é que esta funcão nao calcula período maiores, como por exemplo acima de 50 anos.

    ResponderExcluir