4AP.de ~ alles fuer ABAP-Programmierer - Infos zur SAP Programmiersprache


das Neueste

10 Jahre 4ap.de

10 Jahre 4ap.de - kleines und stilles Jubiläum

|

 

Buchrezensionen

Einige neue Buchrezensionen sind vorhanden.

|

 

neues Coding: braune Kekse

Lange schwebte mir die Idee vor, aber es fehlte schlicht die Zeit. Heute war es endlich soweit: ich nahm sie mir, die Zeit :-) Ergebnis unter: braune Kekse.

|

 

neues Kontaktformular

Wegen Formularspoofing wurde eine neue Kontaktmöglichkeit geschaffen.
|

 

Codings gesucht

Codings gesucht, die NICHT im SDN stehen.
|

 

Suche



 


Dieser Inhalt wurde zuletzt geändert am:
21.04.2009 von TN

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