Rheinwerk < openbook > SAP-Wissen aus erster Hand
SAP-Wissen aus erster Hand.
 
Inhaltsverzeichnis
Vorwort zur vierten Auflage
1 ABAP und die ersten Schritte im SAP-System
2 ABAP Dictionary
3 Programmieren im ABAP Editor
4 Felder und Berechnungen
5 Modifikation von Zeichenketten
6 Debugging von Programmen
7 Modifikation von transparenten Datenbanktabellen
8 Rechnen mit Datum und Zeit, Mengen und Währungen
9 Mit Daten in einer Datenbanktabelle arbeiten
10 Programmablaufsteuerung und logische Ausdrücke
11 Selektionsbildschirme
12 Interne Tabellen
13 Modularisierung von Programmen
14 Weiterführende Themen
A Icons auf einen Blick
B Abkürzungsverzeichnis
C Die Autoren
Stichwortverzeichnis

Download:
- Beispielprogramme, ca. 23 KB

Buch bestellen
Ihre Meinung?

Spacer
<< zurück
Einstieg in ABAP von Karl-Heinz Kühnhauser, Thorsten Franz
Buch: Einstieg in ABAP

Einstieg in ABAP
Pfeil 8 Rechnen mit Datum und Zeit, Mengen und Währungen
Pfeil 8.1 Felddeklarationen
Pfeil 8.2 Rechnen mit Datumsfeldern
Pfeil 8.3 Rechnen mit Zeitfeldern
Pfeil 8.4 Rechnen mit Mengen- und Währungsfeldern
Pfeil 8.5 Codebeispiel zu Datums-, Zeit- und Währungsfeldern
 
Zum Seitenanfang

8.2    Rechnen mit Datumsfeldern Zur vorigen ÜberschriftZur nächsten Überschrift

Vielleicht fragen Sie sich, warum man überhaupt mit Datumsfeldern rechnen muss. Aber denken Sie an die Ermittlung von Fristen, Stichtagen, Lieferterminen oder Produktionszyklen, an tarifliche Vereinbarungen zwischen Arbeitgebern und Arbeitnehmern, an die Ermittlung des genauen Alters einer Person oder an die Betriebszugehörigkeit in einer Lohn- und Gehaltsabrechnung: In all diesen Fällen sind Berechnungen mit Datumsfeldern zwingend erforderlich.

Nachfolgend lernen Sie deshalb schrittweise, Datumsfelder zu verarbeiten und mit ihnen zu rechnen. Die folgenden »Codeschnipsel« beziehen sich dabei nur auf diesen Aspekt; im Codebeispiel am Ende dieses Kapitels finden Sie zu den im Folgenden verwendeten Datumsfeldern auch die entsprechenden Deklarationen und die DATA-Anweisungen.

Zuerst füllen Sie das Datumsfeld RECHNUNGSDATUM mit einem Datumswert. Soll das Feld RECHNUNGSDATUM den augenblicklichen Wert des Systemdatums erhalten, schreiben Sie:

rechnungsdatum = sy-datum.

Soll das Feld RECHNUNGSDATUM das Datum »05.02.2015« enthalten, lautet die Anweisung:

rechnungsdatum = '20150205'.

Für den Einstieg ist es vielleicht am leichtesten, sich die weiteren Aspekte dieses Themas mit kleinen Beispielen zu erschließen. Diese Beispiele erheben keinen Anspruch darauf, die einzig richtige Lösung zu präsentieren – bekanntlich führen viele Wege nach Rom, und es mag andere, pfiffigere Lösungen und Beispiele geben. Wichtig ist nur, dass Sie ein Gefühl für die besondere Denkweise bekommen, die beim Programmieren in ABAP erforderlich ist.

[zB]  Beispiel 1: Rechnungsdatum und Zahlungsziel

Auf einer Rechnung soll als Rechnungsdatum das heutige Systemdatum stehen. Das Zahlungsziel beträgt 30 Tage. Ihr Programm soll das Fälligkeitsdatum bestimmen.

Für die Lösung dieser Aufgabe gehen Sie folgendermaßen vor:

  1. Dem Datumsfeld RECHNUNGSDATUM weisen Sie den Wert des Systemdatums zu.

    rechnungsdatum = sy-datum.
  2. Dem Integerfeld ZAHLUNGSZIEL weisen Sie den Wert 30 zu.

    zahlungsziel = 30.
  3. Die Felder RECHNUNGSDATUM und ZAHLUNGSZIEL addieren Sie, und das Ergebnis schreiben Sie in das Feld FAELLIGKEITSDATUM.

    faelligkeitsdatum = rechnungsdatum + zahlungsziel.
[zB]  Beispiel 2: Monatsanfang des aktuellen Monats

Ihr Programm soll als Stichtag den ersten Tag des laufenden Monats bestimmen.

Für diese kleine Aufgabe müssen Sie Folgendes vornehmen:

  1. Dem Datumsfeld MONATSANFANG weisen Sie den Wert des Systemdatums zu.

    monatsanfang = sy-datum.
  2. Der Tag steht in den letzten beiden Stellen des Feldes. Nach Stelle 6 setzen Sie die Stellen 7 und 8 auf den Wert 01 und weisen dem Datumsfeld MONATSANFANG zu.

    monatsanfang+6(2) = '01'.
[zB]  Beispiel 3: Erster Tag des Folgemonats

Ihr Programm soll als Stichtag den ersten Tag des Folgemonats ermitteln.

Diese Aufgabe gestaltet sich schon etwas aufwendiger. Hätten alle Monate gleich viele Tage, wäre die Lösung nicht schwer. Leider soll Ihr Programm aber immer richtige Ergebnisse liefern, ob im Januar, im Februar oder im Juni – gleich, ob es einen Monatswechsel, einen Jahreswechsel oder ein Schaltjahr gibt –, und es gehört zum guten Ton, dass die Programmierung auch noch mit möglichst wenigen Zeilen Quellcode erfolgt.

Man hilft sich mit einem kleinen Trick: Nutzen Sie die Kalenderfunktionen des Systems und lösen das Problem folgendermaßen:

  1. Dem Datumsfeld MONATSANFANG weisen Sie den Wert des Systemdatums zu.

    monatsanfang = sy-datum.
  2. Der Tag steht in den letzten beiden Stellen des Feldes. Nach der Stelle 6 setzen Sie die Stellen 7 und 8 auf den Wert 01 und weisen dem Datumsfeld MONATSANFANG zu.

    monatsanfang+6(2) = '01'.
  3. Zum ersten Tag des aktuellen Monats addieren Sie 35 Tage und landen immer mitten im Folgemonat. Bei diesem »Trick 35« ist die Zahl 35 willkürlich gewählt, sie muss lediglich mindestens 31 und darf höchstens 58 sein. Durch die im System eingebaute Kalenderfunktion erhalten Sie so automatisch einen gültigen Tag im Folgemonat, d. h. auch richtige Ergebnisse beim Jahreswechsel, beim Monatswechsel sowie in Schaltjahren.

    monatsanfang = monatsanfang + 35.
  4. Der Tag des Folgemonats steht wieder in den letzten beiden Stellen des Feldes. Die Stellen 5 und 6 des Feldes haben den Wert des Folgemonats erhalten. Sollte durch den Sprung in den Folgemonat gleichzeitig ein Jahreswechsel stattgefunden haben, steht in den ersten vier Stellen das neue Jahr. Um den Tag des Folgemonats auf 01 zu setzen, müssen Sie nach Stelle 6 die Stellen 7 und 8 auf den Wert 01 setzen.

    monatsanfang+6(2) = '01'.
[zB]  Beispiel 4: Ultimo des Vormonats

Ihr Programm soll als Stichtag den letzten Tag des Vormonats ausfindig machen.

Hierzu ermitteln Sie zunächst den ersten Tag des aktuellen Monats wie in Beispiel 2:

  1. Dem Datumsfeld MONATSANFANG weisen Sie den Wert des Systemdatums zu.

    monatsanfang = sy-datum.
  2. Der Tag steht in den letzten beiden Stellen des Feldes. Nach der Stelle 6 setzen Sie die Stellen 7 und 8 auf den Wert 01 und weisen dem Datumsfeld MONATSANFANG zu.

    monatsanfang+6(2) = '01'.
  3. Sie nutzen wieder die Kalenderfunktion des Systems. Durch die Subtraktion von 1 blättern Sie im Kalender vom ersten Tag des aktuellen Monats um einen Tag zurück und landen immer beim letzten Tag des Vormonats. Auch Schaltjahresregelungen oder Jahreswechsel machen so keine Probleme.

    monatsende = monatsanfang - 1.
[zB]  Beispiel 5: Ultimo des aktuellen Monats

Ihr Programm soll als Stichtag den letzten Tag des laufenden Monats berechnen.

Da Sie nicht wissen, in welchem Monat Ihr Programm läuft, nützt es nichts, für den letzten Tag einfach 31 einzusetzen. Sie benötigen eine Lösung, die immer richtige Ergebnisse liefert, und nutzen hierzu wieder die Kalenderfunktionen des Systems:

  1. Dem Datumsfeld MONATSANFANG weisen Sie den Wert des Systemdatums zu.

    monatsanfang = sy-datum.
  2. Der Tag steht in den letzten beiden Stellen des Feldes. Nach der Stelle 6 setzen Sie die Stellen 7 und 8 auf den Wert 01 und weisen dem Datumsfeld MONATSANFANG zu.

    monatsanfang+6(2) = '01'.
  3. Zum ersten Tag des aktuellen Monats addieren Sie 35 Tage und landen im Folgemonat. »Trick 35« gewährleistet dabei wieder einen sauberen Sprung mitten in den nächsten Monat hinein.

    monatsanfang = monatsanfang + 35.
  4. Vom ersten Tag des Folgemonats ausgehend, blättern Sie wieder um einen Tag zurück, zum letzten Tag des aktuellen Monats. Damit haben Sie Problemfälle wie Monats- und Jahreswechsel oder Schaltjahre wieder an den Systemkalender delegiert.

    monatsanfang+6(2) = '01'.
    monatsende = monatsanfang - 1.
[zB]  Beispiel 6: Vergangene Tage des aktuellen Jahres

Ausgehend vom heutigen Tag des Jahres, möchten Sie wissen, wie viele Tage bereits im Jahr vergangen sind und wie viele Tage des Jahres noch vor Ihnen liegen.

Zur Lösung dieser Fragestellung müssen Sie die folgenden Schritte durchlaufen:

  1. Dem Datumsfeld TAGESDATUM weisen Sie den Wert des Systemdatums zu.

    tagesdatum = sy-datum.
  2. Sie setzen Monat und Tag jeweils auf 01 und weisen sie dem Datumsfeld JAHRESANFANG zu; und Sie setzen Monat und Tag auf 12 bzw. 31 und weisen sie dem Datumsfeld JAHRESENDE zu.

    jahresanfang = sy-datum.
    jahresende = sy-datum.
    jahresanfang+4(4) = '0101'.
    jahresende+4(4) = '1231'.
  3. Subtrahieren Sie JAHRESANFANG von TAGESDATUM, und schreiben Sie das Ergebnis in das Integerfeld TAGE_VERGANGEN.

    tage_vergangen = tagesdatum - jahresanfang.
  4. Subtrahieren Sie TAGESDATUM von JAHRESENDE, und schreiben Sie das Ergebnis in das Integerfeld TAGE_VERBLEIBEND.

    tage_verbleibend = jahresende - tagesdatum.
[zB]  Beispiel 7: Alter einer Person bestimmen

Sie möchten das Alter einer Person bestimmen, und zwar bezogen auf den heutigen Tag: Wie alt ist die Person heute, wenn sie am 23. Dezember 1967 geboren wurde? Das Alter soll hierzu einerseits gerundet in Jahren angegeben werden, andererseits in vollen Jahren und Tagen.

Der erste Teil der Lösung dieser Aufgabe könnte in folgenden Schritten erfolgen:

  1. Dem Datumsfeld TAGESDATUM weisen Sie den Wert des Systemdatums zu.

    tagesdatum = sy-datum.
  2. Dem Datumsfeld GEBURTSDATUM weisen Sie den Wert 19671223 zu.

    geburtsdatum = '19671223'.
  3. Durch Subtraktion des Geburtsdatums vom Tagesdatum erhalten Sie die Differenz der beiden Datumswerte in Tagen. Diese Differenz schreiben Sie in das Integerfeld ALTER_TAGE_I.

    alter_tage_i  = tagesdatum - geburtsdatum.
  4. Sie setzen aus Vereinfachungsgründen ohne die Berücksichtigung von Schaltjahren – hierauf wird im Beispiel des Abschnitts 10.5.2, »Verknüpfte logische Ausdrücke«, genauer eingegangen – ein Jahr mit 365 Tagen an und dividieren deshalb den Inhalt von ALTER_TAGE_I durch 365. Das Ergebnis weisen Sie wieder dem Feld ALTER_JAHRE_I zu. Typbedingt stehen im Integerfeld nur ganzzahlige Werte; das Ergebnis wird deshalb kaufmännisch gerundet in das Feld gestellt. Sie hätten damit den ersten Teil der Aufgabe gelöst und das Alter gerundet in Jahren angegeben.

    alter_jahre_i = alter_tage_i / 365.

Für den zweiten Teil der Aufgabe müssen Sie genauer achtgeben und sich an die unterschiedlichen Divisionsmöglichkeiten erinnern (siehe Abschnitt 4.3.3, »Besonderheiten bei der Division«).

Mit dem Schrägstrich (/) erzielen Sie das genaue Ergebnis mit Dezimalstellen. In Abhängigkeit von der Deklaration des Zielfeldes durchläuft das Ergebnis noch die automatische Typkonvertierung und wird dann typgerecht im Zielfeld abgelegt. Die Division mit dem Operanden DIV führt zu einer ganzzahligen Division mit Rest. Das Ergebnis der ganzzahligen Division wird typgerecht im Zielfeld gespeichert. Der Rest wird bei dieser Operation vergessen. Die Division mit dem Operanden MOD ermittelt diesen Rest und legt das Ergebnis ebenfalls typgerecht im Zielfeld ab.

Damit ergeben sich folgende Möglichkeiten zur Lösung der Teilaufgabe:

  • Soll das genaue Alter in Jahren und Tagen im Dezimalsystem ausgerechnet und dargestellt werden, bilden Sie die Differenz aus Tagesdatum und Geburtsdatum, teilen diese durch 365 und speichern das Ergebnis in einer gepackten Zahl mit beispielsweise vier Nachkommastellen.

    alter_dec4 = ( tagesdatum - geburtsdatum ) / 365.
  • Lautet die Anforderung, das Alter getrennt in vollen Jahren und Tagen anzugeben, ermitteln Sie die vollen Jahre über die ganzzahlige Division mit dem Operanden DIV. In diesem Fall ist es sekundär, ob das Zielfeld vom Typ i oder vom Typ p ist; der Inhalt ist auf jeden Fall ganzzahlig.

    alter_volle_jahre =
    ( tagesdatum - geburtsdatum ) DIV 365.
  • Die ganzzahlige Division hat die vollen Jahre geliefert und die restlichen Tage vergessen. Speziell diese verbleibenden Tage berechnen Sie als Rest der ganzzahligen Division mit dem Operanden MOD.

    alter_resttage = ( tagesdatum - geburtsdatum ) MOD 365.

 


Ihre Meinung?

Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de

<< zurück
 Zum Rheinwerk-Shop
Zum Rheinwerk-Shop: Einstieg in ABAP Einstieg in ABAP
Jetzt Buch bestellen

 Buchempfehlungen
Zum Rheinwerk-Shop: SAP – Der technische Einstieg
SAP – Der technische Einstieg


Zum Rheinwerk-Shop: ABAP Objects – Das umfassende Handbuch
ABAP Objects – Das umfassende Handbuch


Zum Rheinwerk-Shop: ABAP-Entwicklung für SAP S/4HANA
ABAP-Entwicklung für SAP S/4HANA


Zum Rheinwerk-Shop: Kundeneigene Erweiterungen mit ABAP
Kundeneigene Erweiterungen mit ABAP


Zum Rheinwerk-Shop: Schrödinger programmiert ABAP
Schrödinger programmiert ABAP


Zum Rheinwerk-Shop: Migration nach SAP S/4HANA
Migration nach SAP S/4HANA


Zum Rheinwerk-Shop: Design Thinking mit SAP
Design Thinking mit SAP


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und in die Schweiz
InfoInfo

 
 


Copyright © Rheinwerk Verlag GmbH 2020
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt.
Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

 
[Rheinwerk]

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern