*
* Coded by Thorsten Neubüser - www.4ap.de
*
SELECTION-SCREEN BEGIN OF BLOCK zeiten WITH FRAME TITLE text-002.
PARAMETERS:
p_v_los LIKE sy-uzeit OBLIGATORY,
p_v_ende LIKE sy-uzeit OBLIGATORY,
p_n_los LIKE sy-uzeit OBLIGATORY,
p_n_ende LIKE sy-uzeit OBLIGATORY.
SELECTION-SCREEN END OF BLOCK zeiten.
INITIALIZATION.
p_v_los = '080000'.
p_v_ende = '120000'.
p_n_los = '123000'.
p_n_ende = '163000'.
*---------------------------------------------------------------------* * Form zeiten_berechnen *---------------------------------------------------------------------*
FORM zeiten_berechnen USING start_datum start_zeit
ende_datum ende_zeit
stunden.
* hours = ( ( T2 - T1 ) MOD 86400 ) / 3600. " 3600 = 1h 86400 = 1d
* p_v_los = '080000'.
* p_v_ende = '120000'.
* p_n_los = '123000'.
* p_n_ende = '163000'.
DATA: start_flag, ende_flag,
anz_tage TYPE i.
CLEAR: start_flag, ende_flag.
* Zeiten korrigieren
IF start_zeit <= p_v_los.
start_zeit = p_v_los.
start_flag = 'V'.
ELSEIF start_zeit BETWEEN p_v_los AND p_v_ende.
start_flag = 'V'.
ELSEIF start_zeit BETWEEN p_v_ende AND p_n_los.
start_zeit = p_v_ende.
start_flag = 'V'.
ELSEIF start_zeit BETWEEN p_n_los AND p_n_ende.
start_flag = 'N'.
ELSEIF start_zeit >= p_n_ende.
start_zeit = p_n_ende.
start_flag = 'N'.
ENDIF.
IF ende_zeit <= p_v_los.
ende_zeit = p_v_los.
ende_flag = 'V'.
ELSEIF ende_zeit BETWEEN p_v_los AND p_v_ende.
ende_flag = 'V'.
ELSEIF ende_zeit BETWEEN p_v_ende AND p_n_los.
ende_zeit = p_v_ende.
ende_flag = 'V'.
ELSEIF ende_zeit BETWEEN p_n_los AND p_n_ende.
ende_flag = 'N'.
ELSEIF ende_zeit >= p_n_ende.
ende_zeit = p_n_ende.
ende_flag = 'N'.
ENDIF.
CLEAR: anz_tage, stunden.
DATA: eth_dats LIKE rke_dat OCCURS 0.
IF ende_datum GE start_datum.
CALL FUNCTION 'RKE_SELECT_FACTDAYS_FOR_PERIOD'
EXPORTING
i_datab = start_datum
i_datbi = ende_datum
i_factid = '01'
TABLES
eth_dats = eth_dats
EXCEPTIONS
date_conversion_error = 1
OTHERS = 2
. " Punkt
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
DESCRIBE TABLE eth_dats LINES anz_tage.
ELSE. " ende_datum ge start_datum
CALL FUNCTION 'RKE_SELECT_FACTDAYS_FOR_PERIOD'
EXPORTING
i_datab = ende_datum
i_datbi = start_datum
i_factid = '01'
TABLES
eth_dats = eth_dats
EXCEPTIONS
date_conversion_error = 1
OTHERS = 2
. " Punkt
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
DESCRIBE TABLE eth_dats LINES anz_tage.
anz_tage = - anz_tage.
ENDIF. " ende_datum ge start_datum
IF anz_tage = 1.
IF ende_zeit LT start_zeit.
anz_tage = -1.
ENDIF. " ende_zeit lt start_zeit
ENDIF. " anz_tage = 1
IF anz_tage GE 0.
* Startzeit vor Endezeit = positiver Betrag * anz_tage = ende_datum - start_datum.
IF anz_tage = 1.
* alles an einem Tag * stunden = ( ( ende_zeit - start_zeit ) MOD 86400 ) / 3600.
IF start_flag = 'V'.
IF ende_flag = 'V'.
stunden = ( ( ende_zeit - start_zeit ) MOD 86400 ) / 3600.
ELSEIF ende_flag = 'N'.
* Cause I'm TNT. I'm dynamite. [AC/DC TNT 1976]
stunden = ( ( p_v_ende - start_zeit ) MOD 86400 ) / 3600
+ ( ( ende_zeit - p_n_los ) MOD 86400 ) / 3600.
ENDIF. " ende_flag = 'V'
ELSEIF start_flag = 'N'.
stunden = ( ( ende_zeit - start_zeit ) MOD 86400 ) / 3600.
ENDIF. " start_flag = 'V'
ELSEIF anz_tage > 1.
* mehrere Tage * erster Tag
IF start_flag = 'N'.
stunden = ( ( p_n_ende - start_zeit ) MOD 86400 ) / 3600.
ELSEIF start_flag = 'V'.
stunden = ( ( p_n_ende - p_n_los ) MOD 86400 ) / 3600
+ ( ( p_v_ende - start_zeit ) MOD 86400 ) / 3600.
ENDIF. " start_flag = 'N'
* letzter Tag
IF ende_flag = 'V'.
stunden = stunden
+ ( ( ende_zeit - p_v_los ) MOD 86400 ) / 3600.
ELSEIF ende_flag = 'N'.
stunden = stunden
+ ( ( p_v_ende - p_v_los ) MOD 86400 ) / 3600
+ ( ( ende_zeit - p_n_los ) MOD 86400 ) / 3600.
ENDIF. " ende_flag = 'N'
* mittlere Tage
anz_tage = anz_tage - 2.
IF anz_tage > 0.
DO anz_tage TIMES.
stunden = stunden
+ ( ( p_v_ende - p_v_los ) MOD 86400 ) / 3600
+ ( ( p_n_ende - p_n_los ) MOD 86400 ) / 3600.
ENDDO. " anz_tage
ENDIF. " anz_tage > 0
ENDIF. " anz_tage = 0
ELSE. " anz_tage ge 0
* Startzeit nach Endezeit = negativer Betrag
* anz_tage = start_datum - ende_datum
IF anz_tage = -1.
* alles an einem Tag * stunden = ( ( ende_zeit - start_zeit ) MOD 86400 ) / 3600.
IF start_flag = 'N'.
IF ende_flag = 'N'.
stunden = - ( - ( ende_zeit - start_zeit ) MOD 86400 ) / 3600.
ELSEIF ende_flag = 'V'.
* stunden = ( ( p_n_los - start_zeit ) MOD 86400 ) / 3600 * + ( ( ende_zeit - p_v_ende ) MOD 86400 ) / 3600.
stunden = p_n_los - start_zeit.
stunden = ( - ( p_n_los - start_zeit ) MOD 86400 ) / 3600.
stunden = ende_zeit - p_v_ende.
stunden = ( - ( ende_zeit - p_v_ende ) MOD 86400 ) / 3600.
stunden = - ( ( - ( p_n_los - start_zeit ) MOD 86400 ) / 3600
+ ( - ( ende_zeit - p_v_ende ) MOD 86400 ) / 3600 ).
ENDIF. " ende_flag = 'N'
ELSEIF start_flag = 'V'.
stunden = - ( - ( ende_zeit - start_zeit ) MOD 86400 ) / 3600.
ENDIF. " start_flag = 'N'
ELSEIF anz_tage < -1.
* mehrere Tage * erster Tag
IF ende_flag = 'N'.
stunden = - ( ( p_n_ende - ende_zeit ) MOD 86400 ) / 3600.
ELSEIF ende_flag = 'V'.
stunden =
- ( ( p_n_ende - p_n_los ) MOD 86400 ) / 3600
- ( ( p_v_ende - ende_zeit ) MOD 86400 ) / 3600.
ENDIF. " ende_flag = 'V'
* letzter Tag
IF start_flag = 'V'.
stunden = stunden
- ( ( start_zeit - p_v_los ) MOD 86400 ) / 3600.
ELSEIF start_flag = 'N'.
stunden = stunden
- ( ( p_v_ende - p_v_los ) MOD 86400 ) / 3600
- ( ( start_zeit - p_n_los ) MOD 86400 ) / 3600.
ENDIF. " start_flag = 'V'
* mittlere Tage
anz_tage = - anz_tage - 2.
IF anz_tage > 0.
DO anz_tage TIMES.
stunden = stunden
- ( ( p_v_ende - p_v_los ) MOD 86400 ) / 3600
- ( ( p_n_ende - p_n_los ) MOD 86400 ) / 3600.
ENDDO. " anz_tage
ENDIF. " anz_tage > 0
ENDIF. " anz_tage = 0
ENDIF. " anz_tage ge 0
ENDFORM. " zeiten_berechnen
|