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
Wenn Sie uns hier eine Nachricht hinterlassen, nehmen wir schnellstmöglich Kontakt zu Ihnen auf.
Firma
Name
Telefon
E-Mail
Betreff
Nachricht