Zeiten berechnen

www.4AP.de - alles über ABAP  -  Zeiten berechnen mit Berücksichtigung der Bürozeiten

Beispielcoding: zur Berechnung der Durchlaufzeit (z.B. der Materialstammanlage) kann über zwei verschiedene Datum- + Uhrzeitangaben unter Berücksichtigung des Fabrikkalenders und der als Parameter mitgegebenen Bürozeiten die Zeitdifferenz in Stunden errechnet werden


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