Datum - Zeitintervall berechnen

Getting started ... Alles für einen gelungenen Start.
7 Beiträge • Seite 1 von 1
7 Beiträge Seite 1 von 1

Datum - Zeitintervall berechnen

Beitrag von abap_coder (ForumUser / 4 / 0 / 0 ) »
Hallo,

ich bin neu hier und habe gleich eine Frage an euch.
Hab gerade einen Report geschrieben, der nach bestimmten selektionskritereien sucht u.a auch Datum von-bis und Zeit von -bis.

Nun benötige ich noch einen algorithmus zum Zeitintervall berechenen.

was ich zur verfügung habe:
datum und uhrzeit als zeitstempel in von uns bis werten (auch als range)

datum/uhrzeit von & datum/uhrzeit bis nochmal einzeln

ich möchte nun ab dem start zeitpunkt bis zum endzeitpunkt stündlich die zeiten in einem alv auflisten.
Ich verwende zur Darstellung das 'REUSE_ALV_GRID_DISPLAY_LVC', nun fehlt nur noch die befüllung der struktur mit den intervallwerten.

Ein Beispiel: Selektionswerte 08.03.2013 | 09:00 bis 08.03.2013 | 12:00
dann soll aufgelistet werden:
09:00 - 10:00
10:00 - 11:00
11:00 - 12:00

Das Intervall ist immer exakt eine Stunde. Hat jemand vorschläge wie ich das am besten realisieren kann?

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Re: Datum - Zeitintervall berechnen

Beitrag von ralf.wenzel (Top Expert / 3865 / 197 / 276 ) »
Datum und Uhrzeit liegen in unterschiedlichen Ranges vor?
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Re: Datum - Zeitintervall berechnen

Beitrag von abap_coder (ForumUser / 4 / 0 / 0 ) »
Es gibt eine Range mit Datum und Uhrzeit als Timestamp, also zusammen.
Außerdem gibt es noch eine noch einzelne Ranges nur von Datum und nur von Uhrzeit

Ein Codingbeispiel um es besser darzustellen:

Coding:

*********************************************************************
" Selektion screen
SELECTION-SCREEN FUNCTION KEY 1.
SELECTION-SCREEN BEGIN OF BLOCK a100 WITH FRAME TITLE text-100.
PARAMETERS p_lgtyp LIKE z9labpo-lgtyp DEFAULT 'ATL'.
PARAMETERS p_status LIKE z9labpo-status DEFAULT '80'.
SELECT-OPTIONS s_datum FOR z9labpo-datum.
SELECT-OPTIONS s_zeit FOR sy-uzeit.
SELECTION-SCREEN END OF BLOCK a100.
**********************************************************************

Form: read_data:

lv_datum_low = s_datum-low.
lv_zeit_low = s_zeit-low.

CALL FUNCTION 'DATE_CHECK_PLAUSIBILITY'
EXPORTING
date = lv_datum_low
EXCEPTIONS
plausibility_check_failed = 1.


"convert to timestamp
"datum = TT.MM.JJJJ -> JJJJMMTT

SPLIT lv_datum_low AT '.' INTO lv_tag lv_monat lv_jahr.
CONCATENATE lv_jahr lv_monat lv_tag INTO lv_datum_low.
SPLIT lv_datum_high AT '.' INTO lv_tag lv_monat lv_jahr.
CONCATENATE lv_jahr lv_monat lv_tag INTO lv_datum_high.


"JJJJMMTTHHMMSS
CONCATENATE lv_datum_low lv_zeit_low INTO lv_aezt_low.
CONCATENATE lv_datum_high lv_zeit_high INTO lv_aezt_high.

-> fill alv structure
"todo calculate time intervall (one hour)
"here is the problem!

DO.

ls_data-datum = lv_datum_low.
ls_data-zeit_von = lv_zeit_low.
ls_data-zeit_bis = "+ 60 min
APPEND ls_data TO gt_data.

IF ls_data-zeit_bis < lv_zeit_high.
ls_data-zeit_von = ls_data-zeit_bis.
ls_data-zeit_bis = ls_data-zeit_von + 60.


SELECT COUNT( * )
FROM z9labpo
INTO ls_data-anz_picks
WHERE lgtyp = p_lgtyp
AND status = p_status
AND aenzt IN lt_aenzt_rt.

ELSE.
EXIT.
ENDIF.
ENDDO.

Re: Datum - Zeitintervall berechnen

Beitrag von JHM (Top Expert / 1197 / 1 / 197 ) »

Code: Alles auswählen.

* Eingangsprüfungen
IF lv_zeit_von+2(4) <> '0000'.
   MESSAGE 'Bitte nur volle Stunden eingeben' TYPE 'E'.
ENDIF.

IF lv_zeit_bis2(4) <> '0000'.
  MESSAGE 'Bitte nur volle Stunden eingeben' TYPE 'E'.
ENDIF.

IF lv_zeit_bis = '000000'.
  MESSAGE 'Bis Zeit muss größer 00:00:00 sein' TYPE 'E'.
ENDIF.

* Startwert setzten
ls_data-datum = lv_datum_low.
ls_data-zeit_von = lv_zeit_low.
ls_data-zeit_bis = lv_zeit_low + 3600.
APPEND ls_data TO gt_data

DO.
* nächstes Intervall berechnen
      ls_data-zeit_von = ls_data-zeit_bis.
      ls_data-zeit_bis = ls_data-zeit_von + 3600.

* auf Datumsgrenze prüfen
      IF ls_data-zeit_von = '000000'.
        ls_data-datum = ls_data-datum + 1.
      ENDIF.

      APPEND ls_data TO gt_data.

* Ende erreicht?
      IF ls_data-datum = lv_datum_high AND ls_data-zeit_bis = p_uzbis.
        EXIT.
      ENDIF. 
ENDDO.
Gruß Hendrik

Re: Datum - Zeitintervall berechnen

Beitrag von abap_coder (ForumUser / 4 / 0 / 0 ) »
Vielen vielen Dank es hat funktioniert!

habe außerdem den selektionsbildschirm geändert, damit nicht mehrere Daten gleichzeitig über die Mehrfachselektion eigegeben werden können.

So schaut die lösung aus:

SELECTION-SCREEN COMMENT 1(31) text-002 FOR FIELD p_ctdfr.
PARAMETERS: p_ctdfr TYPE sydatum OBLIGATORY,
p_cttfr TYPE syuzeit OBLIGATORY.
SELECTION-SCREEN COMMENT 55(10) text-003 FOR FIELD p_ctdto.
PARAMETERS: p_ctdto TYPE sydatum OBLIGATORY,
p_cttto TYPE syuzeit OBLIGATORY.
SELECTION-SCREEN END OF LINE.

----------------------------------------------------------------------------------------------------------

DO.
IF sy-tabix = 1.
ls_data-datum = p_ctdfr.
ls_data-zeit_von = lv_zeit_von.
ls_data-zeit_bis = lv_zeit_von + 3600. "Eine Stunde in Sekunden

SELECT COUNT( * )....
APPEND ls_data TO gt_data.
ENDIF.
IF ls_data-zeit_bis < p_cttto
AND ls_data-datum <= p_ctdto. "also check date
"auf datumsgrenze prüfen
IF ls_data-zeit_von = '000000'.
ls_data-datum = ls_data-datum + 1.
ELSE.
ls_data-datum = p_ctdfr.
ENDIF.
ls_data-zeit_von = ls_data-zeit_bis.
ls_data-zeit_bis = ls_data-zeit_von + 3600. "Eine Stunde in Sekunden
SELECT COUNT( * )......
APPEND ls_data TO gt_data.
ELSE.
EXIT.
ENDIF.
ENDDO.

Re: Datum - Zeitintervall berechnen

Beitrag von abap_coder (ForumUser / 4 / 0 / 0 ) »
Danke für die hilfreichen Nachrichten!

Habe das problem gelöst indem ich folgendes Coding verwendet habe.
Allerdings habe ich noch massive performanceprobleme, hat jemand Tipps wie ich diese lösen kann?

DO.
CLEAR: ls_data-anz_picks
, ls_aezt_rz
, lt_aezt_rt
.
IF sy-tabix = 1.
ls_data-datum = p_ctdfr.
ls_data-zeit_von = lv_zeit_von.
ls_data-zeit_bis = lv_zeit_von + 3600. "Eine Stunde in Sekunden

"create timestamp
CONCATENATE ls_data-datum lv_zeit_von INTO lv_aezt_low.
CONCATENATE ls_data-datum ls_data-zeit_bis INTO lv_aezt_high.

"set timestamp with actual conditions
"create timestamp range
ls_aezt_rz-option = 'BT'.
ls_aezt_rz-sign = 'I'.
ls_aezt_rz-low = lv_aezt_low.
ls_aezt_rz-high = lv_aezt_high.
APPEND ls_aezt_rz TO lt_aezt_rt.

SELECT COUNT( * )
FROM z9labpo
INTO ls_data-anz_picks
WHERE status = p_status
AND lgtyp = p_lgtyp
AND aenzt IN lt_aezt_rt.
APPEND ls_data TO gt_data.
ENDIF.

"auf datumsgrenze prüfen
IF ls_data-zeit_bis = '000000'
AND ls_data-datum <= p_ctdto.
ls_data-datum = ls_data-datum + 1.
ELSE.
ls_data-datum = ls_data-datum.
ENDIF.


CONCATENATE p_ctdto p_cttto INTO lv_aezt_to.
CONCATENATE ls_data-datum ls_data-zeit_bis INTO lv_aezt_high.

"check timestamp
IF lv_aezt_high < lv_aezt_to. "check timestamp

ls_data-zeit_von = ls_data-zeit_bis.
ls_data-zeit_bis = ls_data-zeit_von + 3600. "Eine Stunde in Sekunden

"create timestamp
CONCATENATE ls_data-datum ls_data-zeit_von INTO lv_aezt_low.
CONCATENATE ls_data-datum ls_data-zeit_bis INTO lv_aezt_high.

"set timestamp with actual conditions
"create timestamp range
ls_aezt_rz-sign = 'I'.
ls_aezt_rz-option = 'BT'.
ls_aezt_rz-low = lv_aezt_low.
ls_aezt_rz-high = lv_aezt_high.
APPEND ls_aezt_rz TO lt_aezt_rt.

SELECT COUNT( * )
FROM z9labpo
INTO ls_data-anz_picks
WHERE status = p_status
AND lgtyp = p_lgtyp
AND aenzt IN lt_aezt_rt.
APPEND ls_data TO gt_data.
ELSE.
EXIT.
ENDIF.
ENDDO.

Re: Datum - Zeitintervall berechnen

Beitrag von JHM (Top Expert / 1197 / 1 / 197 ) »
abap_coder hat geschrieben:Allerdings habe ich noch massive performanceprobleme, hat jemand Tipps wie ich diese lösen kann?
Eine Aufgabenbeschreibung würde das Helfen einfacher machen ;-)

Wenn ich dein Coding richtig verstehe, möchtest du die Anzahl von Pick je Stunde zurück haben.
Denn Sinn des doppelten SELECTS auf die Z9LABPO erschließt sich mich hierbei allerdings nicht. Du füllst aber vor jedem Select die RANGE lt_aezt_rt, aber leerst sie nirgendwo. Demnach würde beim 2 DO-Durchlauf bereits zwei "alte" Zeitstempel in der Range stehen, es würde eintrag 3 und 4 hinzukommen und somit der COUNT verfälscht werden.

Hast du mal einen SQL-Trace mitlaufen lassen (ST05). Wird der Zugriff auf die Z9LABPO per Index ausgeführt oder wird sequenziell gelesen?

Deine vielen einzel Selekts sind auch nicht gerade Performant, evtl. würde es mehr Sinn machen alle Picks incl. Zeitstempel auf einmal einzulesen und diese durch einen LOOP mit Gruppenstufenverarbeitung auf die Zeitstempel zu verdichten/zählen. Dies müßte man aber ausprobieren.
Gruß Hendrik

Seite 1 von 1

Vergleichbare Themen

5
Antw.
23176
Views
Datum berechnen
von schroeta » 19.07.2007 11:41 • Verfasst in ABAP® für Anfänger
7
Antw.
6201
Views
Convert Gregorianisches Datum -> Julianisches Datum
von michael baum » 06.06.2005 09:25 • Verfasst in ABAP® Core
4
Antw.
706
Views
Daten zwischen Datum A und Datum B
von cecslucas » 13.10.2022 09:44 • Verfasst in ABAP® für Anfänger
4
Antw.
4558
Views
Differenztage berechnen
von jeyloeso » 26.09.2012 08:47 • Verfasst in ABAP® für Anfänger
7
Antw.
5490
Views
Durchschnittsalter berechnen
von quricky » 21.04.2013 18:17 • Verfasst in ABAP® für Anfänger

Über diesen Beitrag


Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Aktuelle Forenbeiträge

Get und Set
Gestern von tar 18 / 4356
Wissensdatenbank
Gestern von ewx 15 / 2922

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Aktuelle Forenbeiträge

Get und Set
Gestern von tar 18 / 4356
Wissensdatenbank
Gestern von ewx 15 / 2922