12
107 Als Nächstes wenden wir uns der Welt der Zahlen zu. Erfahren Sie in diesem Kapitel, wie Sie Berechnungen in ABAP-Programmen durchführen. 4 Felder und Berechnungen Sie sollten mit allem rechnen – im SAP-System können Sie das sogar mit Datumswerten und Zeichenketten. In diesem Kapitel beginnen wir jedoch mit dem Einfachsten: dem Rechnen mit Zahlen. Vorbereitungen Bevor wir beginnen, sollten Sie entscheiden, ob Sie für die ersten Berech- nungen in ABAP einen neuen Report anlegen oder diese einfach in unse- rem Report aus Kapitel 3, »Programmieren im ABAP Editor«, einbauen. Beides ist natürlich möglich – doch nicht zuletzt für eine bessere Über- sichtlichkeit sollten Sie mit einem frischen Report arbeiten. Die Neuanlage eines Reports wird in Abschnitt 3.1, »ABAP-Report anlegen«, beschrieben. Als Alternative können Sie aber auch einen bestehenden Report kopieren und ihn anschließend modifizieren. Auf diese Weise bleibt der alte Report erhalten, und der neue wird unter einem eigenen Namen abgespeichert. 4.1 Report vorbereiten Report kopieren und modifizieren Starten Sie im Einstiegsbild für den ABAP Editor (SAP Menü Werk- zeuge ABAP Workbench Entwicklung ABAP Editor). Im Start- bildschirm geben Sie als Programmnamen den Namen unseres letz- ten Reports ein, »Z_TEILNEHMERLISTE01«. Anschließend können

4 Felder und Berechnungen - Thali · 107 Als Nächstes wenden wir uns der Welt der Zahlen zu. Erfahren Sie in diesem Kapitel, wie Sie Berechnungen in ABAP-Programmen durchführen

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 4 Felder und Berechnungen - Thali · 107 Als Nächstes wenden wir uns der Welt der Zahlen zu. Erfahren Sie in diesem Kapitel, wie Sie Berechnungen in ABAP-Programmen durchführen

107

Als Nächstes wenden wir uns der Welt der Zahlen zu. Erfahren Sie in diesem Kapitel, wie Sie Berechnungen in ABAP-Programmen durchführen.

4 Felder und Berechnungen

Sie sollten mit allem rechnen – im SAP-System können Sie das sogarmit Datumswerten und Zeichenketten. In diesem Kapitel beginnenwir jedoch mit dem Einfachsten: dem Rechnen mit Zahlen.

Vorbereitungen

Bevor wir beginnen, sollten Sie entscheiden, ob Sie für die ersten Berech-nungen in ABAP einen neuen Report anlegen oder diese einfach in unse-rem Report aus Kapitel 3, »Programmieren im ABAP Editor«, einbauen.Beides ist natürlich möglich – doch nicht zuletzt für eine bessere Über-sichtlichkeit sollten Sie mit einem frischen Report arbeiten. Die Neuanlageeines Reports wird in Abschnitt 3.1, »ABAP-Report anlegen«, beschrieben.Als Alternative können Sie aber auch einen bestehenden Report kopierenund ihn anschließend modifizieren. Auf diese Weise bleibt der alte Reporterhalten, und der neue wird unter einem eigenen Namen abgespeichert.

4.1 Report vorbereiten

Report kopieren und modifizieren

Starten Sie im Einstiegsbild für den ABAP Editor (SAP Menü � Werk-zeuge � ABAP Workbench � Entwicklung � ABAP Editor). Im Start-bildschirm geben Sie als Programmnamen den Namen unseres letz-ten Reports ein, »Z_TEILNEHMERLISTE01«. Anschließend können

Page 2: 4 Felder und Berechnungen - Thali · 107 Als Nächstes wenden wir uns der Welt der Zahlen zu. Erfahren Sie in diesem Kapitel, wie Sie Berechnungen in ABAP-Programmen durchführen

Felder und Berechnungen

108

4

Sie entweder über Programm � Kopieren oder über den ButtonKopieren ( , (Strg) + (F5)) den Kopiervorgang starten (siehe Abbil-dung 4.1).

Abbildung 4.1 ABAP-Programm kopieren

Sie werden nach dem Namen des Zielprogramms gefragt (siehe Abbil-dung 4.2). Dieser muss sich vom Namen des Quellprogramms unter-scheiden, und es gelten für ihn selbstverständlich auch die Namens-konventionen, wie sie in Abschnitt 2.1.2, »Tabelle anlegen undpflegen«, beschrieben werden.

Abbildung 4.2 Namen eines Zielprogramms auswählen

Haben Sie den Namen des Zielprogramms eingetragen, setzen Sie denKopiervorgang über die Schaltfläche Kopieren oder die (¢)-Tastefort. Anschließend haben Sie die Wahl, neben dem Quellcode undden Textelementen auch andere Elemente des alten Programms mitzu kopieren (siehe Abbildung 4.3).

Report vorbereiten

109

4.1

Abbildung 4.3 Elemente eines ABAP-Reports mit kopieren

Für den Anfang können Sie, ohne ein Häkchen zu setzen, einfachüber die Schaltfläche Kopieren den Prozess fortführen und unserenneuen Report als Lokales Objekt abspeichern. Das System zeigtIhnen anschließend wieder das Einstiegsbild des ABAP Editors mitdem neuen Programmnamen. Das alte Programm wurde mit allengewählten Elementen kopiert; beachten sollten Sie nur, dass der neueQuellcode noch inaktiv ist.

Elemente kopieren

Hätten Sie beispielsweise für den alten Quellcode eine Dokumentationhinterlegt, könnte diese ausgewählt und kopiert werden. Alle Elementedieses Fensters sind keine eigenen Objekte der Datenbank, sondern hän-gen fest am Report, d. h., dass beispielsweise die Dokumentation für denReport nicht mehrfach verwendbar ist (etwa für andere Reports), wie esbei einem Datenelement der Fall wäre. Ein Datenelement ist dagegen eineigenes Objekt und damit mehrfach verwendbar.

Über den Ändern-Button ( ) gelangen Sie in den Änderungsmodusfür den Quellcode. Was Sie jetzt sehen, ist nicht neu: Den alten Quell-code kennen Sie bereits. Auffallen könnte Ihnen aber, dass dieREPORT-Anweisung nicht mehr ganz korrekt ist. Sie wurde zwar rich-tig kopiert, doch da sich der Programmname im Operanden geänderthat, sollte es der erste Arbeitsschritt im neuen Quellcode sein, denNamen auf unseren neuen Programmnamen umzuschreiben: Z_TEIL-NEHMERLISTE02.

Page 3: 4 Felder und Berechnungen - Thali · 107 Als Nächstes wenden wir uns der Welt der Zahlen zu. Erfahren Sie in diesem Kapitel, wie Sie Berechnungen in ABAP-Programmen durchführen

Felder und Berechnungen

110

4

Zeilenblock in Kommentarzeilen umwandeln

Was machen Sie mit den Programmzeilen, die Sie nicht mehr benötigen?Es gibt zwei Möglichkeiten: Entweder Sie löschen die Zeilen, oder Sie wan-deln sie in Kommentarzeilen um (»auskommentieren«). Vorsichtige Ent-wickler werden sich zunächst für die zweite Möglichkeit entscheiden, ver-meintlich überflüssige Anweisungen in Kommentarzeilen umzuwandeln,die man vielleicht für die eine oder die andere Anweisung doch noch ein-mal braucht – man kann ja nie wissen.

Deshalb gehen auch wir so vor und wandeln vorsichtshalber zunächstdie alten Anweisungen in Kommentarzeilen um. Hierzu markieren Siemit dem Cursor den zu bearbeitenden Zeilenblock wie in jedem Editorüblich mit den Cursortasten oder mit der Maus. Der markierte Blockwird nun dunkelblau hinterlegt dargestellt (siehe Abbildung 4.4)

Abbildung 4.4 Block markieren

Anschließend wandeln Sie über Hilfsmittel � Block/Ablage � Kom-mentar-* einfügen den gesamten Block in Kommentarzeilen um(siehe Abbildung 4.5). Als Ergebnis sind alle Zeilen des Blocks inSpalte 1 mit einem Stern als Kommentarzeilen gekennzeichnet. Wareine Zeile bereits vorher eine Kommentarzeile, hat sie jetzt zwei füh-rende Sterne.

Report vorbereiten

111

4.1

Abbildung 4.5 Block in Kommentarzeilen umwandeln

Aus Abbildung 4.5 können Sie auch ableiten, wie Sie bei Bedarf einenBlock von Kommentarzeilen analog wieder in Anweisungszeilenumwandeln: Hierzu markieren Sie den Block sowie das Blockendeund wählen Hilfsmittel � Block/Ablage � Kommentar-* löschen.

Zeilenblock löschenDa wir für die Anweisungen ab Zeile 10 aber tatsächlich im Folgen-den keine Verwendung mehr haben, können Sie den Zeilenblockruhig löschen. Hierfür markieren Sie zunächst wieder den entspre-chenden Block und drücken dann die (Entf)-Taste auf Ihrer Tastatur.

Sichern nicht vergessen!

Vergessen Sie nicht, die Veränderung am Quellcode nach wichtigenArbeitsschritten oder vor Arbeitspausen über den Sichern-Button ( ) zuspeichern.

Spreu vomWeizen trennen

Wir können uns nun der eigentlichen Aufgabe dieses Kapitels zuwen-den: Wir verarbeiten nun zwei Zahlen mit ABAP mithilfe der vier

Page 4: 4 Felder und Berechnungen - Thali · 107 Als Nächstes wenden wir uns der Welt der Zahlen zu. Erfahren Sie in diesem Kapitel, wie Sie Berechnungen in ABAP-Programmen durchführen

Felder und Berechnungen

112

4

Grundrechenarten und schreiben das Ergebnis in eine Liste. Hierzusind drei Arbeitsschritte erforderlich:

1. die Felder für die Zahlen deklarieren

2. das Ergebnis berechnen

3. das Ergebnis ausgeben

4.2 Felder deklarieren

Wie in der Praxis müssen auch bei unserer TeilnehmerverwaltungInhalte einer oder mehrerer Tabellen im Report durch Berechnungenweiterverarbeitet, ergänzt oder ausgewertet werden. Hierzu benöti-gen wir im Report eigene Felder.

Felder verarbeiten Auch ABAP verfügt über Regeln, auf welche Weise Felder verarbeitetwerden. Das System muss die Zahlen in unserem Beispiel zwischen-speichern, ablegen und sie sich für folgende Verarbeitungsschrittewieder zurückholen. Hierzu werden die Werte an einem Ort bzw.einer Datenadresse im Speicher temporär abgelegt.

In ABAP heißen diese Orte Felder oder Datenobjekte. Sind die Inhalteder Datenobjekte durch ABAP-Anweisungen veränderbar, sprichtman von Variablen, sind sie es nicht, spricht man von Konstanten.

4.2.1 Variablen deklarieren

Namen vergeben Bei der Namensvergabe für Variablen müssen Sie Folgendes beach-ten:

� Der Name soll mit einem Buchstaben beginnen; er darf nicht aus-schließlich aus Ziffern bestehen.

� Der Name darf maximal 30 Zeichen lang sein.

� Der Name soll möglichst keine Sonderzeichen enthalten, bis auf denUnterstrich. Ausdrücklich verbotene Sonderzeichen sind Plus (+),Komma (,), Doppelpunkt (:), Klammer auf (() und Klammer zu ()).

� Für den Namen dürfen keine reservierten Wörter für ABAP-Anwei-sungen oder Zusätze verwendet werden.

Felder deklarieren

113

4.2

Sprechende Variablen

Die Namen der Variablen sollten darüber hinaus sprechend, d. h. selbster-klärend sein. Nennen Sie die Variable für einen Familiennamen z. B. FAMI-LIENNAME und nicht A1. Legen Sie großen Wert auf Lesbarkeit, und seienSie dementsprechend gnädig mit Dritten – Sie könnten es in wenigenWochen selbst sein.

Felder haben einen symbolischen Namen (z. B. ZAHL01), eine defi-nierte Länge und einen Datentyp. Über die symbolischen Namenwerden die Speicheradressen angesprochen, und die dort abgelegtenInhalte können gelesen und verarbeitet werden. Für die Verarbeitunggelten je nach Datentyp entsprechende Regeln, die allerdings vonProgrammiersprache zu Programmiersprache sehr unterschiedlichsind.

DATASollen sich die Inhalte unserer Zahlenfelder verändern können,deklarieren wir für den Einstieg unsere Felder mit der DATA-Anwei-sung. Für unsere Berechnungen bieten sich vorerst zwei Datentypenfür die Variablen an, nämlich ganze Zahlen (Integer) und Dezimal-zahlen.

TYPE iSoll das Feld ZAHL01 eine ganze Zahl enthalten, lautet die Anweisungfolgendermaßen:

DATA zahl01 TYPE i.

TYPE pSoll das Feld ZAHL01 hingegen eine Dezimalzahl mit zwei Nachkom-mastellen sein, lautet die Anweisung:

DATA zahl01 TYPE p DECIMALS 2.

Bei der Entscheidung, welche Deklaration sinnvoller ist, kommt esdemnach auf den Verwendungszweck an. Felder vom Typ i werdenüblicherweise für Zähler oder Stückzahlen verwendet. Felder vomTyp p sind für arithmetische Berechnungen mit Nachkommastellenüblich. Wichtig ist, vor der weiteren Programmierung zu überlegen,welche Rechen- und Anzeigegenauigkeit bei der gewünschtenBerechnung erforderlich ist, weil sich die Zahl der nötigen Nachkom-mastellen hiernach richtet – denken Sie z. B. an Wechselkurse. FünfNachkommastellen sind in solchen Fällen keine Seltenheit, wogegendie 14 erlaubten Nachkommastellen eher selten ausgereizt werden.

Page 5: 4 Felder und Berechnungen - Thali · 107 Als Nächstes wenden wir uns der Welt der Zahlen zu. Erfahren Sie in diesem Kapitel, wie Sie Berechnungen in ABAP-Programmen durchführen

Felder und Berechnungen

114

4

ElementareDatentypen

Beide Datentypen, i und p, sind für ABAP elementare Datentypenmit fester Länge. Deshalb müssen Sie die Feldlänge hier nicht explizitangeben. Die beiden Datentypen sind zwei von acht dieser in ABAPeingebauten elementaren Datentypen fester Länge.

Umfassenderes Typkonzept

Einen elementaren Datentyp variabler Länge werden Sie noch kennenler-nen. Für ein leichteres Verständnis beschränken wir uns vorerst auf diewichtigsten Datentypen. Auf die Darstellung von Referenzdatentypen undkomplexen Datentypen wird verzichtet. Sie sollten jedoch im Hinterkopfbehalten, dass das Typkonzept in ABAP für fortgeschrittene Anwendungenviel umfassender ist, als hier dargestellt.

Möchten Sie zwei Variablen gleichlautend deklarieren, müssen Siezwei Anweisungszeilen schreiben und darauf achten, dass Sie diesel-ben Attribute verwenden, beispielsweise:

DATA zahl01 TYPE p DECIMALS 2.

DATA zahl02 TYPE p DECIMALS 2.

LIKE Dies hat allerdings den entscheidenden Nachteil, dass Sie immerselbst dafür sorgen müssen, die Deklaration von ZAHL02 nachzupfle-gen, falls sich die Deklaration von ZAHL01 ändert. Bei vielen abhängi-gen Deklarationen wird dies schnell zu einer sehr mühseligen undlangatmigen Arbeit. Einfacher ist es, bei ZAHL02 auf die Deklarationvon ZAHL01 zu verweisen. Dies geschieht mit dem Zusatz LIKE:

DATA zahl01 TYPE p DECIMALS 2.

DATA zahl02 LIKE zahl01.

Damit ist gewährleistet, dass die Deklaration von ZAHL02 immer rich-tig bleibt, da sie so an die Deklaration von ZAHL01 geknüpft ist. Sollteeinmal ein Anlass bestehen, die Zahl der Dezimalstellen beispiels-weise von zwei auf vier zu erhöhen, muss nur die Deklaration vonZAHL01 geändert werden; die Deklaration von ZAHL02 wird automa-tisch angepasst. Natürlich gilt dies entsprechend für alle Variablen ineinem Report, die auf die Deklaration von ZAHL01 verweisen.

Inkonsistenzenvermeiden

Auf diese Weise können Sie zwar erreichen, dass Inkonsistenzeninnerhalb eines Reports vermieden werden, aber falls in verschiede-nen Reports gleichlautende Deklarationen von Variablen benötigt

Felder deklarieren

115

4.2

werden, müssen Sie sich bei der Deklaration beispielsweise auf einTabellenfeld im ABAP Dictionary beziehen. Möchten Sie im Reportdie Variable LAUFENDE_NUMMER genauso deklarieren wie das FeldTNUMMER der Tabelle ZTEILNEHMER, schreiben Sie:

DATA laufende_nummer TYPE zteilnehmer-tnummer.

Mit dieser Methode müssen Sie in den einzelnen Reports keine Anpas-sung dieser Variablen mehr vornehmen. Sollte sich je eine Änderunghinsichtlich der Länge ergeben, betrifft sie ausschließlich die Domänedes Tabellenfeldes. Alle betroffenen Reports werden automatischbeim ersten Start nach der Änderung nachgeneriert, und kein einzigerQuellcode muss aus diesem Grund mehr geändert werden.

Postleitzahlen

Der Praxisbezug dieses Vorgehens wird schnell deutlich, wenn Sie sichdaran erinnern, dass in der Bundesrepublik die Postleitzahlen früher vier-stellig waren und im Jahr 1993 auf fünf Stellen umgestellt wurden. Teil-weise mussten Entwickler in Hunderten kundenspezifischer Programmedas Postleitzahlenfeld suchen und umstellen, die Programme wieder bin-den und kompilieren. Dies war eine absolut lästige Angelegenheit – manglaubt gar nicht, wie viele verschiedene Möglichkeiten es gibt, um dasWort »Postleitzahl« abzukürzen und eine Variable zu deklarieren! Mitunserer Methode wäre das Problem schnell gelöst gewesen.

Ähnliche Probleme treten auf, wenn Unternehmen – beispielsweisebedingt durch eine Fusion – ihre Organisation erheblich umstellen undplötzlich das früher einstellige Regionskennzeichen nicht mehr ausreicht,um knapp fünfhundert Regionen zu unterscheiden, in denen das Unter-nehmen tätig ist. Oder, um zum Beispiel Postleitzahl zurückzukehren, dasUnternehmen wird international tätig und muss neben rein numerischenPostleitzahlen auch englische Postleitzahlen verwalten, die Buchstabenenthalten.

VALUEFür jeden Datentyp vergibt das System Initialwerte. Für die Daten-typen i und p belegt das SAP-System das Feld zunächst mit demWert 0. Manchmal kann es jedoch sehr nützlich sein, eine Variableselbst mit einem Startwert zu versehen – hierzu verwenden Sie beider DATA-Anweisung den Zusatz VALUE. Soll beispielsweise die Varia-ble ZAHL01 eine ganze Zahl darstellen und mit dem Wert 5 vorbelegtwerden, lautet die Anweisung:

Page 6: 4 Felder und Berechnungen - Thali · 107 Als Nächstes wenden wir uns der Welt der Zahlen zu. Erfahren Sie in diesem Kapitel, wie Sie Berechnungen in ABAP-Programmen durchführen

Felder und Berechnungen

116

4

DATA zahl01 TYPE i VALUE 5.

Bei einer Vorbelegung mit dem negativen Wert –105 müsste dasnegative Vorzeichen mitgeschrieben werden, und die Anweisungwürde entsprechend lauten:

DATA zahl01 TYPE i VALUE -105.

Initialwerte mitNachkommastellen

Auch dies ist relativ einfach. Soll die Variable ZAHL01 hingegen eineDezimalzahl mit zwei Nachkommastellen sein, wird das Ganze schonetwas aufwendiger. Lautet der Plan, die Variable ZAHL01 beispiels-weise mit dem Wert 3,14 vorzubelegen, würde man eigentlich eineAnweisung vermuten wie:

DATA zahl01 TYPE p DECIMALS 2 VALUE 3,14.

Dies funktioniert aber leider nicht: Der Doppelpunkt nach DATA fehlt,und das Komma ist für einen Kettensatz und eine zweite Anweisungreserviert, in diesem Fall:

DATA 14.

Dies ergäbe leider auch keinen Sinn. Es funktioniert auch nicht, fürdas Dezimaltrennzeichen anstelle des Kommas einen Punkt einzuset-zen. Grundsätzlich ist diese Idee ausgezeichnet, weil das Systemintern als Dezimaltrennzeichen tatsächlich einen Punkt verwendet,aber wie Sie wissen, ist der Punkt für das Ende einer Anweisungreserviert. Für das System würden dann zwei Anweisungen in einerZeile stehen, wobei die zweite keinen Sinn ergibt.

Lösung: Literal Deshalb ist es formal korrekt, wenn Sie den Vorbelegungswert in einLiteral schreiben:

DATA zahl01 TYPE p DECIMALS 2 VALUE '3.14'.

Bei der Vorbelegung mit der negativen Zahl –4,56 lautet die richtigeSyntax entsprechend:

DATA zahl01 TYPE p DECIMALS 2 VALUE '-4.56'.

4.2.2 Konstanten deklarieren

CONSTANTS Der Vollständigkeit halber erwähnen wir hier, dass wir für die Dekla-ration von Konstanten, d. h. Feldern mit gleichbleibendem unverän-

Grundrechenarten

117

4.3

derten Inhalt, mit einer eigenen Anweisung namens CONSTANTS arbei-ten. Damit werden wir denjenigen Fällen gerecht, in denengewährleistet sein muss, dass ein Feldinhalt während der Laufzeit desReports unverändert bleiben soll. Stoßen Sie in der Praxis auf ein sol-ches Beispiel, ist die CONSTANTS-Anweisung geeigneter als die DATA-Anweisung. Das System unterstützt dieses Konzept dadurch, dass beiVeränderungsversuchen dieser Felder Syntax- oder Laufzeitfehlergeneriert werden.

Einfache arithmetische Operationen

Da diese Anweisungen allerdings bis auf den Verwendungszweckweitgehend identisch sind, verzichten wir für den Einstieg auf dieCONSTANTS-Anweisung. Für einfache arithmetische Operationenkönnten unsere Deklarationen deshalb vorerst so aussehen:

DATA zahl01 TYPE p DECIMALS 2 VALUE '-4.56'.

DATA zahl02 LIKE zahl01 VALUE '5.67'.

DATA ergebnis LIKE zahl01.

Die Variable ZAHL01 gibt den Datentyp p und die Anzahl von zweiDezimalstellen vor. Außerdem wird der Variablen die negative Zahl –4,56 als Startwert zugewiesen. Die Variable ZAHL02 verweist hinsicht-lich des Typs und der Dezimalstellen auf die Variable ZAHL01 underhält als Startwert die Zahl 5,67. Die Variable ERGEBNIS verweist hin-sichtlich des Typs und der Dezimalstellen ebenfalls auf ZAHL01.

Der Vorteil dieser Schreibweise besteht darin, dass bei einer Ände-rung der Deklaration nur die Deklaration von ZAHL01 geändert wer-den muss, die Deklarationen von ZAHL02 und ERGEBNIS werden auto-matisch angepasst.

4.3 Grundrechenarten

Für die Addition, Subtraktion, Multiplikation und Division in ABAPhaben wir damit bereits alle erforderlichen Variablen deklariert.Arithmetische Operationen können Sie nun leicht über Zuweisungendurchführen: Soll beispielsweise der Inhalt der Felder ZAHL01 undZAHL02 addiert werden, schreiben Sie einfach:

ergebnis = zahl01 + zahl02.

Page 7: 4 Felder und Berechnungen - Thali · 107 Als Nächstes wenden wir uns der Welt der Zahlen zu. Erfahren Sie in diesem Kapitel, wie Sie Berechnungen in ABAP-Programmen durchführen

Felder und Berechnungen

118

4

MathematischerAusdruck

Formal ist anzumerken, dass rechts vom Gleichheitszeichen die arith-metische Operation selbst stehen muss. Das Ergebnis der Operationwird in das links vom Gleichheitszeichen stehende Feld eingetragen,die Felder ZAHL01 und ZAHL02 behalten auch nach der Berechnungihren alten Inhalt. Anders hingegen verhält es sich mit dem Feld linksvom Gleichheitszeichen: Im Feld ERGEBNIS steht nach der Berechnungnicht mehr der alte, sondern der neue Inhalt; der alte Inhalt des Fel-des wurde ersetzt.

Leerzeichen in arithmetischen Operationen

Darüber hinaus ist für die richtige Schreibweise der Umgang mit Leerzei-chen wichtig: Sie müssen sowohl vor als auch nach dem Gleichheitszei-chen sowie vor und nach dem Rechenzeichen stehen, im oberen Beispieldem Pluszeichen (+). Wenn Sie später einmal mit komplexeren Ausdrü-cken und mehreren Klammerebenen arbeiten, sollten Sie schon jetzt darandenken, dass in solchen Fällen auch vor und nach jeder Klammer ein Leer-zeichen stehen muss. Dabei muss es jeweils mindestens ein Leerzeichensein; die Eingabe mehrerer Leerzeichen schadet nicht weiter.

Der Grund für diese Schreibkonvention liegt darin, dass es Funktionengibt, die ohne Leerzeichen direkt an das Feld geschrieben werden. Damitdas System nun unterscheiden kann, ob es sich um eine arithmetischeOperation oder eine solche Funktion handelt, wird das Leerzeichen unbe-dingt benötigt.

Mit Festwertenarbeiten

Soll zum Inhalt der Variablen ZAHL02 ein Festwert, beispielsweise dieZahl 2, addiert werden, lautet die Anweisung:

zahl02 = zahl01 + 2.

Auch hier gilt die Regel, dass in der Variablen links vom Gleichheits-zeichen der alte Inhalt durch den neuen ersetzt wird. Natürlichkönnte man zum Inhalt derselben Variablen auch einen Festwertaddieren, beispielsweise um einen Zähler um 1 zu erhöhen. Dannwürde die Anweisung lauten:

zahl01 = zahl01 + 1.

Auch hier gilt wieder das gleiche Prinzip: Rechts vom Gleichheitszei-chen wird der Wert der Operation bestimmt, d. h. der Inhalt vonZAHL01 und 1 werden addiert und das Ergebnis der Operation in die

Grundrechenarten

119

4.3

Variable links vom Gleichheitszeichen eingesetzt. Mit anderen Wor-ten: ZAHL01 erhält einen neuen Inhalt.

Für die Subtraktion, Multiplikation und Division lautet die Schreib-weise entsprechend:

ergebnis = zahl01 - zahl02.

ergebnis = zahl01 * zahl02.

ergebnis = zahl01 / zahl02.

Anweisungen mit Schlüsselwort

Als Rechenzeichen für Subtraktionen verwenden Sie das Minuszei-chen (-), für Multiplikationen das Sternchen (*) und für Divisionenden Schrägstrich (/). Anstelle von Rechenzeichen könnten wir auchdie Schlüsselwörter ADD, SUBTRACT, MULTIPLY und DIVIDE verwenden,die in der Praxis aber relativ selten anzutreffen sind; auch wir werdenim Folgenden darauf verzichten.

Damit haben Sie die Grundvoraussetzungen kennengelernt – und wirwenden uns den Details zu, denn hierin versteckt sich ja bekanntlichoft der Teufel. Beispielsweise haben nicht alle Felder die gleichenAttribute oder sind untereinander verträglich.

4.3.1 Kompatible und konvertible Datenobjekte

Kompatible und konvertible Datenobjekte

Verfügen Felder über die gleichen Attribute, spricht man von kompa-tiblen Datenobjekten, d. h. dass diese Felder in allen technischenEigenschaften (Typ, Feldlänge, Dezimalstellen) vollständig überein-stimmen. Sind die Attribute untereinander verträglich, spricht manvon konvertiblen Datenobjekten. Dabei müssen die Datentypen kon-vertiert, d. h. umgewandelt werden; Voraussetzung hierfür sind ent-sprechende Konvertierungsregeln. Falls die Konvertierung nichtmöglich ist, entstehen Syntax- oder Laufzeitfehler.

Automatische Umwandlung

Beruhigend ist, dass im SAP-System bereits zahlreiche Konvertie-rungsregeln hinterlegt sind (siehe Abschnitt 4.3.2, »Konvertierungs-regeln«). Das System wandelt bei entsprechenden Anweisungen nachdiesen Regeln automatisch von einem Datentyp in einen anderen um.Sofern diese Regeln die von uns gewünschten Ergebnisse erzielen,haben wir kein Problem. Leider ist dies aber nicht immer der Fall,und leider existieren auch nicht für alle denkbaren KonstellationenKonvertierungsregeln.

Page 8: 4 Felder und Berechnungen - Thali · 107 Als Nächstes wenden wir uns der Welt der Zahlen zu. Erfahren Sie in diesem Kapitel, wie Sie Berechnungen in ABAP-Programmen durchführen

Felder und Berechnungen

120

4

Fehlerquellen

Zähneknirschend muss außerdem hingenommen werden, dass für solcheFehler überwiegend die Entwickler selbst verantwortlich sind – denn es gibtz. B. keinen logischen Grund dafür, in einem Datumsfeld Sternchen undSonderzeichen speichern zu wollen. Solche Syntax- oder Laufzeitfehlergeschehen immer wieder einmal auch Fortgeschrittenen, und zwar insbe-sondere dann, wenn bereits bestehende Anwendungen modifiziert werdenmüssen. Auch bei einer Datenübernahme aus anderen Systemen tauchensolche Fehler auf – für einen Einsteiger erst einmal kein Grund zur Panik.

4.3.2 Konvertierungsregeln

Was geschieht,wenn ...

Die Konvertierungsregeln legen fest, wie der Inhalt eines Quellfeldes inein Zielfeld eingetragen wird. Quellfelder können verschiedene Daten-typen haben, wie die bereits vorgestellten vom Typ p für gepackte undTyp i für ganze Zahlen. Da es, wie erwähnt, auch weitere Datentypenfür Datums- und Zeitfelder oder Zeichenketten gibt, legen die Konver-tierungsregeln pro Datentyp genau fest, wie der Inhalt des Quellfeldesin das Zielfeld eingestellt wird. Was geschieht, wenn Sie eine gepackteZahl in ein Integerfeld stellen, was geschieht, wenn Sie eine gepackteZahl zum Inhalt eines Datumsfeldes addieren, oder was geschieht,wenn Sie eine gepackte Zahl in ein Character-Feld schreiben? Lassen Sieuns hierzu eine Konvertierungsregel als Beispiel ansehen.

Dezimalzahlin ganze Zahl

umwandeln

Ist der Quelltyp ein Datenobjekt vom Typ p und der Zieltyp einDatenobjekt vom Typ i (eine ganze Zahl), rundet das System die Dezi-malstellen des Quellfeldes und stellt den Inhalt rechtsbündig in dasZielfeld. Ist das Zielfeld von seiner Länge her ausreichend, wird linksmit Nullen aufgefüllt, anderenfalls kommt es zu einem Überlauf bzw.Laufzeitfehler. Stellen Sie beispielsweise die gepackte Zahl 4,44 in einIntegerfeld, hat ein Integerfeld danach den Inhalt 4; stellen Sie diegepackte Zahl 5,55 in ein Integerfeld, hat es den Inhalt 6.

Konvertierungverschiedener

Datentypen

Falls in einer numerischen Operation mehrere verschiedene Daten-typen vorkommen, konvertiert ABAP vor dem Ausführen der Opera-tion alle Datentypen in den höchsten vorkommenden Datentyp, führtdann die Operation mit den konvertierten Werten aus und stelltanschließend das Ergebnis – eventuell wieder über eine Konvertie-rungsregel – in das Ergebnisfeld.

Grundrechenarten

121

4.3

Ganze und gepackte Zahlen sowie Exponentialzahlen

Sollten beispielsweise ganze Zahlen, gepackte Zahlen und Exponentialzah-len in einer Operation vorkommen, würden die Exponentialzahlen denDatentyp auf höchster Ebene darstellen. Erst würden alle ganzen Zahlen ingepackte Zahlen umgewandelt, dann alle Zahlen in Exponentialzahlen,und schließlich würde die Operation mit Exponentialzahlen berechnet.Anschließend würde gemäß den Konvertierungsregeln der Wert der Expo-nentialzahlen in das Ergebnisfeld eingetragen. Sie können sich wahr-scheinlich gut vorstellen, dass die Rechengenauigkeit schon durch denDatentyp des Ergebnisfeldes beeinflusst werden kann.

Um sich das Leben nicht zu erschweren, sollten Sie von Anfang andarauf achten, Ihre Datenobjekte möglichst kompatibel zu halten.

COMPUTEDer Vollständigkeit halber erwähnen wir hier das COMPUTE-Schlüssel-wort, das für numerische Operationen das ursprüngliche ABAP-Kom-mando ist. Die Schreibweise für eine Addition unter Zuhilfenahmedes Schlüsselwortes COMPUTE lautet:

COMPUTE ergebnis = zahl01 + zahl02.

Wie Sie sehen, ist die Anweisung nur länger, und die Lesbarkeitwird nicht unbedingt erhöht. Glücklicherweise ist das SchlüsselwortCOMPUTE optional und wird in der Praxis – außer für Recherche-zwecke – kaum verwendet; die meisten Entwickler bevorzugen dieverkürzte Schreibweise, die intern vom System exakt gleich behandeltwird, und auch wir arbeiten im Folgenden ohne das SchlüsselwortCOMPUTE:

ergebnis = zahl01 + zahl02.

Gut zu wissen …

Es gibt allerdings einen Fall, in dem es notwendig ist zu wissen, dass esdie COMPUTE-Anweisung gibt: Falls Sie im System die Dokumentation zuselten benötigten Funktionen suchen, finden Sie diese nämlich nur beider COMPUTE-Anweisung.

Ab SAP NetWeaver 7.0 EHP 2 bzw. SAP NetWeaver 7.3 erlaubt dieCOMPUTE-Anweisung den Zusatz EXACT, was bei Berechnungen mit dezi-malen Gleitpunktzahlen ein besonderes Verhalten bewirkt. Dieser Zu-satz ist nur im Zusammenhang mit dem ausgeschriebenen SchlüsselwortCOMPUTE verfügbar.

Page 9: 4 Felder und Berechnungen - Thali · 107 Als Nächstes wenden wir uns der Welt der Zahlen zu. Erfahren Sie in diesem Kapitel, wie Sie Berechnungen in ABAP-Programmen durchführen

Felder und Berechnungen

122

4

4.3.3 Besonderheiten bei der Division

Verschiedene Fälle Für Berechnungen in ABAP stellen Addition, Subtraktion und Multi-plikation kein weiteres Problem dar; nur die Division sollten wir unsnoch etwas genauer ansehen. Es gibt Fälle, in denen Sie ein Divisions-ergebnis mit Nachkommastellen wünschen, aber auch Fälle, in denenSie ganzzahlig ohne Rest teilen möchten. Vielleicht interessiert unsaber auch nur der Rest einer solchen Division. Für diese verschiede-nen Varianten gibt es in ABAP auch verschiedene Anweisungen.

Der einfachste Fall einer Division wird – wie bereits erläutert – durchden Schrägstrich (/) dargestellt:

DATA zahl01 TYPE p DECIMALS 2 VALUE '4.56'.

DATA zahl02 LIKE zahl01 VALUE '5.67'.

DATA ergebnis LIKE zahl01.

ergebnis = zahl02 / zahl01.

Rechengenauigkeit Wenn Sie das Ergebnis mit dem Taschenrechner ausrechnen, erhaltenSie die Zahl 1,243421053. Wie verhält sich ABAP? Alle Variablensind gleichlautend deklariert. Eine gepackte Zahl hat maximal 16Bytes, dies bedeutet 32 Stellen, inklusive Vorzeichen. Das Systemwürde das genaue Ergebnis liefern (bei ABAP liegt die Rechengenau-igkeit von gepackten Zahlen bei maximal 14 Nachkommastellen), esaber auf zwei Nachkommastellen in der Zielvariable runden, die wirselbst mit zwei Dezimalstellen deklariert haben. Diese erhält, durchABAP kaufmännisch gerundet, den Wert 1.24.

DIV Falls Sie das Ergebnis einer ganzzahligen Division erhalten möchten,müssten Sie die Anweisung umschreiben und statt des Schrägstrichsden Operator DIV einsetzen:

ergebnis = zahl02 DIV zahl01.

Unter sonst gleichen Voraussetzungen ergibt die ganzzahlige Divisionfür den Quotienten den Wert 1. Da die Zielvariable zwei Dezimalstel-len hat, steht dort nach dem Ausführen der Anweisung als Inhalt 1.00.

MOD Im dritten Fall interessiert uns der Rest der Ganzzahldivision. Für die-sen Fall verwenden wir den Operanden MOD, und die Anweisung lau-tet:

ergebnis = zahl02 MOD zahl01.

Codebeispiel zu Feldern und Berechnungen

123

4.4

Wieder unter der Annahme, dass alle übrigen Faktoren gleichbleiben,ergibt die ganzzahlige Division 1, Rest 1,11. Dieser Rest wird mitzwei Dezimalstellen in die Zielvariable übertragen, und sie erhältdementsprechend als Inhalt den Wert 1.11.

1,5 Stunden

Möglicherweise fragen Sie sich jetzt, ob solche Berechnungen überhauptpraxisrelevant sind: Aber denken Sie nur daran, dass Stunden, Tage oderJahre in vielen Systemen nicht in Stunden und Minuten erfasst werden,sondern mit Dezimalwerten wie »1,5 Stunden«. Um diese Dezimalwerteauf Stunden und Minuten umzurechnen, kommen Sie um die genanntenDivisionsmöglichkeiten nicht herum. Weitere Beispiele finden Sie in Kapi-tel 5, »Modifikation von Zeichenketten«, und Kapitel 8, »Rechnen mitDatum und Zeit, Mengen und Währungen«.

4.4 Codebeispiel zu Feldern und Berechnungen

Schauen wir uns die verschiedenen Berechnungsmöglichkeiten nunanhand unseres vorbereiteten Reports an:

1 *&---------------------------------------------*

2 *& Report Z_TEILNEHMERLISTE02 *

3 *& *

4 *&---------------------------------------------*

5 *& *

6 *& *

7 *&---------------------------------------------*

8

9 REPORT z_teilnehmerliste02 .

10

11 * Variable deklarieren

12 DATA zahl01 TYPE p DECIMALS 2 VALUE '4.56'.

13 DATA zahl02 LIKE zahl01 VALUE '5.67'.

14 DATA ergebnis_addition LIKE zahl01.

15 DATA ergebnis_subtraktion LIKE zahl01.

16 DATA ergebnis_multiplikation LIKE zahl01.

17 DATA ergebnis_division_genau LIKE zahl01.

18 DATA ergebnis_division_ganzzahl LIKE zahl01.

19 DATA ergebnis_division_rest LIKE zahl01.

20

Page 10: 4 Felder und Berechnungen - Thali · 107 Als Nächstes wenden wir uns der Welt der Zahlen zu. Erfahren Sie in diesem Kapitel, wie Sie Berechnungen in ABAP-Programmen durchführen

Felder und Berechnungen

124

4

21 * Verarbeitungsteil

22 zahl01 = zahl01 + 1.

23 zahl02 = zahl01 + 2.

24 ergebnis_addition = zahl01 + zahl02.

25 ergebnis_subtraktion = zahl01 - zahl02.

26 ergebnis_multiplikation = zahl01 * zahl02.

27 ergebnis_division_genau = zahl02 / zahl01.

28 ergebnis_division_ganzzahl = zahl02 DIV zahl01.

29 ergebnis_division_rest = zahl02 MOD zahl01.

30

31 * Ausgabeteil

32 WRITE: / 'zahl01', zahl01,

33 / 'zahl02', zahl02,

34 / 'ergebnis_addition:',

ergebnis_addition,

35 / 'ergebnis_subtraktion:',

ergebnis_subtraktion,

36 / 'ergebnis_multiplikation:',

ergebnis_multiplikation,

37 / 'ergebnis_division_genau:',

ergebnis_division_genau,

38 / 'ergebnis_division_ganzzahl:',

ergebnis_division_ganzzahl,

39 / 'ergebnis_division_rest:',

ergebnis_division_rest.

Listing 4.1 Report Z_TEILNEHMERLISTE02

Anmerkungen zum Quellcode

Nach den Kommentarzeilen gliedert sich unser Report in drei Teile,die im Folgenden kurz beschrieben sind.

Zeile 1 bis 8

Diese Zeilen werden vom System wieder automatisch als Kommen-tarzeilen generiert.

Zeile 11

Der Quellcode wird in übersichtliche Abschnitte eingeteilt, die derLesbarkeit dienen. In Listing 4.1 werden diese Abschnitte mit dreiKommentarzeilen gebildet: Variable deklarieren (Zeile 11 bis 19),Verarbeitungsteil (Zeile 21 bis 29) und Ausgabeteil (Zeile 31 bis 39).

Codebeispiel zu Feldern und Berechnungen

125

4.4

Zeile 12

Die Variable ZAHL01 wird als gepackte Zahl mit zwei Nachkommastel-len deklariert, und sie erhält als Startwert die Zahl 4,56.

Zeile 13

Die Variable ZAHL02 erhält als Startwert die Zahl 5,67 und die glei-chen Eigenschaften wie ZAHL01.

Zeile 14 bis 19Frage der Weiter-verarbeitung

Die Ergebnisfelder werden deklariert; für jedes Ergebnis wird eineigenes Feld angelegt. Natürlich hätte man nur das Feld ERGEBNISanlegen und immer wieder überschreiben können, aber es hängt vonder Art der Weiterverarbeitung ab, ob man einen Feldinhalt spätervielleicht wieder benötigt oder nicht – und Sie möchten gleich dieverschiedenen Berechnungsergebnisse ausgeben.

Nicht mit Variablen geizen

Arbeitsspeicher und Hardware sind kein Argument mehr, um mit Varia-blen zu knausern, sondern Lesbarkeit und Transparenz sind heute diewesentlicheren Qualitätsfaktoren. Wenn es der Qualität dient, sollten Siedeshalb nicht mit Variablen geizen.

Zeile 21

Der Verarbeitungsteil beginnt.

Zeile 22

Der Wert des Feldes ZAHL01 wird um 1 erhöht. Vor der Anweisungwar der Inhalt 4.56, danach ist er 5.56.

Zeile 23

Das Feld ZAHL02 erhält den Inhalt aus der Addition von ZAHL01 undder Zahl 2. Der alte Inhalt von ZAHL02 war 5.67, der neue Inhalt ist7.56.

Zeile 24

Das Feld ERGEBNIS_ADDITION erhält das Ergebnis der OperationZAHL01 plus ZAHL02, das ist 5.56 plus 7.56 und ergibt 13.12.

Page 11: 4 Felder und Berechnungen - Thali · 107 Als Nächstes wenden wir uns der Welt der Zahlen zu. Erfahren Sie in diesem Kapitel, wie Sie Berechnungen in ABAP-Programmen durchführen

Felder und Berechnungen

126

4

Zeile 25

Das Ergebnis der Subtraktion von ZAHL01 und ZAHL02 ist die negativeZahl 2. Sie wird im Ergebnisfeld ERGEBNIS_SUBTRAKTION als 2.00- dar-gestellt.

Zeile 26

Da ZAHL01 inzwischen den Wert 5.56 und ZAHL02 den Wert 7.56 hat,lautet das Ergebnis der Multiplikation auf zwei Nachkommastellengerundet 42.03.

Zeile 27

Das Ergebnis der Division: 7.56 geteilt durch 5.56 ist gerundet 1.36 –und gleichzeitig der neue Inhalt von ERGEBNIS_DIVISION_GENAU.

Zeile 28

Die ganzzahlige Division ergibt 1.00. Durch die Formatierung wer-den die eigentlich überflüssigen Dezimalstellen mitgezogen.

Zeile 29

Der Rest der Ganzzahldivision beträgt 2.00. Dieser Wert wird in dasFeld ERGEBNIS_DIVISION_REST übertragen.

Zeile 31

Der Abschnitt für die Listerstellung beginnt.

Zeile 32 bis 39

Die WRITE-Anweisung gibt in einer neuen Zeile in Spalte 1 ein Literalals Text aus und anschließend mit einer Leerstelle den Inhalt der Vari-ablen. Die WRITE-Anweisung ist als Kettensatz geschrieben, hinterdem sich eigentlich 16 WRITE-Anweisungen verbergen. Hinter derAnweisung WRITE steht ein Doppelpunkt; die einzelnen Anweisungensind durch Kommata getrennt, und nur die letzte Anweisung des Ket-tensatzes wird mit einem Punkt abgeschlossen.

Ausgabe des Quellcodes

Wenn Sie den Report wie eben editiert, gesichert, geprüft und akti-viert haben, können Sie ihn ausführen, und das Listbild sollte wie inAbbildung 4.6 aussehen.

Codebeispiel zu Feldern und Berechnungen

127

4.4

Abbildung 4.6 Listbild zum Beispiel der Grundrechenarten

Verbesserungs-würdige Optik

Formal und logisch ist hier alles richtig – aber auch das Auge pro-grammiert mit! Da hier die Literale am Zeilenanfang unterschiedlichlang sind, stehen die ausgegebenen Variablen an unterschiedlichenSpaltenpositionen und damit nicht spaltengerecht. Deshalb kümmernwir uns im letzten Schritt noch um die optische Spaltenaufteilung.

Verbesserte Listaufbereitung

Felder einer Liste spaltengerecht ausgeben

Dieses kleine Problem lösen Sie, indem Sie dem WRITE-Kommandobei der Ausgabe mitteilen, an welcher Position einer Zeile die Varia-ble abgebildet werden soll. Möchten Sie die Variable ab Spalte 30ausgeben, müssen Sie Zeile 32 von Listing 4.1 folgendermaßenändern:

WRITE: / 'zahl01', 30 zahl01,

Vor die betreffende Variable schreiben Sie einfach die Spaltenposi-tion der Druckzeile. Beachten Sie, dass zwischen Spaltenposition undVariable mindestens eine Leerstelle bestehen bleiben muss.

Komplexe Listen

Die restlichen relevanten Zeilen könnten Sie entsprechend editieren,indem Sie vor jede betroffene Variable die Ausgabeposition schreiben. Beikurzen und überschaubaren Ausgaben ist dieses Vorgehen auch vertret-bar. Sollte eine Liste allerdings aufwendiger und komplexer zusammenge-setzt sein, könnten Sie es auch mit der nachfolgend beschriebenen Mög-lichkeit versuchen – ähnlich des Verweises bei den Datendeklarationen mitLIKE.

Page 12: 4 Felder und Berechnungen - Thali · 107 Als Nächstes wenden wir uns der Welt der Zahlen zu. Erfahren Sie in diesem Kapitel, wie Sie Berechnungen in ABAP-Programmen durchführen

Felder und Berechnungen

128

4

UNDER Einen Verweis auf ein anderes Objekt können Sie auch bei der Druck-position verwenden, indem Sie einfach auf die Position einer anderenVariablen verweisen. Sollte sich die Position der führenden Variablenändern, ziehen alle anderen referenzierenden Variablen automatischnach. Hierzu wird beim WRITE-Kommando die AufbereitungsoptionUNDER verwendet. Editieren Sie die Zeilen 33 bis 39 wie folgt:

33 / 'zahl02', zahl02 UNDER zahl01,

34 / 'ergebnis_addition:',

ergebnis_addition UNDER zahl01,

35 / 'ergebnis_subtraktion:',

ergebnis_subtraktion UNDER zahl01,

36 / 'ergebnis_multiplikation:',

ergebnis_multiplikation UNDER zahl01,

37 / 'ergebnis_division_genau:',

ergebnis_division_genau UNDER zahl01,

38 / 'ergebnis_division_ganzzahl:',

ergebnis_division_ganzzahl UNDER zahl01,

39 / 'ergebnis_division_rest:',

ergebnis_division_rest UNDER zahl01.

Nach dem Sichern, Prüfen, Aktivieren und Ausführen des Reportssollte das Listbild wie in Abbildung 4.7 aussehen.

Abbildung 4.7 Listbild mit spaltengerechter Ausgabe