Sie sind auf Seite 1von 748

Inhaltsverzeichnis

Einfhrung Auf einen Blick Tag 1 Die Entwicklungsumgebung


Kapitelziele Was ist R/3? Wie sieht R/3 aus? Die Basis Client-Server R/3-Systemarchitektur Architektur des Applikationsservers Open SQL von SAP Zusammenfassung Fragen & Antworten Workshop

Tag 2 Ihr erstes ABAP/4-Programm


Kapitelziele Bevor es weitergeht Die Entwicklungsumgebung Programmtypen Reportbestandteile Ihr erstes Programm Der Quelltexteditor Hilfe Ihre Entwicklungsobjekte wiederfinden Das R/3-Data Dictionary Die ABAP/4-Syntax

Zusammenfassung Fragen & Antworten Workshop

Tag 3 Das Data Dictionary, Teil 1


Kapitelziele R/3-Release-Stnde Tiefer im R/3-Data Dictionary stbern Die verschiedenen Tabellentypen in R/3 Tabellenkomponenten Namenskonventionen fr Tabellen und ihre Komponenten Anlegen einer transparenten Tabelle und ihrer Komponenten Tabellenmodifizierung Arbeiten mit Daten Zugriff auf die Datenbrowser-Funktionalitt aus DDIC heraus Zusammenfassung Fragen & Antworten Workshop

Tag 4 Das Data Dictionary, Teil 2


Kapitelziele Fremdschlssel Besondere Tabellenfelder Strukturen im Data Dictionary Zusammenfassung Fragen & Antworten Workshop

Tag 5 Das Data Dictionary, Teil 3


Kapitelziele Tabellenindizes Technische Einstellungen Zusammenfassung Fragen & Antworten Workshop

Tag 6 Das Data Dictionary, Teil 4


Kapitelziele Automatische Tabellenhistorie und nderungsbelege Zusammenfassung der Technischen Einstellungen berarbeitete und aktive Versionen Das Datenbank-Utility benutzen Zusammenfassung Fragen & Antworten Workshop

Tag 7 Datendefinitionen in ABAP/4, Teil 1


Kapitelziele Programmpuffer und der Rollbereich ABAP/4-Syntaxelemente Datenobjekte definieren Zusammenfassung Fragen & Antworten Workshop

Rckblick Auf einen Blick Tag 8 Datendefinition in ABAP/4, Teil 2


Kapitelziele Definition der Konstanten Definition von Feldleisten Definition von Typen Strukturierte Typen Zusammenfassung Fragen & Antworten Workshop

Tag 9 Zuweisungen, Konvertierungen und Berechnungen


Kapitelziele

Bevor Sie weiterlesen Arbeiten mit Systemvariablen Systemvariablen suchen Zuweisungsanweisungen Dynamische Zuweisungen Zusammenfassung Fragen & Antworten Workshop

Tag 10 Allgemeine Kontrollanweisungen


Kapitelziele Die if-Anweisung Die case-Anweisung Die Anweisung do Der Anweisung while Die Anweisung continue Die Anweisung check Vergleich der Anweisungen exit, continue und check Einfache Positions- und Lngenspezifikationen fr die Anweisung write Zusammenfassung Fragen & Antworten Workshop

Tag 11 Interne Tabellen


Kapitelziele Grundlagen interner Tabellen Zusammenfassung Fragen & Antworten Workshop

Tag 12 Interne Tabellen, Teil 1


Kapitelziele Den Inhalt interner Tabellen testen und modifizieren Informationen ber eine interne Tabelle erhalten Daten von einer internen Tabelle in eine andere kopieren Die editor-call-Anweisung

Zeilen in eine interne Tabelle einfgen Zeilen einer internen Tabelle modifizieren Den Inhalt einer internen Tabelle lschen Das Anlegen von Top-Ten-Listen mit Hilfe von append sorted by Eine interne Tabelle mit collect fllen Zusammenfassung Frage & Antwort Workshop

Tag 13 Interne Tabellen, Teil 2


Kapitelziele Eine interne Tabelle mit Daten aus einer Datenbanktabelle fllen Der Gebrauch von lfa1-, lfb1-, lfc1- und lfc3-Beispieltabellen Gruppenwechsel Zusammenfassung Fragen & Antworten Workshop

Tag 14 Die write-Anweisung


Kapitelziele Standardlngen und Formatierungen Ergnzungen zur write-Anweisung Das Arbeiten mit Unter(Sub)feldern Zusammenfassung Fragen & Antworten Workshop

Rckblick Auf einen Blick Tag 15 Formatierungstechniken, Teil 1


Kapitelziele Grafische Formatierung mit Hilfe der write-Anweisung Berichtsformatierung und Druckausgabe Zusammenfassung

Fragen & Antworten Workshop

Tag 16 Formatierungstechniken, Teil 2


Kapitelziele Anweisungen fr die Ausgabeaufbereitung Die Anweisung skip Die Syntax der Anweisung skip Zusammenfassung Fragen & Antworten Workshop

Tag 17 Modularisierung: Ereignisse und Unterprogramme


Kapitelziele Modularisierungseinheiten in ABAP/4 Ereignisse Unterprogramme Zusammenfassung Fragen & Antworten Workshop

Tag 18 Modularisierung: bergabe von Parametern an Unterprogramme


Kapitelziele Parameterbergabe Externe Unterprogramme definieren und aufrufen Zusammenfassung Fragen & Antworten Workshop Kontrollfragen bung 1

Tag 19 Modularisierung: Funktionsbausteine, Teil 1


Kapitelziele Verwendung der include-Anweisung

Funktionsbausteine Funktionsgruppen Aufruf von Funktionsbausteinen Anlegen eines Funktionsbausteins Zusammenfassung Fragen & Antworten Workshop

Tag 20 Modularisierung: Funktionsbausteine, Teil 2


Kapitelziele Globale Daten fr Funktionsbausteine definieren Eine interne Tabelle an einen Funktionsbaustein bergeben Unterprogramme in einer Funktionsgruppe definieren Einen Funktionsbaustein freigeben Einen Funktionsbaustein testen Existierende Funktionsbausteine finden Die Komponenten Ihrer Funktionsgruppe untersuchen Fehler in Funktionsbausteinen finden und beheben Den Rckgabewert von sy-subrc setzen Die call function-Anweisung automatisch einfgen Zusammenfassung Fragen & Antworten Workshop

Tag 21 Selektionsbilder
Kapitelziele Ereignisgesteuerte Programmierung Datenprfungen mit Fremdschlsseln Datenprfungen mit Matchcodes Selektionsbilder formatieren selection-screen-Anweisungen benutzen Selektionsbild Parameter Selektionsbild checkbox Selektionsbild select-options Selektionsbild Auswahlknpfe (Optionen) Beispielprogramm fr ein Selektionsbild Die Meldungsanweisung benutzen

Zusammenfassung Fragen & Antworten Workshop

Rckblick Anhang A Namenskonventionen


Programm-Namenskonventionen Kundennamensrume

Anhang B Antworten zu den Kontrollfragen und bungen


Kapitel 1 Kapitel 2 Kapitel 3 Kapitel 4 Kapitel 5 Kapitel 6 Kapitel 7 Kapitel 8 Kapitel 9 Kapitel 10 Kapitel 11 Kapitel 12 Kapitel 13 Kapitel 14 Kapitel 15 Kapitel 16 Kapitel 17 Kapitel 18 Kapitel 19 Kapitel 20 Kapitel 21

Ein Imprint des Markt&Technik Buch- und Software-Verlag GmbH. Elektronische Fassung des Titels: ABAP/4 in 21 Tagen, ISBN: 3-8272-2016-X

Einfhrung
Nachdem ich ABAP/4-Zertifizierungskurse mit Hunderten von Anfngern und erfahrenen Entwicklern bei der SAPAG und anderen Instituten durchgefhrt habe, bin ich mir der Probleme und Fragen bewut, die beim Erlernen dieser mchtigen Sprache auftauchen knnen. Ich hoffe, da ich Ihnen dieselben Lernerfahrungen bermitteln kann, indem ich die besten Techniken, mit denen ich in Berhrung kam, mit in dieses Buch einbaue. Es bietet eine Flle von detaillierten Diagrammen, Bildschirmfotos, Beispielprogrammen, ScreenCams und Schritt-fr-Schritt-Prozeduren. Alle Beispielprogramme befinden sich auch auf der CD-ROM. Die Hilfsmittel, die ich all meinen Klassen zukommen lasse, sind auch auf der CD-ROM, einschlielich einiger neuer, die ich speziell fr dieses Buch geschrieben habe. ABAP/4 ist trotz seiner simplen Oberflche im Unterbau eine sehr komplexe Programmiersprache. Deshalb ist ein Anfnger oft vom Verhalten der Sprache verwirrt. Versteht man aber erst, wie es unter der Oberflche funktioniert, ist man auch in der Lage, sie zu beherrschen. Wenn man die Wies und Warums versteht, wird man schnell Verstndnis fr dieses interessante Gebiet bekommen. Dieses Buch wird Sie Schritt fr Schritt in die ABAP/4-Sprache und ihre Umgebung einfhren. Nach jedem Kapitel werden Sie die bungen einsetzen, die das Erlernte vertiefen sollen. Fr alle Aufgaben finden Sie die Lsungen auch auf der CD-ROM. Sowohl erfahrene Programmierer als auch Anfnger knnen sehr schnell herausfinden, da das Schreiben eines ABAP/4-Programms mehr bedeutet, als irgendein Programm zu schreiben. Hufig mu man Entwicklungsobjekte anlegen, um es zu untersttzen. Wie man diese Objekte anlegt, wird detailliert in durchdachten Schritten erklrt. Jeder Schritt enthlt den Titel der Maske, auf die Sie stoen, sowie die zu erwartende Antwort fr jedes Kommando. Alle Prozeduren sind begleitet von ScreenCams, die genau aufzeigen, wie was funktioniert. So knnen Sie nicht nur vom Zusehen etwas lernen, Sie knnen ebenso vor- und rckwrtsspulen. Die Beherrschung der ABAP/4-Programmiersprache ist, wie gesagt, nicht einfach. Ich habe aber versucht, die wichtigsten Informationen, die man hierfr bentigt, in 21 Abschnitte zu packen. Mit diesem Wissen, das Ihnen dies Buch vermittelt, werden Sie in der Lage sein, komplexe ABAP/4Arbeiten zu erledigen. Wenn Sie Probleme beim Durcharbeiten dieses Materials haben, zgern Sie nicht, mich im Internet

unter http://www.abap4.net zu besuchen. Dort werde ich dann versuchen, die am hufigsten gestellten Fragen sowie Probleme, auf die Sie beim Durcharbeiten stoen, zu beantworten. Wenn Sie glauben, einen Fehler gefunden zu haben, knnen Sie mir dort davon berichten. Ich hoffe, da Sie dieses Buch mit der gleichen Freude benutzen werden, die ich beim Schreiben hatte. Viel Spa - und hier ist Ihr ABAP/4 in 21 Tagen.

Ein Imprint des Markt&Technik Buch- und Software-Verlag GmbH. Elektronische Fassung des Titels: ABAP/4 in 21 Tagen, ISBN: 3-8272-2016-X

Auf einen Blick


Tag 1 Die Entwicklungsumgebung 17 Tag 2 Ihr erstes ABAP/4-Programm 55 Tag 3 Das Data Dictionary, Teil 1 111 Tag 4 Das Data Dictionary, Teil 2 157 Tag 5 Das Data Dictionary, Teil 3 195 Tag 6 Das Data Dictionary, Teil 4 223 Tag 7 Datendefinitionen in ABAP/4, Teil 1 243 In der ersten Woche lernen Sie etwas ber die Umgebung von R/3, einschlielich der Basis, des Anmeldemandantens, der ABAP/4-Development Workbench und des Data Dictionary. Innerhalb des Dictionary werden Sie transparente Tabellen unter Verwendung von Datenelementen und Domnen anlegen, Fremdschlssel hinzufgen, um Eingaben zu berprfen, sowie sekundre Indizes oder Puffer anlegen, um Datenzugriffe zu beschleunigen. Sie werden auch lernen, die (F1)- und die (F4)-Hilfe fr den Benutzer einzurichten. Sie beginnen mit dem Schreiben einfacher ABAP/4Programme und lernen den ABAP/4-Editor kennen.

Am ersten Tag, Die Entwicklungsumgebung, wird erklrt, was das R/3-System ist und wie es fr den Benutzer aussieht. Sie erfahren etwas ber die Systemarchitektur, unter der ABAP/4-Programme laufen. Am zweiten Tag, Ihr erstes ABAP/4-Programm, lernen Sie, wie Sie einfache ABAP/4Programme anlegen und modifizieren. Sie werden sowohl eine Tabelle und ihren Inhalt mit Hilfe des Data Dictionary anzeigen als auch Ihren Programmen Kommentare und Dokumentation hinzufgen. Tag drei, Das Data Dictionary, Teil 1, beschreibt den Unterschied zwischen transparenten, Pool- und Clustertabellen. Und Sie lernen, wie man Domnen, Datenelemente und transparente Tabellen im Data Dictionary anlegt. Am vierten Tag, Das Data Dictionary, Teil 2 legen Sie Fremdschlssel und Texttabellen an und benutzen diese. Sie beschreiben den Unterschied zwischen einer Struktur und einer Tabelle und legen im R/3-Data Dictionary Strukturen an.

Whrend des fnften Tages, Das Data Dictionary, Teil 3, legen Sie Sekundrindizes an und verwenden sie entsprechend. Auerdem richten Sie sowohl die technischen Attribute fr transparente Tabellen als auch die Pufferung fr Tabellen ein. Am sechsten Tag, Das Data Dictionary, Teil 4, verwenden Sie die Datenbankhilfsmittel, um Konsistenzchecks zu machen, Sie zeigen datenbankspezifische Tabelleninformationen an, und Sie lschen Tabellen in der Datenbank und stellen sie wieder her. Nach dem siebten Tag, Datendefinitionen in ABAP/4, Teil 1, verstehen Sie die Elemente der ABAP/4-Syntax, knnen das Konzept von Datenobjekten und ihre Auswahl beschreiben, verwenden Literale und wissen, wie man die unterschiedlichen Datentypen kodiert bzw. definiert und verwenden Konstanten.

Ein Imprint des Markt&Technik Buch- und Software-Verlag GmbH. Elektronische Fassung des Titels: ABAP/4 in 21 Tagen, ISBN: 3-8272-2016-X

Woche 1

Tag 1 Die Entwicklungsumgebung


Kapitelziele
Wenn Sie dieses Kapitel bearbeitet haben, sollten Sie folgende Fragen beantworten knnen:

Was ist ein R/3-System? Was ist eine R/3-Instanz? Was versteht man unter der Basis? Welche Betriebssysteme werden von R/3 untersttzt? Wie sehen mgliche R/3-Konfigurationen aus? Wie kann eine R/3-Server-Architektur aussehen? Was ist ein Anmeldemandant?

Was ist R/3?


R/3 ist ein integriertes Paket von Anwendungen fr die Datenverarbeitung, vor allem in Grounternehmen. Es wurde von der Firma SAP AG entwickelt. (SAP ist ein Akronym fr Systeme, Anwendungen und Produkte in der Datenverarbeitung.)

Abbildung 1.1: Anwendungsmodule sind alle in ABAP/4 geschrieben, das von den ausfhrbaren Programmen der Basis interpretiert wird, welche wiederum auf dem Operationssystem laufen. R/3 benutzt eine sogenannte Laufzeitumgebung, um Anwendungsprogramme auszufhren, die in der SAP-eigenen Programmiersprache ABAP/4 geschrieben sind. Diese Anwendungsprogramme sind fr die Datenverarbeitung in groen Konzernen entwickelt worden. R/3 und sein Vorgnger R/2 werden bevorzugt in der Industrie angewendet. Die von Ihnen erstellten ABAP/4-Programme werden unter R/3 laufen (logisch dargestellt in Abb.1.1).

Sinn und Zweck von R/3


R/3 besteht aus sogenannten Modulen, die diverse Geschftsanwendungen wie z.B. Finanzbuchhaltung reprsentieren. Folgende Anwendungen werden standardmig ausgeliefert:

PP (Produktionsplanung) MM (Materialwirtschaft) SD (Vertrieb) FI (Finanzbuchhaltung) CO (Controlling) AM (Vermgensmanagement) PS (Projektsystem) WF (Workflow) IS (Branchenlsungen) HR (Personalwirtschaft) PM (Instandhaltung) QM (Qualittsmanagement)

Diese Anwendungen heien Funktions- oder Anwendungsbereiche, oder manchmal auch funktionelle Module von R/3. Alle diese Begriffe sind miteinander sinnverwandt. Normalerweise stellen Geschftsleute ein Paket von DV Anwendungen zusammen, indem sie individuelle Produkte begutachten und diese dann bei verschiedenen

Softwareanbietern kaufen. In solchen Fllen bentigt man Schnittstellen zwischen den einzelnen Komponenten. Zum Beispiel wird die Materialverwaltung Verbindungen zum Verkauf, zur Distribution und zum Finanzwesen brauchen, und das Workflow-System wird Zugriffe auf das HR-System bentigen. Hierdurch wird sehr viel Zeit und Geld fr Implementierung und Wartung verschwendet. R/3 enthlt die Kerngeschfts-Anwendungen, die in groen Unternehmen bentigt werden. Diese Anwendungen koexistieren in einer homogenen Umgebung. Sie wurden mit Hilfe einer Datenbank und einer sehr groen Anzahl von Datenbanktabellen entwickelt. Gegenwrtige Produktionsdatenbanken schwanken zwischen 12 Gigabyte und 3 Terabyte. In der Version 3.0F wurden ungefhr 8000 Datenbanktabellen mit dem standardmigen R/3 Produkt ausgeliefert.

Warum mssen Sie das wissen?


Fr Sie als ABAP/4-Programmierer ist es wichtig, die Anwendungen zu verstehen, da sie alle ausschlielich in ABAP/4 geschrieben sind. Nehmen Sie zum Beispiel an, Sie kennen ABAP/4 und werden gebeten, einen Finanzbericht zu schreiben, der im Steuerjahr Soll und Haben fr jeden Verkufer eines Unternehmens zusammenfassen soll. Sie mgen in ABAP/4 programmieren knnen, aber wrden Sie wissen, wie man es anfngt, eine solche Aufgabe zu lsen? Oder Ihre Aufgabe besteht vielleicht in einer Neuentwicklung in ABAP/4. Sie werden aufgefordert, ein System zu entwerfen, das potentiellen Kufern Aktiennotierungen zur Verfgung stellt. Wenn Sie die Finanz-, Verkaufs- und Distributionssysteme nicht kennen, werden Sie nicht wissen, ob Sie etwas entwickeln, das vielleicht schon in R/3 existiert. Ebensowenig knnen Sie wissen, ob es R/3-Tabellen gibt, die schon Daten enthalten, welche hnlich oder identisch sind mit denen, die Sie speichern wollen. Ein Entwickler, der die Einstellung hat Ich erstelle meine eigenen Tabellen und fhre meine eigenen Datenkopien, wird bald feststellen, da seine Daten berflssig sind und mit dem Rest der Datenbank synchronisiert werden mssen. Er hat eine Anwendung erstellt, welche die hochentwickelte Form der R/3-Umgebung nicht nutzt. Ich erwhne dies nur, weil viele Entwickler, die selbstndige Berater werden wollen, denken, da es ausreicht, ABAP/4 zu lernen, um im R/3-System zu programmieren. Es ist sicherlich ein wichtiger Anfang, aber eben nur ein Anfang. Die Bedeutung, in einem Funktionsbereich zu ben, kann von jemandem, der ein fhiger ABAP/4-Berater werden will, leicht bersehen werden oder ihm unbekannt sein. Offensichtlich kann und wird man viel whrend der Arbeit lernen. Ich hoffe, ich kann veranschaulichen, da das Erlernen von ABAP/4 nur der Anfang einer langen Reise durch SAP sein wird. Wenn Sie als selbstndiger Berater erfolgreich sein mchten, werden Sie Funktionsbereichswissen erwerben mssen.

ber die Funktionsebenen knnen Sie in der R/3-Online-Referenz (Menpfad Hilfe- >R/3-Bibliothek) nachlesen. Diese enthlt Tutorien und Dokumentation fr alle Funktionsebenen. Wenn Sie Zugriff haben zu einem System mit IDES-Daten (International Demo and Education System), knnen Sie sich auch durch die R/3Bibliotheksbungen durcharbeiten. Was das Angebot an Trainingskursen betrifft, so wenden Sie sich an SAP (http://www.sap.de).

Wie sieht R/3 aus?


Bei einer Windows-Umgebung melden Sie sich normalerweise zu R/3 an, indem Sie einen Menpfad vom Startmen whlen oder durch einen Doppelklick auf eine R/3- Ikone (Abb. 1.2).

Abbildung 1.2: Die R/3-Ikone auf dem Desktop Das R/3-System wird Sie nach einem Benutzernamen und einem Kennwort fragen. Die Anmeldemaske erscheint wie in Abb. 1.3. Fllen Sie diese beiden Felder aus, und drcken Sie die Entertaste.

Abbildung 1.3: Die R/3-Einwhlmaske fragt Sie nach dem Pawort Es folgt eine Copyrightmaske, nach deren Besttigung durch die Entertaste das R/3- Hauptmen angezeigt wird (s. Abb. 1.4).

Abbildung 1.4: Das R/3-Hauptmen

Die konzeptionellen R/3-Anwendungsgebiete


Vom Hauptmen aus knnen Sie drei konzeptionelle Gebiete im R/3-System ausrufen:

die Anwendungsebene die SAP Basis die Entwicklungsumgebung

In der Anwendungsebene initiieren Sie Transaktionen (Systembefehle in R/3) fr die Funktionsbereiche innerhalb von R/3. Um darauf zuzugreifen, whlen Sie aus dem R/3Hauptmen: Logistik, Buchhaltung, Personalwirtschaft oder Datensysteme. In der SAP Basis knnen Sie Transaktionen aufrufen, in denen sich das R/3-System selbst berwacht. Um auf die Basis zuzugreifen, whlen Sie den Menpfad Werkzeug >Administration aus dem Hauptmen. Sie werden hier verschiedene Werkzeuge zu Performance, Tuning und Datenbankverwaltung finden. In der Entwicklungsumgebung werden ABAP/4-Programme entwickelt und geprft. Als ABAP/4-Programmierer werden Sie die meiste Zeit innerhalb dieser Umgebung verbringen. Um auf die Entwicklungsumgebung zuzugreifen, whlen Sie den Menpfad Werkzeuge->ABAP/4-Workbench. Allerdings wird Ihr Programm-Code hchstwahrscheinlich Anwenderdaten lesen oder aktualisieren und somit Teil der Anwendungsebene werden. Mit diesem Wissen im Hinterkopf lassen Sie uns zuerst einen Blick auf ein Anwendungsgebiet werfen. Fr unser Beispiel stellen Sie sich vor, Sie wren Angestellter in der Abteilung Kreditoren. Ein Lieferant ruft an, um mitzuteilen, da sich seine Adresse gendert hat. Sie legen ein Lesezeichen in den Zeitschriftenartikel, den Sie gerade lasen (Probleme kreativer Buchhaltung aus Sicht eines Kriminologen) und schicken sich an, seine Adresse im R/3-

System zu aktualisieren. Zuerst kommen Sie zum Punkt Kreditoren, indem Sie den Menpfad Rechnungswesen->Finanzwesen->Kreditoren whlen (Abb.1.5).

Abbildung 1.5: Der Menpfad, um die Stammdaten eines Lieferanten zu aktualisieren (Teil 1) Sie rufen dann die Verkufer-Stammsatzpflege-Transaktion auf, indem Sie den Menpfad Stammdaten->ndern whlen (Abb.1.6). Sie sehen Kreditor ndern: Einstieg Buchhaltung.

Abbildung 1.6: Der Menpfad, um die Stammdaten eines Lieferanten zu aktualisieren (Teil 2)

In dieser Maske, die in Abb. 1.7 gezeigt wird, geben Sie seine Kreditorennummer ein, klicken auf Anschrift und drcken die Entertaste. Sie sehen dann die Maske (Abb.1.8) zur Pflege der Adressen.

Abbildung 1.7: Die Transaktion Aktualisierung der Kreditoren-Stammdaten: Einstiegsmaske

Abbildung 1.8: Die Transaktion Aktualisierung der Kreditoren-Stammdaten: Adremaske Sie ndern seine Adresse und sichern die Eingabe (Abb.1.9).

Abbildung 1.9: Sicherung der nderungen in der Lieferantenadresse Beim Sichern geht das System zurck zu Einstieg Buchhaltung. Das System zeigt auch eine Erfolgsmeldung innerhalb der Statusleiste an, die sich am unteren Rand des Bildschirms befindet (Abb.1.10).

Abbildung 1.10: Die Einstiegsmaske gibt die Besttigung, da die Adressennderung vollzogen wurde Diese Transaktion ist reprsentativ fr viele Transaktionen im R/3-System. Die meisten Stammdatentransaktionen sehen hnlich aus.

Die R/3-Anwenderschnittstelle
Abb.1.11 zeigt wieder das Hauptmen; die wichtigsten Bildschirmbereiche sind gekennzeichnet. Jede R/3-Maske enthlt die folgenden Elemente:

Titelleiste: Zeigt den Namen der gegenwrtigen Maske. Menleiste: Die Inhalte der Menleiste verndern sich mit jeder Maske. Wenn Sie innerhalb der Mens blttern, knnen Sie alle Funktionen entdecken, die auf der gegenwrtigen Maske mglich sind. Die System- und Hilfsmens sind auf jeder Maske prsent, und die Menpunkte, die sie enthalten, verndern sich nie. Befehlsfeld: Hier werden die Ausfhrungsbefehle eingegeben (Transaktionscodes). Sie knnen sich zum Beispiel durch Eingabe von /nex in diesem Feld und Drkken der Entertaste abmelden. Der Abschnitt Benutzung des Befehlsfelds beschreibt dieses Feld ausfhrlicher. Symbolleiste: Enthlt das Befehlsfeld und eine Reihe von Symbolen. Sie werden sich in der Erscheinungsform, der Position oder der Funktion nie verndern, und sie werden in jeder Maske prsent sein. Einige knnen ausgegraut sein, wenn ihre Funktion zur Zeit nicht verfgbar ist. Drucktastenleiste: Verndert sich mit jeder Maske. Zeigt Schaltflchen, die Ihnen den schnellen Zugang zu den Menpunkten fr diese Maske ermglichen.

Abbildung 1.11: Wichtige Elemente auf der R/3-Maske

Wenn Sie den Mauspfeil auf irgendeine Schaltflche positionieren und einige Sekunden warten, zeigt R/3 Ihnen die Verwendbarkeit dieser Schaltflche. In R/3 heit dieser Service Quick Info. Er enthlt eine Kurzbeschreibung dieser Schaltflche und die zugehrige Funktionstaste.

Schnittstellenmen: Ermglicht Ihnen, die Merkmale der Anwenderschnittstelle an spezielle Bedrfnisse anzupassen, auf den Windows Zwischenspeicher (Clipboard) zuzugreifen und Grafiken zu erzeugen. Der folgende Abschnitt wird mehr Merkmale des Schnittstellenmens in der Tiefe abdecken. Arbeitsbereich: Dies ist der groe Bereich in der Mitte des Bildschirms, der die Berichtsdaten oder die Maske eines Dialogprogramms anzeigt. Statusleiste: Zeigt Nachrichten, den Systemnamen, die Anzahl der Modi, die Mandantennummer, den Einfge-/ berschreibmodusindikator und die aktuelle Zeit an.

Sie knnen die meisten Bildschirmelemente an- und abschalten. Wenn Ihr Bildschirm nicht so aussieht wie in diesem Kapitel beschrieben, beachten Sie bitte die Anweisungen im nchsten Abschnitt. Arbeiten mit dem Schnittstellenmen Die Ikone mit den drei farbigen Kreisen in der oberen rechten Ecke des R/3-Fensters heit Schnittstellenmen. Damit knnen Sie Benutzereinstellungen wie Bildschirmfarben, Schriftgren und das Cursorverhalten an spezielle Bedrfnisse anpassen. Dafr klicken Sie einmal die Ikone an (Abb.1.12). Ein Men wird geffnet; klicken Sie auf Optionen (Anmerkung: die hier geschilderten Einstellungen basieren auf dem SAPGUI V4.0B. Bei lteren Sapguis knnen die beschriebenen Bilder anders aussehen).

Abbildung 1.12: Das Schnittstellenmen mit dem ausgewhlten Menpunkt Optionen Klicken Sie die Karteikarte General an und ndern Sie Ihre Einstellungen so, wie in Abb.1.13 gezeigt. So stellen Sie sicher, da Ihre Anwenderschnittstelle so aussieht wie in diesem Buch beschrieben.

Abbildung 1.13: Die Optionen der Schnittstelle General Aktivieren Sie alle Werkzeugleisten (markieren Sie diese) und stellen Sie Quick Info auf Quick ein. Markieren Sie die erste und letzte Nachrichten Check Box wie gezeigt und klicken Sie auf bernehmen.

Sie mssen auf bernehmen oder OK drcken, bevor Sie den nchsten Tab aufrufen. Wenn Sie dies nicht tun, werden Ihre nderungen nicht wirksam. Klicken Sie auf Colors In Lists, und markieren Sie die Lines In Lists wie in Abb.1.14 gezeigt. Klicken Sie auf OK, um zurckzukehren.

Abbildung 1.14: Markierung der Checkbox Colors In Lists

Die Lines In Lists Option schaltet die Anzeige vertikaler und horizontaler Linien in Ihrem Ausgabebericht an oder aus. Sie sollten dies prfen, um die Wirkung der ZeilengrafikAnweisungen zu sehen, die Sie spter in diesem Buch programmieren werden.

Zeigen Sie sich alle Einstellungen der Funktionsschlssel an, indem Sie irgendwo in der Maske auf die rechte Maustaste klicken. Dies gilt fr alle Masken. Die Funktionsschlssel 1 bis 12 sind in der oberen Tastenreihe auf Ihrer Tastatur hinterlegt. Die Funktionsschlssel 13 bis 24 erhalten Sie ber die selbe Tastenreihe, wenn Sie gleichzeitig (Umsch) drcken. So erhlt man z.B. F13 ber (Umsch)+(F1). Fr die Funktionsschlssel 24 bis 36 verwenden Sie (Strg) anstatt (Umsch). Fr 37 bis 48 nehmen Sie (Alt). Fr alle Schlssel ber 48 halten Sie die (Strg) Taste gedrckt und tippen Sie die gewnschte Ziffer ein. Fr F50 z.B. halten Sie (Strg) gedrckt und tippen die 5 und die 0 ein. Benutzung des Befehlsfelds In der Symbolleiste gibt es ein Eingabebereich, der Befehlsfeld heit. Sie knnen hier Systembefehle eingeben. Um eine Liste dieser Befehle zu erhalten, bewegen Sie den Cursor in das Befehlsfeld und drcken Sie (F1).

Dieses Feld wird meistens benutzt, um eine neue Transaktion zu starten.

Im Moment gengt es, eine Transaktion als Programm zu verstehen. Die beiden sind einander recht hnlich. Wenn Sie eine Transaktion starten, starten Sie ein Programm. Anstatt dafr einen Menpfad zu whlen, knnen Sie Ihren Transaktionscode in das Befehlsfeld eingeben. Ein Transaktionscode ist ein drei- oder vier-stelliger Zeichencode, verknpft mit einer Transaktion. Sie knnen ihn benutzen, um die Transaktion zu starten, ohne einen Menpfad zu verwenden. Jede Transaktion hat einen Transaktionscode (auch tcode genannt). Um den Transaktionscode fr eine Transaktion zu finden, mssen Sie die Transaktion aufrufen und dann den Menpfad System->Status whlen. Die System-Statusmaske wird gezeigt. Der Transaktionscode erscheint im Transaktionsfeld. Whlen Sie zum Beispiel aus dem R/3-Hauptmen den Menpfad Rechnungswesen ->Finanzwesen->Kreditoren. Sie sehen die Kreditorenmaske. Nun whlen Sie den Menpfad Stammdaten->Anzeigen. Sie werden die Anzeige Kreditor anzeigen: Einstieg Buchhaltung sehen. Whlen Sie den Menpfad System->Status. Nun sehen Sie die System-Statusmaske. Im Transaktionsfeld steht der Transaktionscode fr diese Maske: FK03. Da Sie nun den Transaktionscode haben, knnen Sie diese Transaktion von jeder Maske aus starten, wenn Sie sich im Befehlsfeld /n befinden und dann den Transaktionscode eingeben. Kehren Sie zum Beispiel zum Hauptmen zurck (klicken Sie zweimal auf den grnen Pfeil). Im Befehlsfeld geben Sie /nfk03 ein und drcken die Entertaste. Sie werden sofort die Anzeige Kreditor anzeigen: Einstieg Buchhaltung sehen.

Sie finden in jeder Maske den Transaktionscode fr die aktuelle Transaktion. Whlen Sie dafr den Menpfad System->Status.

Die Basis
Die Basis ist fr R/3 wie ein Betriebssystem. Sie bildet die Schnittstelle zwischen dem ABAP/4-Code und dem Betriebssystem des Computers.

Der Vorgnger von R/3 ist R/2. R/2 basiert auf Grorechenanlagen. SAP hat R/2 in die Client-Server-Umgebung portiert. Fr diese Prozedur entwickelte SAP die Basisumgebung. Diese ermglicht es, mit Hilfe des existierenden ABAP/4-Codes auch auf anderen Plattformen zu laufen. Schauen Sie sich noch einmal Abb.1.1 an: Sie sehen die R/3-Basis zwischen ABAP/4 und dem Betriebssystem liegen. Ein ABAP/4-Programm kann nicht direkt auf einem Betriebssystem laufen. Es bentigt ein Programmpaket (genannt Basis), um seine Ein- und Ausgaben zu steuern, zu interpretieren und zu puffern. Die Basis arbeitet in gewisser Hinsicht wie die Windows-Umgebung. Windows bietet eine Umgebung, in der Windows-Programme laufen knnen, whrend es aktiv ist. Ohne Windows knnen Programme, die fr die Windows-Umgebung geschrieben werden, nicht laufen.

Die Basis ist fr ABAP/4-Programme das, was Windows fr Windows-Programme ist. Die Basis stellt die Laufzeitumgebung fr ABAP/4-Programme zur Verfgung. Ohne die Basis knnen ABAP/4-Programme nicht laufen. Wenn der Operator R/3 startet, knnen Sie sich vorstellen, er starte die Basis. Die Basis besteht aus einer Reihe von R/3Systemprogrammen, die sich Ihnen mit einer Schnittstelle prsentieren. Der Benutzer kann ABAP/4-Programme starten, indem er diese Schnittstelle benutzt. Von der Befehlsprompt-Ebene des Betriebssystems startet ein Programm die Basis-Installation. Wie bei den meisten Installationen wird eine Inhaltsverzeichnisstruktur geschaffen und dort hinein eine Gruppe von ausfhrbaren Programmen kopiert. Alle diese ausfhrbaren Programme als Einheit zusammengefat, ergeben die Basis. Um das R/3-System in Betrieb zu setzen, gibt der Operator einen Befehl zum Starten des SAP-Systems ein, der die ausfhrbaren Programme der Basis startet. Whrend diese laufen, akzeptieren sie Anfragen des Benutzers, um ABAP/4-Programme auszufhren. ABAP/4-Programme laufen innerhalb der geschtzten Basisumgebung; sie sind keine ausfhrbaren Programme, die auf dem Betriebssystem laufen. Stattdessen lesen die Basisprogramme den ABAP/4-Code und bersetzen ihn in Betriebssystemanweisungen. ABAP/4-Programme greifen nicht direkt auf Betriebssystemfunktionen zu. Sie benutzen stattdessen Basisfunktionen, um die Dateiein- und ausgabe auszufhren und Daten anzuzeigen. Durch diese Isolation vom Betriebssystem knnen ABAP/4-Programme ohne Modifikation in jedes System portiert werden, das R/3 untersttzt. Diese Abstraktion ist direkt in die ABAP/4-Sprache eingebaut und fr den Programmierer vllig transparent. Die Basis macht ABAP/4-Programme portierbar. Die Betriebssysteme, auf denen R/3 laufen kann, sind in Tabelle 1.1 aufgezeigt.

Tabelle 1.1: Von R/3 untersttzte Betriebssysteme und Datenbanken

Betriebssysteme AIX SINIX

Untersttzte Hardware Untersttzte Front-ends Untersttzte Datenbanken IBM SNI SUN Win 3.1/95/NT/98 OSF/Motif OS/2 Macintosh DB2 fr AIX Informix-Online Oracle ADABAS D Oracle SQL Server ADABAS D

SOLARIS HP-UX Digital HP Digital-UNIX Bull

Windows NT

AT&T Compaq Bull/Zenith HP (Intel) SNI IBM (Intel) Digital (Intel) Data-General

Win 3.1/95/NT/98 OSF/Motif OS/2 Macintosh

OS/400 Linux

AS/400 PC

Win95/98/OS/2 Alle (incl. Linux)

DB2/400 Oracle Informix

Wenn Sie zum Beispiel ein ABAP/4-Programm auf Digital Unix mit einer Informix- Datenbank und einem OSF/Motif-Frontend schreiben, sollte dieses Programm ohne Modifikationen auf einer Windows-NT-Maschine mit einer Oracle-Datenbank und einem Windows-95-Frontend laufen, ebenso wie auf einer AS/400 mit einer DB2-Datenbank und OS/2 als Frontend. SAP stellt auch ein Paket von Werkzeugen zur Verfgung, um das Basissystem zu verwalten. Diese Werkzeuge fhren Aufgaben wie Systemleistungsberwachung, Konfiguration und Systemwartung aus. Um auf die Basis-Verwaltungs-Werkzeuge vom Hauptmen aus zuzugreifen, whlen Sie Werkzeug->Administration. Hier sind einige Beispiele von Basis-Verwaltungs-Werkzeugen:

Um eine Liste der Server zu sehen, die zur Zeit in Ihrem R/3-System laufen, whlen Sie den Menpfad Werkzeug->Administration, Monitor->Systemberwachung>Server. Um das aktuelle Systemlog anzusehen, whlen Sie Werkzeuge->Administration ->Monitor->Systemlog. Um Systemleistungsstatistiken zu erhalten, tragen Sie die Transaktion ST03 in das Befehlsfeld ein, whlen This Application Server, Last Minute Load und analysieren die letzten 15 Minuten. Drcken Sie auf den Dialogknopf am unteren Rand des Bildschirm und sehen Sie sich die durchschnittliche Antwortzeit der letzten 15 Minuten (Av.Response Time) an.

Die Basis wurde fr eine Client-Server-Konfiguration entwickelt.

Client-Server
Client-Server: zwei Programme, die miteinander kommunizieren (Abb.1.15).

Abbildung 1.15: Die Grundlage von Client-Server Wir sehen hier Programm 1, das Programm 2 nach irgendeiner Auskunft fragt. Programm 1 ist der Client, und Programm 2 ist der Server. Programm 2 bedient (engl. to serve) Programm 1 mit der gewnschten Auskunft. Dies ist anders als bei einem Hauptprogramm, das ein Unterprogramm aufruft und dann zurckkehrt. Ein Programm, das ein Unterprogramm aufruft, bertrgt die Kontrolle an das Unterprogramm und kann keine Prozesse ausfhren, bis das Unterprogramm die Kontrolle zurckgibt.

Bei Client-Server sind die Client- und Server-Programme unabhngige Prozesse. Wenn der Client dem Server eine Anfrage bermittelt, kann er noch andere Arbeiten ausfhren whrend er auf die Antwort wartet. Abb.1.16 zeigt die drei standardmigen Client-Server-Konfigurationen. R/3 kann so konfiguriert werden, da es in jeder dieser Konfigurationen laufen kann. Wenn die Client- und Serverprogramme auf einem Rechner laufen, bezeichnet man die Konfiguration als einstufig (eine Stufe ist die Grenze zwischen zwei Rechnern). Wenn sie auf verschiedenen Rechnern laufen, handelt es sich um eine zweistufige Client-Server-Architektur.

Abbildung 1.16: Ein-, zwei und dreistufige Client-Server-Konfigurationen

Ein Programm kann sowohl als Client als auch als Server fungieren, wenn es sowohl Informationen anfordert als auch auf Anfragen antwortet. Wenn Sie drei Programme haben die miteinander kommunizieren, wie es in Abb.1.16 gezeigt wird, nennt man dies eine dreistufige Client-Server-Konfiguration. Die Client-Server-Konfiguration ermglicht dem R/3-System, seine Auslastung auf mehrere Rechner zu verteilen. Dies ermglicht dem Kunden, die Leistung des Systems zu vergrern, indem er einfach einen weiteren Rechner zu einer bestehenden Konfiguration hinzufgt, anstatt einen einzelnen Rechner zu ersetzen, der die gesamte Rechnerlast trgt, so wie es in der Grorechnerwelt praktiziert wird.

R/3-Systemarchitektur
Die R/3-Architektur basiert auf einem dreistufigen Client-Server-Modell. Abb.1.17 zeigt die R/3-Systemarchitektur.

Abbildung 1.17: Die R/3-Systemarchitektur

Prsentationsserver
Der Prsentationsserver ist eigentlich ein Programm, das allgemein als Sapgui.exe bezeichnet wird. Es ist blicherweise auf der Workstation eines Benutzers installiert. Um es zu starten, klickt der Benutzer eine Ikone auf dem Desktop an oder whlt einen Menpfad. Beim Start zeigt der Prsentationsserver die R/3-Mens in einem Fenster. Dieses Fenster wird blicherweise SAPGUI oder Anwenderschnittstelle genannt (oder einfach Schnittstelle oder Frontend). Die Schnittstelle akzeptiert die Eingabe vom Benutzer in Form von Tastendruck, Mausklicks und Funktionstasten und sendet diese Aufforderungen an den Applikationsserver zur Bearbeitung. Der Applikationsserver sendet die Ergebnisse zurck zum SAPGUI, das dann die Ausgabe fr die Anzeige an den Benutzer formatiert.

Applikationsserver

Ein Applikationsserver stellt eine Gruppe ausfhrbarer Programme dar, die die ABAP/4-Programme interpretieren und die Ein- und Ausgabe fr sie verwalten. Wenn ein Applikationsserver gestartet wird, starten alle diese ausfhrbaren Programme gleichzeitig. Wenn ein Applikationsserver gestoppt wird, hren alle gleichzeitig auf. Die Anzahl von Prozessen, die starten, wenn Sie den Applikationsserver aufrufen, ist in einer einzelnen Konfigurationsdatei definiert, die als Applikationsserverprofil bezeichnet wird. Jeder Applikationsserver hat ein Profil, das seine Merkmale bestimmt, wenn er startet und whrend er luft. Zum Beispiel spezifiziert ein Applikationsserverprofil:

die Anzahl von Prozessen und ihre Typen den Speicherplatz, den jeder Proze bentigen knnte die Zeitdauer, die ein Benutzer inaktiv ist, bevor er automatisch abgemeldet wird

Der Applikationsserver ist dazu da, ABAP/4-Programme zu interpretieren; diese laufen nur hier und nicht auf dem Prsentationsserver. Ein ABAP/4-Programm kann ein ausfhrbares Programm auf dem Prsentationsserver starten, aber ein ABAP/4-Programm selbst kann dort nichts ausfhren. Wenn Ihr ABAP/4-Programm Informationen aus der Datenbank abfragt, wird der Applikationsserver die Anforderung formatieren und sie an den Datenbankserver senden.

Datenbankserver
Der Datenbankserver besteht aus einer Gruppe ausfhrbarer Programme, die Datenbankanfragen vom Applikationsserver akzeptiert. Diese Anfragen werden zum RDBMS (relationales Datenbankmanagementsystem) weitergeleitet. Das RDBMS sendet die Daten zurck an den Datenbankserver, der dann die Information zurck an den Applikationsserver leitet. Der Applikationsserver leitet diese Auskunft dann zu Ihrem ABAP/4-Programm weiter. blicherweise hat der Datenbankserver einen getrennten Rechner; das RDBMS kann auch auf diesem Rechner laufen oder auf seinem eigenen Rechner installiert werden.

Server-Konfigurationen
Whrend der Installation knnen die Server auf vier Arten konfiguriert werden (Abb.1.18).

Abbildung 1.18: Mgliche R/3-Systemkonfigurationen In einer dreistufigen Client-Server-Konfiguration laufen Prsentations-, Applikations- und Datenbankserver auf getrennten Maschinen. Dies ist die gebruchlichste Konfiguration fr groe Systeme und in einer Produktionsumgebung. Auf kleineren Systemen, die hufig als Entwicklungssysteme genutzt werden, sind die Applikations- und Datenbankserver auf einem Rechner, und die Prsentationsserver laufen getrennt. In der zweistufigen Client-Server-Konfiguration laufen die Prsentations- und Applika- tionsserver auf einem Rechner, und der Datenbankserver luft getrennt davon. Diese Konfiguration wird in Verbindung mit anderen Applikationsservern fr einen Batchserver genutzt, wenn die Hintergrundverarbeitung (Batch) von den Online-Servern getrennt ist. Ein SAPGUI ist darauf installiert, um lokal die Kontrolle zu ermglichen. Wenn alle Server auf einer einzelnen Maschine laufen, spricht man von einer Zentralkonfiguration. Dies ist uerst selten, weil es ein selbstndiges R/3-System bei nur einem einzigen Benutzer beschreibt.

Definition eines R/3-Systems


Die einfachste Definition eines R/3-Systems ist eine Datenbank. In einem R/3-System gibt es nur eine Datenbank. Um die Definition zu erweitern: R/3 steht fr alle Bestandteile, die mit dieser einen Datenbank verbunden sind. Ein R/3-System besteht aus einem Datenbankserver, der auf eine einzelne Datenbank zugreift, einem oder mehreren Applikationsservern und einem oder mehreren Prsentationsservern. Es steht fr alle Bestandteile, die mit einer Datenbank verbunden sind. Wenn Sie eine Datenbank haben, haben Sie ein System. Wenn Sie ein System haben, haben Sie eine Datenbank. Whrend einer Einfhrung ist blicherweise ein System (oder eine Datenbank) zustndig fr die Entwicklung, eines oder mehrere zum Testen und eines fr die Produktion.

Der Begriff R/3-Systemlandschaft zeigt innerhalb einer SAP-Installation eine Beschreibung der Anzahl von Systemen und wofr sie vorgesehen sind: Entwicklung, Test oder Produktion.

Definition einer R/3-Instanz


Wenn Sie den Begriff Instanz hren, wird in den meisten Fllen der Applikationsserver gemeint sein. Der Ausdruck Instanz ist ein Synonym fr Applikationsserver. Der Begriff Zentrale Instanz bezieht sich auf den Datenbankserver. Wenn sich ein Applikationsserver und ein Datenbankserver auf der gleichen Maschine befinden, bezieht sich der Begriff Zentrale Instanz auf den Rechner, auf dem sich beide befinden. In den allermeisten Fllen ist mit einer Instanz ein Server gemeint. Darunter versteht man auch eine Anzahl von R/3-Prozessen, die das R/3-System bedienen.

Architektur des Applikationsservers


Die Bestandteile eines Applikationsservers sind in Abb. 1.19 abgebildet. Er besteht aus einem Dispatcher und vielen Arbeitsprozessen (Work Process/WP). Alle Anfragen, die von Prsentationsservern kommen, werden zuerst zum Dispatcher geleitet. Der Dispatcher schreibt sie in die Dispatcher Queue. Er verwaltet die Anfragen aus der Queue nach dem Prinzip Wer zuerst kommt, mahlt zuerst. Jede Anfrage wird dem ersten freien Arbeitsproze zugewiesen. Ein Arbeitsproze behandelt jeweils eine Anfrage zur Zeit.

Abbildung 1.19: Architektur eines Applikationsservers Um jede Benutzeranfrage auszufhren, mu ein Arbeitsproze zwei gesonderte Speicherfelder ansprechen: den Benutzerkontext und den Programmrollbereich. Der Benutzerkontext ist ein Speicherfeld, das Informationen ber den Benutzer enthlt, und der Rollbereich ist ein Speicherfeld mit Informationen ber die Programmdurchfhrung.

Benutzerkontext
Ein Benutzerkontext ist ein Speicher, der die Charakteristika eines Benutzers enthlt, der auf dem R/3-System angemeldet ist. Er enthlt Informationen ber den Benutzer, die von R/3 bentigt werden, wie:

die gegenwrtigen Einstellungen des Benutzers die Benutzerberechtigungen die Namen der Programme, die der Benutzer zur Zeit laufen lt

Wenn sich ein Benutzer anmeldet, wird ein Benutzerkontext fr diese Anmeldung angelegt. Bei der Abmeldung werden die Speicherbereiche mit dem Benutzerkontext wieder gelscht. Der Benutzerkontext wird whrend der Verarbeitung benutzt; seine Bedeutung wird in den folgenden Abschnitten beschrieben.

Rollbereich
Ein Rollbereich ist ein Speicherbereich, auf den von einem Arbeitsproze einer Instanz whrend der Programmausfhrung zugegriffen wird. Er enthlt Informationen, die von R/3 ber die Durchfhrung des Programms bentigt werden, wie:

die Werte der Variablen die dynamischen Speicherbelegungen der gegenwrtige Programmzeiger

Bei jedem Programmstart wird ein Rollbereich fr die Programminstanz kreiert. Wenn zwei Benutzer gleichzeitig das gleiche Programm laufen lassen, existieren zwei Rollbereiche - fr jeden Benutzer einer. Der Rollbereich wird frei, wenn das Programm endet.

Wenn Sie mit einem Basisberater sprechen, werden Sie feststellen, da der Terminus Rollbereich fr alle Rollbereiche eines Benutzers gebraucht wird oder sogar fr alle Rollbereiche auf einem Applikationsserver. Normalerweise knnen Sie aus dem Zusammenhang erkennen, was gerade gemeint ist. Sowohl der Rollbereich als auch der Benutzerkontext spielen in der Dialogschritt-Verarbeitung eine wichtige Rolle.

Dialogschritt
Jeder Bildschirmwechsel ist ein Dialogschritt (Abb. 1.20).

Abbildung 1.20: Der Wechsel von der Einstiegs- zur Adressenmaske kann als Dialogschritt angesehen werden

Ein Dialogschritt ist fr Basisberater die Maeinheit fr Systemantwortzeit.

Ein Dialogschritt ist die Bearbeitung, die bentigt wird, um von einer Maske zur nchsten zu kommen. Er umfat alle Bearbeitungen, die vorkommen, nachdem der Benutzer eine Anfrage startet, bis zur Bearbeitung, die bentigt wird, um die nchste Maske aufzubauen. Wenn zum Beispiel der Benutzer die Eingabe-Taste auf dem Kreditor ndern: Einstieg Buchhaltung anklickt, initiiert er einen Dialogschritt, und die Sanduhr erscheint, wobei sie eine weitere Eingabe verhindert. Das Programm sapmf02k empfngt die Information und zeigt sie auf der Maske Kreditor ndern an; die Adremaske und die Sanduhr verschwinden. Dies markiert das Ende des Dialogschritts, und der Benutzer kann jetzt eine andere Anfrage starten. Es gibt vier Wege, einen Dialogschritt aus dem SAPGUI zu initiieren:

Drcken der Eingabe-Taste Drcken einer Funktionstaste Anklicken einer Schaltflche Auswhlen eines Menpunkts

Es ist wichtig fr einen ABAP/4-Programmierer, ber Dialogschritte Bescheid zu wissen.

Roll-In/Roll-Out-Bearbeitung
Ein ABAP/4-Programm benutzt nur einen Arbeitsproze fr einen Dialogschritt. Am Anfang eines Dialogschrittes werden der Rollbereich und der Benutzerkontext in einen Arbeitsproze eingelagert (Roll In). Am Ende des Dialogschritts werden sie wieder ausgelagert (Roll Out), siehe Abb. 1.21.

Abbildung 1.21: Roll-In/Roll-Out-Bearbeitung

Whrend der Roll-In Phase werden die Zeiger (Pointer) auf den Rollbereich und den Benutzerkontext dem Arbeitsproze zugewiesen. Dies ermglicht dem Arbeitsproze, auf die Daten in diesen Bereichen zuzugreifen und so die Bearbeitung fr diesen Benutzer und dieses Programm auszufhren. Die Bearbeitung wird so lange fortgesetzt, bis das Programm dem Benutzer ein Ende der Bearbeitung signalisiert. Danach werden beide Bereiche ausgelagert (Roll Out). Der Roll-Out erklrt die Zeiger fr ungltig und lst diese Bereiche vom Arbeitsproze los. Dieser Arbeitsproze ist jetzt frei und kann andere Nachfragen ausfhren. Das Programm belegt jetzt nur Speicherplatz und verbraucht keine CPU-Zeiten. Der Benutzer sieht das Ergebnis auf dem Bildschirm und kann sofort eine neue Anfrage starten. Sobald die nchste Anfrage vom Benutzer gestartet wird, weist sie der Dispatcher dem ersten freien Arbeitsproze zu. Dies kann entweder der gleiche oder ein anderer Arbeitsproze sein. Der Benutzerkontext und der Rollbereich fr dieses Programm werden wieder dem Arbeitsproze zugefhrt, wobei die Verarbeitung an dem Punkt weitermacht, an dem das vorherige Programm aufgehrt hat. Die Verarbeitung geht so lange weiter, bis die nchste Maske gezeigt wird oder das Programm aufhrt. Wenn eine andere Maske gezeigt wird, werden die Bereiche wieder ausgelagert. Wenn das Programm aufhrt, ist der Rollbereich frei geworden. Der Benutzerkontext bleibt so lange zugewiesen, bis sich der Benutzer abmeldet.

In einem System, in dem viele Benutzer mit vielen Programmen arbeiten, sind nur einige dieser Programme in Arbeitsprozessen gleichzeitig aktiv. Wenn sie keinen Arbeitsproze besetzt halten, werden sie in den Speicherbereich ausgelagert. Dies entlastet die CPU und ermglicht dem R/3-System hohen Transaktionsdurchsatz.

ABAP/4-Programme knnen viele gebruchliche Windows-Ereignisse nicht abfangen. Die Ereignisse, die viele Nachrichten erzeugen, wie Tastendruck, Ansichtsnderungen und Mausbewegungen, werden ABAP/4-Programmen nicht bermittelt. Daraus resultiert, da es keine Mglichkeit gibt, einige Funktionen auszufhren, die man in anderen Windows-Programmen findet. Sie knnen zum Beispiel in ABAP/4 nicht den Inhalt eines Felds prfen, wenn der Benutzer die (__)-Taste drckt. Stattdessen mssen Sie warten, bis der Benutzer einen Dialogschritt initiiert.

Wie die Daten zum Prsentationsserver gelangen


Die Nachrichten, die zwischen Prsentationsserver und Applikationsserver ausgetauscht werden, liegen in einem SAP-eigenen Format vor. Das SAPGUI akzeptiert die Bildschirminformation, die vom Applikationsserver gesendet wird und formatiert sie fr das Betriebssystem, auf dem es luft. Dies ermglicht dem Endbenutzer, von verschiedenen Hardware-Plattformen aus Verbindung zu einem einzelnen Applikationsserver aufzunehmen. Zum Beispiel knnen ein OS/2-PC und ein Windows-PC gleichzeitig mit dem gleichen Applikationsserver verbunden sein.

Die Bestandteile eines Arbeitsprozesses


Jeder Arbeitsproze hat vier Bestandteile (siehe Abb. 1.22).

Abbildung 1.22: Die Komponenten eines Arbeitsprozesses Diese vier Komponenten sind:

ein Task Handler (engl. to handle=behandeln) ein ABAP/4-Interpreter ein Screen-Interpreter eine Datenbankschnittstelle

Alle Anfragen werden durch den Task Handler gefiltert und vom entsprechenden Teil des Arbeitsprozesses bearbeitet. Die Interpreter interpretieren den ABAP/4-Code. Beachten Sie, da es zwei Interpreter gibt: den ABAP/4-Interpreter und den Screen-Interpreter. Es gibt zwei Dialekte von ABAP/4: Einer ist die ABAP/4-Datenverarbeitungs-Sprache und der andere eine sehr spezielle Masken-Bearbeitungssprache. Jeder wird von seinem eigenen Interpreter bearbeitet. Die Datenbankschnittstelle hat die Aufgabe, mit der Datenbank zu kommunizieren.

Arbeitsprozesse des SAP-Systems


Es gibt sieben Arten von Arbeitsprozessen. Jede behandelt eine bestimmte Art der Anfrage. Die Art der Prozesse und der Anfragen, die sie behandeln, werden in Tabelle 1.2 gezeigt.

Tabelle 1.2: Arten von Arbeitsprozessen und Anfragen Arbeitsproze (WP)-Typ Anfragetyp D (Dialog) V (Verbucher) B (Background) S (Spool) E (Enqueue) M (Message) G (Gateway) Dialoganforderungen Anfrage, Daten in der Datenbank zu aktualisieren Hintergrundjobs Druckausgaben Logische Sperranforderungen Lenkt Nachrichten zwischen Applikationsservern innerhalb eines R/3 Systems um Schleust Nachrichten in das R/3-System und aus dem R/3-System

Anmeldemandanten
Der Anmeldemandant bezieht sich auf die Nummer, die der Benutzer im Mandantenfeld auf der Anmeldemaske eingibt (siehe Abb. 1.23).

Abbildung 1.23: Der Benutzer gibt den Anmeldemandanten in das Feld Mandant auf der Anmeldemaske ein. Diese Nummer korrespondiert mit Eintrgen innerhalb einer mandantenabhngigen Tabelle in der Datenbank.

Mandantenabhngige und mandantenunabhngige Tabellen


Es gibt zwei Arten von Tabellen in einer R/3-Datenbank: mandantenabhngige und mandantenunabhngige. Eine Tabelle ist mandantenabhngig, wenn das erste Feld vom Typ CLNT ist. Die Lnge wird immer 3 sein, und per Konvention wird dieses Feld immer mandt genannt. Wenn das erste Feld nicht Typ CLNT ist, ist die Tabelle mandantenunabhngig. Beispiele einer mandantenabhngigen und einer mandantenunabhngigen Tabelle zeigen Abb. 1.24 und Abb. 1.25.

Abbildung 1.24: Diese Tabelle ist mandantenabhngig, weil das erste Feld vom Typ CLNT ist.

Abbildung 1.25: Diese Tabelle ist mandantenunabhngig, weil das erste Feld nicht vom Typ CLNT ist. Abb.1.26 zeigt, wie dieses Feld den Benutzer beeinflut.

In Abb. 1.26 meldet sich der Benutzer in Mandant 800 an und aktiviert das folgende Beispielprogramm. Dieses Programm selektiert Zeilen (rows) aus Tabelle lfa1 und schreibt lfa1-lifnr aus. Nachdem dieses Programm gelaufen ist, wurden nur zwei Zeilen ausgewhlt: nmlich diejenige, in der das Feld mandt gleich 800 ist. Dies geschieht automatisch, weil das erste Feld in der Tabelle vom Typ CLNT ist. Es gibt fnf Zeilen in der Tabelle, aber das Programm schreibt nur die Zeilen aus, in denen das Feld mandt gleich 800 ist. Wenn der Benutzer im gleichen Programm den Mandanten 700 ausgewhlt htte, wren 3 Zeilen gefunden und geschrieben worden. Im Falle des Mandanten 900 wre nur eine Zeile gefunden worden.

Abbildung 1.26: Der Effekt von Mandantenabhngigkeit Das Mandantenanmeldeverfahren teilt die Zeilen innerhalb einer mandantenabhngigen Tabelle in charakteristische Gruppen ein. Um auf eine andere Datengruppe zuzugreifen, whlt sich der Benutzer ein, indem er eine andere Mandantennummer eingibt.

Die Anwenderstammdaten (einschlielich der R/3-Benutzer-IDs) sind mandantenabhngig. Daher mu der Sicherheitsadministrator fr Sie eine neue Benutzer-ID innerhalb dieses Mandanten erstellen, um auf diesen Zugriff zu haben. Um innerhalb einer einzelnen Tabelle verschiedene unabhngige Daten anzulegen und darauf zuzugreifen, benutzen Entwickler und Tester das Mandantenanmeldeverfahren. Nehmen wir einmal an, wir htten zwei Programmierer, die an einer Verbesserung des Abrechnungssystems arbeiten. Jim modifiziert die Updatetransaktion, und Jane kreiert einen neuen Bericht (report), der Jims Modifikationen benutzt, ohne da sie vorher miteinander kommuniziert htten.

Jane richtet Daten fr ihren Probelauf ein und fhrt ihren Bericht aus. Jim arbeitet am nchsten Arbeitsplatz, aber wegen seines unkommunikativen Verhaltens ist ihm nicht bewut, da seine Transaktion die gleichen Tabellen benutzt wie der Report von Jane. Er fhrt seine Transaktion aus und aktualisiert die Daten. Jim bekommt, was er wollte, aber Jane modifiziert ihren Code und lt wieder ihr Programm laufen. Ihre Ausgabe unterscheidet sich vom letzten Lauf, doch viele der Unterschiede resultieren nicht aus ihren nderungen, sondern aus den nderungen von Jim. Was wir hier haben, ist ein Abstimmungsfehler.

Wren die Tabellen, die von Jims und Janes Programmen benutzt werden, mandantenabhngig, knnte sich jeder in verschiedenen Mandanten anmelden, ihre voneinander unabhngigen Daten einrichten und ihre Programme testen, ohne jemals miteinander geredet zu haben. Sie knnten ihre gesamten Tests bequem am Arbeitsplatz und unabhngig

vom Mitarbeiter ausfhren. Um ihre Tabellen mandantenabhngig zu machen, bentigen sie nur mandt als das erste Feld, und das R/3-System wird sich um den Rest kmmern. Wenn Datenstze der Tabelle hinzugefgt werden, trgt das System den gegenwrtigen Anmeldemandanten automatisch in das Feld mandt ein, wenn der Datensatz an die Datenbank gesendet wird. Die Open SQL select-Anweisungen liefern nur Zeilen, wo die Mandantennummer in der Tabelle gleich der gegenwrtigen Anmeldemandantennummer ist. Die Open SQL Datenbank-Anweisungen insert, update, modify und delete beinhalten automatische Mandantenpflege. Wenn alle betroffenen Tabellen mandantenabhngig sind, kann es mehr als eine Gruppe von Testern geben, die gleichzeitig in einem Testsystem arbeiten. Zwei Gruppen von Prfern knnen gleichzeitig die divergente Funktionalitt in gleichen Programmen zur gleichen Zeit austesten, wenn sie sich in verschiedenen Mandanten anmelden. Die Updates, die von einer Gruppe gemacht werden, werden die Daten der anderen Gruppe nicht ndern. Ein Testmandant knnte auch auf dem Testsystem existieren. Die Studenten knnten sich in einem Mandanten anmelden, und die Tester in einem anderen. Beide wrden mit den gleichen Programmen arbeiten, aber die Programme wrden auf unabhngige Daten zugreifen.

Die gebruchliche R/3-Installation hat drei Systeme: Entwicklung, Test und Produktion. Jedes System hat Voreinstellungen fr drei Mandanten: 000, 001 und 066. Es ist blich, drei bis sechs Mandanten in den Entwicklungs- und Testsystemen zu haben, aber Sie werden selten mehr als einen Mandanten in der Produktion finden.

Open SQL von SAP


Der ABAP/4-Code ist zwischen Datenbanken portierbar. Um auf die Datenbank in einem ABAP/4-Programm zuzugreifen, werden Sie mit SAPs Open SQL programmieren. Open SQL ist eine Untermenge und Variation von ANSI-SQL. Der ABAP/4-Interpreter reicht alle Open SQL-Anweisungen an die Datenbankschnittstelle als Teil des Arbeitsprozesses weiter (Abb. 1.27). Dort werden sie in das SQL (Native SQL) des installierten RDBMS verwandelt. Wenn Sie eine Oracle-Datenbank laufen lieen, wrde Ihr ABAP/4 Open SQL zum Beispiel von der Datenbankschnittstelle in Oracle- SQL-Anweisungen umgewandelt werden.

Abbildung 1.27: Die Komponenten der Datenbankschnittstelle im Arbeitsproze

Wenn Sie Open SQL benutzen, werden Ihre SQL-Anweisungen zur Datenbankschnittstelle bertragen. Es gibt drei Vorteile, Open SQL zu benutzen. Alle diese Vorteile sind mi Hilfe der Datenbankschnittstelle realisiert.

Portierbarkeit
Der erste Vorteil besteht darin, da Ihre SQL-Anweisungen zwischen Datenbanken portierbar sind. Sollte Ihre Firma zum Beispiel von einer Oracle- zu einer InformixDatenbank wechseln wollen, knnte Ihr ABAP/4-Code ohne Modifikation in der neuen Datenbank laufen.

Puffern von Daten auf dem Applikationsserver

Zweitens puffert die Datenbankschnittstelle die Information aus der Datenbank auf dem Applikationsserver. Wenn Daten aus der Datenbank gelesen werden, knnen sie in Puffern auf dem Applikationsserver gespeichert werden. Wenn eine Anfrage gemacht wird, um auf die gleichen Datenstze zuzugreifen, wrden sie schon auf dem Applikationsserver bereitliegen, und die Anfrage wird aus dem Puffer bearbeitet, ohne auf die Datenbank zugreifen zu mssen. Dieses Pufferungsverfahren reduziert die Last au dem Datenbankserver und auf der Netzwerkverbindung zwischen Datenbank und Applikationsserver und kann die Datenbankzugriffszeiten mit Faktor 10 bis 100 beschleunigen

Automatische Mandantenpflege

Der dritte Vorteil, Open SQL zu benutzen, ist eine automatische Mandantenpflege. Mit Open SQL wird das Mandantenfeld automatisch von der Datenbankschnittstelle besetzt. Dies gibt Ihren Entwicklern und Prfern viele Vorteile, wie die Fhigkeit, vielfache gleichzeitige Tests und bungen auf einer einzelnen Datenbank durchzufhren, ohne sich gegenseitig zu stren.

Zusammenfassung

R/3 untersttzt zahlreiche Hardwareplattformen, Betriebssysteme und Datenbanken. Zustzlich liefert ABAP/4 Open SQL, um Native SQL benutzen zu knnen. Open SQL macht Ihren Code portierbar, schneller und stellt eine automatische Mandantenpflege zur Verfgung. Der Anmeldemandant ermglicht vielen unabhngigen Datengruppen, in der gleichen Tabelle gespeichert zu werden. Die Daten, auf die Sie zugreifen, sind abhngig von der Mandantennummer, die Sie beim Einwhlen eingeben.

Fragen & Antworten


Frage: Kann ich einen bestehenden Mandanten auf einen neuen Mandanten kopieren? Antwort: Der Basisberater wird dies fr Sie tun, wobei er Mandanten-Kopierfunktionen benutzt. Jedes Entwicklungssystem hat mindestens einen Referenzmandanten und einen Arbeitsmandanten. Ihre guten Daten werden im Referenzmandanten gefhrt. Er wird kopiert, um den Arbeitsmandanten zu kreieren. Wenn Sie den Arbeitsmandanten zerstren, kann der Basisberater ihn in seinen ursprnglichen Zustand zurcksetzen, indem er wieder den Referenzmandanten kopiert. Frage: Kann ich ein Programm schreiben, das Daten von einem Mandanten liest, in dem ich nicht angemeldet bin? Antwort: Ja. Sie knnen die Schlsselwrter Client Specified jedem Open SQL Statement hinzufgen. Um Daten in Mandant 900 zu lesen, knnten Sie zum Beispiel programmieren: select * from tbl client specified where mandt = '900'. Es mu Ihnen allerdings klar sein, da Sie dies nur tun sollten, wenn Sie ein System- und kein Anwendungsprogramm schreiben. Die Programme sollten immer mandantenunabhngig sein. Wenn Sie Daten zwischen zwei Produktionsmandanten bertragen mssen, sollten Sie den Datentransfer mit Hilfe von ALE realisieren.

Workshop
Der Workshop bietet Ihnen zwei Mglichkeiten, Ihr gelerntes Wissen umzusetzen. Im Prfungsabschnitt werden Fragen gestellt, die Ihnen helfen sollen, Ihr Verstndnis fr die versprochene Thematik zu vertiefen. Der bungsabschnitt ermglicht Ihnen, Erfahrungen zu sammeln, indem Sie das Gelernte anwenden. Antworten auf die Prfungsaufgaben und die bungen knnen Sie im Anhang B (Antworten zu den Kontrollfragen und bungen) finden.

Kontrollfragen
1. Whlen Sie den Menpfad Werkzeug->Administration, Monitor->Systemberwachung->Benutzerbersicht. Wie lautet der Transaktionscode fr diese Transaktion? 2. Wie lautet der Transaktionscode fr das R/3-Hauptmen? (Das Hauptmen ist das erste Men, das nach der Anmeldung angezeigt wird.) 3. Wie lautet der Transaktionscode fr den Menpfad Werkzeug->Development- Workbench? 4. Wie viele Datenbanken existieren, wenn es drei R/3-Systeme in Ihrer gegenwrtigen Systemlandschaft gibt? 5. Wie viele Instanzen hat ein R/3-System mit zwei Applikationsservern? 6. Was ist Open SQL? 7. Welche Vorteile bietet Open SQL gegenber Native SQL? 8. Welcher Teil des Arbeitsprozesses wird benutzt, um Open SQL zu realisieren? 9. Wann wird ein Rollbereich allokiert, wann wird er deallokiert, und was enthlt er? 10. Wann wird ein Benutzerkontext allokiert, wann wird er deallokiert, und was enthlt er? 11. Wann und warum kommt der Roll-Out vor?

bung 1
Sind die Tabellen in Abb. 1.28 bis 1.31 mandantenabhngig oder mandantenunabhngig?

Ein Imprint des Markt&Technik Buch- und Software-Verlag GmbH. Elektronische Fassung des Titels: ABAP/4 in 21 Tagen, ISBN: 3-8272-2016-X

Woche 1

Tag 2 Ihr erstes ABAP/4-Programm


Kapitelziele
Wenn Sie dieses Kapitel durchgearbeitet haben, sollten Sie folgendes knnen:

einfache ABAP/4-Programme anlegen und modifizieren Standardfunktionen im ABAP/4-Editor verwenden (F1)- und R/3-Bibliotheks-Hilfefunktionen benutzen Ihre Programme mit Hilfe des Object Browser und des Editor finden eine Tabelle und ihren Inhalt anzeigen, indem Sie das Datenwrterbuch (Data Dictionary , auch DDIC genannt) benutzen die Anweisungen tables und select benutzen Anweisungen mit Hilfe des Kettenoperators verketten Ihren Programmen Kommentare und Dokumentationen hinzufgen

Bevor es weitergeht

Sie sollten mit einer Programmiersprache wie C, COBOL oder Visual Basic vertraut sein. Um den vollen Nutzen aus diesem und den folgenden Kapiteln zu ziehen, sollten Sie auch zwei oder mehrere Jahre Entwicklungserfahrung haben. Falls noch nicht geschehen, sollten Sie Ihr Schnittstellenmen so einstellen, wie in Kapitel Tag 1, Abschnitt Arbeiten mit dem Schnittstellenmen empfohlen. Fhren Sie das Installationsverfahren fr die ScreenCams auf der CD-ROM aus. Das Installationsverfahren und weitere Informationen sind in der readme.txt-Datei beschrieben, die im Hauptverzeichnis der CD-ROM liegt.

Viele Vorgehensweisen in diesem Buch sind in ScreenCams demonstriert. ScreenCams sind mit Filmen vergleichbar; sie zeigen eine Reihe von Masken, einschlielich Tastendruck und Mausbewegungen mit einem erklrenden Text. Sie finden die ScreenCams auf der CD-ROM in diesem Buch.

Die Entwicklungsumgebung
Ein Entwicklungsobjekt ist alles, was von einem Entwickler angelegt wird. Programme, Masken, Tabellen, Views, Strukturen, Datenmodelle, Nachrichten und Includes sind Beispiele fr Entwicklungsobjekte. Das R/3-System enthlt Werkzeuge, um Entwicklungsobjekte anzulegen und zu testen. Diese Werkzeuge befinden sich in der R/3-Development Workbench. Um auf irgendein Entwicklungswerkzeug zuzugreifen, gehen Sie zur ABAP/4 Workbench.

Die Workbench enthlt die folgenden Werkzeuge, die Ihnen helfen, Entwicklungsobjekte zu schaffen:

den ABAP/4-Programm-Editor, in dem Sie den ABAP/4-Quelltext und andere Programmbestandteile anlegen und modifizieren knnen das Data Dictionary, in dem Sie Tabellen, Strukturen und Views anlegen knnen den Datenmodellierer, in dem Sie die Beziehungen zwischen Tabellen dokumentieren knnen die Funktionsbibliothek, in der Sie globale ABAP/4-Funktionsmodule anlegen knnen die Screen- und Menu-Painter, in denen Sie eine Anwenderschnittstelle fr Ihre Programme programmieren knnen

Folgende Prf- und Suchwerkzeuge sind vorhanden:


der ABAP/4-Debugger das SQL-Trace Tool, um SQL-Anweisungen zu beschleunigen der Laufzeitanalysator, um die Ausfhrung Ihres Programms zu optimieren ein Verwendungsnachweis fr die Wirkungsanalyse ein computergesttztes Prfwerkzeug fr Rckgangsprfungen ein Repository-Suchwerkzeug fr das Auffinden von Entwicklungsobjekten der Workbench Organizer, um nderungen an den Objekten aufzuzeichnen und sie in die Produktionsumgebung zu befrdern

Alle Entwicklungsobjekte sind portierbar, d.h., sie knnen von einem R/3-System zu einem anderen kopiert werden. Dies geschieht in der Regel, um Ihre Entwicklungsobjekte vom Entwicklungssystem zum Produktionssystem zu bertragen. Wenn sich die Quell- und Zielsysteme auf verschiedenen Betriebssystemen befinden oder verschiedene Datenbanksysteme benutzen, werden Ihre Entwicklungsobjekte ohne jegliche Modifizierung im Istzustand laufen. Dies gilt fr alle Betriebssysteme, die von R/3 untersttzt werden. (Eine Liste untersttzter Hardware und Betriebssysteme finden Sie in Tabelle 1.1.)

Programmtypen
Es gibt zwei Haupttypen von ABAP/4-Programmen:

Reports (Berichte) Dialogprogramme

Reports definieren
Der Zweck eines Reports ist, Daten aus der Datenbank zu lesen und sie auszuschreiben. Er besteht aus nur zwei Masken (siehe Abb. 2.1). Die erste Maske ist die Auswahlmaske. Sie enthlt Eingabefelder, die dem Benutzer erlauben, Auswahlkriterien fr einen Report einzugeben. Zum Beispiel knnte der Report eine Liste von Verkufen fr einen vorgegebenen Datenbereich erzeugen. In diesem Fall wrden die Datenbereichseingabefelder auf der Auswahlmaske des Reports erscheinen. Die zweite Maske ist die Ausgabemaske. Sie enthlt die Liste. Die Liste ist die Ausgabe vom Report und hat normalerweise keine Eingabefelder. In unserem Beispiel wrde sie eine Liste der Verkufe enthalten, die innerhalb des bestimmten Datenbereichs vorkamen. Die Auswahlmaske ist optional. Nicht alle Reports haben eine solche. Alle Reports erzeugen allerdings eine Liste. In diesem Buch werden Sie lernen, wie man Reportprogramme anlegt.

Abbildung 2.1: Die Auswahl- und die Ausgabemaske

Dialogprogramme definieren
Dialogprogramme sind flexibler als Reports und deshalb auf der Programmebene komplexer. Sie knnen mehrere Masken enthalten, und die Maskenfolge kann sich dynamisch whrend der Laufzeit ndern. Auf jeder Maske stehen Ihnen Eingabefelder, Ausgabefelder, Drucktasten und mehrere Mglichkeiten zum Blttern zur Verfgung.

Reportbestandteile
ABAP/4-Reports bestehen aus fnf Komponenten (siehe Abb. 2.2):

Quelltext Attribute Textelemente Dokumentation Varianten

Abbildung 2.2: Die Komponenten eines ABAP/4-Programms Nur die Quelltext- und Programmattributkomponenten sind erforderlich. Die anderen Bestandteile sind optional. Alle Entwicklungsobjekte und ihre Bestandteile sind in der R/3-Datenbank gespeichert. Zum Beispiel wird der Quelltext fr einen Bericht in Datenbanktabelle dd010s gelagert.

Das Laufzeitobjekt
ABAP/4-Programme werden interpretiert und nicht kompiliert. Wenn Sie das erste Mal ein Programm ausfhren, erzeugt das System automatisch ein Laufzeitobjekt. Das Laufzeitobjekt ist eine vorkompilierte Form des Quelltexts. Allerdings ist es kein ausfhrbares Programm, das Sie auf der Betriebssystemebene laufen lassen knnen. Es erfordert stattdessen eine

Interpretation vom R/3-System. Das Laufzeitobjekt wird auch die generierte Form des Programms genannt. Wenn Sie den Quelltext ndern, wird das Laufzeitobjekt automatisch beim nchsten Programmaufruf regeneriert.

Programmnamenskonventionen
Die Firma, fr die bzw. bei der Sie arbeiten, ist Kunde von SAP. Programme, die Sie in Ihrer Firma schreiben, heien deswegen Kundenprogramme. Kundenentwicklungsobjekte folgen Namenskonventionen, die von SAP vordefiniert werden. Diese Konventionen folgen dem sogenannten Kundennamensbereich. Der Kundennamensbereich ist zwischen 2 und 8 Zeichen lang und mu mit dem Buchstaben y oder z anfangen (ab Version 4.0x 40 Zeichen). SAP behlt sich fr ihre eigenen Programme die Buchstaben a bis x vor. Nehmen Sie sich jetzt einen Moment Zeit, um ein persnliches Kennzeichen fr Ihre Programme zu whlen, das drei Zeichen lang sein mu. Innerhalb dieses Buchs werde ich mich auf dieses Kennzeichen beziehen. Es mu mit einem y oder z beginnen. Sie knnten z.B. den Buchstaben z benutzen, gefolgt von Ihren beiden Initialen. Die Notation zeigt an, wo Sie Ihr Kennzeichen benutzen sollten. Wenn Sie zkg whlen und die Aufforderung Geben Sie einen Programmnamen ***abc ein sehen, mssen Sie zkgabc eingeben. Ich empfehle Ihnen, beim Durcharbeiten dieses Buches fr alle Entwicklungsobjekte, die Sie anlegen, immer Ihr persnliches Kennzeichen zu benutzen. Wenn Sie sich daran halten, werden Ihre Objekte spter leichter zu erkennen und zu finden sein. Die Programmnamenskonventionen, die fr dieses Buch angenommen werden, sind wie folgt:

Beispielprogramme der Kapitel folgen der Konvention ztxccnn, wobei cc die Kapitelnummer und nn eine sequentielle Nummer von 01 bis 99 ist. Programmnamen, die in bungen benutzt werden, folgen der Konvention ztyccnn , wobei cc die Kapitelnummer und nn eine sequentielle Nummer ist. Der Programmname fr die Lsung lautet ztzccnn. Dienstprogramme, die auf der CD-ROM zur Verfgung gestellt werden, folgen der Namenskonvention y-xxxxxx, wobei xxxxxx der Name des Hilfsmittels ist.

Das Aufbauprogramm, das Entwicklungsobjekte anlegt und sie fr die bungen mit Daten ldt, wird y-setup genannt. Es kann jederzeit im Bedarfsfall wieder aufgerufen werden, um die bungsdaten wieder in ihren ursprnglichen Zustand zu bringen. Um alle Entwicklungsobjekte und Daten, die vom Setup-Programm angelegt wurden, zu entfernen, lassen Sie das Programm y-uninst laufen. In der readme.txt-Datei auf Ihrer CD-ROM finden Sie weitergehende Informationen.

Ihr erstes Programm


Es folgt jetzt eine Beschreibung, wie ein Programm geschrieben wird. Wenn Sie sich im R/3 anmelden, um Ihr erstes ABAP/4-Programm zu schreiben, sehen Sie zuerst das SAP-Hauptmen. Von dort gehen Sie zur Entwicklungsworkbench und dann zum Editor. Sie geben einen Programmnamen ein und legen das Programm an. Die erste Maske, die Sie sehen, ist die Programmattributmaske. Sie geben dort die Programmattribute ein und sichern. Sie gehen dann zum Quelltexteditor. Im Quelltexteditor geben Sie den Quelltext ein, sichern und fhren das Programm aus. Starten Sie jetzt das ScreenCam How to Create Your First Program. Mit diesem Verfahren schreiben Sie Ihr erstes Programm. Hilfe zu normalen Problemen finden Sie in der darauffolgenden Problemliste. 1. Whlen Sie den Menpfad Werkzeug->ABAP/4-Workbench aus dem R/3-Hauptmen. Eine Maske mit dem Titel

ABAP/4-Workbench wird angezeigt. 2. Klicken Sie die ABAP/4-Editor-Schaltflche auf der Symbolleiste an. Die Maske ABAP/4-Editor:Einstieg erscheint. 3. Geben Sie den Programmnamen ***0201 im Programmfeld ein. 4. Klicken Sie die Schaltflche Anlegen an. Die Maske ABAP/4:Programmattribute Programmname wird angezeigt. Die Felder, die Fragezeichen enthalten, mssen ausgefllt werden. 5. Tippen Sie Mein erstes ABAP/4-Programm in das Titelfeld. Per Voreinstellung wird der Inhalt dieses Feldes am Anfang der Liste erscheinen. 6. Eine 1 in das Typenfeld eingeben. Die 1 zeigt an, da es sich um einen Report handelt. 7. Ein Sternzeichen (*) in das Anwendungsfeld eingeben. Der Wert im Anwendungsgebiet zeigt an, zu welchem Anwendungsbereich dieses Programm gehrt. Die vollstndige Liste von Werten kann erhalten werden, indem Sie den Cursor auf dieses Feld positionieren und dann den Pfeil unten rechts von ihm anklicken. Wenn dieses Programm z.B. zum Inventory Management gehrt, wrden Sie ein L in das Anwendungsgebiet eingeben. Da dies ein einfaches Prfprogramm ist, habe ich ein Sternzeichen benutzt, um zu zeigen, da dieses Programm nicht zu einem speziellen Anwendungsbereich gehrt. 8. Kennzeichnen Sie die Editorsperre. Damit stellen Sie sicher, da niemand auer Ihnen das Programm verndern kann. Sie sollten dies allerdings nicht benutzen, um Entwicklungsprogramme zu sperren. Es wrde andere Programmierer daran hindern, die Programme spter instandzuhalten. 9. Um die Programmattribute zu sichern, klicken Sie auf das Sicherungssymbol auf der Symbolleiste. Die Maske Objektkatalogeintrag anlegen wird angezeigt. 10. Klicken Sie Lokales Objekt an. Die Programmattributmaske wird wieder angezeigt. In der Statusleiste am unteren Rand des Bildschirms erscheint die Nachricht Attribute gesichert. (Anmerkung: die Nachricht, die Sie sehen, enthlt auch den Programmnamen, da sich aber dieser Name fr jeden Benutzer verndert, wird er in diesem Buch nicht erwhnt.) 11. Drcken Sie die Quelltextschaltflche auf der Drucktastenleiste. Die Maske ABAP: Editor Editieren Programm wird angezeigt. 12. Den Menpfad Einstellungen->Editor-Modus whlen. Die Editor Einstellungsmaske wird angezeigt. 13. Whlen Sie die Option PC-Modus mit Zeilennummerierung. 14. Whlen Sie Kleinschreibung aus. 15. Klicken Sie auf den grnen Haken. Sie haben jetzt Ihre Editoreinstellungen gesichert. (Editoreinstellungen mssen nur einmal gesetzt werden.) 16. Schauen Sie auf Zeile 1. Wenn sie nicht die Anweisung Report ***0201. enthlt, tippen Sie diese jetzt ein, wie in Listing 2.1 gezeigt. 17. Auf Zeile 2 schreiben Sie write 'Hallo SAP Welt'. Benutzen Sie Apostrophe, und setzen Sie einen Punkt an das Zeilenende. 18. Sichern Sie das Programm. 19. Um Ihr Programm auszufhren, whlen Sie den Menpfad Programm->Ausfhren. Eine Maske mit dem Titel Mein erstes ABAP/4-Programm wird angezeigt und darunter die Worte Hallo SAP Welt. Dies ist die Ausgabe des Reports,

auch als Liste bezeichnet. Listing 2.1: Ihr erstes-ABAP/4-Programm 1 report ztx0201. 2 write `Hallo SAP Welt. Der Text in Listing 2.1 erzeugt diese Ausgabe: Hallo SAP Welt Herzlichen Glckwunsch, Sie haben gerade Ihr erstes ABAP/4-Programm geschrieben! Um zum Editor zurckzukehren, drcken Sie auf den grnen Pfeil auf der Symbolleiste (oder die (F3)-Taste). Problem Wenn Sie die Schaltflche Anlegen drkken, bekommen Sie eine Dialogbox angezeigt, die sagt: Syntax fr den Objektnamen nicht mglich Wenn Sie die Schaltflche Anlegen drkken, bekommen Sie eine Dialogbox angezeigt, die einen Schlssel verlangt. Sie werden nach einer Auftragsnummer fr eine nderung gefragt. Lsung Sie haben den falschen Programmnamen eingegeben. Ihre Programmnamen mssen mit y oder z anfangen. Drcken Sie den Annullierknopf (das rote X), um abzubrechen, und geben Sie einen neuen Programmnamen ein. Sie haben den falschen Programmnamen eingegeben. Ihre Programmnamen mssen mit y oder z anfangen. Drcken Sie den Annullierknopf (das rote X), um zurckzukehren und einen neuen Programmnamen einzugeben. In der Maske Objektkatalogeintrag anlegen lassen Sie das Feld Entwicklungsklasse leer und klicken stattdessen Lokales Objekt an.

Der Quelltexteditor
In diesem Abschnitt werden Sie lernen, wie man sich die Mglichkeiten des ABAP/4- Editor nutzbar macht, indem man zwei Masken benutzt:

ABAP/4-Editor: Einstieg ABAP/4-Editor: Editieren Programm

Die Maske Editor: Einstieg


Die Maske ABAP/4-Editor: Einstieg wird in Abb. 2.3 gezeigt. Sie knnen von dort aus alle Programmbestandteile anzeigen oder ndern. Um den Quelltext zu ndern, kennzeichnen Sie Quelltext und drcken auf ndern. Oder whlen Sie Attribute und drcken auf Anzeigen, um die Attribute anzuzeigen.

Abbildung 2.3: Aus der Maske ABAP/4-Editor: Einstieg knnen Sie Programmkomponenten anzeigen oder ndern. Die Schaltflche ndern fhrt Sie in den nderungsmodus, der es Ihnen ermglicht, die ausgewhlte Komponente zu ndern.

Beachten Sie in Abbildung 2.3, da die Gruppenbox Objektkomponenten, Optionsfelder und auch die Schaltflchen Anzeigen und ndern enthlt. In einer Gruppenbox, die sowohl Options- als auch Drucktastenfelder enthlt, bestimmen die Optionsfelder die Komponente, die von den Drucktastenfeldern verwaltet wird. Die Wirksamkeit der Optionsfelder ist auf die Gruppenbox beschrnkt; sie haben keine Auswirkungen auf Drucktastenfelder auerhalb der Gruppenbox.

Die Funktionalitt des Quelltexteditors


Vom ABAP/4-Editor: Einstieg whlen Sie Quelltext. Die ABAP/4-Editor: Programm- editiermaske wird angezeigt (Abb. 2.4).

Abbildung 2.4: Benutzen Sie die Maske ABAP/4-Editor: Programme editieren, um die Funktionalitt der Komponenten zu verndern.

Manche Entwickler empfinden die R/3-Anwenderschnittstelle als zu komplex und daher schwer zu erlernen. Ich schlage vor, Sie whlen einen methodischen Weg, der es Ihnen ermglicht, sich jeder neuen Maske anzunhern. Immer, wenn Sie auf eine neue Maske stoen, gehen Sie langsam an die Menteile und Schaltflchen heran. Beginnen Sie links oben in der Maske, und arbeiten Sie sich bis nach rechts unten vor. Halten Sie den Cursor lange genug ber jeder Flche, um sie und die begleitenden Erklrungen zu lesen. Wenn Sie sich fr jede neue Maske ein paar Minuten Zeit nehmen, werden Sie bald mit allen verfgbaren Funktionen vertraut sein. Die Symbolleiste Starten Sie jetzt das ScreenCam Exploring the Standard Toolbar. Die Symbole der Symbolleiste werden in Abb. 2.5 dargestellt.

Abbildung 2.5: Dies sind die Schaltflchen auf der Symbolleiste im ABAP/4-Editor. Die Symbole der Symbolleiste (s. Abb. 2.3) von links nach rechts:

Enter: Die Schaltflche Enter hat die gleiche Wirkung wie die Entertaste. Sie enthlt gleichzeitig die Zeile Teilen Funktion. Um eine Programmzeile zu teilen, positionieren Sie den Cursor an die Stelle, wo die Zeile geteilt werden soll, und drkken Sie (Enter). Befehlsfeld: Hier werden Transaktionstexte und verschiedene andere Befehle eingegeben. Zurck und Exit: Beide bringen Sie zur Maske ABAP/4-Editor: Einstieg. Wenn Sie nicht gesicherte nderungen haben, werden Sie zum Sichern aufgefordert. Annullieren (Cancel): Bringt Sie in den ABAP/4-Editor: Einstieg zurck, ohne Ihre nderungen zu sichern. Wenn Ihre nderungen nicht gesichert sind, werden Sie dazu aufgefordert. Drucken: Druckt den Quelltext Ihres Programms. Beim Ausfhren wird die Druckparametermaske angezeigt. Um Ihre Ausgabe zu erhalten, prfen Sie, ob Sofort Ausgeben aktiviert ist. Suchen: Untersttzt die Funktionalitt Suchen und Ersetzen. Beim Ausfhren wird die Suchen/Ersetzen-Maske gezeigt. Eine detailliertere Erklrung folgt weiter unten. Weiter Suchen: Dies ist eine praktische Abkrzung, um die Zeichenkette zu finden, die als nchste vorkommt. Erste Seite, vorherige Seite, nchste Seite und letzte Seite: Dies ermglicht es Ihnen, im Quelltext auf und ab zu blttern. Hilfe: Sie zeigt eine Dialogbox, von der Sie neben anderen Hilfethemen Hilfe zum Editor- und zur ABAP/4-Syntax erhalten knnen. Positionieren Sie den Cursor auf ein ABAP/4-Schlsselwort oder eine Leerzeile, bevor Sie die Hilfeschaltflche drcken. Der Abschnitt Hilfe spter in diesem Kapitel enthlt mehr Informationen. Nicht erlaubt Schlieen Sie niemals das Editorfenster mit dem X in der rechten oberen Fensterecke. Sie verlieren ungesicherte nderungen.

Erlaubt Sichern Sie Ihr Programm, bevor Sie einen /n-Befehl eingeben. Sie verlieren sonst Ihre nderungen. Suchen und Ersetzen Starten Sie jetzt das ScreenCam Using Find and Replace.

Drcken Sie auf die Schaltflche Suchen auf der Symbolleiste, und das System wird die Suchen/Ersetzen-Maske anzeigen (Abb. 2.6). Geben Sie die Zeichenkette, die Sie finden wollen, in das Suchfeld ein.

Es gibt mehrere Mglichkeiten, auf dieser Maske den Suchproze zu kontrollieren:


Als Zeichenkette wird Ihr Suchtext berall im Programm gefunden. Als Wort wird er nur gefunden, wenn er von Leerzeichen oder Interpunktion auf jeder Seite innerhalb des Quelltextes umgeben ist. Es lt sich auch nach Gro- und Kleinbuchstaben suchen.

Das Feld Suchen hat einige ungewhnliche Qualitten:

Um nach einer Zeichenkette zu suchen, die eingeschlossene Leerzeichen enthlt, tippen Sie einfach die Zeichenkette zusammen mit den Leerzeichen in das Feld Finden. Die Zeichenkette nicht mit Hochkommata einschlieen, da diese sonst ein Teil der Suchkette werden. Um eine Jokersuche durchzufhren, mssen Sie die Zeichen + und * benutzen. Das + prft jedes einzelne Zeichen, whrend * eine beliebige Zeichenkette berprft. Allerdings kann * nur als Stellvertreter an den Anfang oder das Ende einer Zeichenkette gesetzt werden; innerhalb der Zeichenkette wird es nicht als Stellvertreter erkannt. Zum Beispiel wird die engl. Suchkette wo+d word oder wood finden; die Zeichenkette j++n wird john oder joan finden aber nicht jan. *an wird ian oder joan finden und sogar an. Da * innerhalb einer Suchkette nicht als Stellvertreter funktioniert, mu man, um die Zeichenfolge select * from zu finden, den Text genauso eingeben, nmlich select * from. Wenn eine Zeichenkette ein * am Anfang oder am Ende hat, erzeugt das die gleichen Ergebnisse wie die Suche ohne *; * als Joker ist deswegen nicht besonders hilfreich. - . , : ; sind Sonderzeichen. Wenn Ihre Zeichenkette mit einem dieser Zeichen anfngt, mssen Sie sie mit Trennzeichen einschlieen. Sie knnen als Trennzeichen irgendeines dieser Zeichen whlen, solange es nicht innerhalb Ihrer Suchkette erscheint. Zum Beispiel fngt :hh mit einem Sonderzeichen an. Um diese Zeichenkette zu finden, geben Sie -:hh- oder .:hh. oder ,:hh, oder ;:hh;. ein. Das Zeichen # ist auch ein Sonderzeichen. Um in einer Zeichenfolge an beliebiger Stelle das # zu finden, mu man ## fr jedes # ersetzen, das in der Zeichenkette enthalten ist. Um die Zeichenkette a#b zu finden, mu man z.B. die Suchkette a##b benutzen.

Abbildung 2.6: Dies ist die Maske Suchen/Ersetzen. Hier knnen Sie Zeichenketten suchen und ndern bzw. ersetzen. Starten Sie jetzt das ScreenCam Setting the Scope of a Search or Replace Function. Um den Bereich fr Suchen oder Ersetzen abzugrenzen, folgen Sie den nchsten Schritten:

1. Auf der Suchen/Ersetzen-Maske geben Sie die Zeichenkette im Suchfeld ein, die Sie finden wollen. 2. Whlen Sie im Suchbereich die Option Im Aktuellen Quelltext aus. 3. Mit der Option Ab Cursor starten Sie die Suche von der gegenwrtigen Cursorposition aus. Alternativ knnen Sie in bestimmten Zeilenabschnitten suchen. 4. Schaltflche Weiter drcken. Der Cursor wird links von der ersten Vergleichszeichenkette positioniert. 5. Drcken Sie Weiter Suchen, um die nchste Vergleichszeichenkette zu lokalisieren. Starten Sie jetzt das ScreenCam How to Find All Occurrences of a String. Um alle Vorkommen einer Zeichenkette zu finden: 1. Auf der Suchen/Ersetzen-Maske geben Sie die Zeichenkette im Suchfeld ein, die Sie finden wollen. 2. Whlen Sie die Option Globale Suche im Programm. 3. Whlen Sie Weiter. Ein berblick der globalen Suche wird angezeigt. 4. Doppelklicken Sie auf eine Zeile, um den Zusammenhang mit dem Quelltext zu sehen. 5. Zurck drcken, um in der Programmmaske zur globalen Suche zurckzuspringen. 6. Noch einmal Zurck drcken, um zum Quelltexteditor zurckzuspringen. Starten Sie jetzt das ScreenCam How to Search and Replace in the Source Text. Suchen und Ersetzen im Quelltext: 1. Auf der Suchen/Ersetzen-Maske geben Sie die Zeichenkette im Suchfeld ein, die Sie finden wollen. 2. Kennzeichnen Sie Ersetzen durch und geben Sie eine Ersatzzeichenkette ein. 3. Drcken Sie auf Weiter. Die ABAP/4-Programmeditiermaske wird angezeigt. Der Cursor ist links von der nchsten Vergleichszeichenkette positioniert. 4. Zum Ersetzen auf die Schaltflche Ersetzen drcken. Die Zeichenkette an der Cursorposition wird ersetzt, und der Cursor wird an der nchsten Vergleichszeichenkette positioniert. 5. Um ohne zu ersetzen an die nchste Position zu gelangen, drcken Sie die Schaltflche Nchster Treffer. Der Cursor wird an der nchsten Vergleichszeichenkette positioniert. 6. Um alles von der gegenwrtigen Cursorposition bis zum Ende des Quelltextes zu ersetzen, drcken Sie auf die Schaltflche Ohne Besttigung. Starten Sie jetzt das ScreenCam How to Search and Replace Via a Summary Screen. Globales Suchen und Ersetzen: 1. Auf der Suchen/Ersetzen-Maske geben Sie die Zeichenkette im Suchfeld ein, die Sie finden wollen.

2. Kennzeichnen Sie Ersetzen durch und geben Sie eine Ersatzzeichenkette ein. 3. Whlen Sie die Option Globale Suche im Programm. 4. Die Schaltflche Weiter drcken. Die globale Ersetzungsprogramm-Maske wird angezeigt und der Cursor auf der ersten Vergleichszeichenkette positioniert. Alle Zeilen, die Vergleichszeichenketten enthalten, werden angezeigt, und die Vergleichszeichenketten werden hervorgehoben. 5. Um die Zeichenkette an der Cursorposition zu ersetzen, drcken Sie die Schaltflche Ersetzen. Die Zeichenkette an der Cursorposition wird ersetzt, und der Cursor wird an der nchsten Vergleichszeichenkette positioniert. 6. Um ohne zu ersetzen an die nchste Position zu gelangen, drcken Sie die Schaltflche Nchster Treffer. Der Cursor wird an der nchsten Vergleichszeichenkette positioniert. 7. Um alles von der gegenwrtigen Cursorposition bis zum Ende des Quelltextes zu ersetzen, drcken Sie auf die Schaltflche Ohne Besttigung. Wenn Sie irgendeine Zeichenkette ersetzen, mssen Sie Ihre nderungen sichern, bevor Sie zum Quelltexteditor zurckkehren. Drcken Sie deshalb erst auf Sichern und dann auf Zurck. Wenn Sie Ihre nderungen annullieren wollen, whlen Sie bei der Frage Vor Beenden des Editors sichern? Nein. Die Drucktastenleiste Starten Sie jetzt das ScreenCam Exploring the Application Toolbar of the ABAP/4 Editor. Bevor Sie weitermachen, maximieren Sie Ihr Fenster (wenn nicht schon geschehen), weil Sie u.U. sonst die Schaltflchen ganz rechts auf der Drucktastenleiste nicht sehen knnen. Die Schaltflchen der Drucktastenleiste sehen Sie in Abb. 2.7.

Abbildung 2.7: Die Schaltflchen der Drucktastenleiste Es folgt eine Beschreibung der Symbole, wie sie auf dem Bildschirm erscheinen:

Anzeigen<->ndern: ndert die Maske vom Anzeige- in den nderungsmodus. Drcken Sie wieder auf die Schaltflche, um zurck in den Anzeigemodus zu gelangen. Prfen: berprft die Syntax des gegenwrtigen Programms. Verwendungsnachweis: Wenn Sie diese Schaltflche drcken, whrend Ihr Cursor auf einer Variablen steht, werden alle Programmzeilen angezeigt, die sie benutzen. Stapel: Zeigt die Inhalte des gegenwrtigen Navigierungsstapels an. Ausschneiden: Schneidet die Zeile aus, auf welcher der Cursor steht, und stellt den Inhalt in den Zwischenspeicher. In den Puffer kopieren: Kopiert die Inhalte der Zeile, auf welcher der Cursor steht, in den Zwischenspeicher. Aus dem Puffer einfgen (Einsetzen Puffer): Fgt die Inhalte des Zwischenspeichers ber der momentanen Cursorposition in eine neue Zeile ein. Zeile einfgen: Fgt eine Leerzeile ber der gegenwrtigen Cursorposition ein. Markieren: Whlt eine Einzelzeile oder einen Block von Zeilen aus, um sie an andere Textstellen zu bringen, auszuschneiden und wieder einzufgen. Stellen Sie dazu den Cursor auf die letzte Zeile des Blocks und drcken Sie wieder auf Markieren. Die Zeilen, die der Block enthlt, werden rot. Sie knnen jetzt den Textblock ausschneiden, kopieren oder verdoppeln, genauso, wie Sie es fr eine Einzelzeile tten. Um die ausgewhlten Zeilen zu deselektieren, whlen Sie den Menpfad Bearbeiten->Entmarkieren. Widerrufen: Macht Ihre letzte nderung rckgngig. Es ist nur eine Ebene Zurck mglich. ABAP/4-Hilfe: Liefert Hilfe ber den Editor und ber ABAP/4 im allgemeinen. Muster: Ermglicht Ihnen, eine automatisch erzeugte ABAP/4-Anweisung einzufgen. Um z.B. eine writeAnweisung einzufgen, die den Inhalt einer Variablen v1 anzeigt, drcken Sie die Musterschaltflche, dann kennzeichnen Sie write und drcken auf Weiter. Tippen Sie den Variablennamen in Feld ein und drcken Sie auf bernehmen. Eine write- Anweisung wird an der gegenwrtigen Cursorposition eingefgt. Verketten: Verbindet zwei Zeilen. Positionieren Sie den Cursor am Ende einer Zeile und drcken Sie auf die Schaltflche Verketten, um sie mit der nchsten Zeile zu verknpfen. Um eine Zeile zu teilen, positionieren Sie den Cursor an der Stelle, wo die Teilung vorgenommen werden soll, und drcken Sie die Eingabetaste. Doppeln: Dupliziert eine Einzelzeile oder einen ganzen Textblock, sofern einer ausgewhlt wird (s.a. Schaltflchen

Auswhlen). Zeile verschieben: Verschiebt Zeilen von links nach rechts. Um eine Zeile zu verschieben, stellen Sie den Cursor an die Zielposition und drcken auf die Schaltflche Schieben. Um einen ganzen Textblock des Quellcodes zu verschieben, kennzeichnen Sie den Block und setzen Sie den Cursor auf die Anfangszeile des Blocks an die Stelle, an die der Block verschoben werden soll, und drcken dann auf die Schaltflche Schieben. Um den Block nach links zu bewegen, stellen Sie den Cursor links an den Anfang der Zeile und drcken auf die Schaltflche Schieben. Zeile merken: Setzt ein Merkzeichen auf eine Zeile. Sie knnen ber den Menpfad Springen->Merker alle markierten Zeilen anzeigen.

Um eine Zeile an die oberste Stelle im Editorfenster zu stellen, doppelklicken Sie zwischen zwei Wrtern oder am Ende der Zeile. Doppelklicken Sie aber nicht auf ein Wort; das funktioniert nicht. Alternativ hierzu plazieren Sie den Cursor an das Ende der Zeile, und drcken Sie (F2). Ausschneiden und Einfgen In den meisten Windows-Anwendungen gibt es eine Zwischenablage (Clipboard) fr Ausschneide- und EinfgeOperationen. R/3 besitzt fnf Zwischenablagen, die in Tabelle 2.1 beschrieben werden.

Tabelle 2.1: Ausschneide- und Einfge-Puffer Wie man in den Puffer kopiert Wie man aus dem Puffer einfgt Auf die Schaltflche Einfgen drcken Menpfad: Block/Ablage>Einsetzen X-Ablage

Bezeichnung

Verwendung

Der Puffer

Ausschneiden und Einfgen in ein Die Ausschneide- oder Programm Einfge-Schaltflche im Editor benutzen Ausschneiden und Einfgen zwischen zwei Programmen Ausschneiden und Einfgen zwischen:

Die Ablagen X, Y und Z Der Zwischenspeicher (Clipboard)

Menpfad: Block/Ablage>Kopieren in X-Ablage Menpfad: Block/Ablage-> Kopieren in Clipboard

- zwei R/3-Sitzungen - R/3 und anderen Windows Anwendungen (z.B. Notizblock)

Menpfad: Block/Ablage-> Einsetzen Clipboard. Den Text aus dem Zwischenspeicher in das Programm an der aktuellen Cursorposition einfgen. Oder mit (Strg)+(V) ber die existierenden Zeilen kopieren. Es gehen Zeichen verloren, wenn der Platz nicht ausreicht.

- Kopieren des Codes von der (F1)- Hilfe zum Editor - Kopieren von mehr als einer Codezeile

- Einmal klicken - (Strg)+(Y) - Ziehen und markieren - (Strg)+(C)

Die erste Reihe der Tabelle 2.2 ist die programmspezifische Zwischenablage, die einfach Puffer heit. Sie ermglicht es Ihnen, innerhalb eines Programms zu kopieren. Um sie zu benutzen, setzen Sie den Cursor auf eine Zeile oder kennzeichnen einen Block und drcken auf Ausschneiden, Kopieren, oder auf Einfgen aus dem Puffer. Der Inhalt der Zwischenablage geht verloren, wenn Sie den Editor verlassen. Die Zwischenablagen X, Y, und Z werden benutzt, um von einem Programm in ein anderes zu kopieren. Um auf sie zuzugreifen, mssen Sie das Block/Ablage-Men benutzen. Obwohl drei getrennte Zwischenablagen vorhanden sind, werden sie alle auf die gleiche Art genutzt. Ihr Inhalt bleibt erhalten, wenn Sie den Editor verlassen, aber sie gehen verloren, wenn Sie sich abmelden.

Die Zwischenablage ist identisch mit der Windows-Zwischenablage. Benutzen Sie sie, um mit Ausschneiden und Einfgen auf andere Windows-Anwendungen zuzugreifen, wie z.B. MS Word oder Notepad. Sie wird auch benutzt, um Text von der (F1)-Hilfemaske zu kopieren (s.a. den folgenden Abschnitt Hilfe).

Zustzlich zu den Schaltflchen auf der Drucktastenleiste und den Mens knnen Sie standardmige WindowsFunktionen benutzen, um Ausschneide- und Einfge-Operationen durchzufhren. Um ein Wort oder eine Zeile hervorzuheben, ziehen Sie den Cursor darber, oder drcken Sie die Umschalttaste, und bettigen Sie die linken oder rechten Pfeiltasten (mit dieser Methode knnen Sie nur eine Zeile zur Zeit hervorheben). Um mehrere Zeilen hervorzuheben, klicken Sie einmal mit der Maus auf die Bildschirmmaske und drcken dann (Strg)+(Y). Der Zeiger wird verndert. Ziehen Sie den Zeiger ber den Abschnitt, den Sie kopieren wollen. Drcken Sie (Strg)+(C), um den hervorgehobenen Text in die Zwischenablage zu kopieren oder (Strg)+(X), um ihn auszuschneiden. Mit (Strg)+(V) kann der Text wieder aus der Zwischenablage geholt werden. Weitere ntzliche Editorfunktionen

Tabelle 2.2 enthlt einen berblick ber am hufigsten benutzte Editorfunktionen. Auf alle Funktionen wird vom ABAP/4Editor: Programm Editieren zugegriffen, wenn nicht anders erwhnt.

Tabelle 2.2: Andere ntzliche Programm- und Editor-Funktionen Um ... , (Das Ziel) Hilfe fr den Editor zu bekommen Hilfe fr irgendein ABAP/4-Schlsselwort zu erhalten das Programm zu sichern das Programm auszufhren Funktionstasten anzuzeigen den Cursor zum Befehlsfeld zu fhren irgendeine Zeile an den Anfang zu stellen eine Zeile einzufgen eine Zeile zu lschen mu man ... (Der Weg) den Menpfad Hilfe->Erweiterte Hilfe whlen. den Cursor auf ein Schlsselwort innerhalb des Codes positionieren und (F1) drcken. (F11) drcken. (F8) drcken. an beliebiger Stelle des Bildschirmbereichs mit der rechten Maustaste klicken. (Strg)+() drcken. auf das weie Feld (Zeilenende) doppelklicken oder den Cursor auf das weie Feld plazieren und (F2) drcken. den Cursor an den Anfang oder das Ende einer Zeile plazieren und (Enter) drcken. den Cursor auf diese Zeile stellen und Ausschneiden drcken.

einen Textblock zu markieren

den Cursor auf die erste Zeile stellen und (F9) drkken (Auswhlen). Dann den Cursor auf die Schluzeile des Blocks setzen und wieder (F9) drcken. den Block auswhlen und Ausschneiden drcken. die Schalflche Duplizieren drcken. den Cursor an der Trennstelle positionieren und die (Enter)Taste drcken. den Cursor an das Zeilenende stellen und Verketten drcken. einen Block markieren. Die Schaltflche Kopieren in Zwischenspeicher whlen. Dann den Cursor auf dem Punkt plazieren, wo der Block eingefgt werden soll, und Einfgen aus Zwischenspeicher whlen. einen Block markieren, den Menpfad Block/Ablage>Kopieren in X-Ablage whlen. Ein neues Programm ffnen und den Menpfad Block/Ablage->Einsetzen X-Ablage whlen. (In gleicher Weise knnen Sie auch die Y- und ZAblage verwenden.) einen Block markieren. Den Menpfad Block/Ablage>Kopieren in Clipboard whlen, dann den Menpfad Block/Ablage->Einsetzen Clipboard. einen Block markieren und den Menpfad Block/Ablage>Kommentar einfgen whlen. einen Block markieren und den Menpfad Block/Ablage>Kommentar whlen. auf Drucken klicken. sich die Ausgabe ansehen und den Menpfad System ->Liste>Drucken whlen. die Schaltflchen Suchen und Weiter Suchen whlen. den Cursor auf die Zeile, die verschoben werden soll, positionieren. Dann auf die Schaltflche Zeile Verschieben drcken ((F6)). Um einen Block zu verschieben, positionieren Sie den Cursor auf der Anfangszeile und drcken dann auf die Schaltflche Zeile Verschieben. die Schaltflche Widerrufen drcken. Man kann nur eine Stufe zurck. den Menpfad Programm->Pretty-Printer whlen. den Menpfad Hilfsmittel->Download whlen. den Menpfad Hilfsmittel->Upload whlen. den Menpfad Programm->Zwischenspeicher whlen. Die aktuelle temporre Kopie wird beim Sichern des Programms gelscht. den Menpfad Programm->Zwischensp. holen whlen. Sie knnen die gesicherten Kopien so oft Sie wollen wiederholen, bis Sie das Programm gesichert haben. an beliebiger Stelle /nse38 im Befehlsfeld eingeben und (Enter) drcken.

einen Zeilenblock zu lschen eine Zeile oder einen Block zu wiederholen eine Zeile zu teilen zwei Zeilen zu verbinden Zeilen innerhalb des laufenden Programms zu kopieren

Zeilen in ein anderes Programm zu kopieren

aus dem oder in das Windows-Clipboard zu kopieren

einen Zeilenblock zu kommentieren einen Zeilenblock auszukommentieren das Programm zu drucken die Programmausgabe zu drucken zu suchen und weiterzusuchen Programmzeilen nach links/rechts zu verschieben

die letzte nderung rckgngig zu machen automatisch den Quelltext zu formatieren ein Programm auf dem PC zu speichern ein Programm vom PC zu holen eine temporre Kopie Ihres Programms zu sichern

eine temporre Version eines Programms wiederzugewinnen direkt in den Editor zu springen

ein Programm zu kopieren ein Programm umzubenennen ein Programm zu lschen Ihre nderungen unter einem neuen Programmnamen zu speichern zwei Programme gleichzeitig anzuzeigen

vom ABAP/4-Editor: Einstieg den Menpfad Programm>Kopieren whlen. vom ABAP/4-Editor: Einstieg den Menpfad Programm>Umbenennen whlen. vom ABAP/4-Editor: Einstieg den Menpfad Programm>Lschen whlen. whrend des Editierens den Menpfad Programm->Sichern als whlen. von beliebiger Stelle aus einen neuen Modus ffnen. Benutzen Sie den Menpfad System->Erzeugen Modus. In dem neuen Modus gehen Sie in den ABAP/4-Editor unter Angabe des zweiten Namens und drcken auf Anzeigen oder ndern. vom ABAP/4-Editor: Einstieg den Menpfad Hilfsmittel>Splitscreen-Editor whlen. Geben Sie zwei Programmnamen ein und drcken Sie auf Anzeigen. Um den ersten Unterschied anzuzeigen, drcken Sie auf Nchste Differenz. Um beide Programme an der nchsten identischen Zeile auszurichten, bettigen Sie die Schaltflche Angleichen. vom ABAP/4-Editor: Einstieg den Menpfad Hilfsmittel>Splitscreen-Editor whlen. Drcken Sie auf Vergl. ber Systeme. Geben Sie zwei Programmnamen und eine Systemnummer ein und drcken auf Anzeigen. innerhalb des Editors Programm-> Generieren whlen. Das gegenwrtige Programm wird in der Versionsdatenbank gespeichert. im Editor Hilfsmittel-> Versionsverwaltung whlen. Die Maske Versionen des Objekts ...vom Typ REPS wird angezeigt. Deselektieren Sie die aktive Version und kennzeichnen Sie die Version, die Sie wieder herstellen wollen. Drcken Sie auf Zurckholen und dann auf Zurck. Drcken Sie jetzt auf die Schaltflche Ja, und die gegenwrtige Version wird die 1. Generation werden, whrend eine Kopie der ausgewhlten Version die gegenwrtige Version wird. Hilfsmittel->Versionverwaltung whlen. Die Maske Versionen des Objekts ...vom Typ REPS wird angezeigt. Kennzeichnen Sie die Version, die Sie vergleichen wollen und drcken auf die Schaltflchen Vergleichen (oder benutzen Sie den Menpfad Versionen->Vergleichen). Die Vergleichsprogramme: Blttern Sie nach unten, um die Unterschiede anzusehen. Programm->Drucken whlen. Whlen Sie einen Drucker aus und kennzeichnen Sie Sofort Ausgeben.

zwei Programme zu vergleichen

zwei Programme auf verschiedenen Systemen zu vergleichen

eine Version von einem Programm zu sichern

eine Programmversion wiederzugewinnen

Programmversionen zu vergleichen

Ihr Programm zu drucken

Hilfe
Starten Sie jetzt das ScreenCam Getting Help. So erhalten Sie einen vollstndigen Tutorenkurs zum Editor: 1. Rufen Sie den ABAP/4-Editor auf.

2. ber den Menpfad Hilfe->Erweiterte Hilfe wird die SAP R/3-Hilfemaske angezeigt. 3. Durch einen Klick auf den Text ABAP/4-Editor wird die Hilfe zur ABAP/4-Entwicklungsworkbench angezeigt. 4. Klicken Sie auf irgendeinen unterstrichenen Text, um Hilfe zu diesem Thema zu erhalten. Es gibt zwei grundlegende Arten von Hilfe im Editor, die (F1)-Hilfe und die R/3-Bibliothekshilfe. (F1)-Hilfe wird auch als ABAP/4-Schlsselwortdokumentation bezeichnet. Die (F1)-Hilfe beschreibt die Syntax von ABAP/4-Schlsselworten und fhrt Beispiele ihrer Verwendung auf. Sie ist textbasierend und in Tabellen innerhalb der R/3-Datenbank abgelegt. Die R/3-Bibliothekshilfe ist weitreichender und enthlt bersichten von Entwicklungsobjekten und Prozeduren, um Entwicklungsobjekte anzulegen. Sie basiert auf Windows und befindet sich auerhalb der R/3-Datenbank, blicherweise auf einer CD- ROM.

F1-Hilfe
Die (F1)-Hilfe ist praktisch, um die Syntax nachzuschlagen, und enthlt oft ntzliche Programmierbeispiele. So rufen Sie die (F1)-Hilfe auf: 1. Gehen Sie zum ABAP/4-Editor. 2. Plazieren Sie den Cursor auf das ABAP/4-Schlsselwort, fr welches Sie Hilfe brauchen. 3. Drcken Sie (F1). Die Hypertext-Maske wird angezeigt. Innerhalb der (F1)-Hilfe sind hervorgehobene Worte Hypertext-Verbindungen. Wenn Sie diese gekennzeichneten Texte anklicken, erhalten Sie weitergehende Informationen.

Mit dem Hilfsmittel Find/t auf der CD-ROM finden Sie weitere Beispiele. Innerhalb der Hilfe finden Sie oft Programmierbeispiele. Um sie auszuschneiden und in Ihr Programm einzufgen, drcken Sie (Strg)+(Y) und markieren dann einen Block, indem Sie den Cursor von der oberen linken zur unteren rechten Ecke ziehen. Drcken Sie jetzt (Strg)+(C), und kehren Sie zum ABAP/4-Editor zurck. Fgen Sie den Block ber Block/Ablage->Einsetzen Clipboard ein. Oder benutzen Sie (Strg)+(V).

R/3-Bibliotheks-Hilfe
Die R/3-Bibliothekshilfe ist in Windows-Hilfsdateien gespeichert. Um sie aufzurufen, gehen Sie folgendermaen vor: 1. Der Menpfad Hilfe->R/3-Bibliothek kann aus jeder Maske heraus gewhlt werden. Die R/3-Online-Hilfe wird angezeigt. 2. Klicken Sie die Text-Basis-Bestandteile fr Hilfe zu ABAP/4 an. Der Basisbildschirm wird angezeigt.

3. Klicken Sie auf den Text ABAP/4-Entwicklungsworkbench. Die Maske ABAP/4- Entwicklungsworkbench wird angezeigt. 4. Sie knnen von hier aus detaillierte Hilfe zu fast jedem Aspekt ber das Programmieren in ABAP/4 bekommen. Klicken Sie einfach auf das Thema, fr das Sie Hilfe bentigen. Zustzlich knnen Sie durch die folgende Prozedur Hilfe aus dem ABAP/4-Editor erhalten: 1. Gehen Sie in den ABAP/4-Editor. 2. Whlen Sie den Menpfad Hilfsmittel->Schlsselwortdoku whlen. Strukturanzeige: Die ABAP/4-4GL Programmiersprache von SAP wird angezeigt. 3. Drcken Sie auf die Schaltflche Suchen. Die entsprechende Maske wird angezeigt. 4. Geben Sie den gesuchten Text in das Suchfeld ein. 5. Drcken Sie Weiter. Die Anfangszeile des gesuchten Textes ist hervorgehoben. 6. Doppelklicken Sie auf diese erste Zeile, um weitere Informationen zu erhalten, oder drcken Sie Weitersuchen auf der Symbolleiste, um das nchste Auftreten zu lokalisieren. Auch innerhalb des Editors kann man Hilfe erhalten, whrend der Quelltext editiert wird. Whlen Sie den Menpfad Hilfsmittel->Hilfe zu. Sie knnen hier die folgenden Arten von Hilfe bekommen:

Editorhilfe ABAP/4-bersicht ABAP/4-Schlsselwort Neues zu ABAP/4 Funktionsbaustein Tabellenstrukturen Logische Datenbanken Berechtigungsobjekte Infotypen

Ihre Entwicklungsobjekte wiederfinden


Starten Sie jetzt das ScreenCam Finding Your Development Objects. Gehen Sie folgendermaen vor, um alle Entwicklungsobjekte anzuzeigen, die Sie im R/3-System angelegt haben: 1. Starten Sie den Object Browser von der ABAP/4-Entwicklungsworkbench. 2. Lokale Priv. Objekte auswhlen. 3. Anzeigen auswhlen. Der Repository Browser: Entwicklungsklasse $TMP wird angezeigt. Sie sehen hier eine Liste von Entwicklungsobjektkategorien. Links von jeder Kategorie ist ein Pluszeichen. 4. Klicken Sie einmal das Pluszeichen an, um den Knoten aufzublttern. 5. Doppelklicken Sie auf einen Objektnamen, um ihn anzuzeigen. Wenn das Objekt, das Sie zweimal angeklickt haben, ein Programm ist, wird eine Baumstruktur des Programms und seiner Bestandteile angezeigt.

6. Um den Programmquelltext anzuzeigen, doppelklicken Sie auf den Namen des Programms am Oberteil der Baumstruktur. Es erscheint die Maske ABAP/4-Editor: Programm Anzeigen. Sie sind jetzt im Anzeigemodus des ausgewhlten Objekts. Nun knnen Sie die Schaltflche Anzeigen <-> ndern drcken, um in den Editiermodus zu gelangen.

Diese Methode funktioniert nur bei Objekten, die als lokale Objekte gesichert wurden. Sie werden hier nur angezeigt, wenn Sie die Schaltflche Lokales Objekt auf der Maske Objektkatalogeintrag gedrckt haben, als Sie das Objekt anlegten. Wenn Sie ein Programm suchen und die ersten Buchstaben seines Namens kennen, knnen Sie es vom ABAP/4-Editor aus folgendermaen finden: 1. Rufen Sie den ABAP/4-Editor auf. 2. Geben Sie die ersten Buchstaben Ihres Programmnamens im Programmfeld ein, gefolgt von einem Sternzeichen. Um z.B. alle Programme anzuzeigen, die mit ztx anfangen, geben Sie einfach ztx* ein.

3. Klicken Sie auf den Pfeil nach unten rechts von dem Programmfeld. Die Programm-Maske wird angezeigt. Eine Liste von Vergleichsprogrammnamen erscheint auf dieser Maske. Rechts von den Programmnamen ist die Kurzbeschreibung der Programme. 4. Doppelklicken Sie auf den Programmnamen, den Sie editieren wollen. Der Programmname wird im Feld Programm angezeigt.

Das R/3-Data Dictionary


Das R/3-Data Dictionary (Datenwrterbuch, kurz DDIC genannt) ist ein Hilfsmittel, um Datenobjekte zu definieren. Indem Sie das Data Dictionary benutzen, knnen Sie Objekte wie Tabellen, Strukturen und Views anlegen und speichern. Um das Datenwrterbuch aufzurufen, mssen Sie folgende Schritte ausfhren: 1. Rufen Sie die ABAP/4-Workbench auf. 2. Drcken Sie auf die ABAP/4-Dictionary-Schaltflche auf der Symbolleiste. Das Data Dictionary erscheint (siehe Abb. 2.8).

Abbildung 2.8: Die Dictionary-Einstiegsmaske Das Data Dictionary liegt innerhalb des R/3-Systems. Sie knnen es sich so vorstellen, als ob es ber einer Datenbank wie Oracle oder Informix sitzt und das Generieren und Senden von SQL-Anweisungen steuert. Sie knnten z.B. eine Tabellendefinition im Data Dictionary anlegen. Wenn Sie die Tabellendefinition aktivieren, werden SQL- Anweisungen generiert und an das RDBMS gesandt, was zur Folge hat, da sie die eigentliche Tabelle in der Datenbank anlegt. Wenn Sie die Tabelle verndern wollen, mssen Sie die Tabellendefinition in dem Data Dictionary modifizieren. Wenn Sie die Tabelle wieder aktivieren, entstehen zustzliche SQL-Anweisungen, was zur Folge hat, da das RDBMS die Tabelle modifiziert. Erlaubt Benutzen Sie das Data Dictionary, um alle Datenbankobjekte anzulegen und zu modifizieren. Nicht erlaubt Modifizieren Sie keine Tabelle oder andere Objekte auf der RDBMS-Ebene. Die Data Dictionary-Definitionen knnen sich nicht selbst aktualisieren und werden nicht synchron mit der Datenbank sein. Dies kann zu Anwendungsfehlern und zu einem Verlust der Datenintegritt fhren.

Tabellen und Strukturen

In R/3 ist eine Tabelle eine Sammlung von Zeilen. Jede Zeile enthlt Felder, auch Spalten genannt. Innerhalb einer Tabelle, hat jede Zeile die gleiche Anzahl von Spalten wie die anderen Zeilen der Tabelle. Eine Tabelle behlt die eingegebenen Daten. Mit anderen Worten, wenn Sie Daten in eine Tabelle einfgen, bleiben sie dort, nachdem Ihr Programm endet. Sie werden dort solange bleiben, bis sie von Ihrem Programm oder einem anderen Programm gendert oder gelscht werden. Der Name einer Tabelle ist innerhalb des ganzen R/3- Systems eindeutig.

Wenn Sie sich eine Tabelle in dem Data Dictionary ansehen, sehen Sie sich die Beschreibung einer Tabelle in der zugrunde

liegenden Datenbank an. Sie sehen die Datenbanktabelle nicht direkt. Abb. 2.9 zeigt, wie eine Tabellendefinition im R/3Data Dictionary erscheint.

Abbildung 2.9: Die DDIC-Definition der Tabelle lfa1 In R/3 bedeutet eine Struktur die Beschreibung einer Gruppe von Feldern. Sie beschreibt die Feldnamen, ihre Folge und ihre Datentypen und Lngen. Jede Struktur hat einen Namen, der innerhalb des ganzen R/3-Systems eindeutig ist. Eine Struktur kann nicht namensgleich mit einer Tabelle sein. Ein Strukturname kann auf zwei Arten benutzt werden:

In einem Programm kann ein Strukturname benutzt werden, um Speicherplatz fr eine Gruppe von Feldern zu allokieren. In einer Tabelle kann ein Strukturname benutzt werden, um eine Gruppe Felder zu beschreiben.

Eine Struktur ist streng genommen etwas, das nur innerhalb des R/3-Datenwrterbuchs existiert. Wenn Sie das Wort Struktur sehen, sollten Sie sofort an Data Dictionary-Strukturen denken. Allerdings benutzt die SAP-Dokumentation zeitweilig das Wort Struktur, um sich innerhalb eines Programms auf eine Gruppe von Variablen zu beziehen. Die Struktur emara in Abb. 2.10 ist ein Beispiel dafr, wie eine Struktur im Data Dictionary erscheint.

Abbildung 2.10: Die DDIC-Definition der Struktur emara In R/3 sind sowohl Tabellen als auch Strukturen im Data Dictionary definiert. Sie werden jedoch bemerken, da es sehr geringe Unterschiede zwischen ihnen gibt. Das kommt daher, da eine Tabelle in R/3 die Beschreibung einer aktuellen Datenbanktabelle ist. Es ist die Struktur der Tabelle in der Datenbank. Sowohl Tabellen als auch Strukturen innerhalb des Data Dictionarys definieren eine Anordnung - eine Serie von Feldern. Der Hauptunterschied zwischen den beiden ist, da eine Tabelle eine zugrunde liegende Datenbanktabelle hat, die sich damit assoziiert. Eine Struktur tut das nicht. Die R/3-Dokumentation erscheint manchmal verwirrend, da SAP diese zwei Begriffe auswechselbar benutzt.

Eine Tabelle oder Strukturdefinition anzeigen


So zeigen Sie eine Tabellen- oder Strukturdefinition im Data Dictionary an: 1. Gehen Sie zum Data Dictionary. 2. Tragen Sie den Tabellen- oder Strukturnamen in das Objektnamensfeld ein. 3. Kennzeichnen Sie die Tabelle oder die Struktur. 4. Klicken Sie auf Anzeigen. Die Maske Dictionary: Tabelle/Struktur: Felder Anzeigen erscheint wie in Abb. 2.9 und 2.10. Was Sie in Abbildung 2.9 sehen, ist die Struktur von Tabelle lfa1 im R/3-Data Dictionary, nicht die eigentliche Datenbanktabelle. In R/3 kann einzig die Struktur einer Tabelle definiert werden, zusammen mit einigen Merkmalen wie den Primrschlsselfeldern.

Daten in der Tabelle anzeigen

R/3 bietet auch ein Hilfsmittel, um Ihnen das Anzeigen von Daten zu ermglichen, die innerhalb einer Tabelle existieren, und zwar folgendermaen: 1. ffnen Sie Dictionary: Tabelle/Struktur: Felder Anzeigen. 2. Whlen Sie den Menpfad Hilfsmittel->Tabelleninhalt. Die Maske Data Browser: Tabelle: Auswahl wird angezeigt. 3. Um alle Zeilen in der Tabelle anzuzeigen, drcken Sie auf die Schaltflche Ausfhren, ohne irgendwelche Suchkriterien einzugeben. Die Maske Data Browser: Tabelle: Selektion wird angezeigt (s. Abb. 2.11). Die Anzahl von Stzen, die angezeigt werden, ist abhngig vom Wert der maximalen Treffer.

Lschen Sie nicht die Feldinhalte der maximalen Trefferzahl, um alle Datenstze anzuzeigen, auer Sie beabsichtigen, die ganze Liste zu berprfen. Fr groe Tabellen kann dies viel CPU-Zeit auf den beiden Datenbank- und Anwendungsservern verbrauchen, den Netzverkehr bedeutend erhhen und das System verlangsamen. Wenn solch ein groer Report bentigt wrde, liefe er normalerweise im Hintergrund. Es sollten vorzugsweise Selektionswerte im Data Browser eingegeben werden. Dies wird ausfhrlich in einem spteren Kapitel beschrieben.

Abbildung 2.11: Data Browser:Tabelle:Selektionsbild

Angezeigte Felder
Sie knnen kontrollieren, welche Felder Sie ber den Data Browser anzeigen wollen. 1. Gehen Sie zum Data Browser: Tabelle: Selektionsbild (oder Transaktionscode SE11). 2. Whlen Sie den Menpfad Einstellungen->Felder fr Selektion. Die Auswahlmaske wird angezeigt. 3. Markieren Sie die Felder, die Sie fr die Data Browser: Tabelle: Auswahlmaske nutzen wollen. Was nicht erscheinen soll, mssen Sie deselektieren. 4. Drcken Sie die Schaltflche Ausfhren. Die Data Browser: Tabelle: Selektionsbildmaske wird angezeigt und enthlt die Felder, die Sie ausgewhlt haben.

Die ABAP/4-Syntax
Bevor Sie fortfahren, sollten Sie jetzt die bung Setup Utility von der beiliegenden CD-ROM laufen lassen. Hier werden die Tabellen und Daten angelegt, die fr die bungen in diesem Buch bentigt werden. In der readme.txt-Datei im Hauptverzeichnis der CD-ROM finden Sie weitere Instruktionen.

Die select-Anweisung
Die select-Anweisung erhlt Datenstze aus der Datenbank. Syntax fr die select-Anweisung Der folgende Programm-Code zeigt die vereinfachte Syntax fr die select-Anweisung: select * from t1 [into wa] [where f1 op v1 and/or f2 op v2 ...][order by f1]. (other abap/4 statements) endselect.

Erluterungen:

* zeigt an, da alle Felder in der Tabelle gelesen werden sollten. t1 ist der Name einer Tabelle, die vorher ber eine tables-Anweisung definiert wird. wa ist der Name des Arbeitsbereichs, der zur Struktur der Tabelle pat. f1 ist der Name eines Feldes in Tabelle t1. op ist eine der folgenden logischen Operationen: = <> > >= < <=. v1 ist ein Literal oder eine Variable. and/or ist entweder das Wort and oder das Wort or.

Schreiben Sie ein neues Programm, und nennen Sie es ***0202. Benutzen Sie den Code, wie in Listing 2.2 gezeigt. Listing 2.2: Ihr zweites Programm 1 report ztx0202.

2 3 4 5

tables ztxlfa1. select * from ztxlfa1 into ztxlfa1 order by lifnr. write / ztxlfa1-lifnr. endselect.

Der Code in Listing 2.2 sollte diese Ausgabe erzeugen: 1000 1010 1020 1030 1040 1050 1060 1070 1080 1090 2000 V1 V10 V11 V12 V2 V3 V4 V5 V6 V7 V8 V9

Lfa1 ist die Kreditorenhaupttabelle in R/3. Ztxlfa1 wurde von der CD-ROM-Setup- Routine kreiert und ist lfa1 hnlich, wird aber fr die bungen in diesem Buch benutzt. Das Feld lifnr ist das Kreditorennummernfeld. Dieses Programm liest alle Datenstze aus der Tabelle ztxlfa1 und schreibt die Inhalte des Feldes lifnr (die Kreditorennummer) in aufsteigender Ordnung aus.

In Zeile 1 wird die report-Anweisung als Anfangszeile eines Reports verlangt. In Zeile 2 macht die tables-Anweisung zwei Dinge: Sie allokiert zum einen den Speicherbereich (Arbeitsbereich genannt) namens ztxlfa1. Der Arbeitsbereich hat die gleiche Anlage wie die DDIC-Definition von Tabelle ztxlfa1. Zum anderen ermglicht sie dem Programm den Zugriff auf die Datenbanktabelle ztxlfa1. In Zeile 3 macht die select-Anweisung eine Schleife. Das endselect in Zeile 5 markiert das Ende der Schleife. Die Codezeilen zwischen select und endselect werden jeweils einmal ausgefhrt, und zwar fr jede Zeile, die aus der Datenbank kommt. In Zeile 4 wird die write-Anweisung einmal fr jede Zeile ausgefhrt, die von der Tabelle gelesen wird. Der / (Slash) nach write fngt eine neue Zeile an.

Beachten Sie in Ihrem Programm, da Sie zwei Dinge namens ztxlfa1 haben: einen Arbeitsbereich und eine Tabelle. Beide haben den gleichen Namen - ztxlfa1. Die Position des Namens ztxlfa1 innerhalb einer Anweisung entscheidet, worauf Sie sich beziehen. In Zeile 3 bezieht sich das erste Vorkommen von ztxlfa1 auf die

Datenbanktabelle, das zweite auf den Arbeitsbereich. Starten Sie jetzt das ScreenCam AVI Select Statement Processing. Die Verarbeitung luft folgendermaen ab (Abb. 2.12): 1. Das Bettigen der (F8)-Taste ( um das Programm auszufhren ), bewirkt eine Anfrage vom SAPGUI an den Dispatcher auf dem Applikationsserver, das Programm ztx0202 auszufhren. 2. Die Anfrage wird zum ersten verfgbaren Work-Proze gesandt. 3. Der Benutzerkontext wird in den Work-Proze eingelesen (gerollt). 4. Das Programm wird aus der Datenbank zurckgeholt. 5. Der Work-Proze allokiert einen Rollbereich, um die Variablen des Programms, den gegenwrtigen Programmzeiger und die persnliche Memorybelegungen zu halten. 6. Das Programm wird vom Work-Proze auf dem Applikationsserver ausgefhrt und beginnt auf Zeile 3 zu laufen. (Zeilen 1 und 2 sind Deklarationen, keine ausfhrbaren Codes.) 7. Zeile 3 bewirkt, da eine Zeile aus der Datenbanktabelle ztxlfa1 gelesen und in den Arbeitsbereich ztxlfa1 gesetzt wird. 8. Beim ersten Mal wird Zeile 4 ausgefhrt, eine virtuelle Seite wird fr die Liste allokiert. 9. Zeile 4 bewirkt, da das Feld lifnr vom Arbeitsbereich ztxlfa1 an die virtuelle Seite geschrieben wird. 10. Von Zeile 5 geht eine Schleife zurck zu Zeile 3. 11. Die nchste Reihe wird von Tabelle ztxlfa1 gelesen und in den Arbeitsbereich ztxlfa1 gestellt, wobei die vorherige Reihe berschrieben wird. 12. Das Feld lifnr wird in die nchste Zeile der virtuellen Seite geschrieben. 13. Die Schritte 9 bis 11 werden fr alle Reihen in Tabelle ztxlfa1 wiederholt. 14. Die Schleife endet automatisch, wenn die letzte Zeilen von ztxlfa1 gelesen ist. 15. Das Programm endet, aber der Rollbereich (welcher die virtuelle Seite enthlt) bleibt allokiert. 16. Der Work-Proze bestimmt die Zeilenanzahl, die die Maske des Benutzers anzeigen kann, und sendet so viele Zeilen von der virtuellen Seite als erste Seite der Liste an den Prsentationsserver. 17. Der Benutzerkontext und der Rollbereich werden aus dem Work-Proze gerollt. Wenn der Benutzer dann Bild Abwrts (Blttern) drckt, geht der Proze folgendermaen weiter (Abb. 2.13): 1. Indem Bild Abwrts gedrckt wird, startet eine Anfrage von dem SAPGUI an den Dispatcher auf dem Applikationsserver, um die nchste Seite von ztx0202 zu bekommen. 2. Die Anfrage wird an den ersten verfgbaren Work-Proze gesandt.

3. Der Benutzerkontext und der Rollbereich fr ztx0202 werden in den Work-Proze gerollt. 4. Der Work-Proze sendet dem Prsentationsserver die nchste Seite. 5. Der Rollbereich und der Benutzerkontext werden aus dem Work-Proze gerollt.

Abbildung 2.12: So arbeitet die select-Anweisung.

Abbildung 2.13: Dies passiert, wenn der Benutzer Abwrts Rollen drckt.

Wenn der Benutzer dann Zurck drckt, geht der Proze folgendermaen weiter: 1. Indem Zurck gedrckt wird, startet eine Anfrage von dem SAPGUI an den Dispatcher auf dem Applikationsserver, um Programm ztx0202 zu beenden. 2. Die Anfrage wird an den ersten verfgbaren Work-Proze gesandt. 3. Der Benutzerkontext und der Rollbereich fr ztx0202 werden in den Work-Proze gerollt. 4. Das System macht den Rollbereich fr das Programm frei. 5. Der Benutzerkontext wird ausgerollt.

Um ein neues R/3-Fenster (Modus genannt) zu ffnen, whlen Sie von jeder Maske aus den Menpfad System->Erzeugen Modus. Sie knnen maximal sechs Modi ffnen. Wenn Sie mehr als sechs ffnen wollen, whlen Sie sich einfach ein zweites Mal ein.

Tabellenarbeitsbereiche
Auf Reihe 3 in Listing 2.2 sind die Worte into ztxlfa1 optional. Wenn Sie sie fortlassen, wird der Arbeitsbereich mit dem gleichen Namen wie dem der Tabelle benutzt. Mit anderen Worten: Die gegenwrtige Reihe wandert automatisch in den ztxlfa1- Arbeitsbereich. Aus diesem Grund wird er Vorgabetabellenarbeitsbereich genannt. Der Arbeitsbereich ztxlfa1 ist in diesem Fall der Vorgabearbeitsbereich der Tabelle ztxlfa1. Der Code in Listing 2.2 kann daher so vereinfacht werden, wie das in Listing 2.3 gezeigt wird. Listing 2.3: Ihr zweites Programm vereinfacht 1 2 3 4 5 report ztx0203. tables ztxlfa1. select * from ztxlfa1 order by lifnr. write / ztxlfa1-lifnr. endselect.

Im Vergleich mit Listing 2.2 hat sich nur die Zeile 3 verndert. Dieses Programm arbeitet genau so wie das bisherige und erzeugt die gleiche Ausgabe. Solange kein into auf der select-Anweisung spezifiziert wird, benutzt das System den Vorgabetabellenarbeitsbereich ztxlfa1.

Um ein Programm zu kopieren, whlen Sie den Menpfad Programm->Kopieren. Whrend Sie ein Programm editieren, knnen Sie alternativ den Menpfad Programm->Sichern als whlen. Benutzung eines expliziten Arbeitsbereichs Die tables-Anweisung legt immer einen Vorgabetabellenarbeitsbereich an, so da Sie normalerweise Ihren eigenen

nicht definieren mssen. In einigen Fllen kann es allerdings passieren, da Sie zustzliche Tabellenarbeitsbereiche definieren wollen. Wenn Sie die Originalfassung von einer Reihe behalten und auch eine modifizierte Version haben wollten, bruchten Sie zum Beispiel zwei Arbeitsbereiche. Sie knnen zustzliche Tabellenarbeitsbereiche definieren, indem Sie die data-Anweisung benutzen. Vereinfachte Syntax fr die data-Anweisung Unten sehen Sie die vereinfachte Syntax fr die data-Anweisung. data wa like t1. wobei gilt:

wa ist der Name von einem Tabellenarbeitsbereich, den Sie definieren wollen. t1 ist der Name einer Tabelle, nach der Sie Ihren Arbeitsbereich strukturieren wollen.

Listing 2.4 zeigt, wie man mit Hilfe der data-Anweisung einen neuen Arbeitsbereich anlegt. Listing 2.4: Ihr eigener Tabellenarbeitsbereich 1 2 3 4 5 6 report ztx0204. tables ztxlfa1. data wa like ztxlfa1. select * from ztxlfa1 into wa order by lifnr. write / wa-lifnr. endselect.

Der Code in Listing 2.4 sollte die gleiche Ausgabe erzeugen wie die bisherigen zwei Listings (vergleiche die Ausgabe von Listing 2.3). Bitte beachten Sie, da es in diesem Beispiel nicht notwendig ist, einen neuen Arbeitsbereich zu definieren es soll hier nur der Begriff veranschaulicht werden.

Zeile 3 definiert einen neuen Arbeitsbereich, genannt wa, mit der Struktur von ztxlfa1 aus dem Data Dictionary. Zeile 4 liest eine Zeile zur Zeit aus der Tabelle ztxlfa1 in den Arbeitsbereich wa anstatt in den Vorgabetabellenarbeitsbereich. Zeile 5 schreibt die Reihe von wa statt von ztxlfa1 aus.

Wenn Sie einen Arbeitsbereich explizit mit der select-Anweisung benennen (wie into wa auf Zeile 5), wird dieser expliziter Arbeitsbereich genannt.

Die where-Klausel
Um die Anzahl von Zeilen zu beschrnken, die aus der Datenbank gelesen werden, kann der select-Anweisung eine where-Klausel hinzugefgt werden. Um Kreditoren zu erhalten, deren Nummern kleiner sind als 2000, knnen Sie z.B. den Code in Listing 2.5 benutzen. Listing 2.5: Eingrenzung der ausgewhlten Kreditoren 1 report ztx0205. 2 tables ztxlfa1. 3 select * from ztxlfa1 where lifnr < '0000002000' order by Lifnr. 4 write / ztxlfa1-lifnr.

5 endselect. Der Code in Listing 2.5 sollte diese Ausgabe erzeugen: 1000 1010 1020 1030 1040 1050 1060 1070 1080 1090 Dieses Programm liest alle Stze von der Tabelle ztxlfa1, in denen die Kreditorennummer kleiner als 2000 ist, und schreibt den Inhalt des Feldes lifnr aus. In der Datenbank ist lifnr ein Zeichenfeld mit numerischen Werten, rechtsbndig und links mit Nullen aufgefllt. Der Wert, der mit lifnr zu vergleichen ist, sollte deswegen das gleiche Format und den gleichen Datentyp haben, um Datenumsetzung zu umgehen und sicherzustellen, da die geplanten Ergebnisse erzielt werden. Beachten Sie, da Sie die Zeichenkette mit Anfhrungszeichen (wie `0000002000 auf Zeile 3) versehen mssen, um ein Zeichenliteral in ABAP/4 zu programmieren.

Arbeiten mit Systemvariablen


Das R/3-System macht Systemvariable innerhalb Ihres Programms verfgbar. Sie mssen sie nicht definieren, um auf sie zuzugreifen, sie sind immer verfgbar und werden automatisch vom System auf den neuesten Stand gebracht, wenn sich die Umgebung Ihres Programms ndert. Alle Systemvariablen beginnen mit dem Prfix sy-. Zum Beispiel ist das gegenwrtige Systemdatum in dem Systemfeld sy-datum, und die gegenwrtige Zeit in der sy-uzeit verfgbar. Sie heien kurz Sy -Felder. Alle Systemvariablen sind im Data Dictionary unter der Struktur syst definiert. Definieren Sie syst nicht in Ihren Programmen; seine Felder sind innerhalb jedes Programms automatisch verfgbar.

Systemvariable knnen entweder mit dem Prfix Sy- oder syst- programmiert werden. sy-datum kann z.B. auch als syst-datum programmiert werden; sie sind funktionell gleichwertig. Sy- ist die bevorzugte Form, obwohl Sie gelegentlich noch syst- in lteren Programmen finden. syst ist die einzige Struktur, die eine Dualitt von Prfixen hat. Fr alle anderen mssen Sie den vollen Strukturnamen als Prfix benutzen. Zwei Systemvariable sind sehr ntzlich, wenn Sie die select-Anweisung programmieren:

sy-subrc sy-dbcnt

sy-subrc

Um herauszufinden, ob die endselect-Anweisung berhaupt Zeilen zurckliefert, testen Sie den Wert der

Systemvariablen sy-subrc nach der endselect-Anweisung. Wenn Zeilen gefunden werden, wird der Wert von sysubrc 0 sein. Wenn keine Zeilen gefunden wurden, wird der Wert 4 sein (siehe Listing 2.6.) Listing 2.6: Mit Hilfe von sy-subrc entscheiden, ob Zeilen selektiert wurden 1 2 3 4 5 6 7 8 report ztx0206. tables ztxlfa1. select * from ztxlfa1 where lifnr > 'Z'. write / ztxlfa1-lifnr. endselect. if sy-subrc <> 0. write / 'No records found'. endif.

Der Code in Listing 2.6 erzeugt diese Ausgabe: No records found Die select-Anweisung auf Zeile 3 ist beschrnkt durch eine where-Klausel. In diesem Fall passen keine Zeilen zu den Kriterien der where-Klausel, so da hinter dem endselect der Wert von sy-subrc auf 4 gesetzt wird.

Viele Schlsselworte weisen dem sy-subrc Werte zu, einige Schlsselworte berhaupt nicht. Wenn ein Schlsselwort sy-subrc setzt, werden die Werte, die es enthalten kann, in der (F1)-Hilfe fr dieses Schlsselwort dokumentiert. Wenn Sie select programmieren und den Wert von sy-subrc prfen wollen, mu Ihr Test hinter endselect kommen. Warum? Die Antwort liegt in der Tatsache begrndet, da der Code zwischen select und endselect nur einmal fr jede Zeile ausgefhrt wird, die von der Datenbank zurckgeliefert wird. Wenn Nullreihen aus der Datenbank zurckgeliefert werden, wird der Code zwischen select und endselect niemals ausgefhrt. Deswegen mssen Sie den Test fr sy- subrc hinter endselect programmieren.

sy-subrc ist nicht automatisch auf Null initialisiert, wenn Ihr Programm startet. Darum mssen Sie sich jedoch nicht kmmern, weil Sie es nicht prfen sollten, bevor eine Anweisung ausgefhrt wird, die die Initialisierung vornimmt.
sy-dbcnt

Um die Anzahl von Zeilen zu bestimmen, die von einer select-Anweisung zurckgeliefert werden, testen Sie den Wert von sy-dbcnt hinter endselect. Sie knnen es auch als einen Schleifenzhler benutzen; es enthlt zwischen select und endselect einen Zhler der laufenden Iteration. Fr die erste Reihe ist sy-dbcnt 1, fr die zweite 2 und so weiter. Nach endselect wird es seinen Wert behalten und so die Anzahl der selektierten Zeilen enthalten. Um zum Beispiel sequentielle Zahlen neben jeden Kreditor zu drucken und am Ende des Reports die Gesamtanzahl der selektierten Zeilen, benutzen Sie den Code in Listing 2.7.

Listing 2.7: Benutzung von sy-dbcnt, um die Anzahl der von der select-Anweisung zurckgelieferten Zeilen zu zhlen 1 2 3 4 5 6 7 8 report ztx0207. tables ztxlfa1. select * from ztxlfa1 order by lifnr. write / sy-dbcnt. write ztxlfa1-lifnr. endselect. write / sy-dbcnt. write 'records found'.

Der Code in Listing 2.7 erzeugt diese Ausgabe: 1 1000 2 1010 3 1020 4 1030 5 1040 6 1050 7 1060 8 1070 9 1080 10 1090 11 2000 12 V1 13 V10 14 V11 15 V12 16 V2 17 V3 18 V4 19 V5 20 V6 21 V7 22 V8 23 V9 23 records found

Zeile 4 schreibt den Wert von sy-dbcnt fr jede Zeile, die von der select Anweisung zurckgeliefert wird. Der Slash (/) fngt eine neue Zeile an, d.h., jeder sy- dbcnt beginnt auf einer neuen Zeile. Zeile 5 schreibt den Wert von ztxlfa1-lifnr auf die selbe Zeile wie sy-dbcnt.

Die syst-Struktur anzeigen Es gibt zwei Mglichkeiten, die Bestandteile der Struktur von syst anzuzeigen:

Vom ABAP/4-Editor: Doppelklicken Sie auf den Namen irgendeines sy Feldes innerhalb Ihres Codes. Gehen Sie im Data Dictionary auf syst. Whlen Sie die Option Struktur, und drcken Sie auf Anzeigen.

Um Felder innerhalb der Struktur zu finden, drcken Sie die Schaltflche Finden auf der Symbolleiste und tragen Sie den Feldnamen ein, den Sie finden wollen. Wenn Sie den Namen des Feldes, das Sie suchen, nicht wissen, knnen Sie es auch ber die Beschreibung finden.

Starten Sie jetzt das ScreenCam How to Search Through Filed Descriptions. Um Feldbeschreibungen zu durchsuchen, gehen Sie wie folgt vor: 1. Beginnen Sie beim Data Dictionary: Tabelle/Struktur: Felder anzeigen. 2. Den Menpfad Tabelle->Drucken whlen. Eine Dialogbox erscheint; Sie werden gefragt, welche Bestandteile Sie drucken mchten. 3. Haken Sie alle Checkboxen an, und drcken Sie auf die Schaltflche Weiter. Eine Dialogbox erscheint; Sie werden nach den Druckparametern gefragt. 4. Drcken Sie auf die Schaltflche Druckvorschau. Die Dialogbox schliet sich, und eine Liste mit einem kleinen Zeichensatz erscheint. 5. Whlen Sie den Menpfad Springen-> Liste anzeigen. Die Liste verndert sich in ein greres Ausgabestandardformat. 6. Tippen Sie %sc in das Befehlsfeld und drcken die Eingabetaste. Die Dialogbox Finden erscheint. 7. Tippen Sie den Text ein, den Sie finden wollen, und drcken Sie die Eingabetaste. Eine Trefferliste wird angezeigt, und jeder Treffer wird hervorgehoben. 8. Klicken Sie einmal auf ein hervorgehobenes Wort, um sofort zu dieser Zeile in der Liste zu springen. Wenn Sie ein anderes Vorkommen des Texts finden wollen, gehen Sie wieder zu Punkt 6 in dieser Beschreibung.

Der Kettenoperator
Der Doppelpunkt (:) heit Kettenoperator. Benutzen Sie ihn, um Codezeilen zu kombinieren, die mit dem gleichen Wort oder der gleichen Wortfolge beginnen. Stellen Sie den allgemeinen Teil an den Anfang der Anweisung, gefolgt von einem Doppelpunkt. Um zwei Tabellen zu definieren, knnten Sie zum Beispiel programmieren: tables ztxlfa1. tables ztxlfb1. Oder Sie knnten den Kettenoperator benutzen: tables: ztxlfa1, ztxlfb1. Die zwei vorhergehenden Codesegmente sind funktionell identisch, und whrend der Laufzeit ist kein Unterschied in der Performance. Whrend der Codegenerierung wird das zweite Codesegment in zwei Anweisungen erweitert, so da die zwei Programme vom funktionellen Standpunkt aus identisch sind. Kettenoperatoren sollten benutzt werden, um die Lesbarkeit Ihres Programms zu verbessern. Die Verwendung des Kettenoperators ist in Listing 2.8 veranschaulicht. Listing 2.8: Benutzung des Kettenoperators zur Vermeidung von Redundanz in der write-Anweisung 1 2 3 4 5 report ztx0208. tables ztxlfa1. select * from ztxlfa1 order by lifnr. write: / sy-dbcnt, ztxlfa1-lifnr. endselect.

6 write : / sy-dbcnt, 'records found'. Der Programm-Code in Listing 2.8 erzeugt die gleiche Ausgabe wie das vorherige Programm (siehe die Ausgabe von Listing 2.7).

Zeile 4 verbindet die Zeilen 4 und 5 von Listing 2.7 mit Hilfe des Kettenoperators in eine Einzelzeile. Zeile 6 verbindet die Zeilen 7 und 8 von Listing 2.7 in eine Einzelzeile, wobei diese den Kettenoperator benutzt.

Die select single-Anweisung


Die select single-Anweisung holt einen Satz aus der Datenbank. Wenn Sie den ganzen Primrschlssel des Satzes wissen, den Sie auslesen wollen, ist select single viel schneller und effizienter als select/endselect. Syntax fr die select single-Anweisung Hier sehen Sie die vereinfachte Syntax fr die select single-Anweisung. select * from t1-[into wa] [where f1 op v1 and/or f2-op v2 ...]. mit folgenden Bedeutungen:

* zeigt an, da alle Felder in der Tabelle gelesen werden sollten. t1 ist der Name einer Tabelle, die vorher ber eine tables-Anweisung definiert wird. wa ist der Name des Arbeitsbereichs, der zur Struktur der Tabelle pat. f1 ist der Name eines Felds in Tabelle t1. op ist eine der folgenden logischen Operatoren: = <> > >= < <=. v1 ist ein Literal oder eine Variable. and/or ist entweder das Wort and oder das Wort or.

Dabei gelten die folgenden Punkte:

select single bildet keine Schleife, da es nur eine Zeile zurckliefert. Programmieren Sie deswegen keine endselect-Anweisung. Sie werden sonst einen Syntaxfehler bekommen. Um sicherzustellen, da nur eine einzige Zeile zurckgeliefert wird, sollten Sie alle Primrschlsselfelder in der where-Klausel spezifizieren. Wenn Sie dies unterlassen, wird Ihr Programm zwar laufen, aber Sie erhalten eine Warnung. (Um die Warnungen anzuzeigen, whlen Sie den Menpfad Programm->Prfen->Warnungen anzeigen.)

Listing 2.9 illustriert die select single-Anweisung. Legen Sie bungshalber ein neues Programm an, und programmieren Sie, wie in Listing 2.9 gezeigt. Listing 2.9: Die Anweisung select single 1 2 3 4 5 6 7 8 report ztx0209. tables ztxlfa1. select single * from ztxlfa1 where lifnr = 'V1'. if sy-subrc = 0. write: / ztxlfa1-lifnr, ztxlfa1-name1. else. write 'record not found'. endif.

Der Code in Listing 2.9 erzeugt diese Ausgabe: V1 Quantity First Ltd.

Zeile 3 findet den Kreditor V1 in Tabelle ztxlfa1. Weil nur eine Zeile zurckgeliefert wird, werden order by und endselect nicht gebraucht.

Kommentarzeilen und formale Dokumentation


Es gibt zwei Mglichkeiten, Kommentare in Ihren Code zu schreiben:

Ein * (Sternzeichen) in Spalte 1 zeigt, da die ganze Zeile ein Kommentar ist. Im Editor wird sie als Kommentarzeile rot angezeigt. Ein " (Anfhrungszeichen) an beliebiger Stelle auf der Zeile zeigt an, da der Rest der Zeile ein Kommentar ist. Der Kommentar wird nicht, wie ein Vollzeilenkommentar, rot angezeigt.

Zum Beispiel: * This is a comment tables ztxlfa1. " This is also a comment Es gibt kein Kommentar-Ende-Zeichen, d.h., wenn Sie einen Kommentar anfangen, wird der Rest der Zeile auch nur Kommentar sein. Keine andere Programmierung kann auf dieser Zeile folgen. Der Kommentar endet am Ende der gegenwrtigen Zeile. Neben den Kommentaren knnen Sie Ihren Programm-Code formal mit der Dokumentationskomponente des Programms beschreiben. Dafr gehen Sie in den Editor, whlen die Option Dokumentation aus und gehen auf ndern. Schreiben Sie Ihre Dokumentation, und sichern Sie sie.

Zusammenfassung

ABAP/4-Programme werden aus Komponenten zusammengesetzt. Die Komponenten sind Attribute, Quellcode, Varianten, Textelemente und Dokumentation. Ein Programm mu mindestens Attribute und Quellcode enthalten. ABAP/4-Reports mssen mit den report-Anweisungen beginnen. Die tables-Anweisung allokiert einen Vorgabetabellenarbeitsbereich und gibt dem Programm Zugriff auf die Datenbanktabelle mit dem gleichen Namen. Die select-Anweisung liest Zeilen aus einer Datenbanktabelle. Benutzen Sie select single, um eine Zeile auszulesen. Benutzen Sie select/endselect, um mehrere Zeilen zu erhalten. select/endselect bilden eine Schleife. Der Code in der Schleife wird einmal fr jede Tabellenreihe ausgefhrt, die der where-Klausel gengt. Die Schleife endet automatisch, wenn alle Zeilen bearbeitet worden sind. Wenn Sie keine into-Klausel spezifizieren, wird jede Zeile in den Vorgabetabellenarbeitsbereich gestellt und die vorherige Zeile berschrieben. sy-subrc wird auf 0 gesetzt, wenn alle Zeilen und auf 4, wenn keine Zeile selektiert wurden. sy-dbcnt wird jedes Mal durch die Schleife um 1 hochgezhlt. Nach endselect enthlt sie die Anzahl der wiedergewonnen Zeilen. Der Kettenoperator ist ein Doppelpunkt (:). Er wird benutzt, um die Redundanz zu verringern, wenn zwei oder mehr Anweisungen mit dem gleichen Wort oder der gleichen Wortfolge beginnen.

Fragen & Antworten


Frage: Was passiert mit meinen nderungen, wenn ich beim Editieren eines Programms die Verbindung zu R/3 verliere, wenn ich z.B. nach einem PC-Absturz neu booten mu? Werde ich meine nderungen verlieren? Antwort: Wenn Sie sich innerhalb von 5 oder 10 Minuten wieder anmelden, knnen Sie in Ihren Modus zurckkehren (reconnect).

Wenn Sie sich wieder anmelden, geben Sie Ihre Benutzerkennung und das Pawort ein, drcken aber nicht (Enter) auf der Anmeldemaske, sonder whlen stattdessen den Menpfad Benutzer->Copy-Modus. Sie werden mit Ihrem bisherigen Modus wieder verbunden, und alles ist wiederhergestellt wie zuvor, als Sie die Verbindung verloren hatten. Frage: Gibt es ein AutoSave im Editor wie in MS Word? Antwort: Nein. Aber wenn Sie sichern wollen, drcken Sie (F11). Frage: Manchmal, wenn ich ein Programm editiere, erhalte ich eine Dialogbox mit folgendem Text: Das Programm wurde temporr gepuffert (mglicherweise wegen eines Systemfehlers). Whlen Sie eine der folgenden Mglichkeiten. Warum sehe ich die Box, und was sollte ich tun?

Antwort: Das heit, da es zwei Kopien Ihres Programms im System gibt: das wirkliche und ein temporres. Das temporre wird angelegt, wenn Sie Ihr Programm ausfhren, ohne es vorher gesichert zu haben. Normalerweise wird es gelscht, wenn Sie zum Editor zurckkehren und Ihre nderungen sichern, aber wenn Sie den Editor fehlerbedingt verlassen, bleibt es erhalten. Sie knnten z.B. Ihr Programm modifizieren und es dann sofort ohne Sicherung ausfhren. Wenn Ihr Programm einen Abbruch verursacht, mssen Sie die Schaltflche Exit drcken, und Sie werden zur Workbench zurckspringen. Ihr Editormodus wre aufgelst. Es gibt jetzt zwei Versionen Ihres Programms in der Datenbank: die genderte Version (das, was Sie gerade ausfhren) und das Original. Die genderte Version wird unter einem temporren Namen gespeichert, bestehend aus einem ! und den letzten sieben Stellen Ihres Programmnamens. Wenn Sie jetzt zum Editor zurckkehren und versuchen, Ihr Programm wieder zu editieren, wird das System die Anwesenheit von beiden Versionen in der Datenbank entdecken und eine Dialogbox anzeigen, die Sie fragt, welche Version Sie editieren wollen, die gespeicherte oder die temporre. Drcken Sie einfach auf die Schaltflche Weiter, um die temporre Kopie (das, was Sie ausfhrten) anzuzeigen. Frage: Wenn ich ein ganzes Programm kopiere, hat die report-Anweisung noch den alten Reportnamen. Aber wenn ich es laufen lasse, luft es ohne den Fehler. Sollte es mir keine Fehlermeldung geben? Antwort: Der Programmname auf der report-Anweisung wird verlangt, aber er mu nicht zum eigentlichen Programmnamen passen. Er ist nur fr Dokumentationzwecke bestimmt. Frage: Jedesmal, wenn ich mich von R/3 abmelde, bekomme ich die Nachricht Ungesicherte Daten knnen verlorengehen - sogar, wenn ich alles gesichert habe. Warum?

Antwort: Trotz der Formulierung bedeutet diese Nachricht nicht, da es nicht gesicherte Daten gibt, die verloren gehen werden. Es bedeutet Wenn Sie Ihre Daten nicht gesichert haben, gehen sie verloren. Das Beste, was Sie tun knnen, ist, die Meldung zu ignorieren, so wie jeder das tut. Frage: Kann ich select-Anweisungen ineinander verschachteln? Antwort: Ja, das knnen Sie. Sie sollten es aber nicht tun, weil es extrem unwirksam sein kann. Eine bessere Alternative ist es, view's zu benutzen.

Workshop

Die folgenden bungen werden Ihnen Praxis im Umgang mit dem Editor vermitteln und helfen, einfache Programme mit Hilfe der Anweisungen write, tables und select zu schreiben. Die Antworten finden Sie in Anhang B (Antworten zu Aufgaben und bungen).

Kontrollfragen
1. Welche zwei Dinge bewirkt die tables-Anweisung? 2. Worauf bezieht sich der Begriff Vorgabetabellenarbeitsbereich? 3. Was passiert mit den Zeilen, wenn in der select-Anweisung eine into-Klausel fehlt? 4. Wenn eine write-Anweisung keinen Slash (/) enthlt, wird dann die Ausgabe in die gleiche Zeile geschrieben wie die vorherige write-Anweisung oder in eine neue Zeile? 5. Wie heit die Systemvariable, welche anzeigt, ob Zeilen von der select-Anweisung gefunden wurden? 6. Wie heit die Systemvariable, welche anzeigt, wie viele Zeilen von der select-Anweisung gefunden wurden? 7. Wie oft wird Zeile 4 ausgefhrt, wenn es 30 Zeilen in Tabelle ztxlfa1 gibt (siehe Listing 2.6)? 8. Wie oft wird Zeile 4 ausgefhrt, wenn Tabelle ztxlfa1 leer ist (siehe Listing 2.6)?

Editor bungen
In der folgenden bung werden Sie ein Programm kopieren, Fehler im Code beseitigen, neuen Code hinzufgen, es ausfhren, drucken, importieren, exportieren, eine Version anlegen und Versionen vergleichen. Falls notwendig, sehen Sie in Tabelle 2.3 nach. 1. Kopieren Sie Programm zty0200a auf Programm ***0200a. Um zu kopieren, benutzen Sie die Schaltflche Kopieren auf der Drucktastenleiste vom ABAP/4-Editor. report zty0200a. select * from ztxlfa1. write / ztxlfa1-lifnr. endselect. endselect. " intentional duplicate line report zty0200b. if sy-subrc <> 0. write: / 'no records found'. endif. 2. Editieren Sie Programm ***0200a. Korrigieren Sie den Reportnamen auf der report -Anweisung. 3. Fgen Sie eine neue Zeile nach Zeile 1 ein. Tippen Sie die entsprechende tables- Anweisung auf diese Zeile. 4. Rufen Sie die Hilfe fr die tables-Anweisung auf. (Setzen Sie den Cursor auf die tables-Anweisung, und drcken Sie (F1).) 5. Gehen Sie von der Hilfe zurck zu Ihrem Programm. (Drcken Sie die Schaltflche Zurck auf der Drucktastenleiste.) 6. Zeigen Sie die Funktionstastenzuweisungen an. (An beliebiger Stelle den Bildschirmbereich des Fensters mit der rechten

Maustaste anklicken.) 7. Bringen Sie Zeile 3 an den oberen Rand des Bildschirms. (Doppelklick auf ein Leerzeichen auf Zeile 3, nicht auf ein Wort.) 8. Lschen Sie Zeile 6. (Setzen Sie den Cursor auf Zeile 6, und drcken Sie auf die Schaltflche Ausschneiden auf der Drucktastenleiste.) 9. ffnen Sie einen neuen Modus und zeigen Programm zty0200b an. (Whlen Sie den Menpfad System->Erzeugen Modus. Ein neues SAP-R/3-Fenster wird angezeigt. Whlen Sie den Menpfad Werkzeuge->ABAP/4-Workbench. Sie kommen in die ABAP/4-Entwicklungsworkbench. Die ABAP/4-Editor-Schaltflche auf der Drucktastenleiste drcken. Geben Sie im Feld Programmname zty0200b ein, und drcken Sie auf Anzeigen.) 10. Markieren Sie die Zeilen 2 bis 4 mit der Schaltflche Auswahl. (Setzen Sie den Cursor auf Zeile 2. Drcken Sie auf die Schaltflche Auswahl auf der Drucktastenleiste. Zeile 2 wird blau. Setzen Sie den Cursor auf Zeile 4. Drcken Sie wieder auf die Schaltflche Auswhlen. Zeilen 2 bis 4 werden blau markiert.) 11. Kopieren Sie den markierten Block in die Zwischenablage. (Whlen Sie den Menpfad Block/Ablage, und kopieren Sie den Block in die Zwischenablage.) 12. Gehen Sie zurck zu dem Fenster, in dem Programm ***0200a angezeigt wird. 13. Fgen Sie die Zeilen aus der Zwischenablage hinter Zeile 5 ein. (Setzen Sie den Cursor auf Zeile 6. Whlen Sie den Menpfad Block/Ablage: In die Zwischenablage einfgen.) 14. Markieren Sie den Block von Zeile 6 bis 8. (Setzen Sie den Cursor auf Zeile 6. Drcken Sie die Schaltflche Auswahl auf der Drucktastenleiste. Setzen Sie den Cursor auf Zeile 8. Drcken Sie nochmals auf die Schaltflche Auswahl.) 15. Bewegen Sie den Block vier Schritte nach links, indem Sie die if-Anweisung auf die select-Anweisung ausrichten. (Setzen Sie den Cursor auf Zeile 6 in Kolonne 1. Drcken Sie die Schaltflche Zeilen Verschieben auf der Drucktastenleiste.) 16. Whlen Sie den Menpfad Programm->Sichern als, und sichern Sie Ihr modifiziertes Programm unter ***0200b. 17. Rufen Sie Programm ***0200b auf, wobei Sie den Menpfad Programm->Anderes Programm benutzen.

18. Korrigieren Sie den Programmnamen in der report-Anweisung. (ndern Sie ***0200a auf Zeile 1 in ***0200b.) 19. Whlen Sie die Zeilen 3 bis 5. (Setzen Sie den Cursor auf Zeile 3. Drcken Sie die Schaltflche Auswahl auf der Drucktastenleiste. Setzen Sie den Cursor auf Zeile 5. Drcken Sie abermals auf die Schaltflche Auswahl.) 20. Kopieren Sie den ausgewhlten Block in die programminterne Zwischenablage. (Drcken Sie auf die Schaltflche Kopieren in Zwischenablage auf der Drucktastenleiste.) 21. Fgen Sie den gerade kopierten Block an das Ende Ihres Programms ein. (Setzen Sie den Cursor auf Zeile 9, und drcken Sie die Schaltflche Einfgen auf der Drucktastenleiste.) 22. Fgen Sie denselben Block nochmals am Ende Ihres Programms ein. (Setzen Sie den Cursor auf Zeile 12, und drcken Sie die Schaltflche Einfgen auf der Drucktastenleiste.) 23. Machen Sie die letzte Einfgung rckgngig. (Drcken Sie auf die Schaltflchen Rckgngig auf der Drucktastenleiste.) 24. Tippen Sie den folgenden Code in die Zeilen 12 bis 14. Beginnen Sie jede Zeile in Kolonne 1.

if sy-dbcnt > 0. write: / sy-dbcnt, 'records found'. endif. 25. Fixieren Sie die Einrckung automatisch, indem Sie den Menpfad Programm- >Pretty-Printer whlen. 26. Sichern Sie Ihr Programm. (Drcken Sie auf die Schaltflche Sichern.) 27. Gehen Sie zurck zum ABAP/4-Editor: Einstieg, und dokumentieren Sie Ihr Programm. (Drcken Sie auf die Schaltflche Zurck auf der Symbolleiste. Whlen Sie die Option Dokumentation. Drcken Sie ndern.) 28. Sichern Sie Ihre Dokumentation, und gehen Sie zurck, um den Quellcode zu editieren. (Drcken Sie die Schaltflche Sichern, dann Zurck. Whlen Sie die Option Quellcode. Tippen Sie ***0200b in das Programmfeld. Drcken Sie auf ndern.)

29. Zeigen Sie durch einen Doppelklick auf ein Sy-Feld die Bestandteile der SYST Struktur an. (Doppelklicken Sie auf das Wort sy-subrc in Zeile 6. Die SYST Struktur wird angezeigt.) 30. Kehren Sie zum Editieren Ihres Programms zurck. (Drcken Sie auf die Schaltflche Zurck.) 31. Finden Sie das erste Auftauchen des String ztxlfa1 in Ihrem Programm. (Drkken Sie auf die Schaltflchen Finden. Die Suchen/Ersetzen-Maske wird angezeigt. Tippen Sie ztxlfa1 in das Feld Finden. Whlen Sie die Option From Line. Drkken Sie auf die Schaltflche Weiter.) 32. Wiederholen Sie Finden fr jedes Auftauchen, bis Sie alle Strings gefunden haben. (Drcken Sie so oft auf das Feld Weiter Suchen, bis die Nachricht String write nicht gefunden in der Statusleiste am unteren Rand des Fensters angezeigt wird.) 33. Fgen Sie den Tabellennamen ztxlfa1 der tables-Anweisung hinzu. (Verndern Sie die tables-Anweisung wie folgt: tables: ztxlfa1, ztxlfb1.) 34. Ersetzen Sie den String ztxlfa1 in den Zeilen 10 und 11 durch den String ztxlfb1 mit Hilfe der Funktion Suchen/Ersetzen. (Setzen Sie den Cursor auf Zeile 10. Drcken Sie die Schaltflche Auswahl. Setzen Sie Ihren Cursor auf Zeile 11. Drcken Sie Auswahl. Die Zeilen 10 und 11 sind jetzt als ein Block rot markiert. Drcken Sie auf die Schaltflche Finden. Die Suchen/Ersetzen-Maske wird angezeigt. Tippen Sie ztxlfa1 in das Feld Finden. Haken Sie Ersetze Durch an. Tippen Sie ztxlfb1 in das Feld Ersetze Durch. Drcken Sie auf die Schaltflche Weiter. Die ABAP/4Editor: Einstiegsmaske wird angezeigt. Drcken Sie auf die Schaltflche Ohne Besttigung. Jeder String innerhalb des markierten Blocks wurde ersetzt.) 35. Benutzen Sie eine Funktionstaste, um Ihr Programm zu sichern, und eine andere, um es auszufhren. (Drcken Sie (F11) und (F8).) 36. Sichern Sie die Listenausgabe in einer Datei auf Ihrer Festplatte mit dem Menpfad Liste ->Sichern Datei. Benutzen Sie ein unkonvertiertes Format. 37. Zeigen Sie Ihre importierte Ausgabe unter Verwendung von Notepad an. 38. Kehren Sie zum Editieren Ihres Codes zurck. (Die Schaltflche Zurck drcken.) 39. Importieren Sie Ihr Programm in die Datei c:\temp\020***0b.txt. (Whlen Sie den Menpfad Hilfsmittel>Download. Die bertragung auf eine lokale Dateimaske wird angezeigt. Tippen Sie C:\temp\***0200b.txt in das Feld Dateiname. Die Schaltflche OK drcken. Die Nachricht 277 bytes transferred erscheint in der Statusleiste am unteren Rand des Fensters.)

40. Editieren Sie Ihr importiertes Programm unter Verwendung von Notepad. Fgen Sie einen ganzzeiligen Kommentar mit Ihrem Namen hinter der report-Anweisung hinzu. (Fgen Sie eine neue Zeile hinter der report-Anweisung hinzu: *Angelegt von IHR_NAME.) 41. Tippen Sie die folgende Bemerkung hinter die erste select-Anweisung: read all records from table ztxlfa1. 42. Sichern Sie Ihr modifiziertes Programm in Notepad auf Diskette. 43. Exportieren Sie es, indem Sie das Programm ***0200b ersetzen. (Wechseln Sie zur Maske ABAP/4-Editor: Programm ***0200b editieren. Whlen Sie den Menpfad Utilities->Upload. Der Import einer lokalen Dateimaske wird angezeigt. Tippen Sie in das Dateinamensfeld C:\temp\02***00b.txt. Drcken Sie die Schaltflche OK.) 44. Sichern Sie das exportierte Programm. (Drcken Sie auf Sichern.) 45. Drucken Sie Ihr Programm aus. (Drcken Sie die Schaltflche Drucken auf der Symbolleiste. Die Druckparametermaske wird angezeigt. Stellen Sie sicher, da die Checkbox Sofort ausgeben ausgewhlt ist. Whlen Sie Drucken. Ihre Ausgabe wird an den Drucker gesandt, und Sie kehren zum ABAP/4-Editor zurck.) 46. Lassen Sie Ihr Programm laufen und die Ausgabe drucken. (Whlen Sie den Menpfad Programm->Ausfhren. Die Listenausgabe wird angezeigt. Whlen Sie Drucken auf der Symbolleiste. Die Aufdruck-Masken-Listen-Maske wird angezeigt. Stellen Sie sicher, da die Checkbox Sofortdruck angehakt ist. Drcken Sie auf die Schaltflche Drucken. Sie kehren zu der Listenausgabe zurck.) 47. Kehren Sie zum Editierprogramm ***0200b zurck, und sichern Sie eine Version in der Datenbank Versionen. (Drcken Sie auf die Schaltflche Zurck, um zur Maske ABAP/4-Editor: Programm editieren zu kommen. Whlen Sie den Menpfad Programm->Version generieren.) 48. Ersetzen Sie den String ztxlfb1 durch ztxlfc3. (Drcken Sie auf die Schaltflche Finden. Die Suchen/ErsetzenMaske wird angezeigt. Tippen Sie ztxlfb1 in das Feld Finden. Kennzeichnen Sie Ersetzen durch. Tippen Sie ztxlfc3 in das Feld Ersetze durch. Kennzeichnen Sie jetzt die brigen Merkmale, die Sie benutzen wollen. Drcken Sie auf Keine Besttigung. Alle Zeichenketten werden ersetzt. Drcken Sie Sichern und dann Zurck. 49. Sichern Sie Ihre nderungen. (Die Schaltflche Sichern bettigen.) 50. Kehren Sie zurck zur Editoreinstiegsmaske und vergleichen die beiden Versionen. (Whlen Sie Zurck. Die Maske ABAP/4-Editor: Einstieg wird angezeigt. Whlen Sie den Menpfad Hilfsmittel->Versionsverwaltung. Die Maske Versionen des Objekts ***0200b vom Typ-REPS wird angezeigt. Haken Sie die Checkbox Version 00001 an. Drcken Sie auf die Schaltflche Vergleichen auf der Symbolleiste. Die Maske Vergleichsprogramme: Alle wird angezeigt. Blttern Sie abwrts, um die Unterschiede anzusehen.) 51. Holen Sie die Originalfassung zurck. (Drcken Sie die Schaltflche Zurck. Die Maske Versionen des Objekts ***0200b vom Typ-REPS wird angezeigt. Entfernen Sie den Haken von der Checkbox Akt.. Drcken Sie auf die Schaltflche Zurckholen auf der Drucktastenleiste (das System stellt keine Antwort zur Verfgung). Whlen Sie Zurck. Die Maske Versionen Wiederherstellen wird angezeigt. Drkken Sie auf Ja. Die Maske Versionen des Objekts ***0200b vom Typ-REPS werden angezeigt. Drcken Sie auf Zurck. Die Maske ABAP/4-Editor: Einstieg wird angezeigt.)

52. Editieren Sie Ihr Programm und markieren die letzten drei Zeilen als einen Block. (Drcken Sie auf ndern. Die Maske ABAP/4-Editor: Programm editieren wird angezeigt. Setzen Sie den Cursor auf Zeile 13. Drcken Sie die Schaltflche Auswahl. Zeile 13 wird rot. Setzen Sie den Cursor auf Zeile 15. Drcken Sie Auswahl. Der Block wird rot markiert.) 53. Kommentieren Sie den Block, indem Sie den Menpfad Block/Ablage->Kommentar * Einfgen benutzen. 54. Markieren Sie die letzten drei Zeilen als einen Block (siehe Schritt 51).

55. Entfernen Sie den Kommentar mit dem Menpfad Block/Ablage->Kommentar * Entfernen.

Programmierbungen
1. Schreiben Sie ein Programm, das alle Zeilen aus der Tabelle ztxlfb1 liest, wobei der Firmencode grer/gleich 3000 ist. In jeder Ausgabezeile sollten zuerst ein Firmencode und danach eine Kreditorennummer stehen. Die Ausgabe sollte zuerst nach dem Firmencode in steigender Ordnung sortiert werden, dann durch die Kreditorennummer in absteigender Ordnung (Verwenden Sie die (F1)-Hilfe, um die richtige Syntax zu finden). Nennen Sie Ihr Programm ***e0201. Nachfolgend ein Beispiel, wie Ihre Ausgabe aussehen sollte. 1000 1000 1000 2000 V9 V8 V6 V9

2. Kopieren Sie das Programm zty0202 nach ***e0202 (das Listing erscheint unten). Es erzeugt keine Ausgabe. Finden Sie den Fehler, und korrigieren Sie ihn. Wenn Sie dies getan haben, sollte die richtige Ausgabe no records found sein. 1 2 3 4 5 6 7 8 report zty0202. tables ztxlfa1. select * from ztxlfa1 where lifnr like 'W%'. if sy-subrc <> 0. write / 'no records found'. endif. write / ztxlfa1-lifnr. endselect.

3. Kopieren Sie das Programm zty0203 nach ***e0203 (das Listing erscheint unten). Es enthlt einen Syntaxfehler und einen Programmfehler. Korrigieren Sie beide. Dann sollten Kreditorennummern von Tabelle ztxlfa1 angezeigt werden, die grer als 1050 sind. 1 2 3 4 5 report zty0203. tables ztxlfa1 select * from ztxlfa1 where lifnr > '1050'. write / ztxlfa1-lifnr. endselect.

4. Kopieren Sie das Programm zty0204 nach ***e0204 (das Listing erscheint unten). Die Ausgabe ist falsch. Entdecken Sie den Fehler, und korrigieren Sie das Programm. 1 2 3 4 5 6 7 8 report zty0204. tables ztxlfa1. select * from ztxlfa1 where lifnr > '0000001050'. write / ztxlfa1-lifnr. endselect. if sy-dbcnt <> 0. write / 'no records found'. endif.

5. Kopieren Sie das Programm zty0205 nach ***e0205 (das Listing erscheint unten). Die Ausgabe ist falsch. Entdecken Sie den Fehler, und korrigieren Sie das Programm. 1 report zty0205.

2 3 4 5 6 7 8

tables ztxlfa1. select * from ztxlfa1 where lifnr > '0000001050'. endselect. write / ztxlfa1-lifnr. if sy-subrc <> 0. write / 'no records found'. endif.

6. Kopieren Sie das Programm zty0206 nach ***e0206 (das Listing erscheint unten). Vereinfachen Sie das Programm durch Weglassen unntiger Befehle und Worte. 1 report zty0206. 2 tables: ztxlfa1, ztxlfb1, ztxlfc3. 3 data wa like ztxlfb1. 4 select * from ztxlfa1 into ztxlfa1. 5 write / ztxlfa1-lifnr. 6 write ztxlfa1-name1. 7 endselect. 8 if sy-subrc <> 0 or sy-dbcnt = 0. 9 write / 'no records found in ztxlfa1'. 10 endif. 11 uline. 12 select * from ztxlfb1 into wa. 13 write / wa-lifnr. 14 write wa-bukrs. 15 16 17 18 endselect. if sy-subrc <> 0. write / 'no records found'. endif.

7. Kopieren Sie das Programm zty0207 nach ***e0207 (das Listing erscheint unten). Es enthlt sowohl einen Syntaxals auch einen Programmierfehler. Entdecken Sie die Fehler, und korrigieren Sie das Programm. Die Ausgabe sollte einen einzelnen Satz (Kreditor 1000) anzeigen, wobei sie die rationellste Programmierkonstruktion benutzt. 1 2 3 4 5 6 7 8 report zty0207. tables ztxlfa1. select single * from ztxlfa1 where lifnr > '0000001000'. write / ztxlfa1-lifnr. endselect. if sy-subrc <> 0. write / 'no records found'. endif.

Ein Imprint des Markt&Technik Buch- und Software-Verlag GmbH. Elektronische Fassung des Titels: ABAP/4 in 21 Tagen, ISBN: 3-8272-2016-X

Woche 1

Tag 3 Das Data Dictionary , Teil 1


Kapitelziele
Wenn Sie sich dieses Kapitel erarbeitet haben, sollten Sie folgendes knnen:

die Unterschiede zwischen transparenten, Pool- und Clustertabellen beschreiben Domnen, Datenelemente und transparente Tabellen im Data Dictionary einrichten (F1)-Hilfe fr die Tabellenfelder und Hypertexte innerhalb der (F1)-Hilfe einrichten die vier von SAP bereitgestellten Datenbrowser benutzen, um Daten in Tabellen anzusehen und zu modifizieren

R/3-Release-Stnde
Heutzutage sind viele Versionen von R/3 - auch Release-Stnde genannt - in Anwendung. Seit seiner Einfhrung hat SAP die verschiedensten Versionen (z.B. 2.2x, 3.0.x, 3.1.x, 4.0x) herausgebracht. Sie knnen den ReleaseStand Ihres Systems feststellen, indem Sie den Menpfad System->Status benutzen. Dieses Buch wurde auf einem 3.0f-System erstellt und mit 4.0b berarbeitet. Ihr System kann auf einem anderen Systemstand sein. Obwohl die meisten Unterschiede bei den Themen, die hier behandelt werden, gering sein sollten, knnen einige Unterschiede zu Verwirrung fhren oder die Information in diesem Buch als falsch erscheinen lassen. Es knnen sich z.B. Menpfade zwischen Release-Stnden ndern. Aber wenn die Funktionalitt Ihres Systems sich von dem zu unterscheiden scheint, was hier beschrieben wird, knnen Sie auf die R/3-Release-Informationen zurckgreifen, die online verfgbar sind, um zu entscheiden, ob der Unterschied dem Release zuzuordnen ist. Gehen Sie folgendermaen vor, um auf die Release-Information zuzugreifen: Starten Sie jetzt das ScreenCam How to Display R/3 Release Notes. Um die Release-Information anzuzeigen: 1. Gehen Sie zum Hauptmen und whlen Sie den Menpfad Werkzeuge->Suchen ->Informationssystem>Release-Infos. 2. Die Release-Informationsmaske wird angezeigt.

3. Wenn Sie Informationen zum Release 3.0x suchen, klicken Sie auf das Pluszeichen (+), um den Knoten aufzublttern. nderungen zu ABAP werden unter dem Basisknoten angezeigt, unter dem Unterknoten ABAP/4Development Workbench.

Tiefer im R/3-Data Dictionary stbern

Bitte nehmen Sie sich jetzt ein paar Minuten Zeit, und lesen Sie noch einmal den Abschnitt Einfhrung des R/3Data Dictionary im Kapitel Tag 2. Data Dictionary-Objekte werden in den meisten ABAP/4-Programmen benutzt. Die Verklammerungsnatur von ABAP/4-Programmen und DDIC-Objekten macht grndliches Wissen des R/3-Data Dictionary zu einer wesentlichen Grundlage der Programmierfhigkeit. Mit diesem Kapitel beginnen Sie zu lernen, wie man DDICObjekte wie Tabellen, Datenelemente und Domnen einrichtet.

Viele Entwicklungsobjekte, die in diesem Buch als Beispiel verwendet werden (wie Tabellen, Domnen und Datenelemente), basieren auf aktuellen Entwicklungsobjekten im R/3-System. Die Beispielobjekte haben die selben Namen wie die aktuellen R/3- Objekte, allerdings mit dem Prfix ztx. Lfa1 ist zum Beispiel eine reale Tabelle in R/ 3, und die Beispielstabelle in diesem Buch ist ztxlfa1.

Die verschiedenen Tabellentypen in R/3


In R/3 gibt es drei verschiedene Tabellentypen: transparente Tabellen, Pool- und Clustertabellen. Sie sehen sie in Abb. 3.1.

Transparente Tabellen
Eine transparente Tabelle im Wrterbuch hat eine Eins-zu-eins-Beziehung zu einer Tabelle in der Datenbank. Ihre Struktur im R/3-Data Dictionary entspricht einer einzelnen Datenbanktabelle. Fr jede Definition einer transparenten Tabelle im Wrterbuch gibt es eine entsprechende Tabelle in der Datenbank. Die Datenbanktabelle hat den gleichen Namen, die gleiche Feldanzahl, und die Felder haben den gleichen Namen wie die R/3Tabellendefinition. Wenn Sie sich die Definition einer transparenten Tabelle in R/3 ansehen, knnten Sie glauben, Sie shen die Datenbanktabelle selbst. Transparente Tabellen sind weitaus gebruchlicher als Pool- oder Clustertabellen. Sie werden fr Anwendungsdaten benutzt. Anwendungsdaten sind Stammdaten oder Bewegungsdaten, die von einer Anwendung benutzt werden. Ein Beispiel fr Stammdaten ist die Kreditorentabelle (genannt: Kreditorenstammdaten) oder die Kundentabelle (genannt: Kundenstammdaten). Ein Beispiel fr Bewegungsdaten: die Bestellungen von Kunden oder bei Kreditoren. Transparente Tabellen sind wahrscheinlich der einzige Tabellentyp, den Sie jemals anlegen werden. Pool- und Clustertabellen werden blicherweise nicht fr Anwendungsdaten, sondern fr Systemdaten benutzt, wie Systemkonfigurationsinformationen oder historische und statistische Daten. Sowohl Pool- als auch Clustertabellen haben mehr als eine Beziehung mit Datenbanktabellen. Beide knnen in R/3 als mehrere Tabellen erscheinen, aber in der Datenbank werden sie als einzelne Tabelle gespeichert. Die Datenbanktabelle hat einen anderen Namen, eine andere Feldanzahl und andere Feldnamen als die R/3-Tabelle. Der Unterschied zwischen den beiden Arten liegt in den Merkmalen ihrer Daten und wird in den folgenden Abschnitten erklrt.

Tabellenpools und Pooltabellen

Eine Pooltabelle in R/3 hat eine n-zu-1-Beziehung mit einer Tabelle in der Datenbank (s. Abb. 3.1 und 3.2). Fr eine Tabelle in der Datenbank gibt es viele Tabellen im R/3- Data Dictionary. Die Tabelle in der Datenbank hat einen anderen Namen als die Tabelle im DDIC, eine andere Feldanzahl, und die Felder haben auch andere Namen. Pooltabellen sind ein proprietres SAP-Konstrukt. Wenn Sie sich eine Pooltabelle in R/3 ansehen, sehen Sie die Beschreibung einer Tabelle. In der Datenbank wird sie allerdings mit anderen Pooltabellen zusammen in einer einzelnen Tabelle gespeichert, Tabellenpool genannt. Ein Tabellenpool ist eine Datenbanktabelle mit einer besonderen Struktur, in der die Daten vieler R/3-Tabellen gespeichert werden knnen. Er kann nur Pooltabellen enthalten. R/3 verwendet Tabellenpools, um eine Vielzahl (Zehntausende) sehr kleiner Tabellen (mit jeweils ungefhr 10 bis 100 Zeilen) zusammenzuhalten. Tabellenpools reduzieren die Menge an Datenbankressourcen, die bentigt werden, wenn viele kleine Tabellen gleichzeitig geffnet sein mssen. SAP benutzt sie fr Systemdaten. Sie sollten einen Tabellenpool einrichten, wenn Sie Hunderte kleiner Tabellen einrichten mssen, von denen jede einzelne nur wenige Zeilen lang ist. Um diese kleinen Tabellen als Pooltabellen zu implementieren, legen Sie zuerst die Definition eines Tabellenpools in R/3 an. Daraufhin wird jede einzelne Tabelle (der Tabellenpool) in der Datenbank eingerichtet. Sie knnen dann Pooltabellen innerhalb von R/3 definieren und alle Ihrem Tabellenpool zuweisen (s. Abb. 3.2). Pooltabellen werden von SAP primr fr Kundendaten benutzt. Wenn eine Firma ein groes System installiert, wird das System auf die eine oder andere Art speziellen Bedrfnissen angepat, um den firmenspezifischen Anforderungen gerecht zu werden. Solche Anpassungen (Customizing) werden in R/3 mit Customizing- Tabellen gemacht. Customizing-Tabellen enthalten Codes, Feldwerte, Zahlenbereiche und Parameter, die sich so verndern, wie sich die R/3-Anwendungen verhalten.

Abbildung 3.1: Pooltabellen haben eine n-zu-1-Beziehung mit Tabellenpools. Einige Beispiele von Daten, die in Customizing-Tabellen enthalten sind, sind Lnderkennzahlen, Postleitzahlen, Abrechnungsnummern, Wechselkurse, Abschreibungsmethoden und Preiskonditionen. Selbst Maskendurchflsse, Feldwerte und individuelle Feldattribute sind manchmal tabellengesteuert durch Settings in Customizing-Tabellen. Whrend der Einfhrungsphase des Systems werden die Daten in den Customizing- Tabellen von einem Funktionsanalytiker eingesetzt. Er oder sie wird Erfahrungen bezglich des Geschftsbereichs, der implementiert wird, und eine weitreichende Ausbildung in der Konfiguration eines R/3-Systems haben.

Tabellencluster und Clustertabellen


Eine Clustertabelle ist einer Pooltabelle hnlich. Auch sie hat eine n-zu-1-Beziehung mit einer Tabelle in der Datenbank. Viele Clustertabellen sind in einer einzelnen Tabelle in der Datenbank gespeichert, die Tabellencluster heit. Ein Tabellencluster hnelt einem Tabellenpool Er enthlt viele Tabellen, die alle Clustertabellen sind.

Wie Pooltabellen sind auch Clustertabellen ein proprietres SAP-Konstrukt. Sie werden benutzt, um einige sehr groe Tabellen (ungefhr 2 bis 10) zusammenzufassen, die einen Teil ihres Primrschlssels gemeinsam haben und auf deren Daten simultan zugegriffen wird. Die Daten sind logisch gespeichert, wie in Abbildung 3.3 gezeigt

wird. Tabellencluster enthalten weniger Tabellen als Tabellenpools, und der Primrschlssel jeder Tabelle beginnt, im Gegensatz zu Tabellenpools, innerhalb des Tabellenclusters mit dem gleichen Feld oder den gleichen Feldern. Zeilen der Clustertabellen werden im Tabellencluster auf der Basis des gemeinsamen Primrschlssels zu einer einzelnen Zeile kombiniert. Wenn eine Zeile von irgendeiner Tabelle im Cluster gelesen wird, werden auch alle zugehrigen Zeilen in allen Clustertabellen gefunden, aber es wird nur ein einziger I/O bentigt. Ein Cluster ist in dem Fall von Vorteil, wo auf Daten simultan von vielen Tabellen zugegriffen wird, und diese Tabellen mindestens eines ihrer Primrschlsselfelder gemeinsam haben. Clustertabellen reduzieren die Anzahl von Datenbanklesezugriffen und verbessern dadurch die Leistung.

Abbildung 3.2: Tabellencluster enthalten Daten verschiedener Tabellen, basierend auf dem Primrschlsselfeld, welches sie gemeinsam haben. Wie z.B. in Abbildung 3.4 gezeigt wird, sind die ersten vier Primrschlsselfelder in cdhdr und cdpos identisch. Sie werden fr den Tabellencluster zum Primrschlssel mit dem Zusatz eines standardmigen Systemfelds pageno, um sicherzustellen, da jede Zeile eindeutig ist.

Abbildung 3.3: Den Tabellen cdhdr und cdpos sind die ersten vier Primrschlsselfelder gemeinsam, die immer zusammen aufgerufen werden, so da sie beide gemeinsam im Tabellencluster cdcls gespeichert sind. Oder nehmen wir zum Beispiel einmal an, da die Daten von Orderheader- und Order-Itemtabellen immer gleichzeitig bentigt werden und beide einen Primrschlssel haben, der mit der Ordernummer beginnt. Sowohl der Header als auch die Items knnen in einer einzelnen Clustertabelle gespeichert werden, weil das erste Primrschlsselfeld gleich ist. Wenn eine Header Zeile gelesen wird, die als Cluster implementiert wurde, werden auch alle Items Zeilen gelesen, weil sie alle in einer einzelnen Zeile im Tabellencluster gespeichert sind. Wenn ein einzelnes Item gelesen wird, werden auch der Header und alle anderen Items gelesen, weil sie in einer einzelnen Zeile gespeichert sind.

Beschrnkungen von Pool- und Clustertabellen


Pool- und Clustertabellen werden blicherweise nur von SAP und nicht von Kunden benutzt, wahrscheinlich wegen des proprietren Formats der Tabellen innerhalb der Datenbank und wegen der technischen Beschrnkungen innerhalb des Gebrauchs mit ABAP/4-Programmen. Fr Pool- oder Clustertabellen gilt:

Sekundrindizes knnen nicht eingerichtet werden. Die ABAP/4-Konstrukte select distinct und group by knnen nicht benutzt werden. Sie knnen kein Native SQL verwenden. Sie knnen Feldnamen nach der Klausel order by nicht spezifizieren, order by primary key ist die einzig zugelassene Variante.

Die Verwendung von Pool- und Clustertabellen kann Ihre Firma davor bewahren, Reporthilfsmittel in vollem Umfang von dritter Seite benutzen zu mssen, wenn sie Datenbanktabellen direkt lesen, weil Pool- und Clustertabellen ein proprietres SAP-Format haben. Wenn Ihre Firma solche Hilfsmittel von Dritten benutzen mchte, sollten Sie vielleicht nach Alternativen suchen, bevor Sie Pool- und Clustertabellen anlegen. Wegen dieser Beschrnkungen der Pool- und Clustertabellen und wegen ihres begrenzten Nutzens konzentriert sich dieses Buch auf Anlage und Anwendung von transparenten Tabellen. Die Anlage von Pool- und Clustertabellen wird nicht behandelt.

Tabellenkomponenten
Sie wissen jetzt, was transparente Tabellen sind, und Sie kennen den Unterschied zwischen transparenten, Poolund Clustertabellen. Jetzt lernen Sie die Komponenten kennen, die bentigt werden, um Tabellen anzulegen. Eine Tabelle besteht aus Feldern. Um ein Feld anzulegen, bentigen Sie ein Datenelement. Das Datenelement enthlt die Feldkennungen und Online-Dokumentation (auch (F1)-Hilfe genannt) fr das Feld. Es ist ausschlielich beschreibend; es enthlt semantische Merkmale fr das Feld, auch bekannt unter business context. Die Kennstze, die Sie innerhalb eines Datenelements zur Verfgung stellen, werden auf der Maske neben einem Eingabefeld angezeigt. Das Datenfeld enthlt auch eine Dokumentation, die angezeigt wird, wenn der Anwender durch Drcken der (F1)-Taste nach Hilfe fr dieses Feld fragt. Die Definition eines Datenelements erfordert eine Domne (s. Abb. 3.5). Die Domne enthlt die technischen Merkmale eines Felds wie Feldlnge und Datentyp.

Abbildung 3.4: Tabellen bestehen aus Feldern, die ihrerseits aus Datenelementen bestehen, welche wiederum aus Domnen bestehen. Domnen und Datenelemente sind wiederverwendbar. Eine Domne kann in mehr als einem Datenelement verwendet werden und ein Datenelement in mehr als einem Feld und einer Tabelle. Stellen Sie sich z.B. vor, Sie mten eine Kundeninformationstabelle namens zcust erstellen, die Bro-, Faxund Privatrufnummern enthalten soll (s. Abb. 3.6).

Abbildung 3.5: Ein Beispiel, in dem Tabellen, Datenelemente und Domnen verwendet werden. Um ein Feld anzulegen, beginnen Sie normalerweise damit, eine Domne zu erstellen. Sie knnten in diesem Fall eine generische Rufnummerndomne anlegen, sie zphone nennen und ihr den Datentyp CHAR mit einer Lnge von 12 geben. Sie knnten die meisten Rufnummern mit dieser generischen Rufnummerndomne speichern und auch bestimmte Rufnummernarten wie Fax oder Privat definieren.

Um nach der Anlage der Domne die ausschlielich technische Beschreibung eines Feldes zu halten, knnen Sie ein Datenelement anlegen, um die beschreibenden Attribute des Felds zu halten. In das Datenelement mssen Sie den Namen einer Domne eintragen, um ihm die technischen Merkmale zu geben. Dann geben Sie die Kennstze und die Dokumentation (F1)-Hilfe ein, um die Daten zu beschreiben, die Sie

speichern wollen. In diesem Beispiel wrden Sie wahrscheinlich drei Datenelemente anlegen, je eines fr die Privat-, Bro- und Faxnummer. In jedes Datenelement wrden Sie Feldkennungen eintragen, welche die Art der Telefonnummern beschreiben, die Sie damit speichern wollen, und die (F1)-Hilfe fr den Endbenutzer. Nach den Datenelementen knnen Sie jetzt die Tabelle anlegen. Sie knnten drei Telefonnummernfelder in der Tabelle einrichten (Privat, Bro, Fax) und jedem Feld das entsprechende Datenelement zuweisen. Ein Datenelement ist jedem Feld zugewiesen. Dies gibt dem Feld beschreibende Information vom Datenelement und technische Information von der Domne, die sich darauf bezieht. Wenn das Feld in einer Maske benutzt wird, erhlt es einen Kennsatz und (F1)-Hilfe-Dokumentation vom Datenelement und sowohl seine Lnge als auch den Datentyp von der Domne innerhalb des Datenelements. Ein anderes Beispiel: Sie mssen den Namen einer Person in drei verschiedenen Tabellen speichern: als Kunden, als Kreditoren und als Angestellten. In der Kundentabelle wollen Sie einen Kundennamen speichern, in der Kreditorentabelle den Kreditornamen und den Angestelltennamen in der Angestelltentabelle. Weil es eine gute Idee ist, allen Personennamensfeldern den gleichen Datentyp und die gleiche Lnge zu geben, knnen Sie eine einzelne generische Personennamensdomne einrichten, zum Beispiel zpersname. Dann knnen Sie ein Datenelement fr jeden Geschftsgebrauch vom Namen einer Person einrichten: fr den Kundennamen, den Kreditornamen und den Angestelltennamen. Innerhalb jeden Datenelements beziehen Sie sich immer auf Ihre zpersname-Domne, um allen die gleichen Merkmale zu geben. Sie knnen dann diese Datenelemente benutzen, um Felder innerhalb jeder Tabelle einzurichten.

Technische Merkmale von Feldern pflegen


Wenn Sie die Lnge des Feldes ndern mssen, nachdem Sie die Tabelle angelegt haben, brauchen Sie diese nur in der Domne ndern. Wenn die Domne in mehr als einer Tabelle benutzt wird, wird die nderung automatisch in allen Feldern wirksam, die diese Domne benutzen. Wenn zum Beispiel der Geschftsanalytiker verlangt, da Sie die Lnge Ihres Personennamensfelds von 12 auf 15 abndern, verndern Sie einfach die Lnge in der zpersname-Domne. Wenn Sie Ihre nderung aktivieren, werden sich die Lngen von allen Namensfeldern, die auf dieser Domne basieren (Kunden-, Kreditoren-, Angestelltentabelle), ebenfalls verndern.

Wann werden Domnen und Datenelemente angelegt oder wiederverwendet?


In jedem R/3-System existieren bereits mehr als 13.000 Domnen, die von SAP angelegt wurden. Wenn Sie ein neues Feld anlegen, mssen Sie sich entscheiden, ob Sie eine neue Domne anlegen oder eine bereits existierende verwenden. Um diese Entscheidung zu treffen, legen Sie fest, ob der Datentyp oder die Feldlnge von einem bestehenden SAP-Feld abhngig sein soll. Wenn Ihr Feld unabhngig sein soll, richten Sie eine neue Domne ein. Wenn Ihr Feld abhngig sein soll, verwenden Sie eine bestehende SAP-Domne. Entsprechend sollten Sie Datenelemente wiederverwenden, so sich Ihre Feldkennungen und Ihre Dokumentation dann verndern sollen, wenn sich diese auch bei SAP verndern. Nehmen wir an, Sie wollen zum Beispiel eine neue Tabelle anlegen, die zustzliche Kreditorinformationen enthalten soll. Wenn Sie die Tabelle anlegen, mssen Sie die Kreditoren in Ihrer Tabelle mit denen in der SAPTabelle verbinden. Legen Sie einen Primrschlssel in Ihrer Tabelle an, der die Kreditorennummer enthlt. Benutzen Sie das bestehende Datenelement, um Ihr Feld einzurichten. Beide Tabellen werden jetzt in das SAP-

Kreditorennummernfeld eingegeben, wobei die gleichen Datenelemente und Domnen benutzt werden. Wenn sich bei SAP der Datentyp oder die Lnge eines Feldes verndert, werden sich Ihre automatisch mit verndern.

Namenskonventionen fr Tabellen und ihre Komponenten


Tabellen, Datenelemente und Domnen, die am Kundenstandort angelegt werden, mssen den SAPNamenskonventionen fr Kundenobjekte folgen. Diese werden in Tabelle 3.1 gezeigt.

Tabelle 3.1: Namenskonventionen fr Tabellen, Felder, Datenelemente und Domnen, eingerichtet vom Kunden Objekttyp Tabelle Max. Namenslnge (bis Version 4.0x) Erlaubtes erstes Zeichen 10 y, z y, z y, z Jedes Zeichen

Datenelement 10 Domne Feld 10 10

Alle Namen sind bis zur Version 4.0 maximal 10 Zeichen lang. Die Namen aller Tabellen, Domnen und Datenelemente, die Sie anlegen, mssen mit y oder z beginnen. Sie knnen kein anderes Zeichen fr den Anfang benutzen; alle anderen sind belegt von SAP. Das R/3-System erzwingt diese Konvention; Sie erhalten eine Fehlermeldung, wenn Sie versuchen, ein Objekt mit einem Namen anzulegen, der diesen Konventionen nicht entspricht. Feldnamen knnen mit jedem Zeichen anfangen. Gewisse Worte sind allerdings vorbesetzt und knnen nicht als Feldnamen belegt werden. Die DDIC-Tabelle trese enthlt die vollstndige Auflistung der reservierten Worte. Der Inhalt von trese kann angezeigt werden, indem man die Prozedur von Tag 2 im Abschnitt Daten in der Tabelle anzeigen ausfhrt.

Anlegen einer transparenten Tabelle und ihrer Komponenten


In den folgenden Abschnitten werden Sie Domnen, Datenelemente und schlielich Ihre erste transparente Tabelle anlegen - es wird eine kleine Version der von SAP gelieferten Kreditorenstammtabelle lfa1 sein.

Fr den Zweck dieses Buches stellen Sie sich bitte vor, da das R/3-System bisher noch keine Kreditorenstammdaten gespeichert hat. Stellen Sie sich auch vor, die Tabelle lfa1 wrde noch

nicht existieren, auch nicht ihre Datenelemente oder Domnen. Deshalb werden wir sie in diesen bungen anlegen. Um Kreditorenstamminformationen zu speichern, mssen Sie die Tabelle ***lfa1 anlegen. Sie enthlt Felder fr eine Kreditornummer, einen Namen, eine Postleitzahl und eine Lnderkennzahl. Die Feldnamen und technischen Merkmale, die Sie verwenden werden, sind in Tabelle 3.2 aufgefhrt. Ein x in der Spalte PK zeigt Felder, die den Primrschlssel bilden. (Die Installationsprozedur hat eine Tabelle namens ztxlfa1 in Ihrem R/3-System angelegt. Sie ist der ***lfa1-Tabelle sehr hnlich. Verwenden Sie diese als Referenz, whrend Sie dieses Kapitel lesen.)

Tabelle 3.2: Felder und ihre Merkmale fr Tabelle ***lfa1 Feldname PK DE Name DM Name Datentyp Lnge mandt lifnr name1 regio land1 x x mandt ***lifnr ***lifnr CHAR CHAR CHAR CHAR 10 35 3 3

***name1 ***name ***regio ***land1 ***regio ***land1

Diese Feldnamen und ihre technischen Merkmale basieren auf den aktuellen Feldern der Tabelle ***lfa1.

ndern Sie nicht die oben verwendeten Namen. Die bungen spter in diesem Buch beziehen sich auf diese Feldnamen. Wenn Sie nicht die genauen Namen verwenden, werden die nachfolgenden bungen nicht funktionieren. Da diese Tabelle Anwendungsdaten enthlt, sollte sie mandantenabhngig sein. Das erste Feld mu daher mandt sein (Gehen Sie zurck zu Kapitel 1, wenn Sie sich noch einmal ber mandantenabhngige Tabellen informieren mchten).

Anlegen von Tabellen


Es gibt zwei Mglichkeiten, Tabellen anzulegen:

von unten nach oben (Methode 1) von oben nach unten (Methode 2)

Wenn man von unten nach oben anfngt, legt man zuerst die Domnen an, dann die Datenelemente und dann die Tabelle.

Im umgekehrten Fall wird zuerst die Tabelle angelegt, dann die Datenelemente und dann die Domnen. Die erste Methode ist fr den Anfnger intuitiver, wird aber auch schnell hinderlich. Die zweite Methode ist viel leichter zu benutzen, wenn man sich etwas mit dem Anlegen von Tabellen vertraut gemacht hat. Aus diesen Grnden werde ich beide Verfahren erlutern. Auf den folgenden Seiten werden Sie zuerst etwas ber ein Objekt ,wie z.B. eine Domne, lernen, und dann werden Sie eines anlegen. Die Objekte, die Sie einrichten werden, sind beschrieben in Tabelle 3.2.

Denken Sie daran, immer Ihr persnliches Kennzeichen (***) als die ersten drei Zeichen eines Objektnamens zu verwenden, wenn Sie irgendein Objekt in diesem Buch anlegen. (Die Zeichen *** reprsentieren Ihr persnliches Kennzeichen und wurden in Kapitel 2 Programmnamenskonventionen vorgestellt) Benutzen Sie nicht ztx als erste drei Zeichen, denn dann wird es sehr schwierig werden, zu bestimmen, welches Ihre Objekte sind.

Aktivierung von DDIC-Objekten


Bevor Sie sich etwas grndlicher mit DDIC-Objekte befassen, sollten Sie etwas ber Objektaktivierung wissen. Die Aktivierung bezieht sich auf alle Dictionary-Objekte. Nachdem Sie ein Data Dictionary-Objekt angelegt haben, mssen Sie es aktivieren. Ein Objekt zu aktivieren ist einfach: Sie mssen nur auf die Schaltflche Aktivieren drcken. Damit ndern Sie den Status des Objekts auf Aktiv. Ein Objekt mu aktiv sein, bevor es benutzt werden kann. Sollten Sie versuchen, ein inaktives Datenelement zu benutzen, wenn Sie ein Feld einrichten, werden Sie zum Beispiel eine Meldung bekommen, die sagt, da das Datenelement nicht existiert oder nicht aktiv ist. Ihre Reaktion wrde sein, das Datenelement zu aktivieren. Wenn Sie ein Objekt wechseln, mssen Sie es fr die nderungen nochmals aktivieren, damit diese wirksam werden. Wenn Sie die nderungen sichern, aber nicht aktivieren, wissen die Objekte nichts von den nderungen.

Domnen
Bevor ich eine Domne einrichte, beschreibe ich die Maske, die Sie zum Anlegen benutzen. In Abbildung 3.7 sehen Sie die Maske, die Sie benutzen werden, um eine Domne einzurichten: Dictionary: Domne Pflegen. Auf dieser Maske geben Sie eine Kurzbeschreibung, den Datentyp, die Zahl der Stellen und optional eine Ausgabelnge ein. Diese Punkte sind in den folgenden Abschnitten erklrt.

Abbildung 3.6: Domne Pflegen wird zum Anlegen einer Domne verwendet. Kurzbeschreibung Das Textfeld enthlt eine Beschreibung der Domne. Der Endbenutzer sieht sie nie; sie wird nur Entwicklern angezeigt. Sie sehen sie, wenn Sie eine Liste von Domnen aufrufen oder wenn Sie eine Domne suchen. In diesem Feld werden Sie die Art von Daten beschreiben, die fr die Domne vorgesehen sind. Zum Beispiel wrde die Beschreibung einer wiederverwendbaren Rufnummerndomne generische Rufnummer oder allgemeine Rufnummer sein.

Es ist berflssig, das Wort Domne an das Ende einer Kurzbeschreibung zu setzen. Zum Beispiel sollte die Bezeichnung Generische Telefonnummerndomne vermieden werden; schreiben Sie einfach Generische Telefonnummer. Das Datentypfeld Das Datentypfeld gibt die Darstellung an, die intern von der Datenbank benutzt wird, um den Wert fr dieses Feld zu speichern. Fr einige Datentypen bestimmt es die Eingabeformatprfung und das Ausgabeformat des

Feldes. Felder vom Datentyp DATS (Datum) und TIMS (Zeit) sind zum Beispiel automatisch mit Trennzeichen formatiert, wenn man eine Liste ausdruckt oder sie auf dem Bildschirm anzeigt. Sie mssen im Datums- oder Zeitformat eingegeben werden, oder eine Fehlermeldung wird dem Anwender angezeigt. Die blicherweise am meisten benutzten Datentypen sind in Tabelle 3.3 aufgelistet.

Tabelle 3.3: Gebruchliche Datentypen Typ CHAR DEC DATS TIMS Beschreibung Zeichenketten (maximal 255 Zeichen) Dezimalwerte (maximal 31 Stellen) Datenfeld Zeitfeld

INT1, INT2, INT4 Integer-Werte NUMC Feld mit ausschlielich numerischen Zeichen

Sie sollten immer die Entertaste drcken, wenn Sie das Datentypenfeld ausgefllt haben. Durch Bettigen der Entertaste wird die Maske verndert, basierend auf dem Datentyp, den Sie bestimmt haben. Wenn der Datentyp numerisch ist, erscheint eine Zeichencheckbox. Fr Felder mit Dezimalstellen wird ein Feld Dezimalstellen angezeigt, fr Zeichenfelder sehen Sie die Checkbox Kleinbuchstaben auf der Maske. Zahl der Stellen, Dezimalstellen und Kleinbuchstaben Das Ausgabelngenfeld zeigt die Anzahl von Bytes an, die bentigt werden, um das Feld in einer Liste oder einer Maske auszugeben, einschlielich Kommata, Dezimalpunkt, Vorzeichen und allen anderen Formatierungszeichen. Bei der Ausgabe sind Datum und Zeitfelder zum Beispiel durch Trennzeichen automatisch formatiert. Ein Datum wird intern als acht Zeichen gespeichert (immer JJJJMMTT), aber die Ausgabelnge in der Domne sollte mit 10 angegeben werden, damit zwei Trennelemente eingefgt werden knnen. Wenn das Ausgabelngenfeld leer bleibt, werden die Werte automatisch vom System beim Drcken der Entertaste errechnet. Fr dezimale Felder knnen Sie die Anzahl von Dezimalstellen im Dezimalstellenfeld angeben. Zeichenfelder werden blicherweise in Grobuchstaben umgewandelt, bevor sie in der Datenbank gespeichert werden. Diese Konvertierung kann durch die Hkchenmarkierung im Feld Kleinbuchstaben verhindert werden. Die meisten Entwickler haben keine Probleme, die interne Darstellung von Zeichen oder Ganzzahlfeldern zu verstehen. Der Standort des Dezimalpunkts in dezimalen Feldern ist allerdings oft verwirrend, so da er hier erklrt wird.

Fr Felder vom Typ DEC ist der Dezimalpunkt nicht in der Datenbank gespeichert. Nur der numerische Teil ist gespeichert, nicht der dezimale. Bei der Ausgabe wird die Position der Dezimalzahl von dem Wert bestimmt, den Sie im Dezimalstellenfeld der Domne anlegen. Um das Feld richtig anzuzeigen, mssen Sie eine Ausgabelnge angeben, die ein Byte fr den Dezimalpunkt und ein Byte fr jedes 1000-er Trennelement umfat, die angezeigt werden knnen. Wenn Sie das Feld allerdings leer lassen, wird das System die Ausgabelnge fr Sie bestimmen. Eine Domne anlegen In diesem Abschnitt lernen Sie, nach Methode 1 eine Domne einzurichten. Starten Sie jetzt das ScreenCam How to Create a Domain. Fhren Sie diese Prozedur zweimal aus, um die Domnen ***lifnr und ***name1 anzulegen. Hilfe zu den blichen Problemen finden Sie im Strungssucher. Wenn Sie mit irgendwelchen Schritten ein Problem haben, vergessen Sie nicht, im Strungssucher nachzusehen. 1. Starten Sie im Wrterbuch. 2. Geben Sie den Domnennamen im Objektnamensfeld ein. 3. Whlen Sie die Option Domne. 4. Legen Sie die Domne an. 5. Geben Sie eine Kurzbeschreibung ein. 6. Fllen Sie das Datentypenfeld aus. Positionieren Sie den Cursor in das Feld, und drcken Sie auf den Pfeil nach unten, um eine Auflistung von erlaubten Datentypen anzuzeigen. Whlen Sie einen aus, oder geben Sie ihn ein. 7. Geben Sie die Feldlnge ein. 8. Aktivieren Sie die Domne (sie wird gleichzeitig gesichert). Die Maske Objektkata- logeintrag anlegen erscheint. 9. Drcken Sie die Schaltflche Lokales Objekt. Sie kommen in die Ausgangsmaske zurck. 10. Durch Drcken der Schaltflche Zurck kommen Sie an den Anfang dieses Vorgangs. Problem Mgliche Symptome Lsung

Ich kann keine Domne anlegen.

Wenn Sie auf Anlegen drcken, passiert nichts.

Schauen Sie auf die Statusleiste unten auf Ihrem Bildschirm, und drcken Sie nochmals auf Anlegen. Es ist mglich, da Sie dort jetzt eine Mitteilung sehen. ndern Sie den Domnennamen so, da er mit y oder z beginnt.

Wenn Sie auf Anlegen drcken, sehen Sie die Nachricht Das System erlaubt keine nderungen an SAP-Objekten. Wenn Sie auf Anlegen drcken, sehen Sie die Mitteilung Geben Sie den Zugangsschlssel ein.

ndern Sie den Domnennamen so, da er mit y oder z beginnt.

Wenn Sie auf Anlegen drcken, Erbitten Sie die Autorisierung von Ihrem sehen Sie die Mitteilung Sie haben Sicherheitsadministrator. keine Berechtigung. Wenn Sie auf Anlegen drcken, Ihr gewhlter Name existiert schon im Data sehen Sie die Mitteilung ist bereits Dictionary. Whlen Sie einen anderen vorhanden. Domnennamen. Ich erhalte eine Nachricht W: Die errechnete Ausgabelnge ist kleiner als die angegebene. E: Wertetabelle existiert nicht. SAP-Dokumentation ber Domnen erhalten Es gibt viele Stellen, SAP-Dokumentation ber die Merkmale von Domnen zu erhalten. Wenn Sie sich die Dokumentation ansehen wollen, die alle Datentypen und ihre Anwendungsmglichkeiten beschreibt, gehen Sie auf das Datentypenfeld und drcken (F1). Sie sehen eine Dialogbox mit markierten Feldern. Klicken Sie auf diese Felder fr mehr Details. Sie knnen auch die R/3-Bibliothek-Hilfe in Anspruch nehmen fr zustzliche Dokumentationen ber Datentypen und andere Eigenschaften der Domne. Um diese Dokumentation anzusehen, whlen Sie aus jeder Maske den Menpfad Hilfe->R/3-Bibliothek. Sie kommen in das Hauptmen der R/3-Bibliothek. Fr noch mehr Dokumentation ber die Datentypen in der Domne whlen Sie den Menpfad Hilfe->Erweiterte Hilfe innerhalb der Domne und klicken dann den Bereich an, fr den Sie Hilfe brauchen. Um eine Dokumentation zu erhalten, welche die Abbildung von Domnendatentypen zu den ABAP/4Datentypen beschreibt, zeigen Sie die (F1)-Hilfe fr die Tabellen- Schlsselwrter an. (Um das innerhalb des ABAP/4-Editors zu machen, gehen Sie auf den Begriff tables und drcken (F1)). Leeren Sie das Feld Zahl der Stellen, und drcken Sie erst (Enter) und dann Aktivieren. Leeren Sie das Feld Wertetabelle, und drcken Sie erst (Enter) und dann Aktivieren.

Datenelemente
Vor dem Anlegen eines Datenelementes wird die Maske beschrieben, die Sie benutzen, um es einzurichten. Abbildung 3.8 zeigt die Maske, die benutzt wird, um ein Datenelement einzurichten. Sie geben hier die Kurzbeschreibung, den Domnennamen, die Kennstze und eine Kopfzeile ein, die in den folgenden Abschnitten

erklrt werden. Eine Dokumentation kann auch eingerichtet werden, nachdem das Datenelement gesichert geworden ist.

Abbildung 3.7: Die Maske Dictionary: Datenelement ndern Kurzbeschreibung Das Textfeld beschreibt einen Geschftszusammenhang fr eine Domne. Eine Kundenrufnummer ist zum Beispiel ein spezifischer Geschftszusammenhang fr eine generische Rufnummerndomne, so da sie eine entsprechende Beschreibung fr ein Datenelement sein wrde. Der Endbenutzer sieht diese Beschreibung, wenn er die (F1)-Hilfe aufruft fr ein Feld, das angelegt wurde, um dieses Datenelement zu benutzen. Feldbezeichner und berschrift Am unteren Rand der Maske, die in Abbildung 3.8 gezeigt wird, sind vier Textfelder. Die ersten drei sind Feldkennungen. Wenn irgendein Feld auf einer Maske erscheint (wie z.B. ein Eingabefeld auf einer Eingabemaske), wird eines der kurzen, mittleren oder langen Felder links davon als Feldkennung erscheinen. Der Programmierer whlt eine dieser Feldbezeichnungen, wenn er eine Maske anlegt. Die Inhalte der berschrift erscheinen als Spaltenberschriften am Anfang von Auflistungen. Wenn die Felder, die Sie mit diesem Datenelement anlegen, nicht auf allen Masken erscheinen, deaktivieren Sie Feldbezeichner pflegen. Sie werden die Feldkennung und die berschriften nicht mehr sehen. Sie mssen zweimal (Enter) eingeben, damit die Felder verschwinden, wenn sie Werte enthalten.

Datenelementedokumentation Nachdem Sie das Datenelement gesichert haben, erscheint die Dokumentationsschaltflche auf der Drucktastenleiste, so da Sie freie Texte speichern knnen. Der Anwender sieht diesen Text, wenn er die (F1)Hilfe aufruft. Anders ausgedrckt: wenn ein Tabellenfeld, das dieses Datenelement benutzt, auf einer Maske erscheint, kann der Anwender seinen Cursor in dieses Feld bewegen und (F1) drcken, um die Dokumentation anzuzeigen, die Sie hier eingegeben haben. Wenn Sie die Dokumentationsmaske sehen, wird die Anfangszeile die Zeichen &DEFINITION& enthalten. Dies ist eine berschrift; ndern Sie diese Zeile niemals. Beginnen Sie die Eingabe Ihrer Dokumentation auf Zeile 2.

Die Dokumentation der Datenelemente ist fr den Programmierer oft sehr ntzlich. Indem er die (F1)-Hilfe liest, kann er die geschftliche Verwendbarkeit der Daten bestimmen. Deshalb sollten Sie die (F1)-Hilfe fr den Benutzer immer ber die Schaltflche Dokumentation anlegen. Anlegen eines Datenelements In diesem Abschnitt lernen Sie die Methode 2 kennen, ein Datenelement anzulegen. Starten Sie jetzt das ScreenCam How to Create a Data Element. Fhren Sie diesen Vorgang zweimal aus, um die Datenelemente ***lifnr und ***name1 anzulegen. Hilfe finden Sie in der Tabelle im Anschlu. Bei auftauchenden Problemen sehen Sie unbedingt hier nach. 1. Starten Sie mit dem Dictionary (Transaktion SE11 oder ber den Menpfad) 2. Geben Sie den Namen des Datenelements in das Feld Objektname ein. 3. Whlen Sie die Option Datenelemente. 4. Drcken Sie die Schaltflche Anlegen. Die Maske Dictionary:Datenelement ndern erscheint. 5. Geben Sie die Kurzbeschreibung fr das Datenelement ein. 6. Geben Sie einen Domnennamen ein, und drcken Sie (Enter). Wenn die Domne existiert und aktiv ist, werden ihr Datentyp und die Lnge erscheinen. Wenn Sie nach dem Bettigen der Entertaste keinen Datentyp und keine Datenlnge sehen, berprfen Sie den Namen des Datenelements. Wenn der Name korrekt ist, berprfen Sie durch ffnen eines neuen Modus, ob es aktiv ist (benutzen Sie den Pfad System->Erzeugen Modus), und lassen Sie es sich im Data Dictionary anzeigen. 7. Geben Sie die Feldnamen in die Feldbezeichner kurz, mittel, lang und die berschrift ein. Der Wert im Kurzfeld darf hchstens 10 Zeichen haben, der mittlere 15, und der lange ist auf 20 Zeichen begrenzt. Der Wert

in der berschrift sollte hchstens so lang sein wie die Ausgabelnge in der Domne. 8. Drcken Sie Sichern auf der Symbolleiste. Die Maske Objektkatalogeintrag anlegen erscheint. 9. Drcken Sie die Schaltflche Lokales Objekt. Das Statusfeld enthlt die Werte Neu und gesichert, und die Mitteilung gesichert ohne Prfung erscheint unten im Fenster der Statusleiste. Unter anderen erscheint die Schaltflche Dokumentation auf der Drucktastenleiste. 10. Drcken Sie die Schalflche Dokumentation. Sie gelangen in die Dokumentationserfassungsmaske. Hier knnen Sie eine Endbenutzerdokumentation eingeben. Diese Dokumentation erscheint, wenn der Benutzer die (F1)-Hilfe fr Felder aufruft, die angelegt wurden, diese Datenelemente zu benutzen. Die erste Zeile enthlt die Zeichen &DEFINITION&. Dies ist eine berschrift; ndern Sie diese niemals. Beginnen Sie mit der Eingabe Ihrer Dokumentation in Zeile 2. Drcken Sie die Entertaste zu Beginn eines jeden Absatzes. 11. Drcken Sie Sichern und Aktivieren. Die Mitteilung Das Dokument wurde im Status aktiv gesichert erscheint in der Statusleiste. 12. Drcken Sie Zurck - Sie kehren zur Maske Dictionary: Datenelement ndern zurck. 13. Drcken Sie auf Aktivieren. Der Wert im Statusfeld ndert sich zu Akt. , und die Mitteilung Wurde erfolgreich aktiviert erscheint in der Statusleiste. 14. Drcken Sie auf Zurck. Sie kehren zum Anfang des Vorgangs zurck. Problem Mgliche Symptome Lsung Schauen Sie auf die Statusleiste unten im Fenster, und drcken Sie nochmals auf Anlegen. Sehr wahrscheinlich sehen Sie hier eine Mitteilung.

Ich kann kein Datenelement Wenn Sie die Schaltflche anlegen Anlegen drcken, passiert nichts.

Wenn Sie Anlegen drcken, ndern Sie den Namen des Datenelements, sehen Sie die Mitteilung Das beginnend mit y oder z. System erlaubt keine nderungen an SAP-Objekten. Wenn Sie Anlegen drcken, ndern Sie den Namen des Datenelements, sehen Sie die Mitteilung Geben beginnend mit y oder z. Sie den Zugangsschlssel ein. Wenn Sie Anlegen drcken, sehen Sie die Mitteilung ...keine Berechtigung.... Wenn Sie Anlegen drcken, sehen Sie die Mitteilung ist bereits vorhanden. Ich kann das Datenelement nicht aktivieren Sie sehen die Mitteilung Es existiert keine aktive Domne mit diesem Namen. Erbitten Sie die Autorisierung von Ihrem Sicherheitsadministrator. Ihr gewhlter Name existiert schon im Data Dictionary. Whlen Sie einen anderen Domnennamen. Gehen Sie zur Maske Dictionary: Datenelement ndern und doppelklicken Sie auf den Domnennamen.

Der Domnenname, den Sie in Sie sehen entweder eine Dialogbox oder die der vorherigen Maske Maske Dictionary: Domne anzeigen. eingegeben haben, existiert nicht oder ist nicht aktiv. Wenn Sie eine Dialogbox mit dem Namen Domne Anlegen sehen, existiert die Domne nicht. berprfen Sie den Namen. Haben Sie den falschen Namen eingegeben? Es knnte eine gute Idee sein, eine neue Session zu ffnen und alle Objekte anzeigen zu lassen, die Sie bisher mit dem Object-Browser angelegt haben (Schauen Sie in Tag 2 in das Kapitel Ihre Entwicklungsobjekte wiederfinden). Wenn Sie nach einem Doppelklick die Maske Dictionary: Datenelement anzeigen sehen, schauen Sie auf die Statusleiste auf dieser Maske. Ist der Status Neu? In diesem Fall mu die Domne aktiviert werden. Drkken Sie auf Aktivieren und dann auf Zurck, um zum Datenelement zurckzukehren, und versuchen Sie noch einmal, es zu aktivieren. Ich erhalte die Nachricht: Bitte Feldbezeichner pflegen. W Lnge wurde auf die tatschliche Lnge heraufgesetzt. Ich komme nicht in die Feldkennungen hinein. Fgen Sie die Kurz-, Mittel- und Langfelder ein, und aktivieren Sie dann. Die von Ihnen eingegebene berschrift war lnger als die Feldlnge. Dies ist kein groes Problem. Drcken Sie einfach auf (Enter), und aktivieren Sie erneut.

Die Eingabefelder fehlen auf der Haken Sie die Feldbezeichner pflegen an, und Maske. drcken Sie (Enter).

Transparente Tabellen
In Abbildung 3.9 sehen Sie die Maske, die benutzt wird, um transparente Tabellen anzulegen. Hier spezifizieren Sie die Kurzbeschreibung, die Auslieferungsklasse, Feldnamen, ein Datenelement fr jedes Feld, und selektieren das Primrschlsselfeld. In den folgenden Abschnitten werden die einzelnen Punkte detaillierter erlutert.

Abbildung 3.8: In die Maske Dictionary :Tabelle/Struktur: Felder ndern knnen Kurzbeschreibungen, Attribute und Feldnamen eingegeben werden. Kurzbeschreibung Das Textfeld wird fr die gleichen Zwecke benutzt wie die Kurzbeschreibung von Domnen. Der Endbenutzer wird diese Beschreibungen nicht sehen, aber der Entwickler sieht sie, wenn er eine Tabellenliste aufruft. Feld Auslieferungsklasse (AusliefKlasse) Der Wert im Feld Auslieferungsklasse identifiziert den Besitzer der Daten in dieser Tabelle. Der Besitzer ist verantwortlich fr die Pflege des Tabelleninhalts. In Kundentabellen geben Sie hier immer ein A ein, um anzuzeigen, da die Tabelle Anwendungsdaten enthlt, die nur dem Kunden gehren. Andere Werte, die in das Feld eingetragen werden, sind nur ntzlich fr SAP und zeigen an, da die Daten entweder SAP gehren oder aber sowohl SAP als auch dem Kunden.

Um eine komplette Liste der zulssigen Werte und ihrer Bedeutung zu erhalten, positionieren Sie den Cursor auf das Feld Auslieferungsklasse, und drcken Sie (F1).

Feld Tabellenpflege erlaubt (Tab.pflege erlaubt) Indem Sie die Tab.pflege erlaubt anhaken, kann der Menpfad Hilfsmittel->Eintrge erfassen benutzt werden. Wenn Sie die Tabelle aktiviert und diesen Menpfad gewhlt haben, erscheint die Maske Tabelle einfgen und ermglicht Ihnen, Daten in Ihre Tabelle einzutragen. Dies ist sinnvoll zum Testen und zur manuellen Eingabe von geringen Datenmengen. Wenn Tab.pflege erlaubt nicht angehakt ist, erscheint der Menpfad ausgegraut. Feldnamenspalte In der unteren Hlfte des Bildschirms knnen Sie Feldnamen eingeben. Die Primrschlsselfelder mssen in dieser Liste zuerst auftauchen und durch ein Hkchen in der Schlsselspalte markiert werden. Rechts von jedem Feldnamen mu ein Datenelementsname eingegeben werden. Wenn Sie alle Felder ausgefllt haben, drcken Sie die Schaltflche Neue Felder auf der Symbolleiste, um weitere Felder hinzuzufgen. Anlegen einer transparenten Tabelle unter Benutzung bereits existierender Domnen und Datenelemente In diesem Abschnitt lernen Sie, wie man mit Hilfe der ersten Methode (von unten nach oben) eine transparente Tabelle anlegt. Starten Sie jetzt das ScreenCam How to Create a Transparent Table Using Preexisting Domains and Date Elements. Fhren Sie diesen Vorgang aus, um die Tabelle ***lifnr anzulegen. Wir werden die Tabelle anlegen, aber nur die ersten drei Felder mandt, ***lifnr und ***name1 aufnehmen. Spter werden wir die brigen Felder mit Hilfe der zweiten Methode (von oben nach unten) hinzufgen. Hilfe finden Sie in der Tabelle im Anschlu. Wenn Sie mit irgendeinem der Schritte Probleme haben, schauen Sie dort nach. 1. Starten Sie mit der Maske Dictionary: Einstieg. 2. Geben Sie den Tabellennamen ***lifnr in das Feld Objektname ein 3. Whlen Sie die Option Tabellen. 4. Drcken Sie die Schaltflche Anlegen. Es erscheint die Maske Dictionary: Tabelle/Struktur: Felder ndern. 5. Geben Sie die Kurzbeschreibung fr die Tabelle ein. 6. Geben Sie ein A in das Auslieferungsklassefeld ein. 7. Machen Sie ein Hkchen Tab.pflege Erlaubt. 8. Tragen Sie den Namen des ersten Feldes der Tabelle in die Feldnamenspalte ein. 9. Haken Sie Key an, wenn es Teil des Primrschlssels ist. 10. Tragen Sie den Namen eines Datenelements in die Spalte Datenelement ein.

11. Drcken Sie die Entertaste. 12. Sehen Sie auf die Statusleiste. Wenn Sie die Mitteilung Datenelement ist nicht aktiv sehen, existiert das Datenelement entweder noch nicht, oder es ist nicht aktiviert. Folgende Grnde knnen vorliegen:

Es wurde gar nicht angelegt. Ihnen unterlief ein Rechtschreibfehler, als Sie das Datenelement anlegten. Der Name des Datenelements wird auf der gegenwrtigen Maske falsch geschrieben. Das Datenelement existiert, und es ist richtig geschrieben, aber es ist nicht aktiv.

berprfen Sie den Namen. Wenn die Schreibweise korrekt ist, fhren Sie einen Doppelklick aus. Wenn ein Datenelement mit diesem Namen nicht existiert, sehen Sie jetzt eine Dialogbox Datenelement anlegen. Wenn das Datenelement existiert, wird es jetzt angezeigt.- Wenn Sie sich jetzt das Datenelement ansehen, achten Sie auf den Wert im Statusfeld. Das Statusfeld mu Akt. enthalten. Wenn das Datenelement aktiviert ist, drcken Sie auf Zurck, um zur Ausgangsmaske zurckzukehren. 13. Wiederholen Sie Schritt 8 bis 12 fr die verbleibenden Felder in der Tabelle (***lifnr und ***name1). 14. Drcken Sie auf Sichern. Sie sehen die Maske Objektkatalogeintrag anlegen. 15. Drcken Sie auf die Schaltflche Lokales Objekt. Sie kehren zurck zu der Maske Dictionary:Tabelle/Struktur:Felder ndern. 16. Whlen Sie Technische Einstellungen - die Maske ABAP/4 Dictionary:Technische Einstellungen pflegen wird angezeigt. 17. Geben Sie APPL0 im Feld Datenart ein (mit einer Null, nicht dem Buchstaben O). 18. Tragen Sie 0 (Null) in das Feld Grenkategorie ein. 19. Sichern Sie. 20. Drcken Sie Zurck - Sie kommen wieder zu der Ausgangsmaske zurck. 21. Whlen Sie Aktivieren. War die Aktivierung erfolgreich, erscheint jetzt die Meldung wurde erfolgreich aktiviert in der Statusleiste; das Statusfeld enthlt den Wert Akt. 22. Mit Zurck kommen Sie wieder zum Anfang. Problem Ich kann keine Tabelle anlegen. Mgliche Symptome Wenn Sie die Schaltflche Anlegen drcken, passiert nichts. Lsung Schauen Sie auf die Statusleiste unten im Fenster, und drcken Sie nochmals auf Anlegen. Sehr wahrscheinlich sehen Sie hier eine Nachricht.

Wenn Sie Anlegen drcken, ndern Sie den Namen der Tabelle, sehen Sie die Mitteilung Geben beginnend mit y oder z. Sie den Zugangsschlssel ein. Wenn Sie Anlegen drcken, ndern Sie den Namen der Tabelle, sehen Sie die Mitteilung Das beginnend mit y oder z. System erlaubt keine nderungen an SAP Objekten. Wenn Sie Anlegen drcken, Erbitten Sie die Autorisierung von Ihrem sehen Sie die Mitteilung Geben Sicherheitsadministrator. Sie den Zugangsschlssel ein. Wenn Sie Anlegen drcken, sehen Sie die Mitteilung ... keine Berechtigung .... Wenn Sie Anlegen drcken, sehen Sie die Mitteilung ist bereits vorhanden. Ich kann die Tabelle nicht aktivieren. Ihr gewhlter Name existiert schon im Data Dictionary. Whlen Sie einen anderen Domnennamen.

Sie sehen die Mitteilung Gehen Sie eine Maske zurck zur Maske Datenelement oder Domne ist Dictionary: Tabelle/Struktur: Felder ndern nicht aktiv oder existiert nicht. und doppelklicken Sie auf den Namen des Datenelements. Sie sehen entweder eine Dialogbox oder direkt das Datenelement. Wenn Sie eine Dialogbox mit dem Namen Datenelement Anlegen sehen, existiert das Datenelement nicht. berprfen Sie den Namen. Haben Sie den falschen Namen eingegeben? Es knnte eine gute Idee sein, eine neue Session zu ffnen und alle Objekte anzeigen zu lassen, die Sie bisher mit dem Objectbrowser angelegt haben (Schauen Sie in Tag 2 in das Kapitel Ihre Entwicklungsobjekte wiederfinden). Wenn Sie das Datenelement anzeigen knnen, schauen Sie auf die Statusleiste. Ist der Status Neu? Falls nicht, mu das Datenelement aktiviert werden. Drkken Sie auf Aktivieren und dann auf Zurck, um zur Tabelle zurckzukehren.

Ich sehe die Maske Dictionary: Technische Einstellungen Pflegen. Mitteilungen in roter Schrift E-Feld (Datenelement oder werden angezeigt. Domne ist nicht aktiv oder existiert nicht).

Die technischen Attribute wurden entweder nicht eingegeben oder nicht gesichert. Geben Sie diese jetzt ein, drcken Sie Sichern und dann Zurck. Siehe oben (Kann Tabelle nicht aktivieren)

E-Anfang in Tabelle TAORA fehlt.

Schauen Sie weiter unten nach einer (roten) Nachricht ber Datenklasse oder Grssenkategorie.

E-Fehler in der Codegeneration dito fr Tabellenanlage in DB. E-Tabelle (Anweisungen konnten nicht generiert werden). E-Feld Grenkategorie (Wert nicht erlaubt). dito

Sie haben einen ungltigen Wert eingegeben in das Feld Grenkategorie. Drcken Sie Zurck, dann Technische Einstellungen, und ndern Sie die Grenkategorie auf 0 (Null).

E-Feld Datenklasse (Wert nicht Sie haben einen ungltigen Wert eingegeben erlaubt). in das Feld Datenklasse. Drcken Sie Zurck, dann Technische Einstellungen, und ndern Sie die Datenklasse auf APPL0 (mit Null am Ende). E-Schlssel ist bereits definiert; Feld kann nicht im Schlssel sein. Die Primrschlsselfelder sind nicht benachbart. Whlen Sie Zurck und versichern Sie sich, da Ihre Primrschlsselfelder alle am Anfang der Tabelle stehen ohne dazwischenliegende Nichtschlsselfelder (Alle Haken in der Schlsselspalte mssen zusammen am Anfang der Tabelle stehen). Sie haben die Tabelle gewechselt, und jetzt mu eine Tabellenkonvertierung vorgenommen werden, um die Aktivierung abzuschlieen. Whlen Sie einen Prozessortyp von Online und drcken Sie die Schaltflche Anpassen. Sie haben versucht, ein Feld zu entfernen, indem Sie es leerten. Sie drfen nicht so vorgehen. Sie mssen die Felder mit der Schaltflche Ausschneiden lschen. Drkken Sie Ausschneiden, bis Sie die Nachricht Selektierte Eingaben wurden in das Clipboard kopiert am unteren Bildschirmrand in der Statusleiste sehen.

Die Dialogbox mit dem Namen Tabelle Anpassen zeigt an Table must be adjusted in the database.

Die Tabelle mu konvertiert werden.

Am unteren Bildschirmrand erscheint die Nachricht Initialwert nicht erlaubt als Feldname oder: Ich kann nicht hochrollen. oder: Ich sehe die eingegebenen Felder nicht. Ich kann eine Nachricht nicht bergehen.

Eine Nachricht mit dem Zeichen Drcken Sie die Entertaste als Antwort auf W: erscheint in der die Nachricht. Statusleiste, und Sie kommen nicht weiter.

Anlegen einer transparenten Tabelle ohne Benutzung bereits existierender Domnen und

Datenelementen In diesem Abschnitt lernen Sie, mit Hilfe der Methode 2 einer Tabelle Felder hinzuzufgen. Sie werden die verbleibenden Felder (***regio und ***land1) Ihrer Tabelle ***lfa1 hinzufgen. Mit Methode 2 knnen Sie Felder einer Tabelle hinzufgen, bevor Sie die Datenelemente und Domnen anlegen. Sie legen die Datenelemente und Domnen einfach whrend Ihres normalen Fortschreitens an. Um so zu verfahren, geben Sie einfach den Namen eines Datenelements oder einer Domne ein, und fhren Sie darauf einen Doppelklick aus. Sie legen dann die Domne oder das Datenelement an, aktivieren Sie beide und drcken dann die Schaltflche Zurck, um zum Ausgangspunkt zurckzukehren. Nun folgt der Vorgang, einer transparenten Tabelle Felder hinzuzufgen, ohne vorher Domnen oder Datenelemente anzulegen. Starten Sie jetzt das ScreenCam How to Create a Transparent Table Without Preexisting Domains and Data Elements. 1. Sie beginnen wieder mit der Maske Dictionary: Einstieg. 2. Geben Sie den Tabellennamen ***lfa1 in das Feld Objektname ein. 3. Whlen Sie die Option Tabellen. 4. Drcken Sie ndern. 5. Drcken Sie die Schaltflche Neue Felder. Sie sehen leere Zeilen am unteren Rand des Bildschirms, und die existierenden Tabellenfelder werden aufwrts gerollt. 6. Tragen Sie den Namen des Feldes, welches Sie hinzufgen mchten, in die Spalte Feldname ein. 7. Haken Sie Key an, wenn es einen Teil des Primrschlssels bildet (Die Felder ***regio und ***land1 tun dies nicht, aber dieser Abschnitt ist allgemeingltig fr jede Situation). 8. Geben Sie den Namen des assoziierten Datenelements in die Spalte Datenelement ein. 9. Drcken Sie (Enter). 10. Sehen Sie zur Statuszeile. Sie sehen die Nachricht Datenelement ist nicht mehr aktiv, weil das Datenelement nicht existiert. 11. Doppelklicken Sie auf den Namen des Datenelements. Die Dialogbox zum Anlegen von Datenelementen wird angezeigt. Im Feld Datenelement steht der Name des Datenelements, welches angelegt werden soll. Dies ist natrlich das Datenelement, das Sie anlegen wollen, also ndern Sie es hier nicht, wenn es nicht falsch geschrieben sein sollte. 12. Drcken Sie auf Weiter. Die Maske Dictionary: Datenelement ndern erscheint. 13. Geben Sie die Kurzbeschreibung fr das Datenelement ein.

14. Geben Sie einen Domnennamen ein. 15. Machen Sie einen Doppelklick auf den Namen der Domne, um sie anzulegen. Die Dialogbox Domne Anlegen erscheint. Im Feld steht der Name der Domne, die angelegt werden soll. Dies ist die Domne, die Sie anlegen wollen, also ndern Sie diese hier nicht, es sei denn, sie ist falsch geschrieben. 16. Drcken Sie auf Weiter. Die Maske Dictionary: Domne Pflegen erscheint. 17. Geben Sie in die Felder Kurzbeschreibung, Datentyp und Feldlnge ein. 18. Drcken Sie auf Aktivieren. 19. Drcken Sie die Schaltflche Lokale Objekte. Sie kehren zur Maske zurck. Der Wert im Statusfeld ndert sich in Akt., und die Nachricht wurde erfolgreich aktiviert erscheint in der Statuszeile. 20. Drcken Sie auf Zurck, um zur Maske Dictionary: Datenelement ndern zurckzukehren. 21. Geben Sie die noch verbleibenden Felder fr das Datenelement ein (schauen Sie auf Schritt 7 im Abschnitt Anlegen eines Datenelements). 22. Drcken Sie auf Aktivieren. Sie sehen die Maske Objektkatalogeintrag. 23. Drcken Sie nun Lokales Objekt. Sie kehren zur Maske zurck. Der Wert im Statusfeld ndert sich auf Akt., und die Nachricht wurde aktiviert erscheint auf der Statusleiste. 24. Drcken Sie Zurck. Sie kommen zur Maske Dictionary: Tabelle/Struktur: Felder ndern. In der Statusleiste sollten keine Mitteilungen stehen. 25. Wiederholen Sie Schritt 5 bis 23 fr jedes neue Datenelement, welches Sie anlegen mchten. 26. Wenn Sie alle Domnen und Datenelemente angelegt haben, drcken Sie auf Aktivieren. War die Aktivierung erfolgreich, erscheint nun die Nachricht wurde erfolgreich aktiviert auf der Statusleiste, und das Statusfeld enthlt den Wert Akt. 27. Drcken Sie Zurck, um an Ihren Ausgangspunkt zu gelangen.

Tabellenmodifizierung
Wenn Sie eine Tabelle angelegt haben, knnen Sie folgendes mit ihr machen:

sie kopieren sie lschen Felder hinzufgen Felder lschen Felder ndern

Der folgende Abschnitt beschreibt, wie Sie diese Funktionen anwenden.

Eine Tabelle kopieren


Wenn eine Tabelle im DDIC aktiv ist, knnen Sie diese kopieren. Sie knnten dies zum Beispiel wollen, wenn eine bereits existierende Tabelle sehr hnlich derjenigen ist, die Sie anlegen mchten. Oder vielleicht wollen Sie mit einigen Wrterbuchfunktionen ein wenig herumexperimentieren, mchten aber eine bereits existierende nicht modifizieren. So kopieren Sie eine Tabelle: 1. Starten Sie in der Maske Dictionary: Einstieg. 2. Whlen Sie die Option Tabellen. 3. Drcken Sie Kopieren. 4. Geben Sie die Namen der Start- und Zieltabellen ein. 5. Drcken Sie Aktivieren. Sie kehren zum Ausgangspunkt zurck und sehen die Mitteilung ++ auf der Statusleiste. Diese Prozedur kopiert lediglich die Tabellenstruktur, nicht ihre Daten. Um die Daten zu kopieren, mssen Sie selbst ein kleines ABAP/4-Programm schreiben.

Tabellen knnen nicht umbenannt werden. Um einen Tabellennamen zu ndern, mssen Sie die Tabelle in eine andere kopieren, die den gewnschten Namen hat, und dann die Originaltabelle lschen. Wenn Sie dies getan haben, kopieren Sie unbedingt sowohl die Struktur als auch die Daten.

Eine Tabelle lschen


Sie knnen existierende DDIC-Tabellen lschen. Dies ist z.B. dann sinnvoll, wenn eine existierende Tabelle nicht mehr bentigt wird, oder fr eine Tabelle, die Sie lediglich angelegt haben, um Ihnen unbekannte Wrterbuchfunktionen auszuprobieren. Um eine Tabelle zu lschen, gehen Sie folgendermaen vor: 1. Starten Sie mit der Maske Dictionary: Einstieg. 2. Geben Sie den Tabellennamen in das Feld Objektname ein. 3. Whlen Sie die Option Tabellen.

4. Drcken Sie Lschen. Sie werden zur Besttigung aufgefordert. 5. Prfen Sie noch einmal den Tabellennamen, und drcken Sie Ja, wenn Sie fortfahren mchten.

Felder hinzufgen
Es gibt zwei Mglichkeiten, existierenden Tabellen Felder hinzuzufgen:

einfgen anhngen

Wenn Sie ein Feld einfgen, knnen Sie dies auch vor ein bereits existierendes Feld positionieren. Wenn Sie ein Feld anhngen, knnen Sie dies am Ende der Tabelle machen, zumindest am Ende von allen existierenden Feldern. Ein Feld einfgen Um ein neues Feld vor einem existierenden Feld einzufgen, fhren Sie folgenden Vorgang aus: 1. Der Start erfolgt wieder von der Dictionary: Einstieg-Maske aus. 2. Geben Sie den Tabellennamen im Objektname-Feld ein. 3. Whlen Sie die Option Tabellen. 4. Drcken Sie ndern. 5. Positionieren Sie den Cursor auf einem Feld. 6. Drcken Sie die Schaltflche Einfgen. ber der Cursorposition erscheint eine neue Zeile. 7. Legen Sie Ihr neues Feld in der Zeile an, die Sie gerade eingefgt haben. Ein Feld anhngen Um ein Feld an das Ende einer Tabelle anzuhngen, gehen Sie so vor: 1. Dictionary: Einstieg-Maske. 2. Geben Sie den Tabellennamen in das Feld Objektname ein. 3. Whlen Sie Tabellen. 4. Drcken Sie ndern. 5. Drcken Sie auf Neue Felder. Auf der unteren Bildschirmhlfte rollt das existierende Feld nach oben, so da Sie ein zustzliches Feld anhngen knnen.

6. Legen Sie Ihre neuen Felder in den Zeilen an, die Sie gerade eingefgt haben.

Felder lschen
Sie knnen existierende Felder aus einer Tabelle lschen, weil das Feld z.B. nicht mehr bentigt wird oder es nur probeweise angelegt war. Um ein Feld aus einer Tabelle zu lschen, gehen Sie folgendermaen vor: 1. Zuerst wieder unsere bekannte Maske Dictionary: Einstieg. 2. Geben Sie den Tabellennamen ein. 3. Whlen Sie den Punkt Tabellen. 4. Drcken Sie ndern. 5. Plazieren Sie den Cursor in das Feld, welches Sie lschen wollen. 6. Drcken Sie die Schaltflche Ausschneiden auf der Drucktastenleiste, oder whlen Sie den Menpfad Bearbeiten: Ausschneiden. 7. Aktivieren Sie die Tabelle. Die Maske Tabelle Anpassen erscheint. Drcken Sie Anpassen, um die Tabelle in der Datenbank zu konvertieren.

Um ein Feld aus einer Tabelle zu lschen, leeren Sie keinesfalls den Feldnamen. Positionieren Sie statt dessen den Cursor auf den Feldnamen und drcken Sie Ausschneiden. Wenn Sie den Namen nur leeren, erhalten Sie in der Statusleiste am unteren Bildschirmrand die Nachricht Initialwert als Feldname nicht erlaubt; Sie knnen nicht weiterarbeiten, bis Sie die Zeile lschen, die Sie geleert haben.

ndern des Datentyps oder der Lnge eines Feldes


Sie knnen sowohl den Datentyp als auch die Lnge eines existierenden Feldes in der Tabelle verndern. Dies wird z.B. notwendig, wenn die Feldlnge erweitert werden mu, um grere Werte aufnehmen zu knnen, oder wenn die Gltigkeit fr die Felder sich ndert und der Datentyp nicht mehr geeignet ist fr die neuen Daten, die eingegeben werden sollen. Vollziehen Sie die untenstehenden Schritte nach: 1. Sie starten wieder in der Maske Dictionary: Einstieg.

2. Geben Sie den Tabellennamen ein. 3. Whlen Sie Tabellen. 4. Drcken Sie auf Anzeigen. 5. Doppelklicken Sie auf das Datenelement, das dem Feld entspricht, welches Sie ndern mchten. Das Datenelement wird angezeigt. 6. Machen Sie nun einen Doppelklick auf den Domnennamen im Datenelement. Die Domne wird jetzt angezeigt. 7. Drcken Sie die Schaltflche Anzeigen<->ndern. Sie knnen jetzt die Attribute der Domne verndern. 8. Leeren Sie das Feld Ausgabelnge. 9. ndern Sie den Datentyp und/oder die Lnge. 10. Drcken Sie Aktivieren. Eine Maske erscheint mit einer Liste aller Tabellen und Strukturen, die diese Domne verwenden und daher betroffen sind. Drcken Sie auf Weiter, um fortzufahren.

nderungen in der Domne wirken sich auf alle Felder aus, welche die Domne verwenden.

Arbeiten mit Daten


Wenn Sie es bisher noch nicht getan haben, legen Sie Ihre Tabelle jetzt an und aktivieren Sie diese, bevor Sie weitermachen. In R/3 gibt es von SAP mitgelieferte Hilfsmittel, Datenbrowser genannt, mit denen Sie Daten innerhalb von Tabellen manipulieren knnen. Obwohl der Name Browser impliziert, da Sie die Daten nur lesen werden, knnen Datenbrowser sowohl zum Lesen als auch zur Aktualisierung verwendet werden. Sie knnen die Datenbrowser-Hilfsmittel verwenden, um Tabellendaten folgendermaen darzustellen oder zu modifizieren:

Zeilen suchen und anzeigen, die spezifizierten Kriterien entsprechen neue Zeilen hinzufgen existierende Zeilen modifizieren Zeilen lschen

Zugriff auf die Datenbrowser-Funktionalitt aus DDIC heraus

Wie schon erwhnt, ist eine Funktion des Datenbrowsers, neue Zeilen in eine Tabelle einzufgen. Ein schneller und einfacher Weg, auf diese Funktionalitt zuzugreifen, ist aus der Maske Dictionary: Tabelle/Struktur (entweder im Anzeige- oder nderungsmodus). Whlen Sie den Menpfad Hilfsmittel->Eintrge erfassen. Dieser Menpfad ist eine Abkrzung - er ruft den Datenbrowser auf, umgeht dabei die Einstiegsmaske und fhrt Sie direkt zu der Maske, von der aus Sie neue Zeilen in eine Tabelle einfgen knnen. Wenn dieser Menpfad nicht mglich ist, haken Sie Tab.pflege Erlaubt an, und reaktivieren Sie Ihre Tabelle. Durch die Wahl dieses Menpfades werden automatisch die folgenden Aufgaben ausgefhrt:

Fr Ihre Tabelle wird speziell ein ABAP/4-Updateprogramm generiert, das einen Datenbrowser aufrufen kann. (Dieses ABAP/4-Programm wird nur beim ersten Mal generiert, wenn Sie auf diesen Menpfad fr eine vorgegebene Tabelle zugreifen. Sie greifen jedesmal darauf zu, wenn eine nderung in der Tabelle vorgenommen wurde.) Der Datenbrowser wird aufgerufen, der seinerseits das neu generierte ABAP/4- Programm aufruft. Eine Maske wird angezeigt, von der aus Sie direkt Zeilen in der Tabelle anlegen knnen.

Starten Sie jetzt das ScreenCam How to Add Data to a Table. Fhren Sie diese Prozedur aus, um Ihrer Tabelle Daten hinzuzufgen. In der nachfolgenden Tabelle finden Sie Hilfe fr einige eventuell auftretende Probleme. 1. Starten Sie in der Maske Dictionary: Einstieg. 2. Geben Sie Ihren Tabellennamen in das Objektnamensfeld ein. 3. Drcken Sie auf Anzeigen. 4. Whlen Sie den Menpfad Hilfsmittel->Eintrge erfassen. Achten Sie auf die Statusleiste, wenn Sie diesen Menpfad whlen; mglicherweise sehen Sie die Nachricht Compiling. Diese Meldung zeigt an, da das System das Update-Programm generiert. Die Maske Tabelle Einfgen wird angezeigt. Auf dieser Maske ist ein Eingabefeld fr jedes Feld in Ihrer Tabelle. Links vom Eingabefeld steht der Feldname. Die Primrschlsselfelder erscheinen zuerst, gefolgt von einer leeren Zeile, und dann die brigen Felder der Tabelle. Um das Programm zu sehen, welches generiert wurde, whlen Sie Hilfsmittel: Eintrge Erfassen und dann den Menpfad System->Status. Der Programmname erscheint im Programmfeld.

Wenn Sie den Cursor auf irgendein Feld bewegen und die (F1)-Taste drcken, erscheint die Maske Hilfe:Tabelle Einfgen. Auf dieser Maske sehen Sie die Dokumentation, die Sie in das Datenelement eingegeben haben. Um zur Maske Tabelle Einfgen zurckzukehren, drcken Sie entweder auf Weiter oder auf Abbrechen. 5. Fllen Sie die Felder mit den Daten, die Sie in Ihre Tabelle einfgen wollen.

6. Drcken Sie Sichern. Sie sehen die Mitteilung Datensatz erfolgreich angelegt in der Statusleiste. 7. Wiederholen Sie die Schritte 5 und 6 fr jede Zeile, welche Sie einfgen mchten. 8. Drcken Sie Zurck, um zur Ausgangsmaske (Punkt 1) zu kommen. 9. Whlen Sie den Menpfad Hilfsmittel->Tabelleninhalt, um die Zeilen anzuzeigen, die Sie gerade angelegt haben. Die Maske Data Browser: Tabelle: Selektionsbild erscheint. 10. Um alle Zeilen der Tabelle anzuzeigen, drcken Sie auf Ausfhren, ohne irgendwelche Suchkriterien einzugeben. Die Maske Data Browser: Tabelle wird geffnet, und die von Ihnen eingegebenen neuen Zeilen werden in einer Liste gezeigt. Problem Ich kann keine Daten hinzufgen. Mgliche Symptome Der Menpunkt Eintrge Erfassen ist ausgegraut, und es passiert nichts, wenn Sie darauf klicken. Lsung Die Checkbox Tab.pflege Erlaubt wurde nicht geprft. Gehen Sie zur Maske Dictionary: Tabelle Suchen (um dorthin zu gelangen, zeigen Sie die Tabelle an, und klicken Sie auf die Schaltflche Anzeigen<->ndern, bis die Felder modifizierbar sind). Machen Sie ein Hkchen in die Tab.pflege Erlaubt-Checkbox, und drcken Sie Aktivieren. Die Tabelle enthlt bereits einen Datensatz mit dem selben Primrschlssel wie derjenige, den Sie sichern wollen. Die Primrschlsselfelder erscheinen zuerst auf dem Bildschirm. Unter dem letzten Feld im Primrschlssel ist ein Leerzeichen. ndern Sie einen Wert in einem der Felder darber, und versuchen Sie erneut, Ihren Datensatz zu sichern.

Wenn Sie auf Sichern drkken, sehen Sie die Nachricht Ein Datensatz mit dem spezifischen Schlssel existiert bereits unten im Fenster.

Allgemeine Datenbrowser-Hilfsmittel
Die Funktionalitt, auf die Sie im vorangegangenen Abschnitt zugegriffen haben, ist nur eine Funktion eines einzelnen Datenbrowsers. Im R/3-System gibt es vier allgemeine Hilfsmittel fr den Datenbrowser: SE16, SE17, SM30 und SM31. In einer gewissen Weise hneln sie sich, und doch bieten sie unterschiedliche Arten von Funktionalitt. SE16 verwenden SE16 ist das am meisten verwendete universelle Hilfsprogramm fr den Datenbrowser. Hiermit knnen Sie Tabellen nach bestimmten Zeilen durchsuchen und diese anzeigen, aktualisieren, lschen, kopieren, neue Zeilen einfgen und vieles mehr. SE16 kann auf zwei Weisen verwendet werden:

Von der Maske Dictionary: Tabelle/Struktur aus, mit dem Menpfad Hilfsmittel ->Tabelleninhalt. Geben Sie /nse16 in das Transaktionsfeld ein.

Starten Sie jetzt das ScreenCam How to Display Table Data Using the Data Browser.

1. Geben Sie /nse16 in das Transaktionsfeld ein. 2. Drcken Sie (Enter); die Maske Data Browser:Einstieg erscheint. 3. Geben Sie Ihren Tabellennamen in das Feld Tabellenname ein. 4. Drcken Sie auf die Schaltflche Tabelleninhalt auf der Drucktastenleiste. Falls die Tabelle mehr als 40 Felder enthlt, sehen Sie eine Auswahlmaske. In diesem Fall machen Sie ein Hkchen neben die Felder, fr die Sie Suchkriterien eingeben wollen, und drcken Sie auf Ausfhren. Die angehakten Felder sehen Sie auf der nchsten Maske. Diese Maske wird einfach Auswahlmaske genannt. Hier knnen Sie Suchkriterien eingeben, um bestimmte Tabellenzeilen zu finden. Um alle Zeilen anzuzeigen, geben Sie einfach kein Suchkriterium ein. Wenn mehr als 500 Zeilen zu Ihren Suchkriterien passen und Sie alle anzeigen wollen, lschen Sie den Wert im Feld Maximale Trefferzahl. 5. Drcken Sie auf Ausfhren. Sie sehen jetzt die Maske Data Browser: Tabelle Selektionsbild. Alle Zeilen, die zu Ihren Suchkriterien passen, werden angezeigt bis zur Maximalanzahl, die im Feld Maximale Trefferzahl spezifiziert wurde. Problem Wenn Sie die Schaltflche Ausfhren drcken, passiert nichts. Lsung

Sie haben absichtlich oder versehentlich in das Feld der Auswahlmaske geschrieben, und dies trifft auf keine Zeile zu. Lschen Sie alle Feldinhalte in der Auswahlmaske und drcken Sie nochmals auf Ausfhren. Die Tabelle enthlt keine Daten. Haben Sie Sichern nach jedem Datensatz gedrckt? Haben Sie Daten in die Tabelle eingegeben? Haben Sie nach jedem Datensatz Sichern gedrckt? Haben Sie jedem Datensatz einen eigenen Primrschlssel zugewiesen? Sie haben absichtlich oder versehentlich etwas in ein Feld der Auswahlmaske getippt, und nicht alle Datenstze passen zu diesem Suchkriterium. Kehren Sie zur Auswahlmaske zurck, lschen Sie alle Eingabefelder, und drcken Sie erneut auf Ausfhren.

In der Ausgabeliste stehen weniger Datenstze als Sie in die Tabelle eingegeben haben.

Der Menpfad Hilfsmittel->Tabelleninhalt generiert genauso ein Programm wie Hilfsmittel>Eintrge Erfassen, und er wird regeneriert, wenn Sie die Tabellenstruktur verndern. Um das Programm anzuzeigen, das er generiert, whlen Sie den Menpfad System->Status von der Auswahlmaske.

Starten Sie jetzt das ScreenCam Data Browser Functionality. Auf der Datenbrowsermaske knnen Sie folgendes machen:

auf - und abrollen nach links und rechts schieben auf eine Zeile doppelklicken, um gleichzeitig mehrere Felder zu sehen eine neue Zeile anlegen mit dem Menpfad Tabelleneintrag->Anlegen mit Vorlage eine existierende Zeile ndern durch Anhaken und den Menpfad Tabelleneintrag->ndern mehrere Zeilen ndern durch Anhaken, Wahl des Menpfads Tabelleneintrag- >ndern und Drcken der Schaltflchen Nchster Eintrag und Vorheriger Eintrag eine existierende Zeile kopieren durch Anhaken und den Menpfad Tabelleneintrag->Anlegen mit Vorlage mehrere Zeilen kopieren durch Anhaken, Menpfad Tabelleneintrag->ndern und Drcken von Vorheriger Eintrag und Nchster Eintrag auf der Drucktastenleiste Lschen einer oder mehrerer Zeilen durch Anhaken, in Menpfad Tabelleneintrag->Anlegen mit Vorlage und Drcken von Lschen fr jede Zeile, die Sie lschen wollen Auswhlen und ausschlieen aller Zeilen durch Drcken der entsprechenden Schaltflchen Drucken der Liste durch Bettigen der Schaltflche Drucken auf der Symbolleiste Sortieren der Liste durch Plazieren Ihres Cursors auf die zu sortierende Spalte und Drcken von Sort.Aufsteigend oder Sort.Absteigend auf der Drucktastenleiste Auffinden einer Zeichenkette durch Drcken von Suchen. Geben Sie die Zeichenkette ein, drcken Sie auf Suchen, und klicken Sie dann auf einen hervorgehobenen Bereich, um die Zeile sichtbar zu machen. Herunterladen der Liste in eine Datei auf Ihrer Festplatte mit Hilfe des Menpfades Bearbeiten>Download. Sie knnen whlen zwischen ASCII, Spreadsheet oder Rich Text Format. Auswhlen der Felder, die Sie sehen mchten, mit dem Menpfad Einstellungen ->Feldauswahl Setzen verschiedener anderer Parameter unter Verwendung des Menpfades Einstellungen>Benutzerparameter. Hier sehen Sie die Ausgabebreite, die maximale Anzahl der Zeilen, die angezeigt werden knnen. Sie knnen Konvertierungsausgnge freigeben oder die aktuelle Anzahl der Zeilen anzeigen, welche die Suchkriterien erfllen. Sie knnen auch die Spaltenberschriften ndern, um die Kennungen von Datenelementen zu benutzen statt der Feldnamen von Tabellen.

SM31 und SM30 einsetzen SM31 und SM30 knnen auch verwendet werden, um Tabellendaten anzuzeigen und zu aktualisieren. SM31 ist eine ltere Version von SM30 und hat weniger Funktionen. Das Eingabefeld auf der ersten Maske von SM30 ist lang genug, um jeden Tabellennamen aufzunehmen; bei SM31 ist es nur 5 Zeichen lang. Bevor Sie eines von beiden benutzen knnen, mu ein spezielles Programm, ein Standard-Pflegedialog, fr die Tabelle generiert werden, die Sie anzeigen mchten. Ein Standard-Pflegedialog ist ein ABAP/4-Programm, welches Sie generieren. Wenn Sie SM31 oder SM30 aufrufen, wird der Datenbrowser automatisch das generierte Programm finden und aufrufen. Es bietet eine komplexere Schnittstelle und mehr Funktionalitt als SE16. Fr weitere Informationen ber Wartungsdialoge und den Vorgang, sie anzulegen, rufen Sie die R/3-Bibliothekshilfe auf.

Um Informationen ber Wartungsdialoge in der R/3 Bibliothek zu erhalten, whlen Sie den Menpfad Hilfe->R/3 Bibliothek. Von dort aus klicken Sie auf die folgenden Komponenten: Basis Komponenten->ABAP/4 Development Workbench->Erweiterte Anwendungsfunktionsbibliothek>Erweiterte Tabellenpflege. Vergleich zwischen SE17 und SE16 SE17 ist SE16 sehr hnlich, da es auch benutzt werden kann, um bestimmte Zeilen innerhalb einer Tabelle aufzufinden. Allerdings kann SE17 nicht fr Aktualisierungen benutzt werden. Mit SE16 knnen Sie komplexe Suchkriterien fr maximal 40 Felder angeben; mit SE17 knnen Sie einfache Suchkriterien fr jede Anzahl Felder bestimmen. SE16 ermglicht zur gleichen Zeit nur die Ausgabe, die von einer einzelnen Spalte sortiert wurde; SE17 wiederumermglicht Ihnen, jegliche Sortierfolge ber mehrere Spalten zu spezifizieren. SE16 kann - im Gegensatz zu SE17 - nicht mit einer Tabelle arbeiten, die einen standardmigen Wartungsdialog hat. Alle Datenbrowser im berblick In speziellen Fllen, in denen Sie nur anzeigen wollen und mehrere bestimmte Suchkriterien bentigen, benutzen Sie SE17. Aber fr die meisten, tagtglichen Belange zum Anzeigen und Aktualisieren bentigen Sie SE16. Wiederum knnen Sie aber SE16 nicht verwenden, wenn die Tabelle einen standardmigen Wartungsdialog hat. In diesem Fall benutzen Sie SM31.

Der einfachste Weg, Ihnen zu erklren, wann Sie SE16 und wann SM31 benutzen sollten: Probieren Sie es einfach aus. Wenn's der eine nicht tut, tut's wahrscheinlich der andere. Und wenn nichts mehr geht: Probieren Sie es mit SM30.

Anzeige von Daten mit Hilfe Ihrer eigenen ABAP/4-Programme


Anstatt einen Datenbrowser zu verwenden, ist es einfacher, ein kleines ABAP/4-Programm zu schreiben, um die Daten Ihrer Tabelle anzuzeigen. Versuchen Sie, eines anzulegen. Konstruieren Sie das Programm so, da es eine passende Meldung schreibt, wenn die Tabelle keine Zeilen enthlt. Ein Lsungsbeispiel sehen Sie in Listing 3.1. Versuchen Sie aber, Ihr eigenes Programm zu schreiben, bevor Sie auf die Lsung schauen. Listing 3.1: Einfaches Programm zum Anzeigen der Daten in der Tabelle ztxlfa1 1 report ztx0301. 2 tables ztxlfa1. 3 select * from ztxlfa1. 4 write: / ztxlfa1-lifnr, 5 ztxlfa1-name1, 6 ztxlfa1-regio, 7 ztxlfa1-land1. 8 endselect. 9 if sy-subrc <> 0. 10 write 'Table is empty.'. 11 endif.

Nutzung der (F1)-Hilfe

Die (F1)-Hilfe ist die Dokumentation, die vom Benutzer fr ein Feld gesehen wird. Um die Hilfe aufzurufen, positioniert der Benutzer seinen Cursor auf das Feld und drckt (F1). Die Dokumentation wird in einer Dialogbox angezeigt. Gehen Sie wie folgt vor, um die (F1)-Hilfe zu modifizieren, die Sie frher fr das Feld lifnr angelegt haben: Starten Sie jetzt das ScreenCam How to Create or Modify F1 Help. Die (F1)-Hilfe einem Feld hinzufgen 1. Starten Sie in der Dictionary: Einstiegsmaske. 2. Lokalisieren Sie das Feld, fr welches Sie die Hilfe hinzufgen mchten, und doppelklicken Sie auf den Namen des entsprechenden Datenelements. 3. Drcken Sie auf Anzeigen<->ndern. Die Maske schaltet um auf den Modus ndern/Anzeigen. 4. Drcken Sie die Schaltflche Dokumentation auf der Drucktastenleiste. Die Dokumentationsmaske erscheint. 5. Geben Sie den Text ein, den der Benutzer spter erhalten soll, wenn er die Hilfe aufruft. Die erste Zeile enthlt den Zeichensatz &DEFINITION&. Dies ist eine berschrift; ndern Sie niemals diese Zeile. Beginnen Sie mit Ihrer Eingabe in Zeile zwei. Drcken Sie jedesmal (Enter), wenn Sie einen neuen Paragraphen anfangen. 6. Sichern Sie Ihre nderungen. Sie erhalten die Nachricht Dokument wurde im aktiven Status gesichert auf der Statusleiste. 7. Drcken Sie auf Zurck auf der Symbolleiste. Sie kommen zur Maske Dictionary: Datenelement ndern. 8. Drcken Sie nochmals auf Zurck, um zum Ausgangspunkt zurckzukehren. (F1)-Hilfe testen 1. Starten Sie mit der Maske Dictionary: Tabelle/Struktur (entweder im Modus ndern oder Anzeigen). 2. Whlen Sie den Menpfad Hilfsmittel->Eintrge Erfassen. 3. Positionieren Sie den Cursor auf das Feld mit dem modifizierten Hilfetext. 4. Drcken Sie (F1). Das System zeigt Ihnen Ihre modifizierte Dokumentation. Hypertexte der (F1)-Hilfe hinzufgen Hypertexte ermglichen Ihnen, in der (F1)-Hilfe auf ein hervorgehobenes Wort oder eine hervorgehobene Phrase zu klicken und hierfr zustzliche Hilfe anzufordern. Um Hypertexte hinzuzufgen, legen Sie zuerst ein Dokument an, fr welches Sie Hypertexte einfgen mchten, und dann fgen Sie einen Verweis auf dieses Dokument in Ihren Hilfetext ein. Dokumentennamen mssen mit einem y oder z beginnen. Sie knnen Hypertexte auch in Ihr neues Dokument aufnehmen und von dort mit einem anderen Dokument verbinden. Starten Sie jetzt das ScreenCam How to Create a Hypertext Link in F1 Help.

1. Starten Sie im R/3-Hauptmen und whlen Sie den Menpfad Werkzeuge ->ABAP Workbench. Die Maske ABAP/4 Development Workbench wird angezeigt. 2. ber den Menpfad Hilfsmittel->Dokumentation kommen Sie zur Maske Dokumentenpflege: Einstieg. 3. Drcken Sie auf den Pfeil nach unten auf dem Feld Dokumentenklasse. Eine Liste von Dokumentenklassen erscheint. 4. Doppelklicken Sie auf Allg.Text. Das Feld Dokumentenklasse enthlt jetzt den Wert Allg.Text. (Das Feld Dokumentationstyp sollte bereits den Wert Original Benutzer enthalten. Falls nicht, klicken Sie auf den Pfeil nach unten am Ende des Feldes und ndern Sie es entsprechend.) 5. Geben Sie in das Feld Allg.Text den Namen des Dokuments ein, welches Sie anlegen mchten. Der Name mu mit y oder z beginnen. Merken Sie sich diesen Namen. 6. Drcken Sie auf Aktivieren. Sie sehen die Maske Allg.Text ndern: Sprache DE. 7. Geben Sie hier Ihre Dokumentation ein. Drcken Sie (Enter) am Ende eines jeden Paragraphen. 8. Drcken Sie Aktivieren. Die Maske Objektkatalogeintrag erscheint. 9. Drcken Sie auf Lokales Objekt. Sie kehren zur Maske Allg.Text ndern: Sprache DE zurck, und die Mitteilung Das Dokument wurde im Status aktiv gesichert erscheint auf der Statusleiste. 10. Drcken Sie Zurck. Sie befinden sich wieder im Bild Dokumentenpflege: Einstieg. 11. Drcken Sie nochmals auf Zurck, um auf die Maske ABAP/4-Development Workbench zu kommen. 12. Gehen Sie ins Data Dictionary und lassen Sie Ihr Datenelement anzeigen. 13. Drcken Sie auf Anzeigen<->ndern, und Ihre Maske wechselt in den Modus ndern. 14. Drcken Sie auf Dokumentation fr die Maske Datenelement ndern: Sprache DE. 15. Gehen Sie mit dem Cursor an die Stelle, an der Sie den Hyperlink einfgen wollen. 16. Whlen Sie den Menpfad Einbinden->Verweis, um zur Maske Link Erstellen zu gelangen. 17. Bettigen Sie den Pfeil nach unten am Ende des Feldes Ausgewhlter Verweis. Die Titelmaske erscheint; beachten Sie, da sie eine Liste von Dokumentenklassen enthlt. 18. Doppelklicken Sie auf Allg.Text. Das Feld Ausgewhlter Verweis enthlt nun den Wert Allg.Text, und ein Feld namens Allg.Text wird oben auf der Maske angezeigt. 19. Tippen Sie in das Feld Allg.Text den Namen der Dokumentation, die Sie in Schritt 6 angelegt haben. 20. Geben Sie den Hyperlink-Text in das Feld Bezeichn. im Dokument ein. Dies ist der Text, der markiert wird und auf den der Benutzer klicken kann, um mehr Hilfe zu erhalten.

21. Drcken Sie Weiter. Sie kommen zur Maske Datenelement ndern: Sprache DE, und ein Link erscheint auf der Cursorposition. 22. Drcken Sie Aktivieren. 23. Sie knnen Ihren neuen Hyperlink sofort ausprobieren mit dem Menpfad Dokument->Bildschirmausgabe. Die Maske Dokumentation Anzeigen wird angezeigt, Sie sehen Ihren Hilfetext, und Ihr Hyperlink sollte markiert sein. 24. Klicken Sie auf den Hyperlink. Auf der Maske Hypertext Anzeigen sollte nun Ihr Dokument erscheinen. 25. Drcken Sie dreimal auf Zurck, um zur Maske Dictionary: Tabelle/Struktur zu kommen. 26. Um Ihren Hyperlink zu testen, rufen Sie Ihre Tabelle auf, und whlen Sie den Menpfad Hilfsmittel>Eintrge erfassen. 27. Positionieren Sie den Cursor in dem Feld, fr welches Sie die (F1)-Hilfe angelegt haben. 28. Drcken Sie (F1) - Ihr Hilfetext mit dem Hyperlink sollte angezeigt werden. 29. Klicken Sie auf den Hyperlink. Jetzt sollten Sie Ihr neues Dokument sehen. Problem Ich kann den Allg.Text nicht in der Liste der Dokumentenklassen finden. Lsung Blttern Sie aufwrts.

Ich sehe die Mitteilung bersetzungsrelevante nderung. Drcken Sie auf die Schaltflche Aktivieren auf der Drucktastenleiste, nicht auf Sichern auf der Symbolleiste. Ich sehe die Nachricht Datenelement wird nicht in einer ABAP/4-Struktur verwendet. Ich drcke die Schaltflche Dokumentation, aber es passiert rein gar nichts. ndern Sie die Dokumentenklasse zu Allg.Text. Heit die Maske Dictionary: Datenelement anzeigen? Wenn ja, sind Sie im Modus Anzeigen, Sie sollten aber in ndern sein. Drcken Sie auf Anzeigen/ndern, und versuchen Sie es nochmals.

Zusammenfassung

Das Data Dictionary ist ein Werkzeug, welches von ABAP/4-Programmen benutzt wird, um Tabellen anzulegen und zu warten. Es gibt drei Arten von Tabellen: transparente, Pool- und Clustertabellen. Transparente Tabellen sind am gebruchlichsten und enthalten Anwendungsdaten. Pool- und Clustertabellen werden von SAP hauptschlich fr Systemdaten verwendet. Um eine Tabelle anzulegen, brauchen Sie erst einmal Domnen und Datenelemente. Domnen stellen die technischen Charakteristika eines Feldes zur Verfgung, Datenelemente die Feldkennungen und die (F1)Hilfe. Beide sind wiederverwendbar.

Dictionary-Objekte mssen aktiv sein, bevor man sie verwendet. Wenn Sie ein Dictionary-Objekt verndern, mssen Sie das Objekt reaktivieren, bevor die nderung wirksam wird. Mit Datenbrowsern knnen Sie Tabellendaten anzeigen und modifizieren. SE16 ist der gebruchlichste Datenbrowser. Die anderen Browser sind SE17, SM30 und SM31, die verschiedene Mglichkeiten bieten. In einem Datenelement knnen Sie (F1)-Hilfe anlegen, indem Sie auf die Schaltflche Dokumentation drcken. Innerhalb dieser (F1)-Hilfe knnen Sie Hypertexte zu anderen (F1)-Hilfedokumenten anlegen.

Fragen & Antworten


Frage: Was passiert, wenn ich die Lnge eines Feldes kleiner mache, indem ich die Domne ndere, dieses Feld aber von einer Tabelle benutzt wird, die schon Daten enthlt, welche die gesamte Feldlnge ausfllen? Antwort: Wenn Sie die Domne aktivieren, wird das System versuchen, die Tabellen zu aktivieren, die domnenabhngig sind. Die Aktivierung der Tabellen, die Daten verlieren wrden, wird nicht funktionieren, und Sie erhalten eine Liste mit diesen Tabellen. Wenn Sie diese Tabellen dann ffnen, wird das System automatisch die enthaltenen Daten konvertieren und die Daten in der Spalte, die sich auf die Domne bezieht, krzen. Frage: Wie findet man heraus, welche Tabellen betroffen sein werden, bevor man die Domne verndert? Antwort: Machen Sie einen Verwendungsnachweis in der Domne. Dafr lassen Sie die Domne anzeigen, drcken die Schaltflche Verwendungsnachweis, whlen Andere Objekte und drcken auf Weiter. Eine Baumstruktur wird angezeigt. Doppelklicken Sie auf die Zeile namens Tabelle. Die Liste mit den Tabellennamen erscheint. Doppelklicken Sie auf irgendeine Zeile, um die Tabelle anzuzeigen. Frage: Ist es mglich, ein Tabellenfeld anzulegen, ohne ein Datenelement oder eine Domne zu benutzen? Es scheint ziemlich aufwendig zu sein, diese fr jedes Feld anlegen zu mssen. Antwort: Ja, das ist mglich. Zeigen Sie die Tabelle im Modus ndern an, und whlen Sie den Menpfad Bearbeiten>Direkte Typeingabe. Dann knnen Sie die Feldlnge und den Datentyp direkt eingeben. Diese Methode ist nicht empfehlenswert fr Felder, die auf der Maske zu sehen sind; sie ist nur geeignet fr Felder, die niemals zu sehen sein werden und die niemals Fremdschlssel-Beziehungen zu anderen Tabellen haben werden (der Ausdruck foreign key wird im nchsten Kapitel erklrt). SAP verwendet diese Methode, um Tabellen anzulegen, die Systeminformationen enthalten wie z.B. Datenbank Cursor IDs. Sie knnten so in einer Tabelle verfahren, die seltene Daten im Transit in ein oder aus einem R/3-System beinhaltet. Es gibt zwei Nachteile bei dieser Methode. Der eine: Es werden keine Datenelemente benutzt, also existieren auch keine Feldkennungen und keine (F1)-Hilfe. Der zweite: Es werden keine Domnen verwendet, also knnen auch keine Fremdschlssel angelegt werden.

Workshop
Durch die nachfolgenden bungen erhalten Sie Praxis darin, Objekte im Data Dictionary anzulegen und diese in einfachen Programmen mit den Anweisungen tables, select und write zu verwenden. Die Lsungen

finden Sie im Anhang.

Kontrollfragen
1. Was ist der Zweck einer Domne? 2. Was enthlt das Datenelement? 3. Worauf bezieht sich der Terminus Anwendungsdaten ? 4. Ist der Dezimalpunkt fr Felder vom Typ DEC mit dem Wert im Feld gespeichert? 5. Was sind die Transaktionscodes der vier Datenbrowser? Welcher ist der gebruchlichste, und welcher kann nicht dazu benutzt werden, Daten zu aktualisieren ? 6. Was ist der Unterschied zwischen einer transparenten Tabelle und einer Pool- oder Clustertabelle?

bung 1
Fgen Sie die in Tabelle 3.4 gezeigten Felder Ihrer Tabelle ***lfa1 hinzu. Keines dieser Felder hat ein x in der Schlsselspalte, weil sie nicht Teil des Primrschlssels sind. Der Zweck dieser Felder ist es, einen zweiten Namen fr den Kreditor zu enthalten, Tag und Uhrzeit, wann diese Zeile angelegt wurde, und die ID des Benutzers, der diesen Datensatz angelegt hat. Legen Sie ein neues Datenelement fr alle Felder an. Verwenden Sie die Domne vom Feld name1 auch fr das Feld name2. Fr die brigen Felder benutzen Sie die existierenden R/3-Domnennamen, die Sie weiter unten sehen. Dokumentieren Sie diese Felder mit der Schaltflche Dokumentation im Datenelement. Nachdem Sie Ihre nderungen aktiviert haben, verwenden Sie einen Datenbrowser, um die existierenden Zeilen in Ihrer Tabelle zu aktualisieren und Daten in die neuen Felder einzugeben. Whrend Sie die Zeilen aktualisieren, testen Sie Ihre (F1)-Hilfe.

Tabelle 3.4: Neue Felder und ihre Charakteristika fr Tabelle ztxlfa1 Feldname DE Name name2 erdat ertim ername ***name2 ***erdat ***ertim DM Name ***name datum time

***ername usnam

bung 2
Legen Sie eine transparente Tabelle ***kna1 an, die Kundenstammdaten enthalten soll, wie in Tabelle 3.5 gezeigt. Verwenden Sie einen Datenbrowser, um der Tabelle Daten hinzuzufgen. Legen Sie ein neues Programm ***e0302 an, welches die Daten dieser Tabelle liest und in die Liste schreibt.

Tabelle 3.5: Felder und ihre Merkmale fr Tabelle ***kna1 Beschreibung Feldname Mandant mandt Kundennummer kunnr Kundenname name1 Stadt cityc Region regio Land land1 ***land1 ***land1 CHAR 3 ***regio ***regio CHAR 3 ***cityc ***cityc CHAR 4 ***kname1 ***name CHAR 35 x ***kunnr ***kunnr CHAR 10 x mandt PK DE Name DM Name Typ Lnge

Ein Imprint des Markt&Technik Buch- und Software-Verlag GmbH. Elektronische Fassung des Titels: ABAP/4 in 21 Tagen, ISBN: 3-8272-2016-X

Woche 1

Tag 4 Das Data Dictionary , Teil 2


Kapitelziele
Nachdem Sie dieses Kapitel durchgearbeitet haben, knnen Sie:

einen Fremdschlssel einrichten die Wertetabelle einer Domne benutzen eine Texttabelle anlegen und benutzen den Unterschied beschreiben zwischen einer Struktur und einer Tabelle und Strukturen im R/3Data Dictionary einrichten Tabellen und Strukturen anlegen, die Whrungs- und Mengenfelder enthalten Strukturen innerhalb anderer Strukturen oder Tabellen verschachteln

Fremdschlssel
Ein Fremdschlssel ist ein Feld in einer Tabelle, das ber eine Fremdschlsselbeziehung mit einer anderen Tabelle verbunden ist. Der Zweck dieser Fremdschlsselbeziehung ist es, Daten gegen eine zulssige Wertmenge in einer anderen Tabelle zu berprfen. Die Tabelle, die den Fremdschlssel enthlt, heit Fremdschlsseltabelle. Die Tabelle, welche die zulssige Wertmenge beinhaltet, wird Prftabelle genannt (s. Abb. 4.1). Das Feld, das berprft und ber das die Fremdschlsselbeziehung eingerichtet wird, ist dann der Fremdschlssel.

Abbildung 4.1: Die Fremdschlsseltabelle und die Prftabelle Zum Beispiel enthlt die ***lfa1-Tabelle Landeskennzahlen im Feld land1. Sie knnen eine zweite Tabelle (zum Beispiel ***t005) einrichten und diese mit einer Auflistung der zulssigen Landeskennzahlen fllen. Wenn Sie dann einen Fremdschlssel einrichten (wie in Abb. 4.1 gezeigt), wird der eingegebene Wert automatisch gegen die zulssigen Werte in der Prftabelle berprft. Mit diesem Fremdschlssel kann der Anwender keine ungltigen Landeskennzahlen in die Tabelle ***lfa1 einfgen. Der Fremdschlssel bekommt seinen Namen von der Tatsache, da er immer gegen das Feld des Primrschlsssels einer anderen Tabelle berprft werden mu.

Auslsung der Fremdschlsselberprfung


Die Fremdschlsselberprfung wird von der R/3-Benutzerschnittstelle ausgefhrt. Wenn Sie einen Wert in ein Feld eingeben und die Entertaste drcken, formuliert dieses im Hintergrund eine selectAnweisung und bermittelt selbige an die Datenbank, um das Fremdschlsselfeld zu berprfen. Wenn kein Eintrag in der Prftabelle gefunden wird, bekommt der Anwender eine Standardmeldung angezeigt, da der eingebene Wert ungltig ist. Existiert der eingegebene Wert in der Prftabelle, werden die Feldinhalte an das der Eingabemaske zugrunde liegende ABAP/4-Programm bergeben. Der Fremdschlssel wird also schon berprft, bevor das Programm die Werte aufnimmt. Zustzlich zur Entertaste wird die berprfung des Fremdschlssels auch vorgenommen, wenn eine Funktionstaste, eine Drucktaste oder ein Menpunkt angesprochen werden. Die berprfung des Fremdschlssels wird nur durch die Benutzerschnittstelle vorgenommen. Fremdschlssel existieren nicht in der Datenbank und werden somit bei Datenbankupdates nicht berprft. Ein falsch programmiertes ABAP/4-Programm kann deswegen die Konsistenz verletzen; es kann ungltige Werte in Datenbanktabellen einfgen. Aus diesem Grund benutzen ABAP/4-

Programme, welche die Datenbank mit von auen kommenden Daten aktualisieren sollen, in der Regel die Anwenderschnittstelle, um die Daten zu berprfen.

Fr weitere Informationen ber die Verwendung der Benutzerschnittstelle zur Datenberprfung schlagen Sie in der R/3-Bibliothekshilfe unter BDC (Batch Data Communication) Programmen nach. Um sich diese Dokumentation anzusehen, whlen Sie (egal aus welcher Maske) den Menpfad Hilfe->R/3-Bibliothek. Sie erhalten das Hauptmen der R/3-Bibliothek. Klicken Sie jetzt auf folgende Tabs: Basis->ABAP/4Workbench->Basisprogrammierschnittstellen->Daten mit Batch-Input bernehmen.

Technische Voraussetzungen zum Anlegen eines Fremdschlssels


Um einen Fremdschlssel einzurichten:

mu die berprfung gegen ein Feld innerhalb des Primrschlssels der Prftabelle vorgenommen werden mssen die Domnen des Fremdschlsselfelds und des Prftabellenfelds bereinstimmen

Die zweite Voraussetzung stellt sicher, da die Felder, die hierbei verglichen werden, jeweils vom gleichen Typ sind und die gleiche Lnge haben (s. Abb. 4.2).

In Abbildung 4.2 verwenden beide Felder dieselben Datenelemente und dieselbe Domne. Beachten Sie, da die Verwendung derselben Datenelemente nicht verlangt wird, lediglich die Domne mu dieselbe sein. Weil sich diese Felder eine allgemeine Domne teilen, ist die Vergleichsintegritt zwischen diesen beiden Feldern garantiert, da ihre Datentypen und Lngen immer zusammenpassen werden.

Abbildung 4.2: Dies ist ein Diagramm des Fremdschlsselfeldes, des Prftabellenfeldes und der allgemeinen Domne, die sie sich teilen.

Anlegen des Fremdschssels


Nun ist es an der Zeit, einen einfachen Fremdschlssel anzulegen. Dieses Beispiel soll Sie mit der dafr vorgesehenen Oberflche vertraut machen. Alle Felder dieser Masken werden spter ausfhrlich in diesem Kapitel erlutert. Im folgenden wird aufgezeigt, wie die Prftabelle ztxt005 eingerichtet und anschlieend der Fremdschlssel ber das Feld ztxlfa1-land1 angelegt wird. Nachdem Sie sich dieses Verfahren angeschaut haben, werden Sie aufgefordert, Ihre eigene ***t005-Tabelle und die dazugehrige Fremdschlsselbeziehung von ***lfa1-land1 zu erstellen. Bevor Sie einen Fremdschlssel einrichten, mu zuerst eine Prftabelle vorhanden sein. Obwohl schon eine Lndertabelle in R/3 vorhanden ist, werden Sie als praktische bung Ihre eigene erstellen. Die Prftabelle wird ***t005 genannt. Die in ihr enthaltenen Felder und Datenelemente sind in der Tabelle 4.1 aufgefhrt. (Ein X in der PK-Spalte zeigt die Felder auf, die den Primrschlssel bilden.)

Tabelle 4.1: Die Felder der Tabelle ***t005 und ihre Eigenschaften Feldname PK DE-Name

mandt land1

x x

mandt ***land1

Verfahren zum Anlegen einer Prftabelle Im folgenden wird das Einrichten der Prftabelle ***t005 aufgezeigt. Falls Sie Probleme dabei haben, benutzen Sie den Strungssucher fr das Anlegen von transparenten Tabellen (vorhandene Domnen und Datenelemente) im Kapitel von Tag 3. Starten Sie jetzt das ScreenCam How to Create Check Table ***t005. Um Ihre Prftabelle einzurichten: 1. Gehen Sie in die Einstiegsmaske des Data Dictionary. 2. Geben Sie den Tabellennamen im Feld Objektname ein. 3. Markieren Sie die Auswahl fr Tabellen. 4. Drcken Sie auf die Schaltflche Anlegen. 5. Geben Sie eine Kurzbeschreibung ein. Als Auslieferungsklasse wird A festgelegt. Kreuzen Sie Tabellenpflege erlaubt an. 6. Tippen Sie die Feld- und die Datenelementnamen ein. 7. Kreuzen Sie bei beiden Feldern das Feld fr den Primrschlssel an. 8. Drcken Sie die Sichern-Taste auf der Symbolleiste. Die Maske Objektkatalogeintrag erscheint. 9. Drcken Sie die Schaltflche Lokales Objekt. Danach wird zum Dictionary zurckgesprungen: Tabelle/Struktur: Felder ndern. 10. Drcken Sie auf die Schaltflche Technische Einstellungen auf der Drucktastenleiste. Das ABAP/4Dictionary: das nderungsbild Technische Einstellungen pflegen wird angezeigt. 11. Geben Sie APPL0 im Feld Datenart ein (APPL0 mit einer Null, nicht APPLO mit dem Buchstaben O). 12. Geben Sie 0 (Null) im Feld Grenkategorie ein. 13. Drcken Sie die Sichern-Taste. 14. Drcken Sie die Zurck-Taste. Danach wird ins Dictionary zurckgesprungen: Tabelle/Struktur:

nderungsbild. 15. Aktivieren Sie die Tabelle durch Drcken der entsprechenden Schaltflche. Nach der Meldung Tabelle wurde aktiviert ndert sich der Status auf aktiv. Whlen Sie danach den Menpfad Hilfsmittel->Eintrge erfassen aus, um Daten in Ihre neu eingerichtete Prftabelle einzugeben. Geben Sie ins Feld land1 die Werte US, CA, DE, IT, JP und AU ein. Verfahren zum Anlegen des Fremdschlssels Starten Sie nun das ScreenCam How to Create a Foreign Key. Um einen Fremdschlssel einzurichten: 1. Gehen Sie ins Data Dictionary: Einstiegsbild. 2. Tippen Sie den Namen der Tabelle ein, die den Fremdschlssel enthalten soll (***lfa1). 3. Markieren Sie die Auswahl Tabelle. 4. Drcken Sie nun auf die Schaltflche ndern. Dictionary: Tabelle/Struktur: Felder ndern wird angezeigt. 5. Positionieren Sie den Cursor auf das Feld, das als Fremdschlssel vorgesehen ist (land1). 6. Drcken Sie auf die Schaltflche Fremdschlssel (oder benutzen Sie den Menpfad Springen>Fremdschlssel). Danach befinden Sie sich in der nderungsmaske fr Fremdschlssel (s. Abb. 4.3). 7. Tippen Sie nun den Namen des Fremdschlssels in die Kurzbeschreibung ein, zum Beispiel Gltige Landeskennzahlen. 8. Geben Sie dann den Namen der Prftabelle (***t005) im entsprechenden Feld ein, oder klicken Sie auf den Pfeil nach unten und whlen die Tabelle in der Eingabehilfe aus. 9. Das Fremdschlssel-Popup erscheint mit der Meldung, da die Prftabelle eingerichtet oder gendert wurde. Besttigen Sie den Systemvorschlag mit Ja. 10. Nach dem Rcksprung zum nderungsbild, werden die Felder der Prftabelle inklusive der Fremdschlsselfelder angezeigt. (Die Felder der Prftabelle sind ***t005-mandt und ***t005land1. Die Fremdschlsselfelder sind ***lfa1-mandt und ***lfa1-land1). 11. Drcken Sie auf bernehmen. Danach springen Sie automatisch zum Dictionary zurck: Tabelle/Strukturen: Im nderungsbild erscheint die Meldung, da der Fremdschlssel bertragen wurde. Die Statusfelder stehen auf berarbeitet und nicht gesichert.

12. Drcken Sie auf die Schaltflche Aktivieren auf der Drucktastenleiste. Die Meldung wurde aktiviert erscheint in der Statusleiste. Der Status steht jetzt auf aktiv und gesichert. Sie haben eine Fremdschlsselbeziehung zwischen den Tabellen ***lfa1 und ***t005 eingerichtet. Das Feld ***lfa1-land1 ist der Fremdschlssel und ***t005 ist die Prftabelle. Die Benutzerschnittstelle berprft den Inhalt des Felds ***lfa1- land1 gegen die Werte des Felds land1 in der Tabelle ***t005.

Abbildung 4.3: Die Maske Fremdschlssel Anlegen zeigt die Prftabellenfelder und die zugehrigen Fremdschlsselfelder. Prfen der Fremdschsselbeziehung Das folgende Verfahren wird im nchsten Abschnitt ausfhrlich beschrieben. Um Ihren Fremdschlssel zu prfen, 1. gehen Sie ins Einstiegsbild des Dictionary: Tabelle/Struktur (Anzeige- oder nderungsbild) 2. whlen Sie den Menpunkt Hilfsmittel->Eintrge erfassen

3. geben Sie die Bezeichnung des Fremdschlssels ein (Gltige Landeskennzahlen) 4. drcken Sie die Entertaste. Wenn der Wert nicht in der Tabelle gefunden wird, existiert der Eintrag nicht, und die Meldung bitte Eingabe berprfen erscheint.

Das Prftabellenfeld
Nachdem Sie den Fremdschlssel eingerichtet haben, erscheint der Name der Prftabelle in der entsprechenden Spalte im Dictionary. Schauen Sie sich jetzt Ihre Tabelle an. Sie sehen den Namen Ihrer Prftabelle in der dafr vorgesehenen Spalte.

Automatische Festlegung von Fremdschlsseln


Als Sie den Fremdschlssel eingerichtet haben, muten Sie Felder, die an der Fremdschlsselbeziehung teilnehmen, nicht spezifizieren. Diese wurden durch das System automatisch ausgewhlt. Dieser Abschnitt erklrt, wie das System diese Feldnamen bestimmt. Beim Anlegen eines Fremdschlssels haben Sie Ihren Cursor auf dem Fremdschlsselfeld positioniert und die dazugehrige Schaltflche gedrckt. Danach hat Ihnen das System Feldpaare vorgeschlagen, fr die Sie eine Fremdschlsselbeziehung aufbauen knnen. In jedem Paar steht jeweils ein Feld aus der Fremdschlsseltabelle und ein Feld aus der Prftabelle. Die Anzahl der Paare ist gleich der Anzahl der Primrschlsselfelder in der Prftabelle. Alle Primrschlsselfelder der Prftabelle mssen in die Fremdschlsselbeziehung eingebunden werden. Das System sucht nach Primrschlsselfeldern, welche die gleiche Domne haben wie die Fremdschlsselfelder und stellt daraus mgliche Paare zusammen. Wenn es mehrere Primrschlsselfelder in der Prftabelle gibt, wird versucht einen Eintrag fr jedes der brigen Felder zu finden. Das System versucht fr jedes Feld der Fremdschlsseltabelle ein Feld in der Prftabelle zu finden, das die gleiche Domne besitzt. Falls dies nicht gelingt, wird versucht, ein Feld zu finden, das den gleichen Datentyp und die gleiche Lnge hat. Wenn das System mehr als ein darin bereinstimmendes Feld findet, wird ein beliebiges Feld ausgewhlt und die Warnung ausgegeben, da die Zuweisung nicht eindeutig ist. Dieser Proze wird so oft wiederholt, bis alle Primrschlsselfelder der Prftabelle den korrespondierenden Feldern in der Fremdschlsseltabelle zugewiesen sind.

Zuordnung des Fremdschlssels zur Eingabehilfe bzw. F4-Hilfe


Zustzlich zur (F1)-Hilfe knnen Sie dem Anwender auch die sogenannte (F4)-Hilfe zur Verfgung stellen. Die (F4)-Hilfe ist eine Auflistung der zulssigen Werte, die der Anwender in ein Feld eingeben kann. Um die (F4)-Hilfe zu erhalten, positioniert der Anwender den Cursor in ein Eingabefeld und drckt die (F4)-Taste oder klickt den nach unten zeigenden Pfeil an. (F4)-Hilfe wird auch als

Eingabehilfe bezeichnet. Beide Bezeichnungen werden synonym von SAP benutzt. Fr einen angelegten Fremdschlssel wird die (F4)-Hilfe automatisch untersttzt. Starten Sie nun das ScreenCam Using a Foreign Key to Provide F4 Help. Wenn Sie den Cursor in ein Fremdschlsselfeld der Eingabemaske stellen, wird am rechten Rand des Eingabefeldes ein nach unten zeigender Pfeil erscheinen. Dies ist das Zeichen der (F4)-Hilfe. Wenn Sie nun auf den Pfeil nach unten klicken oder die (F4)-Taste drcken, wird eine Auflistung der mglichen bzw. zulssigen Eingaben angezeigt. Diese Auflistung zeigt den Inhalt der Prftabelle, wobei alle Schlsselfelder der Prftabelle mit Ausnahme des Felds mandt angezeigt werden. Wenden Sie folgendes Verfahren an, um die auf ***lfa1-land1 eingerichtete Fremdschlsselbeziehung zu testen. Wenn Ihr Fremdschlssel nicht funktioniert, vergleichen Sie Ihre Tabelle mit ztxlfa1, um den Fehler zu beheben. 1. Starten Sie von einer beliebigen Maske aus. 2. Geben Sie /nse16 im Befehlsfeld ein. 3. Drcken Sie die Entertaste. Der Data-Browser: Die Einstiegsmaske wird angezeigt. 4. Tippen Sie ***lfa1 als Tabellennamen ein. 5. Drcken Sie auf die Schaltflche Eintrge erfassen auf der Drucktastenleiste (oder whlen Sie den Menpfad Tabelle->Springen->Eintrge erfassen). Die Maske Tabelle einfgen wird angezeigt. 6. Tippen Sie irgendeinen Wert im Feld Kreditorennummern ein, zum Beispiel MY- V1. 7. Positionieren Sie den Cursor auf dem Feld Landeskennzahlen (land1). Obwohl ein Pfeil nach unten am Ende des Felds erscheint, klicken Sie ihn noch nicht an. 8. Geben Sie den Wert XX im Feld Landeskennzahlen ein. 9. Drcken Sie die Sichern-Taste auf der Symbolleiste. Es erscheint die Meldung Eintrag XX nicht vorhanden (Bitte Eingabe berprfen). Ihr Cursor ist am Anfang des Felds positioniert, das den falschen Wert enthlt. Der Pfeil nach unten erscheint am Ende des Felds. 10. Klicken Sie auf den Pfeil nach unten, oder drcken Sie die (F4)-Taste. Es erscheint ein Popup, das die Schlsselfelder der Prftabelle ***t005 enthlt. 11. Doppelklicken Sie auf den Eintrag US. Das Popup verschwindet, und der Wert US wird in das Feld Lnderkennzahlen gestellt. 12. Drcken Sie abschlieend auf die Sichern-Taste auf der Symbolleiste. Die Meldung Datensatz

erfolgreich weggeschrieben erscheint auf der Statusleiste. Die Fremdschlsselbeziehung ermglicht dem Anwender, Bildschirmeingaben auf ihre Gltigkeit hin zu berprfen. Ist ein Feld ein Fremdschlsselfeld, wird der Wert gegen die Prftabelle geprft. Wenn der Wert nicht in der Prftabelle existiert, wird eine Standardfehlermeldung ausgegeben.

Fremdschlssel und Batch-Programme


Batch-Programme, die sequentielle Dateien oder andere Datenquellen einlesen und direkt die Datenbank aktualisieren, mssen die Daten im Gegensatz zur Bildschirmeingabe selbst berprfen. Diese Programme sollten in einer der folgenden drei Weisen programmiert werden:

Die Daten sollten ber die Benutzerschnittstelle durch Aufruf der Transaktion, welche die Eingabemaske enthlt, bergeben werden. Dies geschieht komplett im Hintergrund. Die Daten werden automatisch den Eingabefeldern zugewiesen, fr die dann die berprfung des Fremdschlssels vorgenommen wird. Dieses Verfahren wird BDC (Batch Data Communications) genannt und wurde schon im Abschnitt Exkurs in den Fremdschlssel erwhnt. BDC ist das Standardverfahren, um Daten in das R/3-System zu importieren. Sie knnen selbst select-Anweisungen enthalten, welche die Fremdschlsselprfungen ausfhren. Dieses Verfahren ist weniger zuverlssig, weil die Programme aktualisiert werden mssen, wenn neue Fremdschlssel hinzugefgt oder existierende verndert worden sind. Die Daten knnen ber besondere Funktionsmodule bergeben werden, die sowohl die Fremdschlsselprfung als auch das Datenbankupdate ausfhren. Diese Module (genannt BAPIs, oder Business APIs) werden von SAP angelegt und im R3-System zur Verfgung gestellt.

Zusammengesetzter Fremdschlssel
Ein zusammengesetzter Fremdschlssel besteht aus zwei oder mehreren Feldern. Eine berprfung wird vorgenommen, in dem zum Beispiel zwei Felder der Fremdschlsseltabelle mit zwei Feldern der Prftabelle verglichen werden. Die Kombination der Werte mu in der Prftabelle existieren, bevor sie in die Fremdschlsseltabelle eingefgt werden kann. Allerdings reicht ein Eingabefeld aus, die Prfung des zusammengesetzten Fremdschlssels auszulsen. Wenn Sie einen zusammengesetzten Fremdschlssel einrichten, heit das Feld, auf dem Sie den eigentlichen Fremdschlssel definieren, Prffeld. Nur ein beschriebener Wert (ungleich Space) im Prffeld lst die berprfung gegen die Prftabelle aus. Ein Wert innerhalb eines anderen Felds des zusammengesetzten Fremdschlssels fhrt nicht zur berprfung. Das Feld regio in der Tabelle ztxlfa1 z.B. sollte nur gltige Lnder und Regionskennzahlen enthalten. Die Kombination von land1 und regio mu also zulssig sein. Deswegen mu diese Kombination in der Prftabelle (ztxt005s) vorhanden sein. Nachdem diese Prftabelle angelegt ist, wird ein zusammengesetzter Fremdschlssel in ztxlfa1 bentigt, um die Zulssigkeit der Kombination von regio und land1 festzulegen. Zustzlich soll ztxt005s-land1 noch gegen ztxt005-land1 geprft werden (s. Abb. 4.4).

Abbildung 4.4: Ein zusammengesetzter Fremdschlssel besttigt die Kombination von Region und Land gegen die Prftabelle. Ein zusammengesetzter Fremdschlssel wird im Prinzip genauso angelegt wie ein Fremdschlssel, der ein einzelnes Feld enthlt. Sie fangen an, indem Sie den Cursor auf ein Feld, in diesem Fall ztxlfa1regio, positionieren und dann auf die Schaltflche Fremdschlssel drcken. Weil der Cursor auf regio steht, wird dieses Feld das Prffeld des zusammengesetzten Fremdschlssels. Obwohl der Fremdschlssel aus mehreren Feldern besteht, wird nur dieses Feld die berprfung gegen die Datenbank anstoen. Wenn das Feld beschrieben ist und der Anwender die Entertaste drckt, wird eine berprfung gegen die Prftabelle vorgenommen, die alle Felder des Fremdschlssels vergleicht. Wenn das berprfungsfeld leer ist, findet keine berprfung statt, auch wenn die anderen Felder Werte enthalten.

Was den einfachen Fremdschlssel betrifft, so mssen die Domnennamen des Prffeldes und die zugehrigen Felder in der Prftabelle bereinstimmen. Wenn jedoch der Fremdschlssel angelegt wurde, mssen die restlichen Domnennamen in dem zusammengesetzten Fremdschlssel nicht passen; der Fremdschlssel kann angelegt werden, wenn ihre Datentypen und Lngen bereinstimmen. Wird zu einem spteren Zeitpunkt der Datentyp oder die Lnge in einer dieser Domnen gendert, passen die Felder nicht mehr zusammen, somit wird das Ergebnis der Fremdschlsselprfung unvorhersehbar. Aus diesem Grund ist es uerst ratsam, da alle Domnennamen eines zusammengesetzten Fremdschlssels bereinstimmen, obwohl R/3 dies nicht ausdrcklich verlangt. Als Faustregel gilt: Wenn ein Datentyp oder die Lnge eines Feldes, auer derjenigen

des Prffeldes, in einem zusammengesetzten Fremdschlssel gendert werden, mssen Sie checken, ob der Fremdschlssel und die Prftabellenfelder die gleiche Domne benutzen. Wenn dies nicht der Fall ist, mssen sie auf den gleichen Stand gebracht werden, da es sonst zu unvorhergesehenen Ttigkeiten des Fremdschlssels kommen kann. Wenn Sie eine Fremdschlsselbeziehung zu einer Prftabelle einrichten, die mehr als ein Feld im Primrschlssel enthlt, mssen alle Primrschlsselfelder der Prftabelle in den Fremdschlssel einbezogen werden. Diese Felder mssen nicht alle berprft werden (siehe Abschnitt generische Fremdschlssel). Trotzdem mssen sie alle im Fremdschlssel vorhanden sein. Da die meisten Prftabellen das Feld mandt enthalten, ist dieses in fast allen Fllen Teil des Fremdschlssels (s. Abb.4.5 und 4.6). Mit der Aufnahme dieses Felds in die Prftabelle knnen unabhngige Wertemengen fr jeden Anmeldemandanten definiert werden. Diese Mglichkeit ist oft erwnscht, um Daten zwischen den einzelnen Mandanten zu unterscheiden bzw. sicherzustellen, da sie vllig unabhngig voneinander sind. Die (F4)-Hilfe ist nur fr das Prffeld eines zusammengesetzten Fremdschlssels verfgbar. Beim Aufruf der (F4)-Hilfe werden alle Primrschlsselfelder der Prftabelle angezeigt. Die Spalte, die das Prffeld enthlt, wird in der Liste hervorgehoben. Die Spaltenbreiten und Titel werden aus den Beschreibungen der Datenelemente ermittelt.

Abbildung 4.5: Ein zusammengesetzter Fremschlssel bezieht das mandt-Feld mit ein.

Abbildung 4.6: Die Definition des Fremdschlssels aus Abb. 4.5

Kardinalitt
Die Kardinalitt der Fremdschlsselbeziehung beschreibt, wie viele Eintrge in der Fremdschlsseltabelle fr jeden Wert der Prftabelle vorhanden sein drfen. Sie wird im nderungsbild fr Fremdschlssel angegeben (Abb. 4.3). Die Kardinalitt wird mit X:Y bezeichnet, wobei sich X auf die Prftabelle und Y auf die Fremdschlsseltabelle bezieht. X kann dabei die Werte 1 oder C annehmen, Y die Werte 1 , C, N oder CN. Die Werte fr X bedeuten:

1: Wenn das Anwendungsprogramm eine Zeile aus der Prftabelle lscht, wird es auch die entsprechenden Zeilen in der Fremdschlsseltabelle lschen. Wenn zum Beispiel das Programm den Wert US aus der Prftabelle lscht, werden alle Zeilen aus der Fremdschlsseltabelle gelscht, in denen das Feld land1 = US enthlt. Fr jeden unterschiedlichen Wert in der Fremdschlsseltabelle, gibt es genau einen Wert in der Prftabelle. C: Das Lschen von Eintrgen in der Prftabelle ist erlaubt, ohne da die entsprechenden Zeilen aus der Fremdschlsseltabelle gelscht werden. Das heit, es knnen Werte in der Fremdschlsseltabelle vorhanden sein, ohne da die entsprechenden Werte in der Prftabelle existieren.

Die Werte fr Y bedeuten:

1: Es gibt genau eine Zeile in der Fremdschlsseltabelle fr jede Zeile in der Prftabelle. C: Es gibt maximal eine Zeile in der Fremdschlsseltabelle fr jede Zeile in der Prftabelle. N: Es gibt mindestens eine Zeile in der Fremdschlsseltabelle fr jede Zeile in der Prftabelle. CN: Es knnen eine, keine oder mehrere Zeilen in der Fremdschlsseltabelle fr jede Zeile in der Prftabelle vorhanden sein.

Die Angabe der Kardinalitt wird vom R/3-System nicht erzwungen. Die Festlegung ist optional. Die Kardinalitt wird auch vom System nicht berprft, wenn es darum geht, Datenbankupdates durch ein ABAP/4-Programm vorzunehmen. Die Kardinalitt wird vor allem beim Einrichten von zusammengesetzten Objekten im DDIC benutzt. Ein zusammengesetztes Objekt ist ein DDIC-Objekt, das aus mehr als einer Tabelle besteht. Ein Beispiel fr ein solches Objekt ist ein View. Wenn Sie einen Fremdschlssel einrichten, sollten Sie die Kardinalitt angeben, da Sie sonst die Tabelle nicht in ein zusammengesetztes Objekt aufnehmen knnen.

Der Typ des Fremdschlsselfelds


Der Typ des Fremdschlsselfelds wird auf der gleichen Maske wie die Kardinalitt angegeben (auf Abb. 4.3 beziehen). Er kann folgende Werte einnehmen:

Schlsselfelder/-kandidaten keine Schlsselfelder/-kandidaten Schlsselfelder einer Texttabelle

Schlsselfelder Fr den Fall, da das Fremdschlsselfeld ein Primrschlsselfeld der Fremdschlsseltabelle ist, mssen an dieser Stelle Schlsselfelder/-kandidaten ausgewhlt werden. Ist dies nicht der Fall, werden keine Schlsselfelder/-kandidaten ausgewhlt. Nehmen wir zum Beispiel an, da die Tabelle t1 aus den Feldern f1 bis f10 und den Primrschlsselfelder f1, f2 und f3 besteht. Wenn Sie einen Fremdschlssel auf Feld f3 definieren wollen, mten Sie Schlsselfelder/-kandidaten anklicken, da f3 Teil des Primrschlssels ist. Wenn der Fremdschlssel auf Feld f5 definiert werden soll, mten Sie dagegen Keine Schlsselfelder/-kandidaten angeben, weil f5 kein Primrschlsselfeld ist. Schlsselkandidaten Ein Schlsselkandidat ist ein Feld, das allein oder in Verbindung mit einem anderen Feld, das nicht Teil des Primrschlssels ist, Eintrge in der Tabelle eindeutig identifizieren kann. Wenn es auerhalb des Primrschlssels die Mglichkeit gibt, alle Eintrge eindeutig zu bestimmen, mu ein Schlsselkandidat vorhanden sein. Dieser kann dann alternativ als Schlssel benutzt werden. Zum Beispiel hat ztxlfa1 nur ein einziges Primrschlsselfeld. Wenn wir nun annehmen, da die

Kombination von erdat und ertim (Erstellungsdatum und Zeit) fr jede Zeile ebenfalls eindeutig ist, dann sind diese Felder Schlsselkandidaten. Auch wenn nur eines dieser beiden Felder im Fremdschlssel vorkommen wrde, wre der Fremdschlsseltyp Schlsselfelder/-kandidaten. Wenn Sie einen Fremdschlssel fr die oben gezeigte Konstellation einrichten, sollten Sie Schlsselfelder/-kandidaten whlen. Ansonsten whlen Sie keine Schlsselfelder/- kandidaten. Schlsselfelder einer Texttabelle Das R/3-System untersttzt viele Sprachen und ermglicht dem Anwender, sich in der Sprache seiner Wahl anzumelden. Dafr werden Beschreibungen im R/3 in besonderen sprachabhngigen Tabellen gespeichert, die als Texttabellen bezeichnet werden.

Anwender knnen Ihre eigene Anmeldesprache einrichten. Das wird im Benutzerprofil ber den Menpfad System->Benutzervorgaben->Eigene Daten vorgenommen. nderungen werden erst bei der nchsten Anmeldung wirksam. Eine Texttabelle ist eine sprachenspezifische Prftabelle. Der Primrschlssel der Texttabelle ist der gleiche wie der der eigentlichen Prftabelle (ohne Texte) mit dem zustzlichen Schlsselfeld spras (Sprache). Die Tabelle ztxt005 enthlt z.B. die Landeskennzahlen. Die Namen der Lnder sind dagegen in einer gesonderten Tabelle gespeichert, der ztxt005t (s. Abb. 4.7), die fr jede untersttzte Sprache jeweils einen Eintrag enthlt. Die Tabelle ztxt005t ist somit die Texttabelle der Lnderkennzahlen.

Abbildung 4.7: Die Texttabelle fr ztxt005 ist ztxt005t. Sie besteht aus den Feldern mandt, spras, land1, landx und natio. Der Primrschlssel einer Texttabelle besteht aus dem Feld mandt, dem Feld spras und einem oder mehreren Prffeldern. Dahinter folgt das Textfeld (ggf. mehrere). Eine Fremdschlsselbeziehung ist auf ztxt005t-land1 zur Prftabelle ztxt005 definiert. Der Typ des Fremdschlsselfelds sollte Schlsselfeld einer Texttabelle sein.
Zuordnung von Texttabellen zur F4-Hilfe

Der Typ Schlsselfeld einer Texttabelle eines Fremdschlsselfeldes zeigt dem R/3-System an, da diese Tabelle eine Texttabelle ist. Wenn Sie diesen Typ whlen, werden die Textfelder der (F4)-Hilfe in der Anmeldesprache des Anwenders angezeigt. Dieser Schlsseltyp hat deswegen zwei besondere Eigenschaften:

Beim Aufrufen der (F4)-Hilfe werden die Eintrge der Texttabelle angezeigt, als wren sie Teil der Prftabelle. Nur die Eintrge der Texttabelle, die den gleichen Sprachenschlssel wie den der gegenwrtigen Anmeldesprache haben, erscheinen in der (F4)-Hilfe-Liste.

Zum Beispiel enthlt die Texttabelle ztxt005t eine Fremdschlsselbeziehung von ztxt005tland1 zur Prftabelle ztxt005, wobei der Typ Schlsselfeld einer Texttabelle ist. Wenn Sie die (F4)-Hilfe auf ztxt005-land1 aufrufen, sehen Sie die Primrschlsselspalten der Prftabelle ztxt005 und zustzlich den Inhalt der ersten Spalte, die dem Primrschlssel von ztxt005t folgt. Nur die Zeilen fr die gegenwrtige Anmeldesprache (spras = sy-langu) werden angezeigt. Die Inhalte der Tabellen ztxt005 und ztxt005t werden in den Tabellen 4.2 und 4.3 gezeigt.

Tabelle 4.2: Inhalt der Tabelle ztx005 Land1 US CA DE IT JP AQ CC Tabelle 4.3: Inhalt der Tabelle ztxt005t spras Land1 landx E D E D E D CA CA DE DE US US Canada Kanada Germany Deutschland United States USA

E D E D E D E D

IT IT JP JP AQ AQ CC CC

Italy Italien Japan Japan Antarctica Antarktis Coconut Islands Kokosinseln

Starten Sie nun das ScreenCam Text Table Demonstration: The Effect of the Logon Language. 1. Transaktion SE16 (/nse16 im Befehlsfeld eingeben und die Eingabetaste drcken). 2. Geben Sie den Tabellennamen ztxlfa1 im Tabellennamensfeld ein. 3. Drcken Sie Schaltflche Eintrge erfassen auf der Drucktastenleiste. 4. Positionieren Sie den Cursor auf das Feld Landeskennzahlen (land1). 5. Drcken Sie die (F4)-Taste, oder klicken Sie auf den Pfeil nach unten am Ende des Feldes. Es erscheint ein Popup, das sowohl die Spalten der Tabelle ztxt005 als auch die der Tabelle ztxt005t anzeigt. Beachten Sie, da neben dem Feld land1 der Tabelle ztxt005 die deutschsprachigen Beschreibungen aus der Tabelle ztxt005t erscheinen. 6. Melden Sie sich ein weiteres Mal an (Sie mssen sich dazu nicht abmelden). Diesmal tragen Sie E fr englisch in das Sprachfeld der R/3-Anmeldemaske ein. 7. Wiederholen Sie die Schritte 1 bis 5 in dieser Session. 8. Beachten Sie in dieser Zeit die englischen Beschreibungen der Tabelle ztxt005t.
Einrichten einer Texttabelle mit dem dazugehrigen Fremdschlssel

Im folgenden werden Sie nun Ihre eigene Texttabelle einrichten. Die ztxt005t soll hierbei als Vorlage dienen. Diese Texttabelle wird ***t005t genannt. Die benutzten Felder, Datenelemente und Domnen werden in der Tabelle 4.4 aufgezeigt. Das Datenelement ***landx mu hierfr noch eingerichtet werden. Als Domne verwenden Sie dafr die bereits bestehende text15.

Tabelle 4.4: Felder und deren Eigenschaften fr Tabelle ***t005t

Feldnamen PK DE-Name mandt spras Land1 landx x x x mandt spras ***land1

DM-Name

***landx Text15

Nachdem Sie die Tabelle ***t005t aktiviert haben, geben Sie Daten mit Hilfe der SE16 ein. Benutzen Sie diejenigen Daten, die schon in Tabelle 4.3 gezeigt wurden. Danach mu ein Fremdschlssel auf das Feld ***t005t-land1 eingerichtet werden. Das Verfahren ist das gleiche wie bei den vorherigen bungen. Die ***t005 wird dabei als Prftabelle benutzt. In der Maske Fremdschlssel anlegen geben Sie als Feldtyp Schlsselfeld einer Texttabelle an. Nachdem Sie den Fremdschlssel eingerichtet haben, testen Sie ihn wie schon gezeigt fr das Feld ***lfa1-land1. Nach erneuter Anmeldung mit dem Sprachschlssel E (englisch) sehen Sie nun beim Wiederholen des Tests die englischsprachigen Texte.

Generische und konstante Fremdschlssel


Wenn Sie einen Fremdschlssel anlegen, mssen, wie gesagt, alle Primrschlsselfelder der Prftabelle in der Fremdschlsselbeziehung eingebunden werden. Es kann aber Flle geben, bei denen die berprfung gegen alle Felder unerwnscht ist. Oder es soll nur gegen einen konstanten Wert berprft werden. Fr diese Flle lt sich ein generischer bzw. ein konstanter Fremdschlssel definieren. Generischer Fremdschlssel Bei einem generischen Fremdschlssel wird ein Schlsselfeld der Prftabellen als generisch gekennzeichnet, was bedeutet, da dieses Feld an der berprfung nicht teilnimmt. Zum Beispiel ist die Tabelle mara innerhalb der Materialwirtschaft eine zentrale Tabelle. Sie enthlt die Auflistung derjenigen Materialien, die fr die Fertigung benutzt werden, inklusive der Materialeigenschaften. Das Setup-Programm zu diesem Buch richtet eine hnliche Tabelle mit Namen ztxmara ein. Die Felder von ztxmara sind in der Abbildung 4.8 enthalten.

Abbildung 4.8: Tabelle ztxmara ist hnlich der R/3-Tabelle Materialstamm mara. Das Feld ztxmara-stoff enthlt die Nummer des Gefahrenstoffs. Eine Ziffer in diesem Feld zeigt an, da das Material eine besondere Handhabung erfordert und gibt Auskunft ber die Art der Handhabung. Diese Nummern sind in der Tabelle ztxmgef definiert, die in Abbildung 4.9 gezeigt wird. In unserem Beispiel wird angenommen, da ztxmgef den Eintrag mit stoff gleich 1 enthlt. Dieser Eintrag zeigt an, da die Handhabung dieses Stoffes Handschuhe erfordert.

Abbildung 4.9: Die Tabellen ztxmara und ztxmgef sind verbunden durch das Feld stoff. Die Prftabelle fr ztxmara-stoff ist ztxmgef. Die Fremdschlsseldefinition wird in Abbildung 4.10 angegeben. Dieser Fremdschlssel berprft die Werte, die in ztxmara-stoff eingegeben werden, und stellt sicher, da nur zulssige Zahlen fr die Handhabung in der Tabelle ztxmara existieren. Diese Handhabungsregeln knnen aber je Land und Region variieren. Der Primrschlssel von ztxmgef besteht deswegen aus stoff, land1 und regio. ztxmara enthlt allerdings keine Informationen ber den Standort - diese Informationen sind in den Werktabellen enthalten. Wie bereits aufgezeigt, mu ein Fremdschlssel alle Primrschlsselfelder der Prftabelle umfassen. Deswegen erscheinen regio und land1 der Tabelle ztxmgef in der Fremdschlsseldefinition. Fr die berprfung von ztxmara-stoff reicht das Feld ztxmgef-stoff allerdings aus. Die Information ber den Standort existiert nicht in ztxmara. Sie ist fr die Gltigkeit unerheblich. Hierfr reicht es aus, da die angegebene Zahl fr die Handhabung berhaupt vorhanden ist.

Abbildung 4.10: Ein Hkchen in der Checkbox Generic bewirkt, da ein Feld whrend der Fremdschlsselprfung ignoriert wird. In dieser Fremdschlsselbeziehung werden regio und land1 im Primrschlssel von ztxmgef ignoriert. Um dies zu erreichen, werden die entsprechenden Felder im Fremdschlssel als generisch definiert. Kreuzen Sie dazu die entsprechende Checkbox in Maske Fremdschlssel anlegen an. Durch den Fremdschlssel wird so nur die Kombination von mandt und stoff geprft. Die Felder regio und land1 werden dabei ignoriert. Konstanter Fremdschlssel Der konstante Fremdschlssel ist ein zusammengesetzter Fremdschlssel, bei dem eines der Felder der Prftabelle einen konstanten Wert beinhaltet. Dieser konstante Wert wird beim Einrichten in der Maske Fremdschlssel anlegen eingegeben (s. Abbildung 4.11). Angenommen, Sie mten zum Beispiel eine Kreditorentabelle ztxlfa1us anlegen, die nur amerikanische Kreditoren enthalten soll und aus Kompatibilittsgrnden genauso wie ztxlfa1 aufgebaut sein mu. Die Landeskennzahl in dieser Tabelle wrde immer US sein. Hierfr knnen Sie einen konstanten Fremdschlssel einrichten, um die Werte in Tabelle ztxlfa1 auf US einzugrenzen (s. Abb. 4.11).

Abbildung 4.11: Das Landesfeld als konstanter Fremdschlssel

Angepate Fremdschlssel
Die Felder eines zusammengesetzten Fremdschlssels mssen nicht aus einer einzigen Tabelle stammen. Einen solchen Fremdschlssel nennt man dann einen angepaten Fremdschlssel. Angenommen, die Landeskennzahl eines Kreditors wird nicht in ztxlfa1 gespeichert, sondern in ztxlfa1cc. Wenn Sie nun einen Fremdschlssel auf dem Feld Region einrichten, wrden Sie das Feld land1der Prftabelle ndern in ztxlfa1cc-land1 (s. Abb. 4.12). Fr das Feld regio wird nun geprft werden, ob die Kombination von mandt und regio in ztxt005s existiert und ob land1 in ztxt005cc vorhanden ist.

Abbildung 4.12: Ein Beispiel fr einen angepaten Fremdschlssel

Definition einer Wertetabelle


Beim Pflegen einer Domne kann eine Wertetabelle angegeben werden. Diese Tabelle bewirkt folgendes:

Sie wird automatisch als Prftabelle vorgeschlagen, wenn, bezogen auf diese Domne, ein Fremdschlssel eingerichtet werden soll. Sie stellt die Eintrge fr die (F4)-Hilfe zur Verfgung, ohne da dabei die Gltigkeit geprft wird.

Immer, wenn Sie einen Fremdschlssel anlegen, geht das System in das Feld Wertetabelle. Findet es einen Tabellennamen, schlgt es diesen fr die Prftabelle vor. Auf dieses Konzept wird im folgenden Abschnitt ausfhrlich eingegangen. Die Wertetabelle Zum besseren Verstndnis des Zwecks von Wertetabellen soll ein komplexeres Beispiel im Bereich des Datenbankdesigns und der Entwicklung dargestellt werden.

Bevor Tabellen im DDIC eingerichtet werden knnen, mssen in der Regel bestimmte Voraussetzungen im Bereich des Datenbankdesigns geschaffen sein. Dieses Design beschreibt die Tabellen, die angelegt werden sollen, ihre Beziehungen und die Art von Daten, die sie enthalten sollen. Bestimmte Tabellen werden als Prftabellen deklariert, um Daten innerhalb anderer Tabellen zu prfen. Die Prftabelle fr die Landeskennzahlen kann z.B. berall dort eingesetzt werden, wo Landeskennzahlen abgespeichert werden. Wenn Sie mehrere Tabellen innerhalb des R/3 einrichten, werden Sie in der Regel zuerst die Prftabellen anlegen. Es knnen mehrere Fremdschlsselbeziehungen eingerichtet werden, die andere Tabellen mit einer einzigen Prftabelle verketten. Das Wertetabellenfeld in der Domne soll diese Aufgabe vereinfachen. Der Begriff der Wertetabelle innerhalb der Domne ist an dieser Stelle ein etwas verwirrender Ausdruck. Eigentlich ist sie der Vorschlagswert fr die Prftabelle. Im weiteren wird diese Tabelle auch als Default-Prftabelle bezeichnet. Um das Beispiel zu vereinfachen, wird unsere Prftabelle nur ein Primrschlsselfeld enthalten (Abb. 4.13). Das Verfahren fr das Anlegen der Prftabelle werde ich noch einmal beschreiben, um dieses Konzept zu veranschaulichen.

Abbildung 4.13: Das Feld Wertetabelle in der Domne enthlt den Namen einer Prftabelle. Bevor eine Prftabelle eingerichtet wird, mu zunchst eine Domne vorhanden sein. Diese mu ggf. erst einmal angelegt werden. Danach werden erst das Datenelement und dann die Tabelle eingerichtet und aktiviert. Im Anschlu wird beim nachtrglichen Pflegen der Domne (des Primrschlsselfelds) der Name der angelegten Prftabelle im Feld Wertetabelle (Default-Prftabelle) eingegeben. Fr unser Beispiel wird nun die Tabelle ztxlfa1 angelegt. Hierfr wird das Feld land1 eingerichtet, wobei ztxland1 als Datenelement benutzt wird. Beide Felder greifen somit die gleiche Domne zu. Danach richten Sie den Fremdschlssel ein, um land1 berprfen zu knnen. Dafr wird der Cursor

auf das Feld ztxlfa1-land1 gesetzt und auf die Schaltflche Fremdschlssel gedrckt. Dabei sieht das System in der Domne nach, ob eine Wertetabelle (Default-Prftabelle) vorhanden ist. Falls die Tabelle dort existiert, schlgt das System diese automatisch als Prftabelle vor. In unserem Fall wird das System ztxt005 finden und als Prftabelle vorsehen. Abschlieend besttigen und sichern Sie den Fremdschlssel. In diesem Beispiel hat uns im Prinzip das System den Fremdschlssel automatisch eingerichtet, weil wir im Vorfeld den Namen der Prftabelle im Feld Wertetabelle eingegeben haben. Mit drei Mausklicken haben wir einen Fremdschlssel eingerichtet! Dies ist in erster Linie der Grund fr die Existenz des Werttabellenfeldes. Es erleichtert im wesentlichen die Einrichtung des Fremdschlssels. Zusammenfassend gesagt, wird die Wertetabelle durch das System fr zwei Aufgaben benutzt:

Die Wertetabelle wird beim Einrichten eines Fremdschlssels automatisch als Prftabelle vorgeschlagen. Die Wertetabelle stellt die (F4)-Liste zur Verfgung, ohne dabei die Gltigkeit zu berprfen.

Wertetabelle als Vorschlagswert fr die Prftabelle In diesem Abschnitt werden Sie einer Domne eine Wertetabelle zuordnen und die damit verbundene Auswirkung auf die Einrichtung eines Fremdschlssels beobachten. Pflegen Sie nun die Domne ***land1, und tragen Sie ***t005 in das Wertetabellenfeld ein. Danach aktivieren Sie die Domne. Lschen Sie jetzt den Fremdschlssel auf dem Feld ***lfa1-land1. Richten Sie ihn nochmals ein, um die Wirkung des Wertetabellenfeldes beim Bearbeiten des Fremdschlssels erkennen zu knnen. Benutzen Sie dazu das unten stehende Verfahren. 1. Fangen Sie in der Einstiegsmaske des Dictionary an. 2. Tippen Sie den Namen der Tabelle in das Feld Objektname ein (***lfa1). 3. Whlen Sie die Option Tabellen aus. 4. Drcken Sie auf die Schaltflche ndern. 5. Positionieren Sie den Cursor auf dem Fremdschlsselfeld (land1). 6. Drcken Sie auf die Schaltflche Fremdschlssel auf der Drucktastenleiste (oder gehen Sie ber den Menpfad). Das nderungsbild fr den Fremdschlssel wird angezeigt. 7. Drcken Sie am unteren Ende des Fensters auf die Schaltflche Lschen (Abfalleimer). 8. Es wird zum Dictionary zurckgesprungen: Tabelle/Struktur: nderungsbild fr die Felder. Die

Meldung, da der Fremdschlssel gelscht wurde, erscheint in der Statusleiste. 9. Whrend der Cursor noch auf dem Fremdschlsselfeld (land1) steht, drcken Sie nochmals auf die Fremdschlsselschaltflche. Die Maske Fremdschlssel anlegen wird angezeigt. Das System meldet, da kein Fremdschlssel existiert und will den Vorschlag mit der Wertetabelle als berprfungstabelle generieren. Sie sehen diese Meldung, weil das System im Wertetabellenfeld der Domne einen Eintrag gefunden hat. 10. Drcken Sie nun auf Ja. Die Maske Fremdschlssel anlegen wird angezeigt, und das Prftabellenfeld enthlt nun die Wertetabelle der Domne. Die Prftabellen- und Fremdschlsselfelder sind jetzt gefllt. 11. Drcken Sie nun auf die Schaltflche Kopieren. Sie Springen zum Dictionary zurck: Tabelle/Struktur: nderungsbild. Die Meldung Fremdschlssel wurde bertragen erscheint in der Statusleiste. Die Statusfelder zeigen an, da die Tabelle berarbeitet und nicht gesichert ist. 12. Drcken Sie die Schaltflche Aktivieren. Die Meldung wurde gesichert erscheint in der Statusleiste. Die Statusfelder zeigen aktiv und gesichert an. Mit dem Wertetabellenfeld in der Domne knnen Sie Fremdschlssel schnell und zuverlssig einrichten. Die Prftabellenspalte Die Prftabellenspalte im Dictionary: Tabelle/Struktur erfllt hierbei zwei Aufgaben:

Wenn ein Feld Fremdschlssel ist, enthlt diese Spalte den Namen der Prftabelle. Ein Stern (*) in dieser Spalte bedeutet, da zwar keine Prftabelle fr das Feld definiert ist, eine Wertetabelle in der Domne aber existiert.

Zum zweiten Punkt gibt es jedoch eine Ausnahme. Wenn Sie sich die Wertetabelle der Domne selbst anschauen, wird der Stern nicht angezeigt. Die Wertetabelle als Liste mglicher Eingabewerte Bei einem Feld, das eine Wertetabelle enthlt, aber kein Fremdschlssel ist, wird bei Eingabe eines Wertes auf der Bildschirmmaske keine Prfung auf Gltigkeit vorgenommen. Fr diesen Fall wird auch kein Pfeil nach unten am Ende des Felds angezeigt, wie es fr ein Fremdschlsselfeld blich ist. Trotzdem wird, wenn Sie den Cursor in das Feld stellen und (F4) drcken, die (F4)-Hilfe mit der Auflistung der Wertetabelle angezeigt. In diesem Fall ist es fr den Anwender nicht ersichtlich, da die (F4)-Funktionalitt verfgbar ist. Diese Funktionalitt bietet sich an, wenn dem Anwender zwar eine Liste von Vorschlagswerten zur

Verfgung gestellt werden soll, er aber andererseits auch die Mglichkeit haben soll, andere Werte einzugeben.

Besondere Tabellenfelder
Zwei Arten von Tabellenfeldern bentigen eine besondere Behandlung:

Whrungsfelder Mengenfelder

Whrungsfelder
Nehmen wir an, da Sie zur Bank gehen und nach 1000 fragen. Der Kassierer wrde wahrscheinlich fragen: 1000 was?. Sie knnten 1000 Mark antworten. Oder Sie knnten genauer sein und nach 1000 DM fragen. Geldbetrge im R/3 sind in zwei Feldern gespeichert: in einem, das den eigentlichen numerischen Betrag (1000) enthlt, und in einem fr die Whrung (DEM). Das Betragsfeld heit hierbei Whrungsfeld und das andere Feld Whrungsschlsselfeld.

Was viele Leute als Whrung bezeichnen, ist genaugenommen ein Whrungscode (z.B. USD fr US Dollar oder DEM fr Deutsche Mark etc.). Die SAP benutzt das Wort Schlssel als Synonym fr Code, somit heit das Feld, das den Whrungsschlssel beinhaltet, der Whrungsschlssel. Das trifft auf die meisten Codefelder in R/3 zu; der Lndercode wird Lnderschlssel genannt, der Regionalcode ist der Regionalschlssel und so weiter. Whrungsfelder mssen zwei Anforderungen erfllen:

Der Datentyp der Domne mu CURR sein. Sie mssen mit einem Feld vom Typ CUKY verbunden sein, das die Whrung enthlt, wie zum Beispiel US-$ (US-Dollar), CAD (kanadische Dollar), ITL (italienische Lira) und so weiter.

Der Whrungsschlssel ist dabei das Referenzfeld, welches ein Feld der gleichen oder einer anderen Tabelle ist. Nehmen wir zum Beispiel an, da Sie eine Tabelle einrichten wollen, die Zahlungen zu Kreditoren enthalten soll. Hierzu brauchen Sie ein Betragsfeld (wrbtr) und ein Whrungsschlsselfeld (blicherweise waers), um diese Zahlungen komplett anzeigen zu lassen. Die beiden Felder werden miteinander verknpft, indem Sie in der Tabelle auf das Whrungsfeld doppelklicken und dann die Tabelle und das Feld des Whrungsschlssel als Verweis angeben (s. Abb. 4.14).

Abbildung 4.14: Die Referenzfelder auf dem Anzeigefeld

Mengenfelder
Ein Mengenfeld ist ein Feld, das eine Mazahl enthlt. Ein solches Feld knnte z.B. eine Breite, eine Lnge, eine Temperatur oder eine elektrische Spannung enthalten. Um aussagekrftig zu sein, mu ihm eine Maeinheit wie Kilogramm, Meter, Celsius oder Volt zugeordnet sein. Mengenfelder mssen folgenden Anforderungen gengen:

Der Datentyp in der Domain mu QUAN sein. Sie mssen mit einem Feld vom Typ UNIT verbunden werden.

Das UNIT-Feld ist hierbei das Referenzfeld fr das QUAN-Feld. Das UNIT-Feld kann in der gleichen Tabelle oder in einer anderen Tabelle vorhanden sein. Das UNIT-Feld enthlt die Maeinheit fr die Anzahl im Quantittsfeld. In der Tabelle ztxmara enthlt das Feld ntgew zum Beispiel das Nettogewicht eines Materials und das Feld gewei die Einheit, wie Pfund oder Kilogramm (s. Abb. 4.15). Das ntgew-Feld hat, wie

verlangt, den Datentyp QUAN. Der Datentyp von gewei ist UNIT. Wenn Sie ntgew doppelklicken, wird Ihnen die Referenztabelle ztxmara und das Referenzfeld gewei angezeigt (s. Abb. 4.16).

Abbildung 4.15: Dies ist die Struktur der Tabelle ztxmara mit den Feldern ntgew und gewei.

Abbildung 4.16: Dies sind die Feldattribute des Feldes ntgew. Beachten Sie, da die beiden Felder Referenztabelle und Referenzfeld die Verbindung zum Feld UNIT anbieten.

Strukturen im Data Dictionary


Zustzlich zu Tabellen knnen Strukturen (auch Feldleisten) genannt im Data Dictionary definiert werden. Eine Struktur ist eine Reihe von Feldern, die unter einem gemeinsamen Namen gruppiert werden. Strukturen sind Tabellen hnlich. Wie eine Tabelle knnen sie innerhalb eines Programms ber die Anweisung tables benutzt werden, um einen Arbeitsbereich zu definieren. Die Unterschiede zwischen einer Struktur und einer Tabelle sind folgende:

Eine Struktur ist keiner Datenbanktabelle zugeordnet. Eine Struktur hat keinen Schlssel. Eine Struktur hat keine technischen Attribute.

Bei Strukturen gelten die gleichen Namenskonventionen wie bei transparenten Tabellen. Innerhalb eines Programms darf es keine Namensgleichheit zwischen einer Tabelle und einer Struktur geben. Eine Struktur wird im DDIC eingerichtet, wenn sie als Arbeitsbereich (Work Area) in mehreren Programmen definiert werden soll. Wenn Sie zum Beispiel ber ein ABAP/4-Programm Datenstze in eine sequentielle Datei abspeichern und durch ein anderes einlesen wollen, mu in beiden Programmen der Aufbau dieser Datenstze bekannt sein. In diesem Fall bietet es sich an, eine Struktur im DDIC einzurichten, die das Datensatzlayout festlegt und diese dann ber die tables-Anweisung in beide Programme einbindet. Dies wrde einen identischen Arbeitsbereich in beiden Programmen anlegen. Das Verfahren beim Anlegen einer Struktur ist im Prinzip das gleiche wie bei einer transparenten Tabelle (sehen Sie sich hierzu die Prozedur zum Einrichten einer transparenten Tabelle an). Die einzigen Unterschiede sind folgende:

Es wird die Strukturoption statt der Tabellenoption ausgewhlt. Die Felder Auslieferungsklasse und Tabellenpflege Erlaubt erscheinen nicht. Strukturen haben keinen Primrschlssel. Es werden keine technischen Eigenschaften angegeben, die die Kategorie oder Zwischenspeicherung wie eine Datenklasse messen.

Include-Strukturen
Eine Struktur kann ihrerseits eine andere Struktur enthalten, d.h., Strukturen knnen miteinander verschachtelt werden. Dies geschieht, um den Wartungsaufwand zu reduzieren, indem man Felder innerhalb einer Struktur gruppiert und diese dann in eine andere Struktur oder in eine Tabelle einbindet. Zum Beispiel besteht die Adresse einer Person aus Feldern wie Strae, Wohnort, Region, Land und Postleitzahl. Die Adresse wird in der Regel in mehreren Tabellen gefhrt. Innerhalb der Kreditorentabelle knnte die Adresse des Kreditors gefhrt werden. Das gleiche gilt fr die Kundentabelle und die Tabelle, in der die Adressen der Mitarbeiter stehen. Sind nun die Adrefelder in einer Struktur zusammengefat, kann diese Struktur in die entsprechenden Tabellen aufgenommen werden. Beim Aktivieren der Tabelle werden die Felder der Struktur hinzugefgt und existieren in der Datenbanktabelle, als wren sie hier definiert worden. Hier stehen dann die Felder mit den gleichen Namen wie in der Struktur. Um eine Struktur in eine Tabelle (oder innerhalb einer anderen Struktur) aufzunehmen, wird .INCLUDE in der Feldnamenspalte und der Strukturname in der Datenelementspalte eingegeben. In Abbildung 4.17 enthlt die Tabelle ztxempl (Angestelltentabelle) die Struktur ztxaddr (s. Abb. 4.18), welche die Adrefelder stras (Strae), ort01 (Wohnort), regio und land1 umfat. Die Tabelle ztxempl enthlt deswegen die Felder: ztxempl- stras, ztxempl-ort01, ztxemplregio, und ztxempl-land1.

Abbildung 4.17: Die Tabelle ztxempl enthlt .INCLUDE, damit die Felder von ztxaddr mit aufgenommen werden knnen. Um sich die include-Struktur komplett von der Tabellendefinition aus anzusehen, whlen Sie den Menpfad Zustze->Unterstrukturen->Alle Unterstrukturen (Ustr) auflsen. Alle Felder, die unter der Struktur zusammengefat sind, erscheinen danach unter .INCLUDE wie in Abbildung 4.19 gezeigt. Die Kette von Strukturen, die eingerichtet wird, wenn man eine Struktur innerhalb einer anderen aufnimmt, nennt man auch include chain. Die maximale Schachtelungstiefe betrgt neun, und nur eine Tabelle kann in einer include chain erfat werden. Mit anderen Worten: Sie knnen keine Tabelle innerhalb einer Tabelle aufnehmen.

Abbildung 4.18: Die Struktur von ztxaddr enthlt die Adrefelder, die in Tabelle ztxempl aufgenommen werden.

Abbildung 4.19: Die Tabelle ztxempl benutzt die .INCLU-XXX-Form der include-Anweisung, so da ztxaddr zweimal aufgenommen werden kann, ohne Namensfelder zu duplizieren.

Mehrfaches Einbinden der gleichen Struktur


Wenn Sie die gleiche Struktur mehrfach innerhalb einer Tabelle verwenden, mssen Sie statt .INCLUDE .INCLU-XXX benutzen. XXX steht hier fr drei beliebige Zeichen. Diese drei Zeichen werden an jeden Feldnamen angehngt, um diese voneinander unterscheiden zu knnen. Nehmen wir beispielsweise an, da Sie zwei Adressen in ztxempl speichern mssen: eine Rechnungsanschrift und eine Versandadresse. Wie in Abbildung 4.20 gezeigt, umfat ztxempl2 zweimal die Struktur ztxaddr. Die erste Include-Struktur .INCLU-01 bewirkt, da 01 an jeden der Feldnamen der Struktur angehngt wird. Die zweite, .INCLU-02, hngt 02 an jeden Feldnamen. Das Ergebnis (in Abb. 4.21) sieht man, wenn man den Menpfad Zustze>Unterstrukturen->alle Unterstrukturen auflsen auswhlt.

Abbildung 4.20: Die Tabelle ztxempl2 benutzt die .INCLU-XXX-Form der include-Anweisung, so da ztxaddr zweimal aufgenommen werden kann, ohne Namensfelder zu duplizieren

Abbildung 4.21: ??????

Zusammenfassung

Fremdschlssel sorgen bei Bildschirmeingaben fr die Konsistenz der Daten durch berprfung der Gltigkeit und liefern der (F4)-Hilfe Listen der zulssigen Werte. Die Wertetabelle dient als Vorschlagswert fr die Prftabelle und stellt die (F4)- Hilfe zur Verfgung. Texttabellen stellen Beschreibungen in verschiedenen Sprachen dem R/3 und besonders der (F4)Hilfe zur Verfgung. Innerhalb einer Tabelle mu jedes Whrungsfeld einem Whrungsschlsselfeld zugeordnet werden und jedes Quantittsfeld wiederum einem Feld, das die Maeinheiten enthlt. Tabellen und Strukturen sind sehr hnlich. Der Hauptunterschied ist, da eine Tabelle im Gegensatz zur Struktur eine zugrunde liegende Datenbanktabelle besitzt. Sie knnen Strukturen benutzen, um identische Arbeitsbereiche in mehreren Programmen zu definieren. Sie knnen eine Struktur in andere Strukturen und Tabellen einbinden.

Fragen & Antworten

Frage: Kann ein ABAP/4-Programm Fremdschlsselbeziehungen ignorieren und Eintrge einfgen, welche die Datenkonsistenz verletzen? Antwort: Ja. Die Daten kommen aber in der Regel mit Hilfe der Anwenderschnittstelle ins System. Die Anwenderschnittstelle berprft die Daten, bevor diese in die Datenbank einfgt werden, so da der Fremdschlssel im Vorfeld schon berprft wird. Wenn Sie Daten von externen Systemen importieren, sollten Sie das Batch-Input-Verfahren (BDC) benutzen, um die Tabellen zu aktualisieren. Die Datenkonsistenz wird dadurch erreicht, da eine Benutzersitzung simuliert wird und die Daten mittels der Schnittstelle ins System gelangen. Wenn Sie die Datenbank aktualisieren, ohne die Daten durch die Anwenderschnittstelle berprfen zu lassen, dann mu Ihr ABAP/4-Programm so geschrieben sein, da die Konsistenz nicht verletzt wird. Frage: Wenn ich die Konsistenz meiner Datenbank garantieren will, kann ich das auf der Datenbankebene tun? Welche Auswirkungen htte diese Manahme auf das R/3? Antwort: Aktualisieren Sie das RDBMS nie direkt. Sie sollten nur das R/3-DDIC benutzen, um die Definitionen innerhalb der Datenbank zu ndern. Wenn Sie die Datenbank von Hand aktualisieren, werden die Datenbankdefinitionen und die R/3-DDIC-Definitionen inkonsistent, und das Ergebnis wird unvorhersehbar. Frage: Wenn ich eine Zeile aus einer Prftabelle lsche, werden dann auch automatisch die entsprechenden Eintrge in der Fremdschlsseltabelle gelscht? Antwort: Nein. Diese Funktion ist in R/3 so nicht verfgbar. Dieses Merkmal wird normalerweise als Cascade on delete bezeichnet. Frage: Der Fremdschlsseltyp Schlsselfelder einer Texttabelle zwingt das System zu unterschiedlichem Verhalten. Verbirgt sich hinter den anderen Fremdschlsselfeldtypen irgendeine Funktionalitt? Antwort: Nein. Nur die Schlsselfelder einer Texttabelle haben Systemfunktionalitt, die anderen dienen meistens der Dokumentation. Frage: Knnen Strukturen Fremdschlsseldefinitionen haben? Antwort: Ja. Das kommt hufig vor, da eine Tabelle, die eine Struktur beinhaltet, von dieser

Fremdschlsseldefinitionen vererbt bekommt. Man kann diese Art der Vererbung ausschalten, indem man die Struktur bei Bedarf einbindet.

Workshop
Die folgenden bungen sollen Ihnen Praxis beim Anlegen von Fremdschlsseln, Strukturen und Feldern vermitteln.

Kontrollfragen
1. Was mssen das Fremdschlsselfeld und das Prftabellenfeld beim Einrichten des Fremdschlssels gemeinsam haben? 2. Wie lautet die Syntax zum Einbinden der Struktur zs1 in die Tabelle zt1? 3. Welchen Zweck erfllt eine Texttabelle? 4. Nehmen wir an, da eine Prftabelle zc existiert, deren Primrschlssel aus den Feldern mandt, f1 und f2 besteht. Welche Primrschlsselfelder mte die Texttabelle fr zc enthalten? 5. Wenn Sie ein Whrungsfeld einrichten, welchen Typ mu dann das Feld haben, auf das es sich bezieht?

bung 1
Legen Sie die Prftabelle ***t005 fr die Landeskennzahlen an. Sie wird benutzt, um alle Landeskennzahlen zu berprfen, die in Ihre Tabellen eingegeben werden. Der Aufbau erscheint in Tabelle 4.5.

Tabelle 4.5: Felder und ihre Eigenschaften fr die Tabelle ***t005 Beschreibung Feldname Mandant mandt Landeskennzahl mandt x ***land1 x mandt

PK DE-Name

Nachdem Sie diese Tabelle aktiviert haben, gehen Sie in die Domne ***land1. Geben Sie ***t005 im Feld Wertetabelle ein, und aktivieren Sie die Domne. Benutzen Sie SE16, um Ihrer Tabelle Landeskennzahlen hinzuzufgen.

bung 2
Legen Sie die Prftabelle ***t005s an. Sie wird benutzt, um alle Regionskennzahlen zu berprfen, die in Ihre Tabellen eingegeben werden. Ihr Aufbau steht in Tabelle 4.6.

Tabelle 4.6: Felder und ihre Eigenschaften fr die Tabelle ***t005s Beschreibung Feldname Mandant mandt Landeskennzahl land1 Region regio x ***regio x ***land1 ***t005 x mandt

PK DE-Name

Prftabelle

Nachdem Sie diese Tabelle aktiviert haben, gehen Sie in die Domne ***regio, und geben Sie ***t005s im Wertetabellenfeld ein, dann aktivieren Sie dieses. Benutzen Sie SE16, um Ihrer Tabelle Regionskennzahlen hinzuzufgen. Testen Sie Ihren Fremdschlssel auf land1, indem Sie eine ungltige Landeskennzahl eingeben.

bung 3
Fgen Sie Ihrer Tabelle ***lfa1 einen entsprechenden Fremdschlssel fr die Felder land1 und regio hinzu. Benutzen Sie SE16, um die bestehenden Zeilen innerhalb von ***lfa1 zu aktualisieren und die zulssigen Landes- und Regionskennzahlen einzugeben.

bung 4
Richten Sie eine Prftabelle fr das Feld cityc der Tabelle ***kna1 ein, die Sie am dritten Tag angelegt haben. Nennen Sie die Prftabelle ***t005g. Sie sollte eine Auflistung der zulssigen Wohnorte enthalten. Der Aufbau ist in Tabelle 4.7 aufgefhrt.

Tabelle 4.7: Felder und ihre Eigenschaften fr die Tabelle ***t005g

Beschreibung Feldname Mandant mandt Landeskennzahl land1 Region regio Stadt cityc

PK DE-Name

DM-Name Typ

Lnge Prftabelle

mandt

***land1

***t005

***regio

***t005s

***cityc ***cityc CHAR 4

Vergessen Sie nicht, die Fremdschlsselbeziehungen auf den Feldern land1 und regio einzurichten.

bung 5
Gehen Sie in die Domne Cityc, tragen Sie ***t005g im Wertetabellenfeld ein, und aktivieren Sie die Domne. Benutzen Sie SE16, um Schlssel fr die Wohnorte in Tabelle ***t005g hinzuzufgen. Testen Sie den Fremdschlssel, indem Sie versuchen, ungltige Landes- und Regionskennzahlen einzugeben. Dann richten Sie den Fremdschlssel auf dem Feld Cityc in der Tabelle ***kna1 ein und benutzen SE16, um Kunden in ***kna1 einzufgen. Prfen Sie die Fremdschlsselbeziehung, indem Sie versuchen, ungltige Wohnorte einzugeben. Legen Sie eine Texttabelle fr ***t005g an und nennen Sie diese ***t005h. Der Aufbau ist in Tabelle 4.8 dargestellt.

Tabelle 4.8: Felder und ihre Merkmale fr Tabelle ***t005h Beschreibung Feldname Mandant mandt Sprachschlssel spras Landeskennzahl land1 Region x ***land1 ***t005 x spras t002 x mandt

PK DE-Name

DM-Name Typ

Lnge Prftabelle

regio Stadt cityc bezei

***regio

***t005s

***cityc ***bezei20 text20 CHAR 20

***t005g

Der Fremdschlssel auf dem Feld Cityc sollte dem Typ Schlsselfeld einer Texttabelle entsprechen. Benutzen Sie SE16, um Beschreibungen fr jeden Ort einzurichten. Legen Sie diese Beschreibungen in zwei Sprachen an: E (englisch) und D (deutsch). Testen Sie die Texttabelle durch Anlegen eines neuen Eintrags in Tabelle ***kna1 und Bedienen der (F4)-Taste. Die Beschreibungen sollten nun in ihrer gegenwrtigen Anmeldungssprache in der (F4)-Liste erscheinen. Melden Sie sich danach in englisch an, um die englischen Beschreibungen zu sehen.

bung 6
Richten Sie die Struktur ***tel ein. Der Aufbau steht in Tabelle 4.9.

Tabelle 4.9: Felder und ihre Eigenschaften fr die Struktur ***tel Beschreibung Feldname Erste Rufnummer telf1 Zweite Rufnummer telf2 Faxnummer telfx Telexnummer telx1 telx1 telfx telf2 telf1

DE-Name

Binden Sie diese Struktur am Ende der Tabellen ***kna1 und ***lfa1 ein. Benutzen Sie SE16, um einige Ihrer bestehenden Datenstze zu aktualisieren und Rufnummern hinzuzufgen.

bung 7
Fgen Sie der Tabelle ***kna1 zwei Felder hinzu. Der Aufbau wird in Tabelle 4.10 gezeigt.

Tabelle 4.10: Zustzliche Felder und ihre Eigenschaften fr die Tabelle ***kna1 Beschreibung Feldname Kreditgrenze creditl Whrungsschlssel waers waers tcurc ***creditl ***creditl CURR l2 2

DE-Name

DM-Name

Typ

Lnge Dezimalstellen Prftabelle

Das Feld creditl enthlt die Kreditgrenze des Kunden, das Feld waers das Whrungsfeld fr diese Kreditgrenze. Vergessen Sie nicht, die Fremdschlsselbeziehung hinzuzufgen, um die Tabelle tcurc zu berprfen. Legen Sie eine (F1)-Hilfe fr das Feld creditl an, indem Sie auf die Schaltflche Dokumentation im Datenelement drcken. Nach dem Einrichten dieser beiden Felder doppelklicken Sie auf credit. Geben Sie im Feld Referenztabellen ***kna1 und im Feld Referenztypen creditl ein. Dann aktivieren Sie die Tabelle. Benutzen Sie SE16, um die Kundendatenstze zu aktualisieren und jedem eine Kreditgrenze hinzuzufgen. Sehen Sie sich die (F1)-Hilfe an, die Sie eingerichtet haben.

Ein Imprint des Markt&Technik Buch- und Software-Verlag GmbH. Elektronische Fassung des Titels: ABAP/4 in 21 Tagen, ISBN: 3-8272-2016-X

Woche 1

Tag 5 Das Data Dictionary , Teil 3


Kapitelziele
Nachdem Sie dieses Kapitel durchgearbeitet haben, sollten Sie folgendes knnen:

Sekundrindizes anlegen und benutzen die technischen Attribute fr transparente Tabellen einrichten Pufferung fr Tabellen einrichten

Tabellenindizes
Ein Index ist ein sehr wirksamer Mechanismus, um Zeilen innerhalb einer Tabelle schnell zu finden. Er wird bentigt, weil Daten in einer Tabelle in der Reihenfolge gespeichert werden, in der sie hinzugefgt wurden (die Reihenfolge der Ankunft). Stellen Sie sich vor, Sie wrden alle Seiten aus diesem Buch herausreien, sie in die Luft werfen und durcheinander bringen. Danach legen Sie sie ohne Rcksicht auf die Reihenfolge zu einem Stapel zusammen. Was wrden Sie machen, um jetzt eine einzelne Seite innerhalb dieses Stapels zu suchen? Einige Leute wrden einfach den Stapel durchblttern, in der Hoffnung, die richtige Seite zu finden. Ich bin sicher, da die meisten es bald aufgeben wrden, die Seiten eine nach der anderen umzudrehen. Diese Arbeit wrde offensichtlich leichter sein, wenn alle Seiten sortiert wren. Bei geordneten Seiten knnten Sie irgendwo starten und wten, in welche Richtung Sie die Seiten wenden, so da Sie die gesuchte Seite schnell finden wrden. Nehmen Sie an, da Sie die Seiten geordnet zurckgelegt haben. Indem Sie das neu geordnete Buch nehmen, fangen Sie vielleicht an, die Seite zu suchen, die die Transaktion SE16 beschreibt. Wo schauen Sie nach, wenn Sie die Seitenzahl nicht wissen? Sie sehen in das Register (Index). Das Register enthlt die wichtigsten Wrter, die in alphabetischer Reihenfolge sortiert sind. Sie lokalisieren SE16 schnell im Register und erhalten eine Seitenzahl. Nun durchsuchen Sie das Buch,

um diese Seite zu finden. Um ein Register anzulegen, dupliziert der Verlag wichtige Informationen und sortiert sie. Danach stellt er sie an das Ende des Buches. Wenn Sie es sich dann ansehen, sehen Sie sich die ursprngliche Information an? Nein, natrlich nicht. Sie sehen eine Kopie der ursprnglichen Information. Das Buch nimmt ein wenig mehr Platz wegen des Registers ein und wird ein bichen teurer wegen der lngeren Bearbeitung, aber niemand beklagt sich, weil weniger Zeit zum Suchen gebraucht wird. Eine Tabelle in der Datenbank ist hnlich wie ein Buch. Eine sequentielle Zahl wird jeder Zeile zugeordnet, wenn sie einer Tabelle hinzugefgt wird, hnlich einer Seitenzahl. Die wichtigen Spalten werden dann zu einem Register zusammengefat und sortiert - wie im Register am Ende eines Buches. Um alle Daten zu finden, durchsucht das System zuerst das Register, um die Zeilennummer zu eruieren und ermittelt dann schnell die Zeile. Jede R/3-Tabelle hat einen primren Index, der auf dem primren Schlssel der Tabelle aufbaut. Dieser Index wird gebraucht, weil die Daten in der Tabelle nach der Reihenfolge gespeichert sind, in der sie hinzugefgt werden. Wenn eine Zeile hinzugefgt ist, wird die Schlsselinformation sortiert und zum Index kopiert, zusammen mit einem Zeiger auf die ursprngliche Zeile. Abbildung 5.1 zeigt ein Beispiel mit Tabelle ztxlfal. Die Daten aus dem lifnr-Feld in ztxlfal werden zum Index kopiert, alphabetisch sortiert und zusammen mit der Zeilenanzahl der ursprnglichen Zeile gespeichert. (Das mandt-Feld ist ausgelassen geworden, um das Beispiel zu vereinfachen.)

Die Zeilennummer wird intern von der Datenbank vergeben; Sie sehen sie niemals im Data Dictionary. Sie wird vom Index benutzt, um auf die Originalzeile zu verweisen, aus der die Daten kommen.

Abbildung 5.1: Ein Tabellenindex ist die Kopie von einer oder mehreren Spalten, die in

verschiedenen Reihenfolgen mit Hinweisen auf die Originalzeilen sortiert sind . Wenn die Anweisung select * from ztxlfal where lifnr = '0000001050' ausgefhrt wird, erkennt das System, das es lifnr schon sortiert im Index hat und benutzt es automatisch. Es findet 1050 im Index und erhlt Zeilennummer 2. EsDann sucht es in der Tabelle nach Zeilennummer 2. Nehmen Sie jetzt an, die Anweisung select * from ztxlfa where land1 = 'US' wird ausgefhrt. Der Index ist nach lifnr sortiert, nicht nach land1. Die land1-Spalte steht nicht in einer besonderen Reihenfolge in der Tabelle. Das System wird vom Anfang der Tabelle bis z deren Ende alle Zeilen nach land1 = 'US' durchsuchen. Die Tabelle in Abbildung 5.1 ist sehr klein, aber ihre Erstellung kann in einer greren Tabelle ein sehr zeitaufwendiger Proze sein. Kehren wir zurck zum Buchbeispiel. Ein Buch hat manchmal mehr als einen Index. So knnte ein medizinisches Buch ber den Gebrauch von Krutern das bliche Register haben, zustzlich eines nur fr Pflanzennamen und ein drittes ausschlielich ber medizinische Wirkungen. Um diese Register anzulegen, mu die Information sortiert und drei mal am Buchende dupliziert werden. Damit vergrert sich die Seitenzahl des Buches. Es gibt somit verschiedene Mglichkeiten, eine Seitenzahl zu finden, z.B. mit Hilfe des blicherweise benutzten Registers oder eines der drei zustzlichen Register. Der Aufbau des allgemein benutzten Registers hnelt dem primren Index einer Tabelle. Die zustzlichen Register entsprechen den Sekundrindizes. Um eine where-Klausel auf einem nichtprimren Schlsselfeld zu untersttzen, kann ein sekundrer Index definiert werden. Eine Tabelle kann mehrere Sekundrindizes haben. Abbildung 5.2 zeigt einen sekundren Index auf ztxlfal-land1. Ein Index verkrzt die Zugriffszeiten enorm. In einer Tabelle, die eine Million Zeilen enthlt, kann ein select- Kommando auf eine Spalte mit gleichen Werten, die nicht mit einem Index versehen ist, ca. 500.000 Stze lesen, um den richtigen Satz zu finden. Im schlimmsten Fall wrden 1 Million Vergleiche gemacht werden.

Abbildung 5.2: Ein Sekundrindex ermglicht Ihnen eine schnelle Suche auch in anderen als Primrschlsselspalten. Wenn Sie einen Index hinzufgen, kann das System einen binren Suchvorgangsalgorithmus benutzen, um den Datensatz zu finden, nachdem es durchschnittlich 10 Datenstze vergleicht, im schlechtesten Fall 20 Datenstze! Das ist 50.000mal schneller. Aus diesem Grund sollten Sie sicherstellen, da Felder in einer where-Klausel immer von einem Index untersttzt werden. Dies kann durch bestehende Indizes geschehen, mit deren Hilfe Sie dann ihre Logik organisieren, oder indem Sie sekundre Indizes anlegen.

Indizes anzeigen
Jedes Register in R/3 hat ein einmaliges, ein bis drei Zeichen langes Kennzeichen oder Kennung. Der primre Index hat immer eine Kennung von 0 (Null). Ein sekundrer Index kann jede andere Zahl oder ein Alphazeichen sein. Starten Sie jetzt das ScreenCam How to Display Secondary Indexes. Um bestehende Sekundrindizes einer Datenbanktabelle anzuzeigen, folgen Sie dieser Prozedur: 1. Lassen Sie sich die Tabelle anzeigen. 2. Drcken Sie die Schaltflche Indizes auf der Drucktastenleiste. Wenn Sie diese Schaltflche nicht sehen, knnte Ihr Fenster zu schmal sein. Verbreitern Sie es, oder whlen Sie den Menpfad Springen>Indizes. 3. Wenn Sekundrindizes existieren, wird eine Auflistung von ihnen in einer Dialogbox angezeigt werden. Wenn keine existieren, wird eine entsprechende Meldung angezeigt. 4. Um einen Sekundrindex anzuzeigen, klicken Sie zweimal darauf (Abb. 5.3). Der Zustand des Index wird im Statusfeld angezeigt. Ob der Index in der Datenbank existiert, wird von einer Meldung, die unter dem Statusfeld erscheint, angezeigt. Im DB-Index-Namensfeld steht der Name des Index, wie er in der Datenbank abgelegt ist. Der Indexname in der Datenbank ist von dem Tabellennamen abgeleitet, gefolgt von Unterstrichen und der Indexkennung. Im unteren Teil des Fensters befinden sich die Felder, die die Indizes umfassen. Die Index-Sortierreihenfolge ist die gleiche wie die Feldreihenfolge.

Abbildung 5.3: Der Sekundrindex Z in der Tabelle ztxlfa1 wird von der Feldern mandt und land1 erstellt. Die vorherige Prozedur zeigt nur Sekundrindizes an. Der Index auf den primren Schlssel (Index 0) erscheint nicht in dieser Auflistung. Starten Sie jetzt das ScreenCam How to Display all Indexes. Um alle Indizes einschlielich des primren Indexes anzuzeigen, folgen Sie diesen Schritten: 1. Lassen Sie sich die Tabelle anzeigen. 2. Den Menpfad Hilfsmittel->Datenbank-Utility whlen. Das ABAP/4-Dictionary: Utility fr Datenbanktabellen wird angezeigt. 3. Den Menpfad Zustze->Datenbankobjekt->Anzeigen whlen. Eine Auflistung von allen Feldern in der Tabelle wird angezeigt. Darunter ist eine Auflistung von allen Indizes mit ihren Feldern, einschlielich des Index 0.

berlegungen, wann ein Index angelegt wird


Ein Index kann aus mehr als einem Feld bestehen. Um beispielsweise einen sekundren Index vom land1 und regio aufzubauen, hilft die Anweisung select * from ztxlfa1 where land1 = 'US' and regio = 'MA' schnell Vergleichszeilen zu finden. Wenn mehrere Indizes existieren (ein primrer und ein oder mehrere sekundre Indizes), benutzt das Relationale Datenbankmanagementsystem (RDBMS) einen Optimierer, um den effizientesten auszuwhlen. Um einen Index zu whlen, sieht sich der Optimierer die Feldnamen in der where-Klausel an und sucht dann einen Index, der die gleichen Feldnamen in der gleichen Reihenfolge hat, die die where-Klausel spezifiziert. Um sicherzustellen, da das System den Index whlt, den Sie mchten, spezifizieren Sie die Felder in der gleichen Reihenfolge, wie sie im Index erscheinen. Indizes und mandt Wenn eine Tabelle mit dem mandt Feld anfngt, sollten so auch ihre Indizes anfangen. Wenn eine Tabelle mit mandt anfngt und der Index nicht, wird der Optimierer den Index vermutlich nicht benutzen. Vergegenwrtigen Sie sich die automatische Mandantenpflege von OPEN SQL. Wenn die Anweisung select * from ztxlfa1 where land1 = `US ausgefhrt wird, lautet die wirkliche SQLAnweisung select * from ztxlfa1 where mandt = sy-mandt and land1 = 'US'. Sy-mandt enthlt den aktuellen Anmeldemandanten. Wenn Sie Zeilen aus einer Tabelle mit OPEN SQL selektieren, fgt das System sy-mandt automatisch der where-Klausel zu, die also nur die Zeilen aussucht, die zum gegenwrtigen Anmeldemandanten gehren. Wenn Sie einen Index auf einer Tabelle anlegen, die mandt enthlt, sollten Sie deshalb mandt auch mit im Index aufnehmen. Es sollte als erstes in den Index kommen, weil es im generierten SQL-Code immer zuerst erscheint. Fr den Rest dieser Darstellung nehmen Sie bitte an, da mandt in allen Indizes vorhanden ist. Programmierung einer select-Anweisung, um einen bestehenden Index zu benutzen Wenn Sie select * from ztxlfa1 where regio = 'MA' programmieren, mu ein Index mit mandt und regio vorhanden sein, damit der Optimierer ihn benutzen kann. Wenn Sie select * from ztxlfa1 where land1 = 'US' and regio = 'MA' programmieren, mu ein Index vorhanden sein, der mandt,land1 und regio enthlt. Der ideale Index wrde sie auch in dieser Reihenfolge beinhalten. Wenn es keine Indizes mit dieser Reihenfolge gibt, aber einen Index, der mit mandt und land1 anfngt, wrde der Optimierer ihn benutzen, um die ersten zwei Felder der where-Klausel zu vergleichen, dann einen Indexbereich zu durchsuchen und schlielich eine bereinstimmung zu regio zu finden. Das Durchsuchen eines Index-Bereiches stellt eine sequentielle Suche durch einen Teil eines Index dar.

Selektive Indizes und die Wirksamkeit von Indizes Wenn die where-Klausel mehr Felder als der Index enthlt, benutzt das System den Index, um den Suchvorgang zu verkrzen. Es liest dann Datenstze von der Tabelle und prft, ob bereinstimmungen zu finden sind. Wenn z.B. ein Index aus den Feldern F1 und F2 zusammengesetzt ist und Sie F1 = 1, F2 = 2 und F3 = 3 programmieren, wird das System nur die Indizes zur Lokalisierung von Datenstzen benutzen, in denen F1 = 1 und F2 = 2 ist. Es wird nur diejenigen Stze aus der Tabelle auslesen, um herauszufinden, welche Stze F3 = 3 haben. Somit ist der Index nur teilweise effektiv. Er wre effektiver, wenn er alle Felder enthielte: F1, F2 und F3. Ist der Index mit F3 effektiver? Es hngt davon ab, auf welche Weise die Daten in der Tabelle verteilt sind. Wenn die Kombination aus F1 und F2 sehr spezifisch ist (oder selektiv) und aus nur wenigen passenden Zeilen resultiert, ist der Index schon sehr effektiv. Wenn F3 in diesem Fall zum Index hinzukommt, drfte das wegen des Pflegeaufwandes beim Modifizieren der Tabelle nicht lohnend sein. Wenn die Kombination aus F1 und F2 aus einer Vielzahl von Zeilen resultiert, die aus der Tabelle selektiert wurden, ist der Index nicht sehr selektiv, und das Hinzufgen von F3 wrde wahrscheinlich die Leistungsfhigkeit des Systems erhhen und Resourcenverbrauch reduzieren. Wenn Sie Indizes anlegen oder modifizieren, versuchen Sie, kein Feld zu benutzen, das schon in einem Index vorhanden ist. Wenn ein prexistierendes Programm luft, besteht die Mglichkeit, da der Optimierer den neuen Index whlt, mit der Folge, da das Programm wahrscheinlich langsamer laufen wird. Richtlinien, um einen Index anzulegen Diese Richtlinien gelten als Faustregel, der Sie folgen sollten, wenn Sie einen Index anlegen:

Versuchen Sie, keine unntigen Indizes hinzuzufgen. Fragen Sie sich Kann ich so programmieren, um einen bestehenden Index zu benutzen? Vermeiden Sie sich berschneidende Indizes; mit anderen Worten, vermeiden Sie gleiche Felder in mehreren Indizes. Versuchen Sie, Indizes selektiv zu machen, aber nehmen Sie keine Felder, die die Selektivitt minimal erhhen.

Einen sekundren Index anlegen


Starten Sie jetzt das ScreenCam How to Create a Secondary Index. Um einen sekundren Index anzulegen, gehen Sie wie folgt vor: 1. Lassen Sie sich die Tabelle anzeigen. Sie sollten beim Dictionary anfangen: Tabellen/Strukturen: Anzeigen.

2. Whlen Sie den Menpfad Springen->Indizes oder drcken Sie auf Indizes. 3. Wenn schon Sekundrindizes existieren, wird eine Auflistung von ihnen in einer Dialogbox fr Tabelle xxxxx angezeigt. Drcken Sie auf die Schaltflche Anlegen, um einen Index anzulegen. 4. Wenn keine Sekundrindizes existieren, sehen Sie keine Auflistung. Statt dessen erscheint die Dialogbox Index Anlegen. 5. Tragen Sie eine Indexnummer in die Indexkennung ein. Kundenindizes sollten mit Y oder Z anfangen, obwohl dies das System nicht erzwingt. 6. Drcken Sie auf Weiter. Das ABAP/4-Dictionary: Index Tabelle xxx pflegen wird angezeigt. 7. Tippen Sie eine Beschreibung des Indexes im Textfeld ein. 8. In dem Feld Feldname geben Sie die Felder ein, aus denen der Index bestehen soll, und zwar in der Reihenfolge, in der sie sortiert werden. 9. Wenn alle Werte in diesen Feldern zusammengenommen eindeutig sein mssen, markieren Sie Unique-Index. 10. Sichern Sie. Die Werte in den Statusfeldern sind nun NEW und SAVED. Direkt darunter erscheint die Meldung existiert nicht in der Datenbank. Ebenso erscheint die Nachricht in der Statuszeile: Index xxx von Tabelle xxxxx wurde gesichert . 11. Drcken Sie Aktivieren. Das System generiert nun SQL-Anweisungen und sendet sie an das RDBMS, die die Indizes in der Datenbank anlegt. Bei Erfolg erscheint die Meldung aktiv und gesichert und darunter die Meldung Existiert in der Datenbank. Das DB-IndexNamensfeld wird den Namen des Index in der Datenbank enthalten. In der Statusleiste wird die Meldung erfolgreich aktiviert angezeigt. 12. Kehren Sie nun zum Dictionary zurck. Sie haben gelernt, wie man einen sekundren Index anlegt. Indizes verbessern die Leistungsfhigkeit der select-Anweisungen.

Wenn Sie die Checkbox Unique Index anhaken, wird die Einzigartigkeit der Feldkombinationen im Index garantiert; dies wird von der Datenbank untersttzt. Die Anweisung insert oder modify wird scheitern, wenn die Wertkombination in den

Indexfeldern schon in der Tabelle prsent ist.

Einen sekundren Index lschen


Starten Sie jetzt das ScreenCam How to Delete a Secondary Index. So gehen Sie vor, um einen Sekundren Index zu lschen: 1. Lassen Sie sich die Tabelle im Dictionary anzeigen. 2. Gehen Sie zu Springen->Indizes oder drcken Sie auf Indizes auf der Drucktastenleiste. Wenn Sie die Dialogbox zum Anlegen von Indizes sehen, existieren keine Sekundrindizes fr die Tabelle, so da Sie keinen lschen knnen. Wenn Sekundrindizes bereits existieren, wird eine Auflistung von ihnen in einer Dialogbox angezeigt, die Indizes zur Tabelle xxxxx genannt wird. 3. Klicken Sie zweimal auf den Index, den Sie lschen wollen. Das Bild Anzeigen Index erscheint. 4. Drcken Sie auf die Schaltflche ndern<->Anzeigen auf der Drucktastenleiste. Sie kommen in den nderungsmodus. 5. Den Menpfad Index->Lschen whlen. Eine Dialogbox erscheint, die Sie auffordert, die Lschanfrage zu besttigen. 6. Besttigen Sie, um zu lschen. Es erscheint die Meldung Index xxxxx gelscht. Die Besttigung in Schritt 6 hat zur Folge, da der Index aus der Datenbank gelscht wird. Wenn Sie zum Dictionary: Tab./Struk. zurckkommen, brauchen Sie die Tabelle nicht zu sichern. Beachten Sie auch, da Sie den Vorgang nicht rckgngig machen knnen, wenn Sie auf die Schaltflche Beenden drcken.

Bestimmen Sie, welcher Index benutzt wird


Wenn eine select-Anweisung ausgefhrt wird, versucht der Optimierer, den gnstigsten Weg der Indizierung zu whlen, um schnell an Daten zu kommen. Wie kann man erfahren, welcher Index aktuell in Benutzung ist, wenn es mehrere Indizes einer Tabelle gibt, oder ob er berhaupt benutzt wird? Um das zu erfahren, gibt es das SQL-Trace-Werkzeug.

Es kann nur jeweils eine Person zur Zeit das SQL-Trace-Werkzeug benutzen. Vergessen Sie nicht, den Trace nach Benutzungsende wieder auszuschalten. SQL Tracing verringert die Leistung des Systems. Starten Sie jetzt das ScreenCam How to Use SQL Trace to Determine the Index Used. Um zu bestimmen, welcher Index fr eine select-Anweisung benutzt wird, gehen Sie bitte so vor: 1. Schreiben Sie ein kleines ABAP/4-Programm, das nur die select-Anweisung enthlt. Bevor Sie weitermachen, prfen Sie, ob das Programm auch funktioniert. 2. ffnen Sie das Programm im Editor nur, um es auszufhren. 3. Erffnen Sie einen neuen Modus (System->Erzeugen Modus). 4. Rufen Sie die Transaktion ST05 im Transaktionsfeld auf (Syntax:/nst05) oder gehen Sie ber den Menpfad System->Hilfsmittel->SQL-Trace. 5. Zeigt das SQL-Trace Status Bild die Meldung Trace SQL is switched off an, gehen Sie zu Punkt 7. 6. Dieser Schritt beinhaltet die Meldung Trace SQL is switched on, gefolgt von der Benutzerkennung mit Datum und Uhrzeit desjenigen, der den Trace angeschaltet hat. Um weiterzumachen, mu der Trace erst ausgeschaltet werden. Wurde der Trace erst vor kurzem gestartet, so ist es mglich, da er arbeitet. Setzen Sie sich mit der Person in Verbindung, die den Trace angeschaltet hat. Sollte der Trace schon seit geraumer Zeit laufen, so ist vermutlich vergessen worden, ihn auszuschalten. Sie knnen ihn beruhigt abstellen. Ausgeschaltet wird der Trace, indem die Schaltflche Trace Off angeklickt wird. In der Statusleiste erscheint nun die Meldung Trace SQL is switched off. 7. Drcken Sie jetzt wieder auf die Schaltflche Trace On. Im Trace Request User Dialog erscheint Ihr Benutzername. Wenn nicht, mten Sie ihn jetzt eintragen. 8. Besttigen Sie mit OK. In der Statuszeile erscheint die Meldung Trace SQL is switched on. 9. Kehren Sie jetzt in den Programmeditiermodus zurck. 10. Drcken Sie (F8), um Ihr Programm zu starten. 11. Wenn Ihr Programm die Bearbeitung beendet hat, kehren Sie in das Trace Fenster zurck. 12. Beenden Sie den Trace (Trace off). Im Statusfeld erscheint die Meldung Trace SQL is switched off.

13. Drcken Sie jetzt auf die Schaltflche List Trace. Es erscheint ein neues Bild mit Daten. 14. Drcken Sie auf OK. Nach einer Weile sehen Sie die Anzeige Trace SQL: List Database Requests. 15. Geben Sie %sc in das Transaktionsfeld ein, und besttigen Sie mit Enter. Ein neues Dialogbild wird gezeigt. 16. Geben Sie nun den Namen der Tabelle ein, die sie analysieren wollen (das ist der Tabellenname aus Ihrer select-Anweisung). 17. Drcken sie Find. Sie bekommen eine Ergebnisliste angezeigt, der Tabellenname ist hervorgehoben. 18. Klicken Sie auf den ersten hervorgehobenen Tabellennamen. Sie kommen zum SQL-Trace: List Database Requests Bild zurck. Ihr Cursor ist auf der ersten Zeile positioniert, die den Tabellennamen beinhaltet. Rechts davon, in der Operationsspalte, sollten die Worte PREPARE, OPEN oder REOPEN stehen. 19. Drcken Sie jetzt auf Explain SQL auf der Drucktastenleiste. 20. Blttern Sie nun im Ergebnisbild. Der verwendete Index wird in Blau angezeigt. Sie haben jetzt gelernt, einen SQL-Trace auszufhren. Dies wird Ihnen helfen, zu erkennen, welcher Index benutzt wird.

Technische Einstellungen
Um die technischen Einstellungen einer Tabelle zu sehen, lassen Sie sich die Tabelle anzeigen. Drcken Sie dann auf die Schaltflche Technische Einstellungen auf der Drucktastenleiste (sollte die Schaltflche nicht zu sehen sein, ist Ihr Fenster vermutlich nicht gro genug. Vergrern Sie das Fenster, oder benutzen Sie den Menpfad Springen->Technische Einstellungen). Die Einstellungen ndern Sie, indem Sie auf ndern<->Anzeigen drcken. Das Bild Technische Einstellungen Pflegen erscheint wie in Abbildung 5.4.

Abbildung 5.4: In der Maske ABAP/4-Dictionary:Technische Einstellungen Pflegen knnen Sie die Datenart, die Grenkategorie und Pufferungsoptionen anlegen.

Datenarten
Die Datenart bestimmt, welche Tabelle welchem Tablespace zugeordnet ist. (Die Bezeichnung Tablespace gilt nur fr Oracle-Datenbanken. Fr Informix ersetzen Sie die Bezeichnung mit DB Space). Ein Tablespace ist eine physikalische Datei auf einer Datenplatte und wird zum Speichern von Tabellen benutzt. Jede Tabelle ist einem Tablespace zugeordnet. Tabellen mit hnlichen Eigenschaften sind gewhnlich in einem Tablespace gruppiert, d.h. Tablespaces sind administrative Einheiten, die vom Datenbankadministrator zum Verwalten der Datenbank benutzt werden. So werden z.B. Tabellen, die sehr schnell anwachsen, in einem Tablespace auf der Datenplatte gruppiert, der sehr viel Speicherplatz besitzt. Jede Datenart ist mit einem Tablespace assoziiert. Wenn Sie eine Tabelle aktivieren, wird die Tabelle in dem Tablespace angelegt, der mit der entsprechenden Datenart assoziiert ist. Wenn Sie die Datenart wechseln, whrend die Tabelle aktiv ist, passiert nichts; die Tabelle wird nicht in einen anderen Tablespace gelegt.

Die wichtigsten Datenarten sind:

APPL0 oder Stammdaten. Wenn Sie APPL0 (Stammdaten) whlen, deuten Sie damit an, da Sie erwarten, da die Tabelle nicht oft aktualisiert wird und langsam wchst. Sie werden in einen Tablespace mit hnlichen Tabellen gelegt. Kreditoren- und Kundentabellen sind Beispiele fr Stammdaten. APPL1 oder Bewegungsdaten. Whlen Sie APPL1 (Bewegungsdaten), deuten Sie damit an, da Sie erwarten, da die Tabelle oft aktualisiert wird und schnell wchst. Kundenbestellungen sind ein Beispiel fr Bewegungsdaten. APPL2 oder Customizing Daten. Wenn Sie APPL2 (Customizing Daten) whlen, deuten Sie damit an, da die Tabelleninhalte vor der Implementierung bestimmt werden und sich danach nicht mehr oft verndern. Prftabellen und ihre assoziierten Texttabellen, wie z.B. ztx005 und ztx005t, sind gute Beispiele fr Tabellen, die die Datenart APPL2 haben sollten.

Zustzlich zu diesen Kategorien kann es auch USER-Klassen geben. Diese werden von Ihrem DBA (Datenbankadministrator) angelegt, der Sie zur angemessenen Zeit anleiten wird, diese auch zu benutzen.

Weitere Datenarten knnen angezeigt werden, indem man auf den Pfeil nach unten am Ende des Datenartfeldes drckt und die Systemdatenarten auswhlt. Diese Klassen sollten nur von SAP benutzt werden; sie sind fr R/3-Systemtabellen gedacht, die z.B. Data Dictionary-Informationen und den Quellcode enthalten.

Grenkategorien
Mit dem Grenkategoriefeld bestimmen Sie die maximale Anzahl an Stzen, die Sie in dieser Tabelle erwarten. Sie stellen hier sowohl die Gre der Initial- und Next Extent-Werte ein, als auch die maximale Anzahl an Extents, die fr diese Tabelle erlaubt sind. Ein Extent ist eine bestimmte Menge an allokiertem Speicherplatz fr eine Tabelle. Der Initial Extent ist der Speicherplatz, der allokiert wird, wenn die Tabelle angelegt wird. Wenn eine Tabelle diesen Speicherplatz verbraucht hat, wird ein neuer Extent allokiert, was dazu fhrt, da der Speicherplatz der Tabelle vergrert wird. Die Grenkategorien gehen immer von 0 bis 4. Die Zahl der zu erwartenden Datenstze in jeder Grenkategorie wird sich aber abhngig von der Lnge der Stze fr jede Tabelle ndern. Whlen Sie eine angemessene Grenkategorie aus, basierend auf der maximalen Anzahl der zu erwartenden Stze fr die Tabelle.

Seien Sie beim Anlegen von Grenkategorien grozgig. Fr R/3 gilt: Nehmen Sie besser einen hheren Wert als einen zu niedrigen. Wenn die gewhlte Grenkategorie zu klein ist und die Tabelle strker anwchst als die Initialallokierung, wird die Datenbank einen neuen Extent anlegen. Sekundre Extents reduzieren die Leistungsfhigkeit des Systems und erfordern eine Tablespace-Reorganisation. Reorganisationen knnen bei groen Datenbanken uerst schwierig werden, insbesondere wenn vom System eine hohe Verfgbarkeit verlangt wird. Es ist wesentlich einfacher, Grenkategorien zu verkleinern als eine zu kleine zu vergrern.

Anzeigen der Extents einer Tabelle


Mit der folgenden Prozedur knnen Sie sich die Anzahl von Extents einer Tabelle anzeigen lassen. Starten Sie jetzt das ScreenCam How to Display the Number of Extents Used by a Table. So wird die Anzahl von Extents angezeigt: 1. Geben Sie den Transaktionscode DB02 ein (Geben Sie /ndb02 im Transaktionsfeld ein). Es erscheint das Bild: Database Performance tables and indices. 2. Gehen Sie auf Detailed Analysis. Die Dialogmaske Storage management: tables and indices erscheint. 3. Geben Sie jetzt den Namen der Tabelle ein und besttigen Sie. Es erscheint das Bild Tables and Indices: Analysis. Der Tabellenname taucht in der Liste auf. 4. Doppelklicken Sie auf den Tabellennamen. Sie sehen jetzt das Bild Tables and Indices: Indices of table ... 5. Whlen Sie Extents. 6. Besttigen Sie. Die Maske Tables and Indices:extents of ... erscheint. Sie enthlt eine Liste der Extents, ihre Tablespace Namen, Block Size, etc. Fr jeden Extent gibt es eine Zeile. Sie haben jetzt gelernt, die Anzahl von Extents einer Tabelle zu erkennen. Damit erhalten Sie Aufschlu darber, ob eine Tabelle reorganisiert werden mu oder nicht.

Puffern einer Tabelle


Wie schon im ersten Kapitel erwhnt, knnen Daten im RAM-Bereich des Applikationsservers

gespeichert werden. Dieser Mechanismus kann per Tabelle kontrolliert werden und wird ber die technischen Einstellungen jeder einzelnen Tabelle spezifiziert (s. Abb. 5.4). Wann immer eine Open SQL-Anweisung versucht, einen Datensatz zu lesen, wird zuerst immer der Puffer berprft, um zu sehen, ob die Tabelle im Puffer liegt. Wenn nicht, wird die Tabelle aus der Datenbank gelesen. Zeigen die Attribute der Tabelle an, da die Daten gepuffert werden sollen, wird der Datensatz im RAM-Bereich des Applikationsservers in Datenpuffern gespeichert. Wird der Datensatz spter noch einmal gebraucht, wird er aus dem Puffer gelesen statt aus der Datenbank. Diesen Proze soll Abbildung 5.5 veranschaulichen.

Abbildung 5.5: Daten knnen im RAM auf dem Applikationsserver gepuffert werden. Wenn Sie Daten puffern, erhhen Sie den Datendurchsatz in zwei wichtigen Schritten:

Die Programme, die gepufferte Daten benutzen, laufen schneller, da sie nicht aus der Datenbank geholt werden. Somit werden Wartezeiten bzw. Verzgerungen auf dem Netzwerk und der Datenbank reduziert. Andere Programme, die Zugriffe auf die Datenbank bentigen, laufen schneller, weil weniger Last auf der Datenbank liegt und weniger Netzverkehr herrscht.

Das Puffern einer Tabelle bedeutet fr eine select-Anweisung 10- bis 100mal schnellere Laufzeiten. So erscheint es erst einmal sinnvoll, jede Tabelle im System zu puffern. Da jedoch die Puffer im RAM-Bereich liegen, wird der Pufferplatz durch die Gre des RAMs begrenzt. Da es aber viel mehr Daten als RAM-Speicherplatz gibt, mssen Tabellen vernnftig gepuffert werden, um berlufe zu verhindern.. Wenn ein Puffer berluft, wird er auf eine Festplatte ausgelagert (geswapt), was dazu fhrt, da der Zugriffsvorteil durch Pufferung aufgehoben wird.

Tabellen, die numerische Datentypen im Primrschlssel enthalten, knnen nicht gepuffert werden. Es handelt sich hierbei um die Datentypen CURR, DEC, FLTP, INT1, INT2, INT4, PREC und QUAN im Data Dictionary.

Mit Hilfe der Transaktion ST02 knnen Sie sich die Puffer und die dazugehrigen Statistiken anschauen. Im Tune Summary-Bild heien die Daten Puffer Generic Key und Single Record. Ein Doppelklick auf jede Zeile zeigt eine detaillierte Analyse. Von hier aus knnen die Objekte im Puffer angezeigt werden, indem man Buffered Objects auf der Drucktastenleiste drckt. Der Basisberater ist verantwortlich fr das Beobachten der Puffer und mu verhindern, da Pufferengpsse das System verlangsamen. Bevor Sie mit dem Puffern von Tabellen beginnen, sollten Sie mit dem Basisberater gesprochen haben. Puffer-Synchronisation Wenn Sie zwei Applikationsserver benutzen, kann der gleiche Datensatz auf beiden gepuffert werden. Das wre kein Problem, solange die Stze nicht aktualisiert werden. Wird ein Datensatz aktualisiert, mu das dem anderen Applikationsserver gemeldet werden. Dieses wird von einem Proze initialisiert, der Puffersynchronisation. Diese Synchronisation wird in ein- bis viermintigen Intervallen vollzogen, abhngig von der Konfiguration Ihres Systems. Im Beispiel in Abbildung 5.6 ist ein Anwender auf Applikationsserver 1 und ein weiterer Anwender auf Applikationsserver 2 angemeldet. Anwender 1 liest einen Datensatz auf Applikationsserver 1. Der Datensatz ist jetzt im Puffer des Applikationsservers 1.

Abbildung 5.6: Schritt A: Benutzer 1 liest Datensatz 1 und bewirkt, da er in Applikationsserver 1 gepuffert wird. In Abbildung 5.7 liest Anwender 2 den gleichen Datensatz. Der Datensatz ist jetzt im Puffer des Applikationsservers 2. Auf beiden Applikationsservern ist jetzt der gleiche Datensatz im Puffer.

Abbildung 5.7: Schritt B: Benutzer 2 liest ebenfalls Datensatz 1 und bewirkt, da er in Applikationsserver 2 gepuffert wird. In Abbildung 5.8 aktualisiert Anwender 1 den Satz. Die Aktualisierung wird sowohl in der Datenbank

als auch im Puffer des Applikationsservers 1 gemacht. Der alte Datensatz befindet sich aber nach wie vor im Puffer von Applikationsserver 2. Jeder Eintrag im Synchronisationslog auf dem Datenbankrechner zeigt an, da der Datensatz 1 aktualisiert wurde.

Abbildung 5.8: Schritt C: Benutzer 1 aktualisiert Datensatz 1 und bewirkt, da er sowohl in der Datenbank als auch in Applikationsserver 1 aktualisiert wird. Abbildung 5.9 zeigt, da Anwender 2 den Datensatz 1 liest. Da sich noch der alte Satz im Puffer befindet, bekommt Anwender 2 alte Daten angezeigt. Anwender 2 wird nicht die aktuelle Fassung des Satzes sehen, solange nicht eine Puffersynchronisierung durchgefhrt wurde.

Abbildung 5.9: Schritt D: Benutzer 2 liest Datensatz 1 und erhlt alte Daten.

In Abbildung 5.10 analysiert der Synchronisationsproze, da das Synchronisationsintervall abgelaufen ist und beginnt mit einer neuen Synchronisation. Der Proze liest das Synchronisationsprotokoll auf dem Datenbankrechner und erkennt, da der Datensatz 1 synchronisiert werden mu. Der Proze kennzeichnet den Satz im Puffer als falsch. An dieser Stelle wird der Satz noch nicht aus der Datenbank im Puffer aktualisiert.

Abbildung 5.10: Schritt E: Die Puffersynchronisation macht Datensatz 1 in Applikationsserver 2 ungltig. Abbildung 5.11 zeigt Anwender 2, der den Datensatz 1 erneut lesen will. Jetzt erst wird der Satz aus der Datenbank im Puffer des Applikationsservers 2 aktualisiert, da er im Puffer als falsch gekennzeichnet wurde.

Abbildung 5.11: Schritt F: Benutzer 2 versucht erneut, Datensatz 1 zu lesen, aber dieser ist im Puffer als falsch markiert. Er wird aus der Datenbank heraus erneuert. Wie Sie in den Abbildungen 5.6 bis 5.11 gesehen haben, wird die Puffersynchronisation mit Hilfe eines Synchronisationsprozesses auf jedem Applikationsserver und auf einem Synchronisationsprotokoll durchgefhrt. In einem bestimmten Intervall prft jeder Synchronisationsproze das Synchronisationsprotokoll, um zu erkennen, ob irgendwelche gepufferten Daten aktualisiert wurden. Wenn ja, werden sie im Puffer als falsch gekennzeichnet. Beim nchsten Zugriff auf diese Daten werden sie aus der Datenbank erneuert. Der Basisberater bestimmt die Lnge des Puffersynchronisationsintervalls mit Hilfe des Parameters rdisp/bufreftime. Fr diese Anzeige benutzen Sie Transaktion RZ10 wie folgt:

Geben Sie im Transaktionsfeld RZ10 ein (/nrz10). Whlen Sie den Menpfad Springen->Profilwerte->Eines Servers. Doppelklicken Sie auf einen Applikationsserver. Es erscheint eine Liste mit aktuellen Parametern des ausgewhlten Applikationsservers. Geben Sie %sc im Transaktionsfeld ein. Es erscheint die Suchmaske. Geben Sie jetzt rdisp/buf im Suchfeld ein. Die Pufferparameter werden hervorgehoben angezeigt. Klicken Sie auf rdisp/bufreftime. Die Aktualisierungszeit (in Sekunden) wird angezeigt.

Aktualisierung der gepufferten Tabellen Wenn Sie eine Transaktion programmieren, die gepufferte Tabellen aktualisiert, sollten Sie immer sicher sein, da Sie sich auf der Datenbank befinden und aktuelle Informationen erhalten, bevor Sie dem Anwender erlauben, den Datensatz zu ndern. Das folgende Beispiel soll dies verdeutlichen. Im folgenden Paragraphen wird der Vollstndigkeit halber eine Satzsperre angenommen. Nehmen Sie an, Satz 1 enthlt die Felder F1 und F2. Anwender 2 liest als erster den Satz, mit der Folge, da der Satz im Puffer gespeichert wird (s. Abb. 5.12).

Abbildung 5.12: Schritt A: Benutzer 2 liest Datensatz 1 und bewirkt, da er auf dem Applikationsserver 2 gepuffert wird. Anwender 1, der nun den Datensatz aktualisieren will, sperrt und liest ihn (s. Abb. 5.13). Anwender 1 ndert F1, schreibt ihn auf die Datenbank zurck (s. Abb. 5.14) und entsperrt ihn. Zu diesem Zeitpunkt hat der Puffer auf Applikationsserver 1 immer noch die Originalkopie von Satz 1 mit dem Originalinhalt von F1. Wenn Anwender 2 Satz 1 sperrt und liest (aus dem Puffer), dann F2 ndert (s. Abb. 5.15) und den Satz auf die Datenbank zurckschreibt (sichert), wren die nderungen von Anwender 1 verloren (s. Abb. 5.16).

Abbildung 5.13: Schritt B: Benutzer 1 sperrt und liest Satz 1 und bewirkt, da er auf dem Applikationsserver 1 gepuffert wird.

Abbildung 5.14: Schritt C: Benutzer 1 aktualisiert Satz 1 und bewirkt, da dieser in der Datenbank und im Puffer des Applikationsservers aktualisiert wird. Die Sperre wird zurckgenommen. Benutzen Sie bypassing buffer in der select-Anweisung, wann immer Sie die aktuellste Information haben wollen (z.B.: select * from ztxlfa1 bypassing buffer). Sie

umgehen somit den Puffer, und die Daten werden direkt aus der Datenbank gelesen. Sie sollten beim reading for update immer so verfahren, d.h. einen Satz lesen, der aktualisiert und auf die Datenbank zurckgeschrieben werden soll.

Abbildung 5.15: Schritt D: Anwender 2 liest den alten Datensatz und sperrt ihn.

Abbildung 5.16: Schritt E: Anwender 2 sichert den Datensatz 1 in der Datenbank und berschreibt damit die nderung von Anwender 1. Beispielsweise in Schritt D: Wenn Anwender 2 mit bypassing buffer den Datensatz liest, wird immer die aktuellste Version des Satzes gelesen, und die nderungen von Anwender 1 gehen nicht verloren.

Bypassing buffer zum Aktualisieren ist am ausgewogensten, wenn man zwischen Sicherheit und Geschwindigkeit entscheiden mu. Wenn Sie jedoch sicher sind, da alle Aktualisierungen von einem einzigen Applikationsserver gemacht werden, mssen Sie nicht bypassing buffer programmieren. Aktualisierungen am Puffer vorbei verzgern den Aktualisierungsproze, weil ein Datenbankzugriff erfolgt. Wenn Sie schnelle Aktualisierungen brauchen und sich sicher sind, da es nur einen Applikationsserver gibt, sollten Sie diese Alternative benutzen. Reden Sie mit Ihrem Basisberater darber. Auflistung der Methoden fr das Puffern mit Aktualisierungen Sie knnen sich fr eine von drei Varianten des Pufferns von Tabellen entscheiden, die aktualisiert werden knnen. In der Reihenfolge vom besten zum schlechtesten Durchsatz:

Puffern Sie die Tabelle, und benutzen Sie nicht bypassing buffer. Vergewissern Sie sich, da nur ein Applikationsserver fr Datenbankaktualisierungen aktiv ist. Puffern Sie die Tabelle, und benutzen Sie bypassing buffer. Puffern Sie die Tabelle nicht.

Wenn eine Tabelle oft aktualisiert wird, benutzen Sie bypassing buffer nicht. Jede Aktualisierung veranlat eine Erneuerung der Puffer auf allen Applikationsservern bei der nchsten Synchronisation. In diesem Fall wrde das Puffern den ganzen Netzverkehr erhhen, statt ihn zu verringern. Puffertechniken

Die untere Hlfte des Bildes Technische Einstellungen (s. Abb. 5.4) enthlt die Mglichkeiten der Einstellungen. Wenn Sie eine Tabelle anlegen, haben Sie die gesamte Kontrolle darber. Um eine SAPeigene Tabelle zu ndern, bentigen Sie einen Zugangsschlssel seitens SAP. Sie knnen die Pufferung direkt beim Anlegen einstellen oder auch spter. Mit den folgenden Einstellungen schalten Sie die Pufferung ein oder aus:

Pufferung nicht erlaubt Pufferung erlaubt, aber ausgeschaltet Pufferung eingeschaltet

Whlen Sie Pufferung nicht erlaubt, wenn die Tabelle nie gepuffert werden soll, was in den

folgenden Fllen passieren kann:

Anwender mssen immer die aktuellen Werte beim Lesen und Schreiben von Datenstzen erhalten, wie z.B. bei der Real Time-Verarbeitung oder bei Brsennotierungen. Datenstze werden jedesmal beim Lesen mit aktualisiert, so da ein Puffern unwirksam werden wrde (s.u.).

Whlen Sie deshalb Pufferung erlaubt, aber ausgeschaltet oder Pufferung erlaubt, wenn die Anwender Verzgerungen von 1 bis 4 Minuten tolerieren. Vergessen Sie nicht, da diese Verzgerungen nicht existieren, wenn Sie bypassing buffer programmieren, um immer auf dem neuesten Stand zu sein.

Pufferung nicht erlaubt bei SAP-Tabellen heit, da Sie die Pufferung fr diese Tabellen ausgeschaltet lassen sollten. Wenn Sie die Pufferung einschalten, kann es zu Datenverlusten/Inkonsistenzen und unvorhersehbaren Operationen der R/3Anwendungen kommen. Puffertypen Wie Sie auf der Maske der Technischen Einstellungen in Abbildung 5.4 sehen, sind drei Arten der Pufferung mglich:

Volle Pufferung Generische Pufferung Einzelsatz-Pufferung

Sie whlen aus, welche Art der Pufferung Sie mchten. Es ist nur eine Mglichkeit erlaubt. Wenn Sie mehr als eine Art auswhlen wollen, bekommen Sie eine Fehleranzeige. Es gibt zwei Arten von Datenpuffern auf jedem Applikationsserver. Mit der Pufferart bestimmen Sie, welche benutzt wird. Beim Applikationsserver sind es:

der generische Satzpuffer der Einzelsatzpuffer

Der generische Satzpuffer wird TABL (Kurzform fr Tabelle) genannt. Der Einzelsatzpuffer heit TABLP (P steht fr engl. partial).
Volle Pufferung

Um volles Puffern zu aktivieren, kennzeichnen Sie Vollstndig Gepuffert. Wenn ein Versuch gemacht wird, Daten aus einer voll gepufferten Tabelle zu lesen, sieht das System im TABL Puffer nach. Wenn dort nichts gefunden wird, werden alle Zeilen aus der Datenbank in die TABL geladen (s. Abb. 5.17). Das passiert jedesmal, wenn eine select -Anweisung ausgefhrt wird, unabhngig davon, wie viele Stze mit der where- Klausel bereinstimmen. Auch wenn keine Stze bereinstimmen, werden alle in den Puffer geladen, wenn die Tabelle nicht schon gepuffert ist oder bei der Puffersynchronisierung ungltig gemacht wurde.

Abbildung 5.17: Alle Zeilen einer vollstndig gepufferten Tabelle werden in TABL geladen. Das Laden von TABL kommt nicht bei select single-Anweisungen vor, sondern nur bei select/endselect. Wenn die Tabelle voll gepuffert ist und eine select singleAnweisung ausgefhrt wird, werden keine Stze in TABL geladen. Ist die Tabelle bereits in TABL geladen worden, wird die select single-Anweisung daraus lesen. Whrend der Puffersynchronisation wird die gesamte Tabelle ungltig, wenn sich auch nur ein Datensatz gendert hat. Beim nchsten Lesezugriff wird die gesamte Tabelle wieder eingelesen. Volle Pufferung eignet sich fr kleine Tabellen, die sich selten ndern. Prftabellen und ihre Texttabellen, wie z.B. ztx005, ztx005t, ztx005s und ztxt005u, sollten voll gepuffert sein. Sie werden mit gltigen Initialwerten und Beschreibungen aufgesetzt und selten modifiziert.

Wenn eine select-Anweisung ausgefhrt wird, aber nur selten Daten in der Tabelle findet, kann volles Puffern den Tabellenzugriff wirksamer machen. Da die ganze Tabelle im Puffer ist, kann das System selbst bestimmen, ob die Datenstze existieren, bevor ein Zugriff auf der Datenbank erfolgt, was es zu vermeiden gilt.
Generischer Puffer

Beim generischen Puffer wird eine Gruppe von Stzen statt der gesamten Tabelle in TABL geladen. Zum Aktivieren markieren Sie Generische Pufferung erlaubt und geben eine Zahl n in das Feld Anzahl Schlsselfelder ein, so da die n linksbndigen Felder des Primrschlssels Stze gruppieren. Wird ein Satz gelesen, und n ist 1, werden alle Felder mit demselben Wert in dem ersten Feld des Primrschlssels in den Puffer geladen. Wird ein Satz gelesen, und n ist gleich 2, werden alle Stze mit dem gleichen Wert in den ersten zwei Feldern des Primrschlssels in den Puffer geladen. Das soll Abbildung 5.18 verdeutlichen.

Abbildung 5.18: Generischer Puffer: n mu kleiner sein als die Anzahl der Felder im Primrschlssel.

Ein anderes Beispiel: Nehmen Sie an, Sie whlen Generische Pufferung fr Tabelle ztxlfa1 und setzen eine 1 in das Feld Anzahl Schlsselfelder ein. Da das erste Feld mandt ist, werden alle Stze eines Mandanten zur gleichen Zeit in die Tabelle geladen.

Wenn Sie volle Pufferung fr eine mandantenabhngige Tabelle whlen (mit mandt in der ersten Spalte), wird das System automatisch die Tabelle allgemein mit n gleich 1 puffern. Das heit, wenn eine Tabelle gelesen wird, werden nur Stze mit der gleichen Mandantennummer in den Puffer geladen. Man kann das anhand der technischen Einstellungen nicht erkennen; sie sind einfach so eingestellt. Generische Pufferung pat auf alle Tabellen, in denen in der Regel auf Stze in Gruppen zugegriffen wird. Wenn auf einen Satz einer Gruppe zugegriffen wird, treten gewhnlich mehrere Zugriffe auf Stze der gleichen Gruppe auf. Meldet sich z.B. ein Anwender in Englisch an, so ist es sehr wahrscheinlich, da nur englische Beschreibungen von diesem und anderen Anwendern auf diesem Applikationsserver benutzt werden. Texttabellen, in denen Beschreibungen gespeichert sind, haben immer mandt und spras (den Sprachencode) in den ersten beiden Feldern. Deshalb ist generische Pufferung mit n gleich 2 am sinnvollsten.

Jede Satzgruppe im Puffer hat einen administrativen berhang. Versuchen Sie, eine mglichst groe Anzahl von Stzen pro Gruppe anzulegen. Eine voll gepufferte Tabelle ist effizienter, wenn bei generischer Pufferung viele Stze in vielen kleinen Gruppen zusammengefat sind. Ist whrend der Puffersynchronisation eine Tabelle generisch gepuffert und ein Datensatz im Puffer ungltig, werden alle Stze dieser Gruppe ungltig. Beim nchsten Lesezugriff auf diese Gruppe wird die gesamte Gruppe neu eingelesen.
Einzelstze gepuffert

Das Markieren von Einzelstze gepuffert aktiviert die Einzelsatzpufferung. Bei dieser Art der Pufferung liest select single einen Satz in den Einzelsatzpuffer TABLP, wie in Abbildung 5.19 gezeigt. Diese Pufferart puffert Stze nur, wenn eine select single- Anweisung ausgefhrt wird. Weder liest noch ldt select/endselect TABLP.

Abbildung 5.19: select single ldt einen Datensatz nach dem anderen in den TABLP Puffer, wenn Einzelstze puffern aktiviert ist. Wenn z. . Tabelle ztxlfa1 eine Einzelsatzpufferung hat, wird die Anweisung select * from ztxlfa1 where lifnr = 'V1' den TABLP Puffer dazu veranlassen, nach Satz V1 zu suchen. Wird er hier gefunden, wird die Kopie benutzt. Wird er nicht gefunden, wird er aus der Datenbank in Tabelle TABLP geladen. Wird ein Satz nicht gefunden, wird ein Eintrag im Einzelsatzpuffer gemacht. Der Eintrag zeigt an, da der Satz nicht in der Datenbank existiert. Sollte der Satz ein nchstes Mal gelesen werden, kann der Puffer dazu benutzt werden, die Anfrage zu lsen, und es ist kein Datenbankzugriff ntig. Nehmen Sie z.B. an, Kreditor X1 existiert nicht in der Datenbank. Beim Ausfhren von select single * from ztxlfa1 where lifnr = 'X1' wrde ein Eintrag im Einzelsatzpuffer angelegt, der anzeigt, da der Satz X1 nicht in der Datenbank existiert. Beim nchsten Zugriff auf X1 erkennt das System anhand des Puffers, da er nicht existiert und braucht somit nicht auf die Datenbank zuzugreifen. Einzelsatzpufferung ist fr sehr groe Tabellen mit einer geringen Anzahl an oft gelesenen Stzen angemessen. Damit die Einzelsatzpufferung funktioniert, mu der Satz mit select singleAnweisungen gelesen werden. Zusammenfassung von Puffer-Arten

Es gibt zwei Arten von Puffern: TABL (den generischen Satzpuffer) und TABLP (den Einzelsatzpuffer). Dafr gibt es auch zwei Varianten der select-Anweisung: select und select single. Die select-Anweisung ldt Tabelle TABL, und die select single-Anweisung ldt TABLP. Beim Lesen benutzt select nur TABL; es ignoriert TABLP. Select single liest beide Puffer. Dieses Verhalten sehen Sie zusammengefat in Abbildung 5.20. Denken Sie daran, da ein Satz nur in einem Puffer zur selben Zeit existieren kann, da eine Tabelle nur ber eine Pufferart verfgt.

Abbildung 5.20: Wie die select-Anweisung mit den Puffern arbeitet

Um den Inhalt von TABL und TABLP zu lschen, knnen Sie im Transaktionsfeld /$tab eingeben. Diese Methode kann man benutzen, nachdem der Puffer ausgeschaltet worden ist, um vor dem Testen von Programmlaufzeiten die Pufferinhalte zu lschen. Puffer-Auslagerung Ist TABLP voll, und ein neuer Satz mu geladen werden, wird der lteste Satz (der Satz, der am lngsten in der Tabelle steht, ohne da auf ihn zugegriffen wurde) gelscht, um Platz fr den neuen zu machen. Alte Stze werden in TABL nicht aufgegeben, wenn neue dazu kommen. Statt dessen wird die gesamte Tabelle periodisch aus dem Puffer entladen. Die Zeitspanne zwischen den Entladungen und welche Tabellen entladen werden, wird durch einen sogenannten Caching Algorithmus von R/3 bestimmt. Dieser komplexe Algorithmus basiert auf dem Verbrauch von Speicherplatz einer Tabelle im Puffer im Gegensatz zur Anzahl von Lesezugriffen auf diese Tabelle in der vorhergehenden Periode, der Menge an Freiplatz, der im Puffer zur Verfgung steht, und der aktuellen Zugriffsqualitt des Puffers. Die Entscheidung, ob gepuffert werden soll

Das Ziel der Pufferung ist die Reduktion von Datenbankzugriffen und Netzverkehr von der Datenbank zum Applikationsserver. Der folgende Abschnitt listet Szenarios mit gepufferten Tabellen auf, die nicht aktualisiert werden, einhergehend mit Pufferung und Indizierung.
Gepufferte Tabellen, die nicht aktualisiert werden

Wird auf eine Tabelle hufig zugegriffen, ohne da diese hufig aktualisiert wurde, sollte sie gepuffert werden. Sie sollten mit Ihrem Basisadministrator sprechen, ob gengend Platz im Puffer ist, um Ihre Tabelle mit aufzunehmen. Wenn dies nicht der Fall ist und auf Ihre Tabelle oft zugegriffen wird, sollte es mglich sein, mehr RAM fr die Allokierung von Puffern zur Verfgung zu stellen. Alternativ kann man die Tabellen aus dem Puffer nehmen, auf die nicht so hufig zugegriffen wird wie auf Ihre Tabelle.
Pufferung und Indizes

Stze in einem Puffer haben ihren eigenen Primrindex, der im RAM-Bereich gebildet wird. Werden Stze bentigt, wird der Index benutzt, um sie im Puffer zu lokalisieren, und zwar auf die gleiche Art, wie der Primrindex in der Datenbank benutzt wird, um Stze in einer Tabelle zu lokalisieren. Es werden jedoch keine Sekundrindizes im Puffer angelegt, genauso wenig wie die Sekundrindizes aus der Datenbank dazu benutzt werden, auf gepufferte Daten zuzugreifen. Sie sollten deshalb beim Programmieren einer select...where-Anweisung in eine gepufferte Tabelle auf die Primrschlsselfelder in der where-Klausel zurckgreifen. Beginnen Sie mit dem ersten Feld des Primrschlssels und benutzen Sie davon so viele wie mglich. Wenn das erste Feld des Primrschlssels in der where-Klausel fehlt (wenn man mandt nicht mitzhlt), wird ein voller Suchlauf in der gepufferten Tabelle durchgefhrt. Ein Beispiel: wenn Tabelle ztxlfa1 voll gepuffert ist, wird die Anweisung select * from ztxlfa1 where lifnr = 'V1' vom Primrindex des Puffers untersttzt. Select * from ztxlfa1 where land1 = 'CA' wird dagegen zu einem gesamten Durchlesen der gepufferten Tabelle fhren. Da man nicht in der Lage ist, Sekundrindizes zu benutzen, auch wenn groe Tabellen voll gepuffert werden, die Sekundrindizes haben, fhrt das zu einem Nebeneffekt. Eine so gepufferte Tabelle wird select-Anweisungen auf dem Primrindex beschleunigen, wird aber select auf Sekundrindizes verlangsamen. Eine select-Anweisung auf einer groen Tabelle (Grenkategorie 1 oder grer), die gnzlich mit Sekundrindizes auf der Datenbank versehen ist, kann im Puffer langsamer laufen, da hier Sekundrindizes nicht untersttzt werden. Um wievieles langsamer, hngt von der Anzahl der Datenstze in der Tabelle ab. Um dieses Problem zu kompensieren, vermeiden Sie den Puffer und benutzen sie Sekundrindizes, indem Sie bypassing buffer Ihrer select-Anweisung hinzufgen, damit ein Sekundrindex benutzt werden kann. Tabelle TSTC z.B. enthlt ber 12000 Zeilen. Ihre Grenkategorie ist 1. Sie ist voll gepuffert und hat einen Sekundrindex auf dem Feld pgmna. Messungen haben gezeigt, da die Anweisung select * from tstc bypassing buffer where pgmna = 'ZTXTEST' im Durchschnitt 18mal schneller luft als select * from tstc where pgmna = 'ZTXTEST', obwohl die Tabelle

voll gepuffert ist. Das erste select-Kommando wurde in der Datenbank aufgelst durch die Benutzung des Sekundrindex auf pgmna; die zweite select-Anweisung fhrte eine komplette Durchsuchung der Tabelle im Puffer aus (full table scan).

Seien Sie uerst vorsichtig, wenn Sie bypassing buffer auf eine gepufferte Tabelle durchfhren, die auch aktualisiert wird. Wenn Sie es in einer selectAnweisung benutzen, sollten Sie es in allen anderen select-Anweisungen fr diese und alle weiteren zu dieser in Beziehung stehenden Tabellen in einer einzigen Transaktion tun. Wenn nicht, werden Sie gepufferte und ungepufferte Daten mischen. Zusammenfassung Pufferung Die folgenden Punkte sollten Sie sich ber Pufferung und Indizierung merken:

Das Puffern von Tabellen beschleunigt Ihre Programme. Wenn die Pufferung allerdings gedankenlos benutzt wird, kann sie den gegenteiligen Effekt haben. Die Puffer sitzen im RAM-Bereich der Applikationsserver; somit ist der Platz an Pufferkapazitt limitiert. Eine Tabelle, auif die nicht oft zugegriffen wird, sollte nicht gepuffert werden, um Pufferplatz zu sparen und einen berlauf zu verhindern. Tabellen, die klein sind (Grenkategorie 0), auf die oft zugegriffen wird und die selten aktualisiert werden, sollten voll gepuffert werden. Tabellen, die eine Grenkategorie grer als 0 haben und oft mit select single im Zugriff sind, sollten Einzelsatzpufferung benutzen. In einer Tabelle, in der Stze aus einer Gruppe zusammen im Zugriff sind, sollte man generische Pufferung benutzen. Ein partieller Primrschlssel mu die Gruppe identifizieren. Tabellen, die oft aktualisiert werden, sollten nicht gepuffert werden, wenn Sie mehrere Applikationsserver im Einsatz haben. Wenn Sie puffern, wird das die Netzlast erhhen, weil die Daten jedesmal in den Puffer des Applikationsservers zurckgeladen werden, wenn sich etwas ndert. Wenn eine Tabelle gepuffert ist, benutzen Sie bypassing buffer um die jngsten Daten zu fassen zu kriegen, bevor Sie aktualisieren. Benutzen Sie, wenn mglich, die Felder des Primrindex in einer where-Klausel auf gepufferte Tabellen. Wenn das nicht mglich und die Tabelle recht umfangreich ist (Grenkategorie grer als 0), fgen Sie bypassing buffer hinzu und benutzen Sie Felder, die vom Sekundrindex in der Datenbank untersttzt werden.

Zusammenfassung

Ein Index ist eine Kopie von spezifischen Spalten einer Tabelle, sortiert in aufsteigender Folge.

Indizes beschleunigen select-Anweisungen. Eine select-Anweisung sollte immer von Indizes untersttzt werden. Es knnen auch Sekundrindizes auf einer Tabelle angelegt werden. Legen Sie welche an, wenn Sie die Felder eines existierenden Index in Ihrer where-Klausel nicht benutzen knnen. Die Felder in Ihrer where-Klausel sollten in Ihrem Programm in der gleichen Reihenfolge aufgelistet werden, wie sie im Index erscheinen. Mit Hilfe der Transaktion ST05 knnen Sie sich anzeigen lassen, ob ein - und wenn ja, welcher - Index von einer select-Anweisung benutzt wird. ber die technischen Einstellungen einer Tabelle haben Sie Kontrolle ber Datenart, Grenkategorie und Pufferart sowie darber, ob die Protokollierung eingeschaltet ist. Die Datenart bestimmt, in welchem Tablespace die Tabelle angelegt werden soll. Die gebruchlichsten Arten sind APPL0 (Stammdaten) und APPL1 (Bewegungsdaten). Die Grenkategorie bestimmt die Gre der Initial- und Next-Extents sowie deren hchstens erlaubte Anzahl einer Tabelle. Sie sollten so gewhlt werden, da der Initial-Extent gro genug ist, um die gesamte Tabelle zu beinhalten. Sekundr- Extents verringern die Systemleistung und machen eine Reorganisation notwendig. Pufferung beschleunigt den Datenzugriff durch Speicherung der am meisten benutzten Daten im RAM-Bereich des Applikationsservers. Da der RAM-Speicher begrenzt ist, sollten Tabellen vernnftig gepuffert werden. Nicht erlaubt Programmieren Sie keine select-Anweisung ohne einen Index. Whlen Sie keine Grenkategorie, die eine Tabelle dazu zwingt, Sekundr-Extents anzulegen.

Erlaubt Plazieren Sie die Felder in der where-Klausel in der gleichen Reihenfolge wie sie im Index erscheinen. Seien Sie grozgig, wenn Sie eine Grenkategorie anlegen. Benutzen Sie bypassing buffer, wenn Sie einen Satz zum Aktualisieren aus einer gepufferten Tabelle lesen.

Fragen & Antworten


Frage: Ich bekomme einige von den Masken, die Sie erwhnen, nicht angezeigt. Ich erhalte die Fehlermeldung: Keine Berechtigung fr Transaktion xxxx. Wie kann ich weitermachen? Antwort: Fragen Sie Ihren Berechtigungsadministrator. Frage: Wenn ich mir mit Hilfe von ST02 die Puffer ansehe, werden viele andere Puffer angezeigt. Wofr sind die alle?

Antwort: Es gibt nur zwei Datenpuffer innerhalb der groen Zahl von Puffern auf dem Applikationsserver. Die sogenannten nametabs (Tabellen, Laufzeit, Objekte) sind alle gepuffert, genauso wie die Programme, Mens und Werkzeugleisten (auch als CUA-n oder GUI-Status bekannt), Masken und Kalender. Alle diese Puffer sind hier aufgelistet.

Workshop
Der Workshop bietet Ihnen zwei Mglichkeiten, Ihr gelerntes Wissen umzusetzen. Im Prfungsabschnitt werden Fragen gestellt, die Ihnen helfen sollen, Ihr Verstndnis fr die besprochene Thematik zu vertiefen. Der bungsabschnitt ermglicht Ihnen, Erfahrungen zu sammeln, indem Sie das Gelernte anwenden. Antworten auf die Prfungsaufgaben und die bungen knnen Sie im Anhang B (Antworten zu Kontrollfragen und bungen) finden.

Kontrollfragen
1. Kann ich irgendwo den genauen Index spezifizieren, den ich einer select-Anweisung mitgeben will? 2. Kann ich Sekundrindizes auf SAP-Tabellen anlegen und sie puffern? 3. Kann ich feststellen, ob mein Programm mit gepufferten Tabellen schneller luft als mit ungepufferten?

bung 1
Welche Datenart haben die Tabellen MARA, LFA1 und KNA1? Und welche Grenkategorie gilt fr MARA, LFA1 und KNA1?

Ein Imprint des Markt&Technik Buch- und Software-Verlag GmbH. Elektronische Fassung des Titels: ABAP/4 in 21 Tagen, ISBN: 3-8272-2016-X

Woche 1

Tag 6 Das Data Dictionary , Teil 4


Kapitelziele
Wenn Sie dieses Kapitel durchgearbeitet haben, sollten Sie folgendes beherrschen:

aktive und berarbeitete Versionen von DDIC-Objekten anzeigen und vergleichen das Datenbank-Utility benutzen, um Konsistenzprfungen durchzufhren, datenbankabhngige Tabelleninformation anzuzeigen, Tabellen in der Datenbank zu lschen und wieder anzulegen.

Automatische Tabellenhistorie und nderungsbelege


nderungen an Daten in Tabellen knnen automatisch aufgezeichnet werden. Solch ein automatisches Protokollieren von nderungen nennt man automatische Tabellenhistorie. Um das Aufzeichnen einzuschalten, markieren Sie mit einem Klick das Feld: automatische Tabellenprotokollierung im Fenster: Technische Einstellungen (siehe Abb. 5.4). Falls es nicht bereits geschehen ist, mu der Basisberater auch im Systemprofilparameter rec/client die Mandantennummer(n) angeben, fr die die Protokollierung durchgefhrt werden soll.

Um die rec/client-Einstellungen in Ihrem System anzuzeigen, folgen Sie den Anweisungen im Abschnitt Puffer Synchronisation von Tag 5.

nderungsbelege
Fr jedes Einfgen, ndern oder Lschen in einer Tabelle, fr das die automatische Tabellenhistorie eingeschaltet ist, wird ein Satz in der Tabelle dbtabprt erzeugt. Jeder einzelne Satz heit

nderungsbeleg. Jeder nderungsbeleg enthlt das Datum und die Zeit der nderung, den Namen des Benutzers, der die nderung durchfhrte, den Transaktionscode und den Programmnamen, die zum ndern benutzt wurden, und den Typ der durchgefhrten nderung. Der nderungstyp ist INS, wenn der Satz eingefgt wurde, UPD, wenn der Satz gendert wurde oder DEL, wenn der Satz gelscht wurde. Mit der Transaktion SCU3 oder OY18 (siehe Abb. 6.1) knnen Sie die nderungsbelege anzeigen und mit den aktuellen Werten in der Tabelle vergleichen. Es gibt keinen Unterschied zwischen diesen beiden Transaktionscodes; sie starten beide dasselbe Programm.

Abbildung 6.1: Die Transaktion Tabellenhistorie zeigt vernderte Dokumente von Tabellen an, wenn automatische Tabellenhistorie ermglicht ist. Vom Fenster: Tabellenhistorie -Auswhlen Funktion, knnen Sie folgende Funktionen durchfhren:

Um die nderungsbelege des aktuellen Tages anzuzeigen, whlen Sie den Auswahlknopf: nderungsbelege Tagesauswertung und drcken die Schaltflche Liste. Eine Liste mit allen nderungen des aktuellen Tages wird angezeigt. Um ber das Datum oder den Tabellennamen nach nderungsbelegen zu suchen, whlen Sie den Auswahlknopf: nderungsbelege: Selektiv, und drcken Sie die Schaltflche Liste. Das Fenster: Auswertung der Tabellen Protokoll Datenbank wird angezeigt. Tippen Sie Ihre Suchkriterien ein, und drcken Sie die Schaltflche Ausfhren. Eine Liste von nderungsbelegen fr die

angegebenen Kriterien wird angezeigt. Oben auf der Liste steht eine Zusammenfassung von Informationen ber die Liste, dann ein Abschnitt Bemerkungen und dann die Analyse. Fr jede Tabelle werden zuerst die Felder angezeigt (siehe Abb. 6.2), und dann folgen die zugehrigen nderungsbelege (siehe Abb. 6.3).

Abbildung 6.2: Die Felder der Tabelle HRP1007 erscheinen vor den nderungsbelegen und zeigen die Feldnamen, den Primrschlsselindikator, den Datentyp und die Lnge sowie den Spaltennamen und ihre Beschreibung an.

Abbildung 6.3: Die nderungsbelege von Tabelle HRP1007 erscheinen nach der Feldliste. Der Primrschlssel jedes Datensatzes erscheint zuerst (in trkis), gefolgt von den Daten (in wei).

Um die Anzahl der nderungsbelege zu einem gegebenen Datum oder einer Tabelle anzuzeigen, drcken Sie die Schaltflche Anz. nderungsbelege (Auswahl). Um eine Liste der Tabelle anzuzeigen, fr die die automatische Historie eingeschaltet ist, whlen Sie den Auswahlknopf: Tabellen mit Historienverwaltung, und drcken Sie die Schaltflche List. Diese Liste zeigt alle Tabellen, deren Feld: nderungen protokollieren markiert ist. Um die Gesamtanzahl nderungsbelege in der Tabelle dbtabprt anzuzeigen, drcken Sie die Schaltflche: Beleganzahl gesamt in der Drucktastenleiste. Um Feldwerte in nderungsbelegen mit den aktuellen Feldwerten einer Tabelle zu vergleichen, whlen Sie den Auswahlknopf: Historie<->Aktuell und drcken die Schaltflche Vergleichen. Das Fenster: Tabellenhistorie wird angezeigt. Geben Sie Suchkriterien fr die nderungsbelege ein, und drcken Sie die Schaltflche Vergleichen. Das Fenster: Tabellenhistorie - Vergleich mit aktuellem Stand wird angezeigt. Der Primrschlssel jedes Satzes erscheint links, und die Unterschiede erscheinen rechts (siehe Abb. 6.4).

Abbildung 6.4: Hier werden die Daten in dbtabprt mit den aktuellen Inhalten jedes Datensatzes verglichen. Der Primrschlssel erscheint in trkis auf der linken Hlfte des Fensters. Die rechte Hlfte des Fensters ist aufgeteilt in die aktuellen Werte und die Historienwerte. Graue Linien zeigen an, da ein Unterschied existiert. Um die Bedeutung der Zeichen in der Spalte ganz links anzuzeigen, positionieren Sie den Cursor darauf, und drcken Sie (F1). Dieser Report zeigt, da in der Tabelle EKPA vier Stze existieren, aber keine Historienstze dazu.

Wann Sie die automatische Tabellenhistorie benutzen sollten


Die automatische Tabellenhistorie sollte fr Tabellen benutzt werden, die kritische Informationen enthalten und bei denen jede nderung lckenlos verfolgt werden mu, unabhngig vom benutzten nderungsprogramm. Unglcklicherweise wird das ndern der Tabelle verlangsamt, da in die dbtabprt ein Satz fr jeden genderten Satz geschrieben wird. In den meisten Fllen, in denen eine Tabellenhistorie gebraucht wird, stellen die nderungsbeleg-Objekte eine schnellere und effizientere Alternative dar und sollten daher statt dessen benutzt werden. Mehr Information ber nderungsbelegobjekte erhalten Sie in der R/3-Bibiliothek (Menpfad Hilfe->R/3-Bibliothek, Basis, ABAP/4 Workbench, Erweiterte Anwendungsfunktionsbibliothek Anwendungen, nderungsbelege).

Wenn der Primrschlssel Ihrer Tabelle grer ist als 86 Bytes oder der Rest der Zeile lnger als 500 Bytes, knnen Sie die automatische Tabellenhistorie nicht verwenden. Sie erhalten eine Fehlermeldung, wenn Sie versuchen, die Tabelle zu aktivieren, und nderungen werden nicht angenommen. Der Grund fr die Beschrnkungen liegt in der Tabelle dbtabprt. Das Feld vkey enthlt den Schlssel des Datensatzes, der gendert wurde, und ist 86 Bytes lang. Das Feld vdata enthlt den Rest des Datensatzes und ist 500 Bytes lang.

Zusammenfassung der Technischen Einstellungen


Die Technischen Einstellungen fr Pufferung, Tabellenerweiterungen und automatisches Aufzeichnen genderter Information:

Die Datenklasse bestimmt den Tablespace, in welchem die Tabelle angelegt wird. Der Datenbankadministrator benutzt Tablespaces, um die Datenbank zu organisieren und zu warten. Wenn man den richtigen Tablespace whlt, macht dies die Datenbankadministration leichter, erhht den Systemdurchsatz und verbessert bis zu einem gewissen Grad sogar die Systemverfgbarkeit, da die Datenbank normalerweise fr Reorganisationen offline geschaltet wird. Die Grenkategorie bestimmt die Gre des initial extents und next extents, ebenso die Anzahl mglicher next extents. Wird die Nummer zu klein gewhlt, verursacht dies das Hinzufgen eines oder mehrerer zustzlicher extents. Eine Tabelle, die sich ber mehrere extents erstreckt, verlangsamt den Systemdurchsatz, erhht die Datenbankwartung und verringert die Systemverfgbarkeit, weil die Datenbank fr Reorganisationen offline geschaltet wird. Pufferung erhht den Systemdurchsatz, indem die Daten lokal auf dem Applikationsserver zwischengespeichert werden. Wenn dies sauber funktioniert, sind weniger Datenbankzugriffe ntig, weil die meistgelesenen Daten im Hauptspeicher auf dem Applikationsserver abgelegt sind. Gute Kandidaten fr eine Pufferung sind Tabellen, die selten gendert und oft gelesen werden. Wird die automatische Protokollierungsfunktion einer Tabelle aktiviert, bewirkt das, da bei jedem ndern der Tabelle ein nderungsbeleg erzeugt wird. Diese Funktion verlangsamt Tabellennderungen, und wird daher nur fr Tabellen mit kritischen Daten benutzt. Fr nichtkritische Tabellen sollten nderungsbelegobjekte benutzt werden.

berarbeitete und aktive Versionen


Es knnen zwei Versionen einer Tabelle (oder einem anderen DDIC-Objekt) existieren: Die berarbeitete Version und die aktive Version. Wenn Sie eine Tabelle ndern und die Schaltflche: Sichern besttigen bedienen, ohne Aktivieren zu drcken, haben Sie eine berarbeitete Version der Tabelle mit Ihren nderungen erzeugt. Die aktive Version existiert ebenfalls noch; es ist die letzte Version, die aktiviert wurde. ABAP/4- Programme nutzen nur aktive Versionen. Das Vorhandensein berarbeiteter Versionen beeinflut sie nicht.

Es gibt die berarbeitete Version, damit Sie eine nderung vorbereiten knnen, bevor sie gebraucht wird, und diese dann aktivieren, wenn sie bentigt wird. Sie ermglicht Ihnen auch, viele Objekte zu ndern und dann alle gleichzeitig zu aktivieren. Wenn Sie sie aktivieren, werden die aktuellen aktiven Versionen gelscht, und Ihre berarbeiteten Versionen werden aktiv und ersetzen diese.

Abbildung 6.5: Wenn eine Tabelle angezeigt wird, die eine berarbeitete Version hat, knnen Sie diese sehen. Die berarbeitete Version wird, falls vorhanden, sichtbar , wenn Sie eine Tabelle anzeigen (das Statusfeld wird berarbeitet enthalten). Die Drucktastenleiste besitzt eine Schaltflche Aktive Version (siehe Abb. 6.5). Wenn Sie sie drcken, wird die aktive Version angezeigt, und die Schaltflche auf der Symbolleiste wird sich in berarbeitete Version ndern, so da Sie sie erneut drcken und zur vorigen Anzeige zurckkehren knnen. Starten Sie nun das ScreenCam How to Compare Revised and Active Versions. Vergleichen von berarbeiteten und aktiven Versionen: 1. Auf dem Fenster: Dictionary: Tabelle/Struktur: Anzeigen Feld, whlen Sie den Menpfad Hilfsmittel>Versionsverwaltung. Das Fenster Objektversionen wird angezeigt. Die erste Zeile enthlt das Word mod.. Dies ist die berarbeitete Version. Die nchste Zeile enthlt akt.. Dieses ist die aktive Version.

2. Um die beiden Versionen zu vergleichen, markieren Sie beide durch Einfachklick, und drcken Sie die Schaltflche Vergleichen. Das Fenster Versionsvergleich fr Tabellen wird angezeigt. Die genderten Zeilen werden am rechten Rand markiert. <- nur aktiv bedeutet, da die Zeile nur in der aktiven Version existiert. <- nur modifiziert bedeutet, da die Zeile nur in der berarbeiteten Version existiert. 3. Um eine Zusammenfassung der nderungen zu sehen, drcken Sie die Schaltflche Delta Anzeige auf der Drucktastenleiste. Die Liste wird angepat und enthlt nur noch die Unterschiede zwischen den zwei Versionen.

Zustzliche Versionen
Neben den aktiven und berarbeiteten Versionen knnen Sie auch temporre Versionen erzeugen. Dazu whlen Sie den Menpfad Tabelle->Version ziehen. Die Meldung: Temporre Version vom aktiven Objekt gezogen erscheint am unteren Fensterrand. Diese temporre Version bleibt erhalten, bis die Tabelle in das Produktionssystem transportiert wird. Um die neue Version anzusehen, whlen Sie den Menpfad Hilfsmittel->Versionsverwaltung. Die Version mit der hchsten Nummer ist diejenige, die Sie gerade erstellt haben.

Lschen einer berarbeiteten Version


Um eine berarbeitete Version zu lschen ohne sie zu aktivieren, mssen Sie zuerst eine temporre Version aus der aktiven Version erzeugen und sie dann zurckladen, wie es im folgenden Verfahren gezeigt wird. Starten Sie nun das ScreenCam How to Discard a Revised Version. Um eine berarbeitete Version zu lschen und die aktive Version wiederherzustellen, gehen Sie so vor: 1. Auf dem Fenster:Dictionary: Tabelle/Struktur: Feld ndern whlen Sie den Menpfad Tabelle->Version ziehen. Ein Dialogfenster erscheint mit der Meldung: Version vom >>aktiven<< Objekt gezogen. 2. Drcken Sie die Schaltflche Weiter. Sie kehren zurck zum Fenster: Dictionary: Tabelle/Struktur: Feld ndern, und die Meldung: Temporre Version vom aktiven Objekt gezogen. wird am unteren Fensterrand angezeigt. 3. Whlen Sie den Menpfad Hilfsmittel->Versionsverwaltung. Das Fenster: Versionen des Objektes wird angezeigt. Neben dem Wort aktiv wird die Markierung angeklickt sein. 4. Entfernen Sie die Markierung neben dem Wort aktiv. 5. Klicken Sie die Markierung unterhalb der Zeile: Version(en) in der Versionsdatenbank, neben der Zeile mit der hchsten Versionsnummer an.

6. Drcken Sie die Schaltflche Zurckholen in der Drucktastenleiste. Ein Dialogfenster erscheint mit der Meldung: Version nnnnn wird nun zur berarbeiteten (nicht aktiven) Version. Weiter?. 7. Drcken Sie die Schaltflche Ja. Sie kehren zurck zum Fenster Versionen der Objekte, und die Meldung: berarbeitete Version mu noch aktiviert werden! erscheint am unteren Fensterrand. Neben dem Wort aktiv wird die Markierung angeklickt sein. Die berarbeitete Version ist nun dieselbe wie die der Schaltflche Aktive Version. 8. Um zu besttigen, da die berarbeitete Version mit der aktiven bereinstimmt, klicken Sie die Markierung neben dem Word mod. an. Sowohl die aktiv- als auch die mod.- Zeile sollten nun markiert sein. 9. Drcken Sie die Schaltflche Vergleichen auf der Drucktastenleiste. Das Fenster: Versionsvergleich fr Tabellen wird angezeigt. 10. Drcken Sie die Schaltflche: Delta Anzeige auf der Drucktastenleiste. Die Liste sollte eine Zeile mit dem Inhalt: Allgemeine Eigenschaften: unverndert und eine andere Zeile mit dem Inhalt: Felder: unverndert enthalten. Sie haben nun besttigt, da die aktive und die berarbeitete Version bereinstimmen. 11. Drcken Sie die Schaltflche Zurck auf der Symbolleiste. Sie kehren zurck zum Fenster: Versionen der Objekte. 12. Drcken Sie die Schaltflche Zurck auf der Symbolleiste. Sie kehren zurck zum Fenster: Dictionary: Tabelle/Struktur: Felder ndern. 13. Drcken Sie die Schaltflche Aktivieren auf der Drucktastenleiste. Das Statusfeld enthlt aktiv, und die Meldung xxxxx wurde aktiviert erscheint am unteren Fensterrand. Alle DDIC-Objekte, wie Domnen und Datenelemente, haben berarbeitete und aktive Versionen. Sie knnen alle in gleicher Weise angezeigt und verglichen werden. Objekte knnen nur aktive Versionen benutzen. Wenn Sie zum Beispiel eine Domne ndern und eine berarbeitete Version erzeugen, benutzen Datenelemente weiterhin die aktive Version, bis Sie die Domne aktivieren.

Das Datenbank-Utility benutzen


Innerhalb des DDIC liegt ein Werkzeug namens Datenbank-Utility. Damit knnen Sie Tabellen auf Datenbankebene prfen und ndern. Starten Sie nun das ScreenCam How to Access the Database Utility. Um zum Datenbank-Utility zu gelangen: 1. Beginnen Sie mit dem Dictionary: Einstiegsbild.

2. Geben Sie einen Tabellennamen im Feld Objektname ein. 3. Drcken Sie die Schaltflche Anzeigen. 4. Whlen Sie den Menpfad Hilfsmittel->Datenbank-Utility. Das Fenster ABAP/4 Dictionary: Utility fr Datenbanktabellen wird angezeigt, wie in Abb.6.6 gezeigt.

Abbildung 6.6: Mit ABAP/4-Dictionary:Utility fr Datenbanktabellen knnen Sie direkt mit der Datenbank kommunizieren, um Tabellen anzuzeigen oder zu verndern. Von hier aus knnen Sie:

die Konsistenz der R/3-DDIC-Definitionen gegen die Datenbank prfen das Aktivierungsprotokoll ansehen, um die tatschlichen SQL-Anweisungen zu sehen, die an die Datenbank bergeben wurden Datenbankspeicherparameter anzeigen und ndern eine Tabelle in der Datenbank lschen oder leeren, indem Sie sie in der Datenbank lschen und wieder anlegen

Konsistenzprfungen

Die Definition einer transparenten Tabelle gibt es an zwei Stellen: im R/3-Data Dictionary und in der Datenbank. Um die Konsistenz zwischen diesen beiden zu prfen, whlen Sie im Datenbank-Utility den Menpfad Zustze->Datenbankobjekt->Prfen. Die aktive Version der Tabelle wird mit der Datenbanktabelle verglichen. Das Fenster Tabelle xxxxx: Datenbankobjekt prfen wird angezeigt, und eine Meldung oben in der Liste zeigt an, ob das Datenbankobjekt konsistent ist (siehe Abb. 6.7).

Abbildung 6.7: Eine Konsistenzprfung gegen die Datenbank besttigt, da die R/3-DDICDefinition der Tabelle ztxlfa1 und die Datenbankdefinition identisch sind. Inkonsistenzen knnen auftreten, wenn:

die Tabellendefinition auf Datenbankebene gendert wurde. Das kann passieren, wenn jemand die Datenbankdefinition manuell, oder ein ABAP/4-Programm sie mit Native SQL ndert; die Datenbank korrupt wird.

Sie werden eine Konsistenzprfung durchfhren, wenn Sie beim Testen eines Programms einen ungewhnlichen SQL-Fehler bekommen, oder falsche Ergebnisse aus einem Programm, das richtig arbeiten sollte, dies aber unerklrlicherweise nicht tut. Falls Sie eine Inkonsistenz finden, deutet dies daraufhin, da die Ursache des Problems auerhalb Ihres Programms liegen knnte.

Eine R/3-Tabelle ist in mancher Hinsicht wie ein herkmmliches Programm. Es gibt sie in zwei Formen: die Quelle, die Sie anzeigen lassen und ndern knnen, und die bersetzte Form, die zur Laufzeit benutzt wird, Laufzeitobjekt genannt. Das Laufzeitobjekt wird erzeugt, wenn Sie die Tabelle aktivieren; es ist auch als nametab bekannt. Wenn eine Konsistenzprfung durchgefhrt wird, wird die nametab gegen die Datenbank verglichen.

Abbildung 6.8: Die nametab ist das Laufzeitobjekt fr eine Tabelle. Sie enthlt alle technischen Charakteristika einer Tabelle, wie z.B. Feldnamen, Datentypen und Lngen. Sie knnen die nametab aus dem Datenbank-Utility heraus anzeigen, indem Sie den Menpfad whlen Zustze->Laufzeitobjekt->Anzeigen. Das Fenster Object xxxxx: Anzeige des aktiven Laufzeitobjekts, wird angezeigt (siehe Abb. 6.8). Am oberen Rand sind der Zeitstempel der nametab und die Kopfinformation. Sie enthlt den Tabellentyp (T fr transparent), die Tabellenform in der Datenbank (wieder steht T fr transparent), die Anzahl Felder in der Tabelle, die Lnge des Satzes in Byte, die Anzahl Schlsselfelder, die Lnge der Schlsselfelder in Bytes, Pufferungsinformation und weiteres mehr. (Fr detaillierte Informationen ber die Kopffelder und ihre Werte lassen Sie sich die Struktur XD30L anzeigen). Unter dem Kopf ist eine Liste der Felder, ihrer Position in der Tabelle, des Datentyps, der Lnge, Anzahl, Dezimalstellen, des Abstands vom Beginn des Satzes, der externe Lnge, der Referenztabelle, der Prftabelle und mehr. Die technischen Eigenschaften der Tabelle werden vollstndig durch die nametab beschrieben.

Rolle der nametab in ABAP/4-Programmen


Wie Sie am 2. Tag gelernt haben, mssen Sie eine tables-Anweisung programmieren, wenn Sie ein ABAP/4-Programm schreiben, das Daten aus einer Tabelle liest. Die tables-Anweisung gibt dem Programm die Struktur der Tabelle bekannt. Wenn Sie jedoch das Laufzeitobjekt fr das Programm erzeugen, wird die Tabellendefinition nicht darin eingebettet. Statt dessen wird, wenn das Programmlaufzeitobjekt ausgefhrt wird, die nametab aufgerufen, um die Tabellenstruktur zur Laufzeit zu bestimmen. Dies ermglicht Ihnen, eine Tabelle (oder Struktur) zu ndern, ohne die von Ihnen benutzten ABAP/4-Programme bersetzen zu mssen. Sie bestimmen dynamisch die Tabellencharakteristika zur Laufzeit, indem Sie die nametab aufrufen. Obwohl Sie nicht alle Programme jedesmal neu bersetzen mssen, wenn eine Tabelle gendert wurde, erfordern bestimmte nderungen (solche wie ein Feld umbenennen oder lschen), da Sie Ihr ABAP/4Programm ndern. In diesem Fall mssen Sie alle Programme finden, die sie benutzen. Starten Sie nun das ScreenCam How to Perform a Where-Used List on a Table. Um alle Programme zu finden, die eine gegebene Tabelle benutzen, gehen Sie wie folgt vor: 1. Beginnen Sie mit dem Dictionary: Eingangsbild. 2. Geben Sie den Tabellennamen in das Feld: Objektname ein. 3. Drcken Sie die Schaltflche: Verwendungsnachweis auf der Drucktastenleiste. Ein Dialogfenster: Verwendungsnachweis erscheint. 4. Whlen Sie Programme. 5. Drcken Sie die Schaltflche Weiter. Das Fenster Tabelle xxxxx in Programmen wird angezeigt. Eine Liste aller Programme, die die Tabelle benutzen, erscheint. 6. Doppelklicken Sie auf einen Programmnamen, um alle Programmzeilen anzuzeigen, in welchen die Tabelle benutzt wird. 7. Doppelklicken Sie auf eine Zeile, um das Programm beginnend mit dieser Zeile anzuzeigen.

Die Konsistenz der nametab prfen


Die nametab bezieht ihre Merkmale von den Datenelementen und Domnen, die die Tabelle bilden. Es ist mglich, da die Definition der nametab nicht mit den Datenelementen und Domnen bereinstimmt. Wenn Sie zum Beispiel eine nderung an einer Domne aktivieren, mssen auch die Tabellen, die sie enthalten, aktiviert werden, um diese nderung zu bernehmen. Dies geschieht automatisch; trotzdem kann eine Reaktivierung fehlschlagen, z.B. wegen einer Einschrnkung der Datenbank oder weil die Tabelle Daten enthlt und erst konvertiert werden mu. Diese Situation kann gecheckt werden, indem man eine Konsistenzprfung auf dem Laufzeitobjekt durchfhrt.

Um die Konsistenz zwischen der nametab und den Data Dictionary-Objekten zu prfen, whlen Sie im Datenbank-Utility den Menpfad Zustze->Laufzeitobjekt->Prfen. Das Laufzeitobjekt wird mit den DDIC-Quellobjekten verglichen. Das Fenster Objekt xxxxx: Prfen aktives Laufzeitobjekt, wird angezeigt, und eine Meldung am oberen Listenrand zeigt, ob das Datenbankobjekt konsistent ist. Abbildung 6.9 und 6.10 zeigen ein Beispiel einer Inkonsistenz in der nametab fr Tabelle ztxlfal. Wenn eine Domne gendert wird, und die Tabellenaktivierung geht schief, kann es eine Inkonsistenz zwischen der nametab und der Domne geben. Im Fall von Abbildung 6.10 deckt die Prfung auf, da der Datentyp von Feld lifnr char 10 in der nametab ist und int4 in der Domne. ABAP/4-Programme benutzen nur die nametab. Daher wissen sie nichts von Inkonsistenzen und werden deshalb im Entwicklungssystem nicht von ihnen beeinflut. Transportiert man DDIC-Objekte, bevor Inkonsistenzen bereinigt sind, kann das Probleme whrend des Imports in Qualittssicherungs- oder Produktionssystemen verursachen oder sogar bewirken, da ABAP/4-Programme in diesen Umgebungen falsche Ergebnisse erzeugen. Der Grund dafr ist, da die nderungen die ABAP/4- Programme nicht beeinflut haben und deshalb noch nicht getestet worden sind.

Abbildung 6.9: Hier findet die Konsistenzprfung den Fehler, da Satzlnge, Schlssellnge und

Tabellenausrichtung inkonsistent sind.

Abbildung 6.10: Beim Herunterblttern findet man die Felder der nametab und den Grund der Inkonsistenz.

Das Aktivierungsprotokoll anzeigen


Aus dem Datenbank-Utility heraus knnen Sie sich das Aktivierungsprotokoll anzeigen lassen, indem Sie die Schaltflche Objektprotokoll auf der Drucktastenleiste drkken. Dieses Protokoll wird nur bereitgestellt, wenn die Aktivierung SQL-Anweisungen erzeugt (In manchen Fllen kann eine Tabellennderung aktiviert werden, ohne die Datenbank zu betreffen, z.B. eine nderung am Kurztext). Das Protokoll enthlt die Reihenfolge der durchgefhrten Schritte und alle SQL-Anweisungen, die whrend der letzten Aktivierung zur Datenbank gesandt wurden (siehe Abb. 6.11 und 6.12).

Abbildung 6.11: Das Aktivierungsprotokoll zeigt die Sequenz der Schritte whrend der Aktivierung und das generierte SQL. Dieses Protokoll zeigt, da whrend der Aktivierung die Tabelle in die Datenbank gesetzt und neu angelegt wurde.

Abbildung 6.12: Dies ist der Rest des Aktivierungsprotokolls aus Abbildung 6.11. Um erluternde Detailinformation zu einer Meldung im Protokoll anzuzeigen, positionieren Sie den Cursor auf die Meldung und drcken die (F1)-Taste.

Speicherparameter anzeigen und ndern


Wird die Schaltflche Speicherparameter im Datenbank-Utility gedrckt (siehe Abb. 6.1), wird das Fenster DB Utility: Transparente Tabellen - Datenbank Parameter angezeigt. Abbildung 6.13 zeigt, wie dieses Fenster aussieht, wenn eine Oracle-Datenbank installiert ist. Dieses Fenster dient hauptschlich dem Datenbankadministrator (DBA), um Speicherparameter aus R/3 heraus zu ndern, nachdem eine Tabelle aktiviert wurde. Der Vollstndigkeit halber wird es hier vorgestellt.

Abbildung 6.13: Datenbankspezifische Parameter werden im Fenster DB Utility: Transparente Tabellen - Datenbank Parameter gezeigt. Diese Maske zeigt, da sich Speicherparameter fr die Tabelle ztxlfa1 nach der Aktivierung verndert haben, weil die Zeilen DBS und CMP nicht passen.

Hier wird eine datenbankspezifische Information ber die Tabellenspeicherparameter angezeigt. Die SrcSpalte zeigt die Quelle der Werte an. DBS bedeutet, da diese Werte die aktuellen Werte in der Datenbank sind. CMP bedeutet, da diese Werte aus der Grenkategorie und Datenklasse berechnet wurden. Die USRZeile ermglicht Ihnen, Werte fr NextE, MaxE, Pf und Pu einzugeben und sie unmittelbar anzuwenden, indem Sie die Schaltflche Parameter NextE, MaxE, Pf beziehungsweise Pu sofort anwenden drcken. Meistens werden die DBS und CMP-Zeilen gleich sein, auer wenn die Speicherparameter fr die Datenbanktabellen manuell gendert wurden, nachdem die Tabelle aktiviert worden ist. Die InitExt- und NextExt-Spalten enthalten die Gren (in Blcken) der initial und next extents. Die MinE- und MaxE-Spalten enthalten die Minimal- und Maximalanzahl erlaubter extents. Als nchstes kommt der Tablespace-Name, gefolgt von den FG- und Fr-Spalten, welche die Anzahl der freelistGruppen und l der freelists in einer Gruppe enthalten (diese zwei Spalten werden nur benutzt, wenn Oracle im parallel processing mode betrieben wird). Die Pf- und Pu-Spalten enthalten die Prozentangabe des Freiplatzes und des benutzten Platzes in den Datenblcken. Wenn Sie mehr zu einer Spalte wissen mchten, stellen Sie den Mauszeiger auf die Spalte und drcken Sie (F1). Obwohl die einzigen Parameter, die gendert werden knnen, NextE, MaxE, Pf und Pu sind, mssen Sie die Zeile vollstndig ausfllen, bevor Sie die Schaltflche Anwenden drcken. Um zum Beispiel die

Gre des next extent auf 64 zu ndern und die Maximalzahl von extents auf 4 zu setzen, whlen Sie zuerst den Auswahlknopf USR. Dann geben Sie 64 in der NextExt-Spalte ein, geben 4 in die MaxESpalte ein, kopieren den Rest der Werte aus der DBS-Zeile und drcken dann die Schaltflche Anwenden. Ihre nderungen werden sofort in der Datenbank wirksam, wenn Sie die Schaltflche Anwenden drcken. Um die Ergebnisse anzusehen, drcken Sie die Schaltflche Zurck, um zum Fenster ABAP/4-Dictionary Utility fr Datenbanktabellen zurckzukehren, und drcken die Schaltflche Speicherparameter auf der Drucktastenleiste. Die Zeile mit DBS in der Src-Spalte wird die neuen Werte enthalten.

Tabellen in der Datenbank lschen und neu anlegen


Der schnellste Weg, die Daten einer Tabelle zu lschen, ist, diese zu lschen und dann neu anzulegen. Um eine Tabelle zu lschen, drcken Sie im Datenbank-Utility die Schaltflche Datenbanktabelle lschen. Ein Dialogfenster wird angezeigt werden, um Ihre Anforderung zu besttigen. Die Tabelle und ihr Inhalt werden aus der Datenbank gelscht. Um sie wieder anzulegen, drcken Sie die Schaltflche Datenbanktabelle anlegen. Die Tabelle wird wieder angelegt, indem die aktive Version der Tabelle benutzt wird. Sie knnen das Datenbank-Utility hierfr einsetzen, anstatt ein ABAP/4-Programm zu schreiben, das alle Zeilen lscht.

Das Lschen einer Tabelle bewirkt, da alle Daten unwiederbringlich verlorengehen. Machen Sie unbedingt eine Datensicherung der Tabelle, bevor Sie sie lschen. Denken Sie daran: wenn Sie die Tabelle manuell kopieren, mssen Sie sowohl die Tabellendefinition als auch die Daten kopieren.

Wenn die Tabelle mehr als einen extent besitzt, ist Lschen und Neuanlage einer Tabelle ein schneller und einfacher Weg, um sie zu reorganisieren. Sie mssen die Daten zeitweilig auf einer anderen Tabelle sichern, bevor Sie lschen und dann spter zurckkopieren.

Zusammenfassung

nderungen an kritischen Daten knnen automatisch in nderungsbelegen protokolliert werden. Fr nichtkritische Daten sollten statt dessen nderungsbelegobjekte benutzt werden. Eine berarbeitete Version einer Tabelle wird angelegt, wenn Sie ndern ohne zu aktivieren. Nur die aktive Version eines Objektes kann benutzt werden. Mittels des Datenbank-Utility knnen Sie die nametab untersuchen und ihre Konsistenz zum Data

Dictionary und zur Datenbank vergleichen. Das Datenbank-Utility ermglicht Ihnen ebenso, das Aktivierungsprotokoll einer Tabelle und der Speicherparameter anzusehen sowie eine Tabelle in der Datenbank zu lschen und wieder anzulegen.

Fragen & Antworten


Frage: Wo wrde ein DBA die Speicherparameter einer aktivierten Tabelle vom SAP R/3-System aus ndern? Antwort: Rufen Sie das Datenbank-Utility auf, und drcken Sie die Schaltflche Speicherparameter.

Workshop
Der Workshop bietet Ihnen zwei Mglichkeiten, Ihr gelerntes Wissen umzusetzen. Im Prfungsabschnitt werden Fragen gestellt, um Ihnen zu helfen, Ihr Verstndnis fr die Materie zu vertiefen, und der bungsabschnitt untersttzt Sie mit Erfahrungen, das Erlernte umzusetzen. Antworten auf die Prfungsaufgaben und die bungen knnen Sie im Anhang B (Antworten zu Kontrollfragen und bungen) finden.

Kontrollfrage
1. Ist es mglich, da die Definition von Tabelle, Datenelementen und Domnen nicht zusammenpassen?

bung 1
1. Was ist der schnellste Weg, die Daten aus einer Tabelle zu lschen?

Ein Imprint des Markt&Technik Buch- und Software-Verlag GmbH. Elektronische Fassung des Titels: ABAP/4 in 21 Tagen, ISBN: 3-8272-2016-X

Woche 1

Tag 7 Datendefinitionen in ABAP/4, Teil 1


Kapitelziele
Am Ende dieses Kapitels knnen Sie:

den Rollbereich und dessen Inhalt erklren die Syntax der Datenelemente von ABAP/4 verstehen die Konzepte der Datenobjekte und deren Auswahl beschreiben Literale benutzen und verstehen, wie jeder Typ im Programmcode verwendet wird Konstanten definieren und benutzen die data-Anweisung anwenden, um Variablen und Feldleisten zu definieren die Datentypen von ABAP/4 verstehen und sowohl alphanumerische als auch numerische Datentypen identifizieren die ABAP/4 Definition der allgemeinen DDIC Datentypen verstehen

Bitte lesen Sie sich jetzt noch einmal den Abschnitt ABAP/4-Syntax des Tags 2 durch, bevor Sie fortfahren.

Programmpuffer und der Rollbereich


Programme werden auf dem Applikationsserver in einem Programmpuffer zwischengespeichert. Wenn ein Benutzer ein Programm aufruft, wird in diesem Programmpuffer nach dem jeweiligen Programm gesucht. Wird dieses Programm dort gefunden, und wurde es in der Datenbank nicht verndert, wird diese zwischengespeicherte Kopie benutzt. Wenn es nicht gefunden wird oder die Datenbank einen neueren Stand hat, wird das Programm neu geladen. Nicht fr jeden Benutzer, der ein Programm aufruft, wird eine separate Kopie im Speicher abgelegt. Statt dessen rufen alle Benutzer dieselbe Kopie des Programms auf. Der Unterschied ist eine separate Speicherzuweisung, der sogenannte Rollbereich (oder Roll Area). Ein Rollbereich wird jeder Programmausfhrung eines Benutzers zugewiesen. Das System nutzt den Rollbereich, um dort alle

Informationen ber die laufende Programmausfhrung und die Speicherallokationen abzulegen. Informationen wie Variablen und deren Werte, der aktuelle Programmzeiger und die Listenausgabe werden in dem Rollbereich gehalten. Ein Beispiel: Der Benutzer fhrt ein Programm aus, und der Rollbereich wird zugewiesen. Wenn derselbe Benutzer, ohne zu warten, da das Programm beendet ist, zu einem anderen Modus wechselt und dasselbe Programm noch einmal startet, wird ein anderer Rollbereich fr diese zweite Programmausfhrung zugewiesen. Der Benutzer hat dann zwei Rollbereiche, einen fr jede Programmausfhrung. Wenn der Benutzer ein anderes Programm aufgerufen htte, dann htte er genauso zwei Rollbereiche, einen fr jedes Programm.

ABAP/4-Syntaxelemente
Jedes ABAP/4-Programm besteht aus einer oder mehreren Anweisungen. Jede Anweisung beinhaltet ein oder mehrere Wrter, die durch wenigstens ein Leerzeichen getrennt werden. Das erste Wort einer Anweisung ist ein Schlsselwort. Eine Anweisung kann ein oder mehrere Zustze beinhalten und endet immer mit einem Punkt. In Listing 7.1 heien die Schlsselwrter select, write und endselect. Zwei Zustze erscheinen in der select-Anweisung: where und order by. Was in anderen Programmiersprachen normalerweise eine Klausel genannt wird, wird in ABAP/4 Zusatz genannt: das ist ein Wort oder eine Gruppe von Wrtern nach dem Schlsselwort, die das Verhalten der Anweisung verndern. Listing 7.1: Beispiel einer grundlegenden ABAP/4-Syntax 1 select * from ztxlfa1 where lifnr > '0000001050' order by lifnr. 2 write: \ ztxlfa1-lifnr, ztxlfa1-name1, ztxlfa1-land1. 3 endselect. Eine Anweisung kann in jeder Spalte beginnen und jede Anzahl von Zeilen umfassen. Um eine Anweisung in einer anderen Zeile fortzusetzen, wird die Anweisung zwischen zwei Wrtern getrennt. Ein Fortsetzungszeichen wird dabei nicht bentigt. Beispiel: Das Listing 7.1 kann auch anders formatiert werden, wie Listing 7.2 zeigt. Listing 7.2: Dieser Code ist derselbe wie in Listing 7.1. Er wurde nur anders formatiert. 1 2 3 4 5 6 select * from ztxlfa1 where lifnr > '0000001050' order by lifnr. write: \ ztxlfa1-lifnr, ztxlfa1-name1, ztxlfa1-land1. endselect.

ABAP/4 ist nicht case sensitive, d.h. ABAP/4 unterscheidet nicht zwischen Gro- und Kleinschreibung.

Datenobjekte definieren
Datenobjekte sind Speicherbereiche, die benutzt werden, um Daten zu halten, whrend das Programm ausgefhrt wird. Es gibt zwei Typen von Datenobjekten: vernderbare und nicht vernderbare. Die nicht vernderbaren Datentypen sind Literale und Konstanten. Die vernderbaren Datenobjekte sind Variablen, Feldleisten und interne Tabellen. Eine Feldleiste ist das ABAP/4-quivalent einer Struktur. Eine interne Tabelle ist das quivalent eines Array. Wenn ein Programm startet, wird die Speicherbelegung fr jedes Datenobjekt in dem Rollbereich abgelegt. Whrend ein Programm abluft, kann der Inhalt des nicht vernderbaren Datenobjektes gelesen werden, oder die Daten der vernderbaren Objekte knnen geschrieben und gelesen werden. Wenn das Programm endet, lscht das System den Speicher fr alle Datenobjekte und, deren Inhalte gehen verloren. Datenobjekte haben drei Stufen der Auswahl: lokal, global und extern. Die Auswahl eines Datenobjektes zeigt an, von wo aus in dem Programm auf diese Datenobjekte zugegriffen werden kann. Lokal auswhlbare Datenobjekte sind nur in dem Unterprogramm zugnglich, in dem sie definiert sind. Auf global auswhlbare Objekte kann von berall aus dem Programm zugegriffen werden. Extern auswhlbare Objekte knnen auch von anderen Programmen genutzt werden. Die Abbildung 7.1 zeigt diese drei Ebenen des Zugriffs. In Abbildung 7.1 sind die lokalen Datenobjekte des Unterprogramms 1A nur innerhalb dieses Unterprogramms auswhlbar. Eine Anweisung, die auerhalb dieses Unterprogramms liegt, kann nicht auf das Datenobjekt zugreifen. Gleichfalls knnen die lokalen Datenobjekte der Unterprogramme 1B und 2A nur innerhalb dieses Programms genutzt werden. Jede Anweisung in Programm 1 kann auf die globalen Datenobjekte in Programm 1 zugreifen, unabhngig davon, wo die Anweisung steht. Ebenso kann jede Anweisung in Programm 2 auf die globalen Datenobjekte des Programms 2 zugreifen.

Abbildung 7.1: Die Auswhlbarkeit von Datenobjekten bestimmt ihre Zugnglichkeit. Wenn die Objekte lokal auswhlbar sind, kann auf sie nur innerhalb des Unterprogramms zugegriffen werden. Wenn sie global auswhlbar sind, sind sie innerhalb des Programms zugnglich. Sind sie extern auswhlbar, knnen auch andere Programme auf diese Datenobjekte zugreifen. Die externen Datenobjekte knnen von jeder Anweisung in Programm 1 oder Programm 2 genutzt werden. Tatschlich hngt die Zugnglichkeit der externen Datenobjekte vom Typ des genutzten externen Speichers und der Beziehung zwischen den zwei Programmen ab. Die Details dieses Punktes sind in den Abschnitten SPA/GPA- Speicher und ABAP/4-Speicher beschrieben.

Definition von Literalen


Ein Literal ist ein nicht vernderbares Datenobjekt. Literale knnen berall in einem Programm auftauchen und sind allein durch ihre Eingaben definiert. Es gibt vier Typen von Literalen: Zeichenketten, numerische, Gleitpunktzahl und hexadezimale. Zeichenkettenliterale Zeichenkettenliterale sind case-sensitive Zeichenketten beliebiger Lnge, umschlossen von einfachen Anfhrungsstrichen. 'JACK' ist z.B. ein Zeichenkettenliteral aus Grobuchstaben. 'Caesar the cat' ist ein Zeichenkettenliteral mit einer Mischung aus Gro- und Kleinbuchstaben. Das erste

Programm nutzte ein Zeichenkettenliteral namens 'Hello SAP World'. Weil ein Zeichenkettenliteral in Anfhrungsstrichen steht, ist es nicht mglich, ein einfaches Anfhrungszeichen alleine als Wert dieses Literals zu benutzen. Um ein einfaches Anfhrungszeichen darzustellen, mssen zwei aufeinanderfolgende Anfhrungszeichen benutzt werden. Beispiel: Die Anweisung write 'Caesar''s tail'. gibt genau Caesar's tail aus. Die Anweisung write 'Caesar's tail' wrde einen Syntaxfehler erzeugen, da die Zeichenkette ein einfaches Anfhrungszeichen enthlt. Die Anweisung write ''''. schreibt ein einfaches Anfhrungszeichen in die Ausgabeseite, da zwei aufeinanderfolgende Anfhrungszeichen innerhalb von Anfhrungszeichen ein einfaches Anfhrungszeichen ergeben. Also: nur die Anweisung write: '''', 'Hello Caesar', ''''. gibt ' Hello Caesar ' aus. Im folgenden sind Beispiele ungltiger Zeichenkettenliterale dargestellt und die korrekte Art, sie zu programmieren. "Samantha" ist nicht korrekt, es mssen einfache statt doppelte Anfhrungszeichen benutzt werden. 'Samantha' wre korrekt. In 'Never ending fehlt das abschlieende Anfhrungszeichen, korrekt wre 'Never ending'. 'Don't bite' sollte von zwei aufeinanderfolgenden einfachen Anfhrungszeichen eingeschlossen sein, korrekt wre 'Don''t bite'.

Wenn ein Literal in einem Vergleich benutzt wird, gilt als Faustregel: immer Grobuchstaben verwenden. Vergleiche mit Zeichenkettenliteralen sind immer case sensitive , so da es notwendig ist, stets auf die korrekte Gro- und Kleinschreibung zu achten, um die beabsichtigten Ergebnisse zu erhalten. Wenn die Schreibweise nicht gleich ist, luft ein Programm fr gewhnlich weiter, aber die Ausgabe wird nicht korrekt sein, oder es wird berhaupt keine Ausgabe geben. In 99,99 Prozent der Flle werden die Werte der Zeichenkettenliterale in Grobuchstaben verglichen. Deshalb sollten Zeichenkettenliterale immer in Grobuchstaben geschrieben werden, es sei denn, sie werden fr andere Zwecke genutzt. Beispiel: select single * from ztxlfa1 where lifnr = 'v1' findet keinen Datensatz, aber select single * from ztxlfa1 where lifnr = 'V1' findet Datenstze. Haben Sie die Kleinschreibung von v bemerkt? Numerische Literale Numerische Literale sind hart programmierte numerische Werte mit einem optionalen Vorzeichen. Sie sind normalerweise nicht von Anfhrungszeichen umgeben. Wenn allerdings ein numerisches Literal eine Dezimalzahl beinhaltet, dann mu es von einfachen Anfhrungszeichen umgeben werden. Wenn eine Dezimalzahl ohne Anfhrungszeichen dargestellt wird, ergibt es den Syntaxfehler Anweisung x ist nicht definiert. Bitte berprfen Sie Ihre Eingabe. Tabelle 7.1 zeigt die richtige und falsche Weise, numerische Literale zu programmieren.

Beispiel: 256 ist ein numerisches Literal, genauso wie -99. '10.5' ist ein numerisches Literal mit einem Dezimalpunkt, so da es von Anfhrungszeichen umgeben sein mu. Ein Literal kann als Vorgabewert fr eine Variable dienen oder dazu benutzt werden, einen Wert fr eine Anweisung zur Verfgung zu stellen. Beispiele von ungltigen Literalen sind: 99- (nachfolgendes negatives Vorzeichen), "Confirm" (umgeben von doppelten Anfhrungszeichen) und 2.2 (trotz Dezimalpunkt nicht in einfachen Anfhrungszeichen). Gleitkommaliterale Gleitkommaliterale werden in einfachen Anfhrungszeichen spezifiziert '<Mantisse>E<Exponent>' . Die Mantisse kann mit einem Vorzeichen und ohne Dezimalpunkte angegeben werden, der Exponent kann mit oder ohne Vorzeichen sowie mit oder ohne fhrende Nullen benutzt werden. Beispiel: '9.99E9', '-10E-32' und '+1E09' sind gltige Gleitkommaliterale. Hexadezimale Literale Ein Hexadezimalliteral wird in einfachen Anfhrungszeichen wie ein Zeichenkettenliteral spezifiziert. Die erlaubten Werte sind 0-9 und A-F. Es mu eine gerade Anzahl von Zeichen in der Kette sein, und alle Zeichen mssen gro geschrieben werden.

Wenn ein Hexadezimalliteral mit klein geschriebenen Zeichen benutzt wird, wird keine Fehlermeldung oder Warnung ausgegeben. Wenn das Programm luft, ist das Literal jedoch falsch. Beispiele von gltigen hexadezimalen Literalen sind '00', 'A2E5' und 'F1F0FF'. Beispiele von ungltigen Literalen sind 'a2e5' (enthlt kleingeschriebene Zeichen), '0' (enthlt eine ungerade Anzahl von Zeichen), "FF" (eingeschlossen von doppelten Anfhrungszeichen) und x'00' (sollte kein fhrendes x haben).

Hexadezimale Werte werden in ABAP/4 kaum benutzt, weil sie hufig maschinenabhngig sind. Der Gebrauch eines hexadezimalen Wertes, der Maschinenabhngigkeit erzeugt, sollte vermieden werden.

Tabelle 7.1 gibt einen berblick ber richtig und falsch programmierte numerische und hexadezimale Literale.

Tabelle 7.1: Richtig und falsch programmierte Literale Richtig -99 '-12' '12.3' 'Hi' 12.3 "Hi" Falsch 99Erluterung Ein nachfolgendes Vorzeichen ist nicht erlaubt, es sei denn, es steht innerhalb der Anfhrungszeichen. Numerische Zahlen zwischen Anfhrungszeichen knnen ein fhrendes oder nachfolgendes '12-' Vorzeichen haben. Numerische Zahlen mit einem Dezimalpunkt mssen in einfachen Anfhrungszeichen geschrieben werden. Doppelte Anfhrungszeichen sind nicht erlaubt.

'Can''t' 'Can't' Zwei aufeinanderfolgende einfache Anfhrungszeichen in der Zeichenkette ergeben in der Ausgabe ein einfaches Anfhrungszeichen. 'Hi' '7E1' '7w1' '0A00' '0A00' '0A00' '0a00' 'A00' 'Hi 7E1 Das Nachfolgende Anfhrungszeichen fehlt. Gleitkommazahlen mssen von Anfhrungszeichen umschlossen sein. Kleinschreibung ist in Gleitkommaliteralen nicht erlaubt. Kleinschreibung in hexadezimalen Literalen ergibt nicht korrekte Ergebnisse. Eine ungerade Zahl von hexadezimalen Stellen ergibt nicht korrekte Resultate.

X'0A00' Ein vorangestelltes oder nachfolgendes Zeichen ist fr hexadezimale Literale nicht erlaubt.

Definition von Variablen


Zwei Anweisungen werden gewhnlich benutzt, um Variablen in ABAP/4-Programmen zu definieren: data parameters Definition von Variablen mit der data-Anweisung Variablen knnen mit der data-Anweisung fr das Programm definiert werden. Variablen, die mit der data-Anweisung definiert werden, werden einem Datentyp zugewiesen und knnen Vorgabewerte haben.

Syntax der data-Anweisung

Nun folgt die Syntax, um Variablen mit der data-Anweisung zu definieren: data v1[(l)] [type t] [decimals d] [value 'xxx']. oder data v1 like v2 [value 'xxx']. wobei gilt:

v1 ist der Variablenname. v2 ist der Name der Variablen, die vorher im Programm definiert wurde, oder der Name eines Feldes, das zu einer Tabelle oder Struktur im Data Dictionary gehrt. (l) ist die interne Lngenangabe. t ist der Datentyp. d ist die Anzahl der Dezimalstellen (wird nur mit Typ p benutzt). 'xxx' ist ein Literal, das den Vorgabewert liefert.

Listing 7.3 zeigt ein Beispiel mit Variablen, die mit der data-Anweisung definiert sind. Listing 7.3: Beispiele mit Variablen, die mit der data-Anweisung definiert sind 1 2 3 4 data data data data f1(2) type c. f2 like f1. max_value type i value 100. cur_date type d value '19980211'.

Variablennamen knnen von 1 bis 30 Zeichen lang sein. Sie knnen jedes Zeichen bis auf ( ) + . , : beinhalten und mssen wenigstens ein alphanumerisches Zeichen haben. SAP empfiehlt, da Variablennamen immer mit einem Buchstaben beginnen und keinen Bindestrich enthalten sollten. Der Bindestrich hat eine besondere Bedeutung (siehe Feldleisten weiter unten). Statt eines Bindestrichs sollte ein Unterstrich (_) verwendet werden.

Benutzen Sie nicht USING oder CHANGING als Variablennamen. Obwohl sie syntaktisch korrekt sind, kann es zu Problemen kommen, wenn sie an Unterprogramme weitergegeben werden.

Die folgenden Punkte sind weiterhin bei der data-Anweisung zu beachten:


Die Standardlnge hngt von dem Datentyp ab. (Standardlngen sind in Tabelle 7.2 aufgelistet) Der Standarddatentyp ist c (Zeichen). Der vorgegebene Initialwert ist 0, auer fr Datentyp c, fr den der vorgegebene Wert das Leerzeichen ist. Der Wertzusatz akzeptiert lediglich ein Literal oder eine Konstante (siehe unten); Sie knnen eine Variable nicht benutzen, um einen Vorgabewert zu liefern. Bei Benutzung des Zusatzes like erhlt die zu definierende Variable ihre Lnge und den Datentyp von der Referenzvariablen. Sie kann nicht in einer Anweisung mit like spezifiziert werden. Bei Benutzung des Zusatzes like wird der Wert nicht von der Referenzvariablen erhalten. Sie knnen den Wertzusatz nutzen, um der Variablen einen Vorgabewert zu geben. Wenn Sie das nicht tun, wird der Variablen der vorgegebene Initialwert 0 zugewiesen (oder Leerzeichen fr den Datentyp Zeichen).

Die data-Anweisung kann berall im Programm verwendet werden. Die Definition der Variablen mu vor den Anweisungen erfolgen, die diese Variable benutzen. Wenn Sie die data-Anweisung nach dem ausfhrbaren Programmcode plazieren, dann knnen die Anweisungen darber nicht auf die von der data-Anweisung definierte Variable zugreifen. Ein Beispiel finden Sie im Listing 7.4. Listing 7.4: Beispiel einer Variablen, auf die zugegriffen wird, bevor sie definiert ist 1 2 3 4 report ztx0704. data f1(2) value 'Hi'. write: f1, f2. data f2(5) value 'there'.

Die Variable F2 ist in Zeile 4 definiert, und die write-Anweisung in Zeile 3 versucht, auf diese Variable zuzugreifen. Dies wird einen Syntaxfehler hervorrufen. Die data- Anweisung in Zeile 4 mu vor Zeile 3 stehen.

Es ist guter Programmierstil, alle data-Definitionen am Beginn eines Programms vor die erste ausfhrbare Anweisung zu setzen. ABAP/4-Datentypen Es gibt zwei Hauptkategorien von Daten in ABA/4: Zeichen und numerische Daten. Variablen erhalten eine spezielle Behandlung vom ABAP/4-Prozessor, basierend auf ihrer Kategorie, die weiter

geht als die bliche Behandlung in anderen Programmiersprachen. Deswegen ist es besonders wichtig fr Sie, zwischen Zeichen und numerischen Daten zu unterscheiden.
Datentypzeichen

Die Datentypzeichen sind in Tabelle 7.2 aufgefhrt. Beachten Sie, da sie auch den Typ n umfassen. Die internen Lngen werden in Bytes angegeben. Ein Strich symbolisiert in der Spalte Maximale Lnge die Datentypen mit fester Lnge. Die Spalte vorgegebener Initialwert zeigt den Vorgabewert der Variablen, wenn kein Wert mit Hilfe der Wertzuweisung angegeben wird.

Tabelle 7.2: Liste der Datentypzeichen Maximale interne Lnge 65535 65535 65535

Datentyp Beschreibung

Interne Standardlnge

Gltige Werte

Vorgegebener Initialwert

c n d t x

Zeichen

Jedes Zeichen 0-9 0-9 0-9 Jedes Zeichen

Leerzeichen 0 00000000 000000

Numerischer Text 1 Datum Zeit Hexadezimal 8 (fest) 6 (fest) 1

Interne Darstellung von Variablen

Numerische Textvariablen werden numerische Zeichenvariablen genannt. Sie enthalten positive ganze Zahlen ohne Vorzeichen. Jede Zahl wird durch ein Byte dargestellt und intern als Zeichen gespeichert. Nur Zeichen 0-9 knnen abgelegt werden. Benutzen Sie numerischen Text, um eindeutige Nummern darzustellen, die zur Identifikation dienen, wie Dokumentennummern, Kontonummern oder Sortierzahlen. Auch fr Variablen, die einen numerischen Teil aus einem Datentyp Zeichen extrahieren, knnen numerische Textvariablen dienen. Wenn Sie zum Beispiel einen Monat mit zwei Zeichen aus einem Datumsfeld extrahieren wollen, dann sollten Sie den Datentyp n benutzen.

Datum und Zeit sind Datentypen mit fester Lnge. Sie brauchen keine Lnge bei der dataAnweisung fr diesen Datentyp anzugeben. Werte fr Datum und Zeit werden intern immer als YYYYMMDD (JJJJMMTT) bzw. HHMMSS (SSMMSS) gespeichert. Das aktuelle Datum ist ber sydatum und die aktuelle Zeit ber sy-uzeit abzurufen.

Die Werte von sy-datum und sy-uzeit werden zu Beginn der Programmausfhrung gesetzt und ndern sich nicht bis zum Ende des Programms. Wenn Sie bei einem lnger laufenden Programm das aktuelle Datum bzw. die aktuelle Zeit bentigen, benutzen Sie die Anweisung get time. Diese Anweisung aktualisiert die Werte von sy-datum und sy-uzeit. Die absoluten Zeitwerte mit einer Genauigkeit von Millisekunden werden nicht in R/3 benutzt. Relative Zeitwerte sind allerdings im Millisekundenbereich verfgbar. Um diese zu erhalten, mu die Anweisung get run time benutzt werden und der Datentyp i. Schauen Sie in das Kapitel Laufzeitanalyse fr tiefergehende Details.
Numerische Datentypen

Die numerischen Datentypen werden in Tabelle 7.3 gezeigt. Ein Strich in der Spalte Maximallnge zeigt an, da die Lnge nicht verndert werden kann. Ein Stern zeigt an, da die Attribute maschinenabhngig sind.

Tabelle 7.3: Numerische Datentypen Datentyp Gltige Vorgegebener Maximale Maximale Beschreibung Interne Werte Initialwert Standardlnge Lnge Dezimalstellen

i p f

Ganze Zahl Gepackte Dezimalzahl Gleitkomma

4(fest) 8 8

16 8

0 14 15*

-231 bis 0 +231 0-9 0

-1E-307 0.0 bis 1E308

Alle Variablen in Tabelle 7.3 haben ein Vorzeichen. In Gleitkommavariablen hat der Exponent ebenfalls ein Vorzeichen. Ganze Zahlen werden benutzt, wenn einfache Berechnungen gemacht werden sollen oder kein Dezimalpunkt bentigt wird. Variablen wie Zhler, Index, Positionen oder Offsets sind gute Beispiele.

Eine dezimale Variable speichert (L*2)-1 Stellen, wobei L die Lnge der Variablen in Bytes ist. Dezimale Werte speichern zwei Stellen pro Byte auer dem Byte am Ende, welches eine Stelle und das Vorzeichen speichert. Der Dezimalpunkt selbst wird nicht gespeichert, es ist ein Attribut der Definition. Beispiel: data f1(4) type p definiert eine Variable f1, die vier Byte lang ist und sieben Stellen (plus Vorzeichen) aufnehmen kann (siehe Abb. 7.2.). data f2(3) type p decimals 2 definiert eine Variable f2, die drei Byte lang ist und 5 Stellen (plus Vorzeichen) speichern kann. Die Definition data f3 type p definiert eine Variable f3 mit der Mglichkeit 15 Stellen zu speichern, da die Standardlnge fr Datentyp p 8 ist.

Abbildung 7.2: Gepackte Dezimalwerte werden mit zwei Stellen pro Byte gespeichert. Das Byte am Ende ist eine Ausnahme; es speichert eine Stelle und das Vorzeichen. Der Dezimalpunkt wird nicht gespeichert und verbraucht so auch keinen Speicher. Er ist Teil der Definition. Gleitkommazahlen sind immer nur annherungsweise genau. Sie knnen fr Berechnungen mit sehr groen Werten oder vielen Dezimalstellen benutzt werden. Die Genauigkeit bis zu 15 Dezimalstellen ist mglich, hngt aber von der jeweiligen Hardware ab.

Seien Sie vorsichtig, wenn Sie die Initialwerte mit der data-Anweisung und dem Wertzusatz definieren. Diese Werte werden nicht daraufhin berprft, ob sie mit dem Datentyp kompatibel sind. Mit dem Wertzusatz knnen Sie absichtlich oder unabsichtlich ungltige Werte fr Ganzzahlen-, Datums- und Zeitvariablen, numerische Texte, gepackte Dezimalvariablen oder Gleitkommavariablen zuweisen. Die Ergebnisse dieser Zuweisung sind maschinenabhngig und undefiniert.
Zuweisung von DDIC-Datentypen zu ABAP/4-Datentypen

Datentypen im Data Dictionary werden aus ABAP/4-Datentypen gebildet. Tabelle 7.4 zeigt die allgemeinen Data Dictionary-Datentypen und ihre korrespondierenden ABAP/4-Datendefinitionen. L ist die Lnge, die in der Domne spezifiziert wird. Fr eine vollstndige Liste rufen Sie bitte die (F1)Hilfe fr die tables-Anweisung auf.

Tabelle 7.4: Data Dictionary-Datentypen und ihre korrespondierenden ABAP/4Datentypen DDIC-Datentypen Beschreibung char clnt dats tims cuky curr dec fltp int1 int2 int4 lang numc prec quan unit Zeichen (Character) Mandant (Client) Datum (Date) Zeit (Time) ABAP/4-Datendefinition c(L) c(3) d t

Whrungsschlssel (Currency key) c(5) Whrung (Currency) Dezimalzahl (Decimal) Gleitkommazahl (Floating-point) p((L+2)/2) p((L+2)/2) f

Ganze Zahl 1 Byte (1-byte integer) (none) Ganze Zahl 2 Byte (2-byte integer) (none) Ganze Zahl 4 Byte (4-byte integer) i Sprache (Language) Numerischer Text (Numeric text) Genauigkeit (Precision) Menge (Quantity) Einheit (Units) c(1) n(L) x(2) p((L+2)/2) c(L)

Definition von Variablen mit der parameters-Anweisung

Ein Parameter ist eine spezielle Variable, die mit der parameters-Anweisung definiert wird. parameters ist hnlich der data-Anweisung, aber wenn Sie das Programm ausfhren, wird das System die Parameter als Eingabefeld auf dem Selektionsbild anzeigen, bevor das Programm endgltig ausgefhrt wird. Der Benutzer kann Werte eingeben oder verndern und dann die AusfhrenTaste drcken, um die Programmausfhrung zu starten. Sie knnen sowohl parameters als auch data im selben Programm benutzen. Die Konventionen fr parameters-Namen sind dieselben wie fr die Variablen. Ausnahmen:

Die maximale Lnge ist 8 Zeichen statt 30 Zeichen. In dem Zusatz fr Literale und Konstanten knnen Sie auch eine Variable nutzen, um einen Wert als Vorgabe zu liefern.

Syntax fr die parameters-Anweisung

Der folgende Programmcode ist die Syntax, um eine Variable mit der parameters-Anweisung zu definieren. parameters p1[(l)] [type t] [decimals d] ... oder data p1 like v1 ... ... [default 'xxx'] [obligatory] [lower case] [as checkbox] [radiobutton group g] wobei gilt:

p1 ist der Parametername. V1 ist der Name der vorher definierten Variablen oder des vorher definierten Parameters bzw. der Name eines Feldes, das zu einer Tabelle oder Struktur im Data Dictionary gehrt. l ist die interne Lngenangabe. t ist der Datentyp. d ist die Zahl der Dezimalstellen (wird nur mit Typ p benutzt). 'xxx' ist ein Literal oder eine vorher definierte Variable, das den Vorgabewert liefert.

Listing 7.5 zeigt ein Beispiel von Parametern, die mit der parameters-Anweisung definiert sind. Listing 7.5: Beispiele von Parametern, definiert mit der parameters-Anweisung 1 2 3 4 5 parameters parameters parameters parameters parameters p1(2) type c. p2 like p1. max_value type i default 100. cur_date type d default '19980211' obligatory. cur_date like sy-datum default sy-datum obligatory.

Es gibt zwei Variationen der parameters-Anweisung: parameter und parameters. In der Anwendung gibt es keinen Unterschied zwischen beiden, sie sind komplett austauschbar. Allerdings werden Sie fr die parameter-Anweisung in der (F1)-Hilfe nichts finden. Aus diesem Grund empfehle ich Ihnen die parametersAnweisung. Ein Beispielprogramm mit der parameters-Anweisung zeigt Listing 7.6; das erzeugte Eingabebild ist in Abbildung 7.3 dargestellt. Bitte fhren Sie den Report jetzt aus.

Listing 7.6: Beispiel eines Programms, das Eingabeparameter durch die parametersAnweisung akzeptiert 1 report ztx0706. 2 parameters: p1(15) type c, 3 p2 like p1 obligatory lower case, 4 p3 like sy-datum default sy-datum, 5 cb1 as checkbox, 6 cb2 as checkbox, 7 rb1 radiobutton group g1 default 'X', 8 rb2 radiobutton group g1, 9 rb3 radiobutton group g1. 10 write: / 'You entered:', 11 / ' p1 =', p1, 12 / ' p2 =', p2, 13 / ' p3 =', p3, 14 / ' cb1=', cb1, 15 / ' cb2=', cb2, 16 / ' rb1=', rb1, 17 / ' rb2=', rb2, 18 / ' rb3=', rb3. Die Zustze fr die parameters-Anweisung sind in Tabelle 7.5 beschrieben

Tabelle 7.5: Zustze zu den parameters-Anweisungen und deren Nutzung Zusatz type decimals like default obligatory lower case as checkbox Benutzung Gleich der data-Anweisung Gleich der data-Anweisung Gleich der data-Anweisung Gleich der Wertzusatz in der data-Anweisung Der Benutzer mu einen Wert in dieses Feld eintragen, bevor das Programm ausgefhrt wird Verhindert, da Werte in Grobuchstaben bersetzt werden Zeigt das Eingabefeld wie ein Ankreuzfeld.

radiobutton group g Zeigt das Eingabefeld wie einen Auswahlknopf zugehrig zur Gruppe g. .

Abbildung 7.3: Wenn Sie den Report ztx0706 ausfhren, erscheinen die Parameter zuerst in dem Selektionsbild. Obligatorische Parameter werden mit einem Fragezeichen versehen. Um das Programm weiter auszufhren, mu der Benutzer die Taste Ausfhren in der Drucktastenleiste drkken. Die folgenden Punkte sind auch fr die parameters-Anweisung zu beachten:

In einem Selektionsbild werden obligatorische Felder mit einem Fragezeichen gekennzeichnet. Das zeigt, da der Benutzer dieser Felder erst ausfllen mu, bevor er weitermachen kann. Der vorgegebene Datentyp ist c (Zeichen). Der Vorgabewert ist 0, auer bei dem Datentyp c, wo das Leerzeichen der Vorgabewert ist. Der Wertzusatz akzeptiert ein Literal, eine sy-Variable oder eine vorher im Programm definierte Variable. Wenn der Zusatz like genutzt wird, dann erhlt der definierte Parameter seine Lnge und den Datentyp von der Referenzvariablen. Sie knnen sie nicht in derselben Anweisung spezifizieren. Wenn der Zusatz like genutzt wird, wird der Wert nicht von der Referenzvariablen bertragen. Sie knnen den Wertzusatz nutzen, um dem Parameter einen Vorgabewert zuzuweisen. Wenn Sie das nicht tun, ist der vorgegebene Initialwert 0 zugewiesen (oder

Leerzeichen fr den Datentyp Zeichen). Wie die data-Anweisung kann die parameters-Anweisung berall im Programm stehen; allerdings mu die Definition vor dem ersten Zugriff der Anweisungen auf diese Variable erfolgen. Parameter erscheinen in dem Selektionsbild in derselben Reihenfolge, in der sie im Programm definiert sind. Alle parameters-Anweisungen, egal wo sie im Programm definiert sind, werden durch den ABAP/4-Interpreter gesammelt und auf dem Selektionsbild angezeigt. Auch wenn die parameters-Anweisung in der Mitte des Programms steht, werden die Parameter auf dem Selektionsbild angezeigt, bevor das Programm weiter ausgefhrt wird. Die Parameter werden im SAP-Standardformat angezeigt. Um ihren Aufbau zu verndern, z.B. um das Eingabefeld nach links oder die Beschriftung nach rechts zu verschieben, benutzen Sie die selection-screen-Anweisung, die am Tag 21 beschrieben wird.

Benutzung des Zusatzes Kleinbuchstaben (lower case)

Alle Werte, die in die Parameter eingegeben werden, werden standardmig in Grobuchstaben umgewandelt. Um diese Umwandlung zu unterbinden, verwenden Sie bitte den Zusatz lower case. Dieser Zusatz ist nur fr Zeichenfelder anwendbar.
Benutzung des Zusatzes Ankreuzfeld (as checkbox)

Ein Ankreuzfeld hat nur zwei Zustnde: angekreuzt oder leer. Es wird gebraucht, um dem Benutzer eine Auswahl an/aus oder wahr/falsch zu geben. Es knnen mehrere Ankreuzfelder auf einem Bild benutzt werden. Wenn Sie mehrere Ankreuzfelder auf einem Bild haben, so sind diese vllig unabhngig voneinander. Um einen Parameter als Ankreuzfeld anzuzeigen, mu der Zusatz as checkbox benutzt werden. Sie knnen fr diesen Zusatz keinen Datentyp und keine Lnge angeben, standardmig wird der Datentyp c und die Lnge 1 fr diesen Zusatz vorgesehen. Der Parameter wird ein X enthalten, wenn das Feld angekreuzt ist und ein Leerzeichen, wenn das Ankreuzfeld leer ist. Wenn das Ankreuzfeld initial angekreuzt sein soll, dann benutzen Sie bitte als Vorgabewert ein X. Rufen Sie das Programm ztx506 auf, um ein Ankreuzfeld zu sehen. Das Leerzeichen und das X sind die einzigen gltigen Werte. Keine anderen Werte sind fr das Ankreuzfeld gltig.
Benutzung des Zusatzes Auswahlknopf (radiobutton group g)

Wie bei einem Ankreuzfeld hat der Auswahlknopf auch nur zwei Zustnde: ausgewhlt oder nicht ausgewhlt. Anders als Ankreuzfelder werden Auswahlknpfe niemals alleine, sondern nur in Gruppen benutzt. Sie knnen mehrere Auswahlknpfe in einer Gruppe zusammenfassen, aber nur ein Auswahlknopf ist ausgewhlt. Sie werden verwendet, um dem Benutzer eine Liste mit Alternativen zu prsentieren, in der lediglich eine Auswahl getroffen wird. Um einen Parameter als Auswahlknopf anzuzeigen, benutzen Sie bitte den Zusatz radiobutton

group g. Sie knnen fr diesen Zusatz keinen Datentyp und keine Lnge angeben, standardmig wird der Datentyp c und die Lnge 1 fr diesen Zusatz vorgesehen. g ist ein beliebiger Gruppenname von vier Zeichen Lnge. Sie knnen mehr als eine Gruppe in einem Programm verwenden. Der Parameter wird ein X enthalten, wenn das Feld angekreuzt ist und ein Leerzeichen, wenn der Auswahlknopf leer ist. Wenn der Auswahlknopf initial angekreuzt sein soll, dann benutzen Sie bitte als Vorgabewert ein X. Es gibt keine anderen gltigen Werte fr den Auswahlknopf. Probieren Sie es aus, indem Sie das Programm ztx006 laufen lassen. Parameter-Beschriftung der Eingabefelder Auf einem Selektionsbild gibt es links von jedem Eingabefeld eine Beschriftung. Standardmig entspricht diese Beschriftung dem Namen des Parameters. Sie knnen diese Beschriftung allerdings auch anders bezeichnen. Fr Parameter wie Data Dictionary-Felder erhalten Sie die Beschriftung automatisch aus den Datenelementen.
nderung der Beschriftung fr Parameter

Starten Sie jetzt das ScreenCam How to Change Input Field Labels. 1. Um eine Beschriftung fr Eingabefeld zu ndern, gehen Sie wie folgt vor: 2. Starten Sie im ABAP/4-Editor. 3. Whlen Sie den Menpfad Springen->Textelemente->Selektionstext. Das ABAP/ 4Textelementebild wird angezeigt. Im Programmfeld steht Ihr aktueller Programmname. 4. Drcken Sie die Schaltflche ndern. Jetzt knnen Sie manuell die Beschriftungen in der Textspalte ndern. 5. ndern Sie die Feldbeschriftungen in der Textspalte. 6. Fr einen Parameter, der wie ein DDIC Feld definiert ist, knnen Sie die Beschriftungen aus dem Datenelement erhalten. Um eine Beschriftung fr ein Datenelement zu erhalten, positionieren Sie den Cursor in dem Feld und whlen den Menpfad Hilfsmittel->DD-Texte bernehmen. Die Beschriftung mittlerer Lnge des Datenelementes erscheint als geschtztes Textfeld und der Datentyp des Feldes wechselt und enthlt die Zeichen DDIC. Am unteren Rand des Fensters erscheint die Meldung Alle Selektionstexte aus Dictionary bernommen. 7. Um den Schutz eines einzelnen Feldes aufzuheben, positionieren Sie den Cursor auf dem Feld und whlen aus dem Menpfad Hilfsmittel->Kein DD-Text. Das Textfeld wird ungeschtzt und die Zeichen DDIC werden vom Feld entfernt. Am unteren Rand des Fensters erscheint die Meldung Text zu xxx wird nicht mehr aus dem Dictionary bernommen. 8. Um die Feldbeschriftungen fr alle Parameter zu erhalten, die wie ein DDIC Feld definiert ist, whlen Sie den Menpfad Hilfsmittel->DD Texte bernehmen. Feldbezeichungen fr alle DDIC

Felder werden geholt und sind geschtzt. Alle existierenden Werte in der Textspalte werden berschrieben. Am unteren Rand des Fensters erscheint die Meldung Alle Selektionstexte aus Dictionary bernommen. 9. Bedienen Sie die Drucktaste Sichern in der Drucktastenleiste. Am unteren Rand des Fensters erscheint die Meldung Textelemente fr Programm xxxxx in Sprache D bernommen. 10. Drcken Sie zweimal die Drucktaste Zurck in der Drucktastenleiste, um zu dem Programm zurckzukehren. Wenn Sie die Beschriftung fr einige, aber nicht fr alle DDIC-Felder berschreiben wollen, dann geben Sie die Beschriftungen in den Textspalten ein und whlen dann den Menpfad Hilfsmittel->DDTexte ergnzen. Alle leeren Textfelder werden aus dem Data Dictionary gefllt und die eingegebenen Werte bleiben erhalten. Wenn die Beschriftung sich im DDIC ndert, wird die Beschriftung auf den jeweiligen Bildern nicht automatisch gendert. Um die Beschriftung dort zu ndern, mssen Sie zu den ABAP/4Textelementen gehen und dort entweder den Menpfad Hilfsmittel- >DD-Text bernehmen oder Hilfsmittel->DD-Texte bernehmen whlen.

Der Wertzusatz der Anweisung parameters wird nicht auf Kompatibilitt mit dem Datentyp geprft. Ein Vorgabewert fr ein Ankreuzfeld oder Auswahlknopf, der nicht Leerzeichen oder X ist, ist ungltig. Obwohl eine cursory evaluation (Cursor Auswertung) die Probleme aufzeigen kann, kann intensives Testen mit dem Programm unvorhersehbares Verhalten hervorrufen.
Auswirkung der Parameter Definitionen: type gegen like

Benutzen Sie immer den Zusatz like, um einen Parameter zu definieren. Wenn Sie diesen Zusatz benutzen, erhlt dieser Parameter die folgenden Eigenschaften des Data Dictionary:

Die (F1)-Hilfe wird von der Drucktaste Dokumentation des Datenelements genutzt. Die (F4)-Hilfe wird benutzt, wenn der Parameter dem der Prftabelle gleicht. Eine Beschriftung des Feldes wird vom Datenelement bertragen.

Zu den eben genannten Vorteilen kommt noch folgendes hinzu:

Eine Feldbeschriftung, die aus dem Data Dictionary kommt, garantiert die Vertrglichkeit mit anderen Feldbeschriftungen aus anderen Programmen fr das gleiche Feld (vorausgesetzt sie erhalten ihre Definition auch aus dem DDIC). Das beseitigt das Problem, zwei Felder mit unterschiedlichen Beschriftungen zu erhalten, die dieselben Daten aufweisen. nderungen des Datentyps oder der Lnge im DDIC werden automatisch in Ihrem Programm bercksichtigt.

Bei Bercksichtigung dieser Vorteile sollten Sie immer den Zusatz like benutzen, um Parameter zu definieren. Das gilt auch fr Ankreuzfelder oder Auswahlknpfe. Wenn notwendig, sollten Sie eine Struktur im DDIC anlegen, die like benutzt. Dann knnen Sie zumindest auf die (F1)-Hilfe zurckgreifen. Beachten Sie, da die (F1)-Hilfe auch fr Ankreuzfelder oder Auswahlknpfe verfgbar ist.
Auswirkung der Prftabelle auf einen Parameter

Wenn Sie einen Parameter mit like st-f1 definieren, und st-f1 hat eine Prftabelle, dann erscheint der nach unten gerichtete Auswahlpfeil. Sie knnen auf diesen Auswahlpfeil drcken und erhalten ein Liste mit gltigen Werten fr das Feld. Allerdings werden die eingegebenen Werte nicht gegen die Prftabelle geprft. Eine Prfung wird nur fr die Dialogbilder vorgenommen, wie Sie es beispielsweise fr die Transaktion SE16 gesehen haben. Der Benutzer kann jeden beliebigen Wert in das Eingabefeld eingeben, und dieser wird an das Programm bergeben, sobald die Drucktaste Ausfhren gedrckt wird.

Sie knnen eigene Prfungen fr Selektionsbilder anlegen. Sie werden detailliert am Tag 21 im Abschnitt Selektionsbilder behandelt.

Zusammenfassung

Programme werden auf dem Applikationsserver in einem Programmpuffer gehalten. Es gibt nur eine Programmkopie, so da ein Rollbereich fr jede Programmausfhrung notwendig ist. Der Rollbereich enthlt die Werte der Variablen und den aktuellen Programmzeiger. Ein ABAP/4-Programm besteht aus Anweisungen, die mit einem Schlsselwort beginnen und mit einem Punkt enden. Anweisungen knnen in jeder Spalte beginnen und sich ber mehrere Zeilen erstrecken. Ein Datenobjekt ist ein Speicherplatz, der Daten zur Laufzeit eines Programms enthlt. Literale und Konstanten sind nicht vernderbare Datenobjekte. Die vernderbaren Datenobjekte sind Variablen, Feldleisten und interne Tabellen. Datenobjekte werden im Rollbereich eines Programms gehalten und gelscht, wenn das Programm endet. Datenobjekte haben drei Ebenen der Auswahl: lokal, global und extern. Die Auswahl der

Datenobjekte steuert, von wo aus auf die Datenobjekte zugegriffen wird. Literale sind Daten, die im Programm hart programmiert sind. Konstanten knnen Literale ersetzen; hierdurch wird ein Programm einfacher zu warten. Bei Datentypen werden zwei Gruppen unterschieden: Zeichen und numerische Typen. Die Datentypzeichen sind c, n, d, t und x; die numerischen Datentypen sind i, p und f. Variablen werden mit den data- und parameters-Anweisungen definiert. Der Unterschied ist, da fr Parameter bei der Programmausfhrung ein Eingabefeld auf dem Selektionsbild angezeigt wird. Der Benutzer kann dann Werte eingeben bzw. die Vorgabewerte ndern. Werte, die in ein Parameter-Eingabefeld eingegeben werden, werden standardmig in Grobuchstaben umgesetzt. Um das zu verhindern, benutzen Sie bitte den Zusatz lower case. Sie knnen die Parameter Eingabefelder ber den Menpfad Springen -> Textelemente ndern. Nicht erlaubt Benutzen Sie keinen Bindestrich in Variablennamen. Ein Bindestrich grenzt die Komponenten einer Feldleiste ab.

Erlaubt Benutzen Sie den Unterstrich, um Ihre Variablen einfacher lesbar zu machen.

Fragen & Antworten


Frage: Warum mu man zwischen Anfhrungszeichen in Grobuchstaben programmieren? Woher soll ich wissen, ob ich in Kleinbuchstaben programmieren mu? Antwort: In den meisten Fllen konvertiert das Programm automatisch die Daten in Grobuchstaben, bevor die Daten in die Datenbank geschrieben werden. Die Konvertierung wird durch die Domne durchgefhrt. Sie knnen feststellen, welche Daten konvertiert werden, wenn Sie sich die Domne anschauen. Wenn der Datentyp des Feldes CHAR ist, und wenn das Ankreuzfeld Lower Case angekreuzt ist, dann knnen die Felder Klein- und Grobuchstaben enthalten. Frage: Kann ich Parameter definieren, die mehrere Werte akzeptieren? Antwort: Ja, die Anweisung select-options ermglicht es dem Benutzer, verschiedenste Werte und komplexe Kriterien einzugeben.

Workshop
Der Workshop bietet Ihnen zwei Mglichkeiten, Ihr gelerntes Wissen umzusetzen. Im Prfungsabschnitt werden Fragen gestellt, die Ihnen helfen sollen, Ihr Verstndnis fr die besprochene Thematik zu vertiefen. Der bungsabschnitt ermglicht Ihnen, Erfahrungen zu sammeln, indem Sie

das Gelernte anwenden. Antworten auf die Prfungsaufgaben und die bungen knnen Sie im Anhang B (Antworten zu Kontrollfragen und bungen) finden.

Kontrollfragen
Welche Literale sind falsch? (Es kann mehr als einen Fehler geben, und einige haben keine Fehler.) Schreiben Sie die richtigen Definitionen auf. 1. Zeichenkettenliteral: "Don't bite." 2. Gleitkommazahl: '+2.2F03.3' 3. Numerisches Literal: -99 4. Hexadezimales Literal: x'0000f' 5. Numerisches Literal: 9.96. Gleitkommazahl: '1.1E308' 7. Hexadezimales Literal: 'HA' 8. Zeichenkettenliteral: '''' 9. Zeichenkettenliteral: '''"''' Was ist an diesen Datendefinitionen falsch? (Es kann mehrere Fehler geben, und einige Beispiele haben keine Fehler.) Schreiben Sie die richtigen Definitionen auf. 1. data first-name(5) type c. 2. data f1 type character. 3. data 1a(5) type i. 4. data per-cent type p value 55.5. 5. data f1(2) type p decimals 2 value '12.3'.

bung 1
Schreiben Sie ein Programm, das Parameter fr die Abbildung 7.4 benutzt.

Ein Imprint des Markt&Technik Buch- und Software-Verlag GmbH. Elektronische Fassung des Titels: ABAP/4 in 21 Tagen, ISBN: 3-8272-2016-X

Rckblick
In der vergangenen Woche haben Sie die folgenden Bereiche und Aufgaben bearbeitet :

die R/3-Umgebung einschlielich der Basis, der Anmeldemandanten, der ABAP/4-Entwicklungsumgebung und des Data Dictionary kennengelernt einfache ABAP/4-Programme geschrieben und sich mit dem ABAP/4-Editor vertraut gemacht transparente Tabellen, Datenelemente und Domnen angelegt Fremdschlssel angelegt, um den Anwender mit der (F4)-Hilfe zu untersttzen Datenelemente dokumentiert, um (F1)-Hilfe anzubieten Sekundrindizes und Puffer angelegt, um den Datenzugriff zu beschleunigen

Ein Imprint des Markt&Technik Buch- und Software-Verlag GmbH. Elektronische Fassung des Titels: ABAP/4 in 21 Tagen, ISBN: 3-8272-2016-X

Auf einen Blick


Tag 8 Datendefinition in ABAP/4, Teil 2 271 Tag 9 Zuweisungen, Konvertierungen und Berechnungen 291 Tag 10 Allgemeine Kontrollanweisungen 327 Tag 11 Interne Tabellen 363 Tag 12 Interne Tabellen, Teil 1 403 Tag 13 Interne Tabellen, Teil 2 441 Tag 14 Die write-Anweisung 481 In Woche 2 legen Sie feste und variable Datenobjekte an, wobei Sie sowohl vordefinierte als auch benutzerdefinierte Datentypen verwenden. Sie lernen die Regeln der ABAP/4-Syntax und die Anweisungen zur Kontrolle des Programmflusses und zur Zuweisung sowie die Umsetzungsregeln kennen. Auerdem definieren Sie interne Tabellen, fllen Sie mit impliziten und expliziten Arbeitsbereichen, fhren Gruppenwechsel aus und optimieren die select-Anweisungen, um direkt und effizient interne Tabellen zu fllen. Schlielich verwenden Sie die Formatoptionen der writeAnweisung, erleben den Effekt von Datentypen in der Ausgabe, erarbeiten conversion exits und entdecken ihre Prsenz in Domnen.

Am 8. Tag verwenden Sie die tables-Anweisung, um Feldleisten zu definieren, verstehen die types-Anweisung und verwenden sie, um Ihre eigenen Datentypen zu definieren. Der 9. Tag lehrt Sie, allgemeine Systemvariablen zu benutzen und sie anzuzeigen oder zu finden, Datenumsetzungen vorherzusagen und mit zugehrigen Anweisungen auszufhren sowie mathematische Ausdrcke zu codieren. Am 10. Tag lernen Sie, die allgemeinen Kontrollanweisungen if, case, do und while zu codieren, Programmsequenzen mit exit, continue und check zu kontrollieren und einfache Positions- und Lngenspezifikationen in der write-Anweisung zu codieren. Der 11. Tag macht Sie mit der Definition einer internen Tabelle mit oder ohne berschrift, vertraut. Sie fllen eine interne Tabelle mit append durch eine berschrift oder einen expliziten Arbeitsbereich, sortieren eine interne Tabelle und verwenden den as text-Zusatz. Am 12. Tag lernen Sie, den Tabellenrumpfoperator zu erkennen und zu verwenden, um nach

der Existenz von Daten in internen Tabellen zu suchen und die Inhalte zweier interner Tabellen auf Gleichheit hin zu berprfen. Der 13. Tag zeigt Ihnen, wie man eine interne Tabelle aus einer Datenbanktabelle fllt, indem man die erfolgreichsten Konstrukte verwendet; Sie fhren Gruppenwechsel in internen Tabellen mit at und on change of aus. Schlielich verstehen Sie nach dem 14. Tag den Effekt von Datentypen in der Ausgabe, verwenden die Formatoptionen der write-Anweisung, benutzen conversion exits und entdecken ihre Prsenz in Domnen.

Ein Imprint des Markt&Technik Buch- und Software-Verlag GmbH. Elektronische Fassung des Titels: ABAP/4 in 21 Tagen, ISBN: 3-8272-2016-X

Woche 2

Tag 8 Datendefinition in ABAP/4, Teil 2


Kapitelziele
Wenn Sie dieses Kapitel durchgearbeitet haben, sollten Sie folgendes knnen:

die tables-Anweisung benutzen, um Feldleisten zu definieren und den Unterschied zwischen Feldleisten verstehen, die mit der data-Anweisung definiert wurden, und solchen, die mit der tables-Anweisung definiert wurden die Anweisung types verstehen und sie benutzen, um Ihre eigenen Datentypen zu definieren

Definition der Konstanten


Eine Konstante ist mit einer Variablen beinahe identisch. Der Unterschied ist, da sich ihr Wert nicht ndern kann. Um eine Konstante zu definieren, benutzen Sie die Anweisung constants. Benutzen Sie eine Konstante dann, wenn Sie das gleiche Literal mehrere Male in einem Programm aufnehmen mssen. Sie knnen eine Konstante mit dem gleichen Wert wie das Literal definieren und die Konstante im Rumpf des Programms an Stelle des Literals benutzen. Wenn Sie den Wert des Literals spter ndern mssen, ndern Sie einfach den Wert der Konstanten, was zur Folge hat, da ihr Wert aktualisiert wird, wo immer er im Programm benutzt wird. ABAP/4 hat eine vordefinierte Konstante: SPACE. Es ist eine Konstante, die den Wert von einem Leerzeichen hat. Sie knnen sie anstelle des Literals '' benutzen.

Syntax fr die Anweisung constants


Der folgende Code demonstriert die Syntax zur Definition einer Konstanten. Er ist der Anweisung data hnlich; der Zusatz value wird allerdings gebraucht. Ansonsten folgen die Konstanten den gleichen Regeln wie Variablen, welche mit Hilfe der data- Anweisung definiert wurden. In Listing 8.1 finden Sie Beispiele von Konstanten-Definitionen.

constants c1[(l)] [type t] [decimals d] value 'xxx'. oder constants c1 like cv value 'xxx'. wobei gilt:

c1 ist der Name der Konstanten. cv ist der Name einer vorher definierten Konstanten oder Variablen oder der Name eines Felds, das im Data Dictionary zu einer Tabelle oder Struktur gehrt. (l) ist die interne Lngenangabe. t ist der Datentyp. d ist die Anzahl der Dezimalstellen (wird nur mit Typ p benutzt). 'xxx' ist ein Literal, das den Wert der Konstanten liefert. Listing 8.1: Definitionen von Konstanten

1 2 3 4

constants constants constants constants

c1(2) type c value 'AA'. c2 like c1 value 'BB'. error_threshold type i value 5. amalgamation_date like sy-datum value '19970305'.

Konstanten knnen in einem Typenpool definiert werden. In diesem Fall knnen sie von mehreren Programmen genutzt werden. Fr weitere Informationen lesen Sie den Abschnitt Pooltypen am Ende dieses Kapitels.

Definition von Feldleisten


Eine Feldleiste ist eine Art Variable und einer Struktur im DDIC gleichwertig, aber innerhalb eines ABAP/4-Programms definiert. Eine Feldleiste ist wie eine Struktur eine Reihe gruppierter Felder unter einem gebruchlichen Namen. Der Hauptunterschied liegt in der Definition. Der Terminus Struktur in R/3 bezieht sich nur auf ein Data Dictionary-Objekt, welches eine Sammlung von Feldern enthlt. Der Terminus Feldleiste bezieht sich auf eine Sammlung von Feldern, die in einem ABAP/4Programm definiert werden. Zwei Anweisungen werden blicherweise benutzt, um Feldleisten in einem ABAP/4- Programm zu definieren:

data tables

Verwendung der data-Anweisung zur Definition einer Feldleiste


Eine Feldleiste, die mit der data-Anweisung definiert ist, ist ein modifizierbares Datenobjekt. Es kann eine globale oder lokale Sichtbarkeit haben.

Syntax zur Definition einer Feldleiste unter Verwendung der data-Anweisung


Im folgenden wird die Syntax gezeigt, mit der eine Feldleiste mit Hilfe der data-Anweisung definiert wird. data: begin of fs1, f1[(l)] [type t] [decimals d] [value 'xxx'], f2[(l)] [type t] [decimals d] [value 'xxx'], ... end of fs1. oder data begin of fs1. data f1[(l)] [type t] [decimals d] [value 'xxx']. data f2[(l)] [type t] [decimals d] [value 'xxx']. ... [include structure st1.] data end of fs1. oder data fs1 like fs2. wobei gilt:

fs1 ist der Name der Feldleiste. f1 und f2 sind die Felder (auch Komponenten genannt) der Feldleiste. fs2 ist der Name einer vorher definierten Feldleiste oder der Name einer Tabelle oder Struktur im Data Dictionary. (l) ist die interne Lngenangabe. t ist der Datentyp. d ist die Anzahl der Dezimalstellen (wird nur mit Typ p benutzt). 'xxx' ist ein Literal, das den Wert der Konstanten liefert.

st1 ist der Name einer Struktur oder Tabelle im Data Dictionary.

Feldleisten folgen den gleichen Regeln wie Variablen, die definitionsgem die data- Anweisung benutzen. Um sich auf eine Einzelkomponente zu beziehen, mu ihr Name mit dem der Feldleiste beginnen, gefolgt von einem Bindestrich (-). Um zum Beispiel die Komponente number der Feldleiste cust_info zu schreiben, wrden Sie die Anweisung write cust_info-number benutzen. Die Anweisung include ist nicht Teil der Anweisung data; sie ist eine gesonderte Anweisung. Sie kann deswegen nicht mit der data-Anweisung verkettet werden. Die Anweisung davor mu mit einem Punkt verbunden werden. Beispiele von Programmen, die Feldleisten definieren und benutzen, werden in den Listings 8.2 bis 8.6 gezeigt. Listing 8.2: Ein einfaches Beispiel einer Feldleiste, die definitionsgem die Anwendung data benutzt 1 report ztx0802. 2 data: begin of totals_1, 3 region(7) value 'unknown', 4 debits(15) type p, 5 count type i, 6 end of totals_1, 7 totals_2 like totals_1. 8 9 totals_1-debits = 100. 10 totals_1-count = 10. 11 totals_2-debits = 200. 12 13 write: / totals_1-region, totals_1-debits, totals_1-count, 14 / totals_2-region, totals_2-debits, totals_2-count. In Zeile 2 fngt die Definition der Feldleiste totals_1 an. Sie enthlt drei Felder, von denen das erste mit dem Wert 'unknown' initialisiert ist. In Zeile 7 wird die Feldleiste totals_2 genau wie totals_1 definiert. Der Wert von totals_1-region wird nicht fr totals_2-region bernommen. In den Zeilen 9 bis 11 werden die Werte den Komponenten der Feldleisten zugewiesen, und in den Zeilen 13 und 14 werden die Werte von allen Komponenten ausgeschrieben. Listing 8.3: Eine Feldleiste kann eine andere beinhalten. 1 2 3 4 report ztx0803. data: begin of names, name1 like ztxkna1-name1, name2 like ztxkna1-name2,

5 end of names. 6 data: begin of cust_info, 7 number(10) type n, 8 nm like names, "like a field string 9 end of cust_info. 10 11 cust_info-number = 15. 12 cust_info-nm-name1 = 'Jack'. 13 cust_info-nm-name2 = 'Gordon'. 14 15 write: / cust_info-number, 16 cust_info-nm-name1, 17 cust_info-nm-name2. In Zeile 2 fngt die Definition der Feldleiste names an. Sie enthlt zwei Felder, die wie Felder von Tabelle ztxkna1 im Data Dictionary definiert sind. Sie enthalten keine Anfangswerte. In Zeile 8 wird die Komponente cust_info-name wie die Feldleiste names definiert. Bei der Verwendung in den Zeilen 12 und 13 wird nm dem Komponentennamen hinzugefgt. Listing 8.4: Eine Feldleiste kann genauso definiert werden wie eine DDIC-Tabelle oder Struktur. 1 report ztx0804. 2 data: my_lfa1 like ztxlfa1, "like a table in the DDIC 3 my_addr like ztxaddr. "like a structure in the DDIC 4 5 my_lfa1-name1 = 'Andrea Miller'. 6 my_lfa1-telf1 = '1-243-2746'. 7 my_addr-land1 = 'CA'. 8 9 write: / my_lfa1-name1, 10 my_lfa1-name2, 11 my_addr-land1. In Zeile 2 ist my_lfa1 genauso definiert wie die DDIC-Tabelle ztxlfa1, und my_addr wird wie die DDIC-Struktur ztxaddr definiert.

Um sich die DDIC-Definition der Tabelle ztxlfa1 anzuschauen, doppelklicken Sie auf den Namen in Ihrem Quellcode.

Listing 8.5: DDIC-Tabellen und -Strukturen knnen auch in eine Feldleiste eingebunden werden. 1 report ztx0805. 2 data begin of fs1. 3 include structure ztxlfa1. 4 data: extra_field(3) type c, 5 end of fs1. 6 7 fs1-lifnr = 12. 8 fs1-extra_field = 'xyz'. 9 10 write: / fs1-lifnr, 11 fs1-extra_field. In Zeile 2 fngt die Definition der Feldleiste fs1 an. Die Anweisung endet mit einem Punkt, weil include structure nicht Teil der Anweisung data ist und deshalb gesondert aufgepat werden mu. In Zeile 3 ist die Struktur von Tabelle ztxlfa1 in die Feldleiste eingebunden. In Zeile 4 ist ein anderes Feld in der Feldleiste nach den Feldern von Tabelle ztxlfa1 eingeschlossen. Mehrere Felder knnten eingebunden werden, ebenso mehrere Strukturen oder jede Kombination davon. Listing 8.6: Wenn Sie like statt include benutzen, erhalten Sie ein anderes Ergebnis. Den Namen der eingebundenen Felder ist der Name einer Zwischenkomponente vorangestellt. 1 report ztx0806. 2 data: begin of fs1, 3 mylfa1 like ztxlfa1, 4 extra_field(3) type c, 5 end of fs1. 6 7 fs1-mylfa1-lifnr = 12. 8 fs1-extra_field = 'xyz'. 9 10 write: / fs1-mylfa1-lifnr, 11 fs1-extra_field. In Zeile 2 fngt die Definition der Feldleiste lfa1_with_extra_field an. Die Anweisung endet mit einem Punkt, weil include structure nicht Teil der Anweisung data ist sondern hiervon unabhngig. In Zeile 3 ist die Struktur von Tabelle ztxlfa1 in die Feldleiste eingeschlossen. In Zeile 4 ist ein anderes Feld in der Feldleiste nach den Feldern von Tabelle ztxlfa1 eingeschlossen. Mehrere Felder knnten eingebunden werden, ebenso mehrere Strukturen oder jede Kombination davon.

Verwendung einer Feldleiste als Variable vom Typ char

Sie knnen nicht nur die Einzelkomponenten einer Feldleiste, sondern auch alle Komponenten auf einmal adressieren, als seien sie einzelne Variablen vom Typ char. Listing 8.7 veranschaulicht dieses Konzept. Listing 8.7: Ein Beispiel zur Verwendung einer Feldleiste sowohl als multiple Variable als auch als einzelne Variable vom Typ char. 1 report ztx0807. 2 data: begin of fs1, 3 c1 value 'A', 4 c2 value 'B', 5 c3 value 'C', 6 end of fs1. 7 8 write: / fs1-c1, fs1-c2, fs1-c3, 9 / fs1. 10 11 fs1 = 'XYZ'. 12 13 write: / fs1-c1, fs1-c2, fs1-c3, 14 / fs1. Der Code in Listing 8.7 sollte diese Ausgabe erzeugen: A B C ABC X Y Z XYZ Die Zeilen 2 bis 6 definieren die Feldleiste fs1. Sie hat drei Komponenten, jede mit einem Standardwert. In Zeile 8 ist jede Komponente individuell ausgeschrieben. In Zeile 9 ist die Feldleiste ausgeschrieben, als sei sie eine einzelne Variable. Folglich zeigt die Ausgabe die Inhalte von fs1 so, als sei es eine einzelne, als char 3 definierte Variable. In Zeile 11 wird der Wert 'XYZ' der Feldleiste zugewiesen, und sie wird wieder als char-Variable behandelt. Die resultierende Ausgabe zeigt, da die Einzelglieder die nderung reflektieren, weil sie auf die gleiche Speicherung zugreifen. Eine Feldleiste kann einer anderen zugewiesen werden, wenn beide die gleiche Struktur haben, wie es in Listing 8.8 gezeigt wird. Listing 8.8: Ein Beispiel einer Zuweisung zweier Feldleisten. 1 report ztx0808. 2 data: begin of fs1,

3 c1 value 'A', 4 c2 value 'B', 5 c3 value 'C', 6 end of fs1, 7 fs2 like fs1. 8 9 fs2 = fs1. 10 write: / fs2-c1, fs2-c2, fs2-c3. Der Code in Listing 8.8 sollte diese Ausgabe erzeugen: A B C Die Zeilen 2 bis 6 definieren die Feldleiste fs1. Zeile 7 definiert die Feldleiste fs2 genau wie fs1. In Zeile 9 erhlt fs2 die gleiche Zuweisung wie fs1, genauso, als wre sie eine einzelne Variable vom Typ char. In Zeile 10 sind die Komponenten von fs2 ausgeschrieben.

Eine Feldleiste, die numerische Daten enthlt, braucht spezielle berlegungen whrend der Zuweisung. Diese werden am neunten Tag im Abschnitt Zuweisungen behandelt.

Verwendung der tables-Anweisung zur Definition einer Feldleiste


Eine Feldleiste, die definitionsgem die Anweisung tables verwendet, ist ein modifizierbares Datenobjekt. Solche Feldleisten folgen den gleichen Regeln wie die Feldleisten, die definitionsgem die Anweisung data benutzen. Ein Beispiel fr ein Programm, welches eine tables-Feldleiste benutzt, finden Sie in Listing 8.9. Syntax zur Definition einer Feldleiste, welche die Anweisung tables benutzt. tables fs1. wobei gilt:

fs1 ist der Name der Feldleiste. Eine Tabelle oder Struktur gleichen Namens mu im Data Dictionary existieren. Listing 8.9: Einfaches Beispiel einer Feldleiste, die definitionsgem die Anweisung tables verwendet.

1 2 3 4 5 6 7

report ztx0809. tables ztxlfa1. ztxlfa1-name1 = 'Bugsy'. ztxlfa1-land1 = 'US'. write: / ztxlfa1-name1, ztxlfa1-land1.

Zeile 2 definiert die Feldleiste ztxlfa1. Ihre Definition ist genau wie die der Data DictionaryTabelle gleichen Namens. In den Zeilen 4 und 5 werden zwei ihrer Komponenten Werte zugeordnet, die in Zeile 7 ausgeschrieben werden.

Definition einer Feldleiste unter Verwendung von tables in Interaktion mit select
Die Anweisung tables bewirkt mehr, als einfach nur eine Feldleiste zu definieren. Sie fhrt zwei Dinge aus:

Sie definiert eine Feldleiste. Sie ermglicht dem Programm den Zugriff auf eine Datenbanktabelle gleichen Namens, wenn eine solche existiert.

Ihr erstes Beispiel fr eine select-Anweisung steht in Listing 8.10. Sie knnen es jetzt aus einer neuen Perspektive analysieren. Listing 8.10: Ihr zweites Programm in berarbeiteter Fassung 1 2 3 4 5 report ztx0810. tables ztxlfa1. select * from ztxlfa1 into z lfa1 order by lifnr. write / z lfa1-lifnr. endselect.

Zeile 2 definiert die Feldleiste ztxlfa1. Ihre Definition lautet genauso wie die der Data DictionaryTabelle gleichen Namens. Es gibt auch eine Datenbanktabelle mit dem gleichen Namen, so da das Programm Zugriff auf diese Tabelle hat, was bedeutet, da sie jetzt in einer select-Anweisung benutzt werden kann. Jedes Mal, wenn Zeile 3 ausgefhrt wird, wird ein Datensatz von der Datenbanktabelle ztxlfa1 in die Feldleiste ztxlfa1 eingelesen. Fr jeden Datensatz wird der Wert der Komponente ztxlfa1- lifnr ausgeschrieben (Zeile 4).

Sichtbarkeit einer Feldleiste, die definitionsgem tables verwendet

Eine Zeichenkette, die definitionsgem tables benutzt, hat immer sowohl globale als auch externe Sichtbarkeit, unabhngig davon, wo sie im Programm definiert ist. Dies bedeutet: Wenn Sie eine tables-Anweisung in einem Unterprogramm plazieren, ist die Definition global, und Sie knnen in diesem Programm an beliebiger Stelle keine andere Definition fr die gleiche Feldleiste haben. Die Feldleiste ist auch extern sichtbar. Das heit: Wenn in einem aufrufenden und aufgerufenen Programm die gleiche tables-Anweisung erscheint, werden diese Feldleisten den gleichen Speicher gemeinsam nutzen. Dieses Konzept ist in Abbildung 8.1 veranschaulicht. Wenn das aufgerufene Programm ausgefhrt wird, sieht es den Wert in ztxlfa1 vom ersten Programm. Wenn es ztxlfa1 ndert, sieht das aufrufende Programm die nderungen in dem Moment, in dem es die Kontrolle wiedererlangt.

Abbildung 8.1: Identische tables-Definitionen in einem aufrufenden und aufgerufenen Programm bewirken die gemeinsame Nutzung des Speichers fr diese Feldleisten.

Definition von Typen


Sie knnen Ihre eigenen Datentypen definieren, indem Sie die Anweisung types auf der Basis von bestehenden Datentypen benutzen.

Syntax fr die types-Anweisung


Es folgt die Syntax zur Typendefinition unter Verwendung der Anweisung types. types t1[(l)] [Type t] [decimals d]. oder types t1 like v1.

wobei gilt:

t1 ist der Typenname. v1 ist der Name einer Variablen, die vorher im Programm definiert wird oder der Name eines Felds, das zu einer Tabelle oder Struktur im Data Dictionary gehrt. (l) ist die interne Lngenangabe. t ist der Datentyp. d ist die Anzahl von Dezimalstellen (nur benutzen mit Typ p).

Listings 8.11 und 8.12 zeigen Beispiele von Programmen, die ihre eigenen Datentypen definieren und benutzen. Listing 8.11: Einfaches Beispiel eines benutzerdefinierten Datentyps char2 1 2 3 4 5 6 report ztx0811. types char2(2) type c. data: v1 type char2 value 'AB', v2 type char2 value 'CD'. write: v1, v2.

Der Code in Listing 8.11 erzeugt diese Ausgabe: AB CD Zeile 2 definiert einen Datentyp, der char2 genannt wird. Es ist ein char-Feld mit zwei Byte. In den Zeilen 3 und 4 werden die Variablen v1 und v2 als char-Felder mit zwei Byte definiert, wobei der Datentyp char2 benutzt wird. Diesen werden Standardwerte zugeteilt, und in Zeile 6 werden sie ausgeschrieben. Listing 8.12: Typenbenutzung kann Ihren Code klarer und leichter lesbar machen. 1 report ztx0812. 2 types: dollars(16) type p decimals 2, 3 lira(16) type p decimals 0. "italian lira have no decimals 4 5 data: begin of american_sums, 6 petty_cash type dollars, 7 pay_outs type dollars, 8 lump_sums type dollars, 9 end of american_sums, 10 begin of italian_sums, 11 petty_cash type lira, 12 pay_outs type lira, 13 lump_sums type lira,

14 end of italian_sums. 15 16 american_sums-pay_outs = '9500.03'. "need quotes when literal contains a decimal 17 italian_sums-lump_sums = 5141. 18 19 write: / american_sums-pay_outs, 20 / italian_sums-lump_sums. Der Code in Listing 8.12 erzeugt diese Ausgabe: 9,500.00 5,141 Zeile 2 definiert einen Datentyp namens dollars als 16-Byte-Dezimalzahlfeld mit zwei Dezimalstellen. Zeile 3 definiert einen hnlichen Datentyp mit 0 Dezimalstellen namens lira. In den Zeilen 5 bis 14 werden zwei Feldleisten definiert, welche die neuen Datentypen benutzen. Je einer Komponente wird in den Zeilen 16 und 17 ein Wert zugewiesen, und in den Zeilen 19 und 20 werden sie ausgeschrieben. Stellen Sie sich einen benutzerdefinierten Typ als eine Variable vor, aber als eine, die Sie nicht benutzen knnen, um Daten zu speichern. Sie kann nur eingesetzt werden, um andere Variablen anzulegen. Die gleichen Regeln beziehen sich auf Typen wie auf Variablen und Feldleisten. Typennamen sind, genau wie Variablennamen, 1 bis 30 Zeichen lang, aber anders als bei Variablen knnen ihre Namen nicht die Zeichen - < > enthalten.

Strukturierte Typen
Ein benutzerdefinierter Typ kann auf der Definition einer Feldleiste basieren. Dies wird als strukturierter Typ bezeichnet. Listing 8.13 zeigt, wie Sie ein Programm verkrzen knnen, indem Sie einen strukturierten Typ einsetzen. Listing 8.13: Die Verwendung von strukturierten Typen kann die Redundanz verringern und macht die Untersttzung einfacher. 1 2 3 4 5 6 7 8 9 report ztx0813. types: begin of address, street(25), city(20), region(7), country(15), postal_code(9), end of address.

10 11 12 13 14 15 16 17 18 19

data: customer_addr type address, vendor_addr type address, employee_addr type address, shipto_addr type address. customer_addr-street = '101 Memory Lane'. employee_addr-country = 'Transylvania'. write: / customer_addr-street, employee_addr-country.

Die Zeilen 2 bis 8 definieren einen Datentyp namens address, der fnf Felder enthlt. In den Zeilen 10 bis 13 werden vier Feldleisten definiert, welche den neuen Typ verwenden. Ohne den neuen Typ htten diese Definitionen zustzlich 24 Code-Zeilen bentigt. Die Untersttzung wird auch leichter gemacht: Wenn eine Definitionsnderung der Adrefeldleisten notwendig wird, mu nur die Definition des Typs gendert werden.

Typgruppen
Die Anweisung types kann in einer Typgruppe gespeichert werden. Die Typgruppe (auch Typenpool genannt) ist ein Data Dictionary-Objekt, welches nur existiert, um eine oder mehrere types- oder constants-Anweisungen zu enthalten. Wenn Sie die Anweisung type-pools in Ihrem Programm benutzen, greifen Sie auf Typen oder Konstanten einer Typgruppe zu und benutzen diese in Ihrem Programm. Mehrere Programme knnen eine Typgruppe gemeinsam nutzen, was Ihnen die Mglichkeit gibt, zentrale Definitionen anzulegen. Abbildung 8.2 veranschaulicht dieses Konzept. Listing 8.14 enthlt ein Beispiel einer Typgruppe, und Listing 8.15 stellt ein Beispiel eines Programms dar, welches daraus types und constants verwendet.

Abbildung 8.2: Eine Typgruppe ist ein Behlter fr types- und constants-Anweisungen. Sie kann von verschiedenen Programmen benutzt werden. Listing 8.14: Eine Beispielanweisung type-pool mit Typen und Konstanten

1 type-pool ztx1. 2 types: ztx1_dollars(16) type p decimals 2, 3 ztx1_lira(16) type p decimals 0. 4 constants: ztx1_warning_threshold type i value 5000, 5 ztx1_amalgamation_date like sy-datum value '19970305'. Zeile 1 zeigt den Anfang der Typgruppe an und gibt ihm einen Namen. Die Zeilen 2 bis 5 definieren types und constants, die in jedem Programm benutzt werden knnen. Listing 8.15: Die Verwendung von Typgruppen reduziert die Codeverdoppelung zur einfacheren Untersttzung. 1 report ztx0815. 2 type-pools ztx1. 3 data: begin of american_sums, 4 petty_cash type ztx1_dollars, 5 pay_outs type ztx1_dollars, 6 lump_sums type ztx1_dollars, 7 end of american_sums. 8 9 american_sums-pay_outs = '9500.03'. 10 11 if american_sums-pay_outs > ztx1_warning_threshold. 12 write: / 'Warning', american_sums-pay_outs, 13 'exceeds threshold', ztx1_warning_threshold. 14 endif. Zeile 2 bringt die Definitionen von Typgruppe ztx1 in das Programm. Die Zeilen 3 bis 7 definieren eine Feldleiste unter Verwendung des Typs ztx1_dollars aus der Typgruppe. Zeile 9 weist pay_outs einen Wert zu, und diese werden mit der Konstanten ztx1_warning_threshold aus der Typgruppe von Zeile 11 verglichen. Wenn die Typgruppe schon eingebracht wurde, werden die nachfolgenden Versuche, sie aufzunehmen, ignoriert, und sie verursachen keinen Fehler. Typgruppennamen knnen 1 bis 5 Zeichen lang sein und mssen mit einem y oder z anfangen. Typen und Konstanten, die in einem Programm eingeschlossen sind, das die Anweisung type-pools benutzt, haben immer eine globale Sichtbarkeit.

Eine Typgruppe anlegen


Um eine Typgruppe im Data Dictionary anzulegen, benutzen Sie die folgende Prozedur.

Starten Sie jetzt das ScreenCam How to Create a Type Group. 1. Beginnen Sie in der Dictionary: Einstiegsmaske (Menpfad Werkzeuge-> ABAP/4-Workbench, Entwicklung->Dictionary). 2. Geben Sie den Namen Ihrer Typgruppe in das Objektnamensfeld ein. 3. Markieren Sie die Option Typgruppen. 4. Drcken Sie auf Anlegen. Sie sehen die Maske Typgruppe xxxx: Text Anlegen. 5. Geben Sie eine Beschreibung Ihrer Typgruppe in das entsprechende Feld ein. 6. Sichern Sie. Die Maske Objektkatalogeintrag ndern wird angezeigt. 7. Whlen Sie Lokales Objekt. Auf der Maske ABAP/4-Editor sehen Sie in der Anfangszeile die Anweisung type-pool t., wobei t der Name Ihrer Typgruppe ist. Wenn dieser nicht erscheint, sollten Sie ihn jetzt eingeben. 8. Tippen Sie in die nachfolgenden Zeilen constants- und types-Anweisungen. Alle Namen mssen mit t_ anfangen. 9. Sichern Sie wieder. Am unteren Rand des Fensters sehen Sie die Nachricht Typgruppe wurde gesichert. 10. Mit der Taste Zurck kommen Sie wieder an den Anfang. Um eine Typgruppe zu lschen, fhren Sie die Schritte 1 bis 3 aus und drcken dann auf Lschen.

Zusammenfassung

Feldleisten sind wie Strukturen, die innerhalb Ihres Programms definiert sind. Sie knnen sie definieren, wobei Sie entweder data oder tables benutzen. Feldleisten, die definitionsgem tables verwenden, haben sowohl globale als auch externe Sichtbarkeit. Sie knnen Ihre eigenen Datentypen definieren, sogar strukturierte Typen, indem Sie die Anweisung types benutzen. Benutzerdefinierte Typen reduzieren die Redundanz und machen eine Wartung leichter. Sie knnen eine Typgruppe im Data Dictionary definieren, um Ihre benutzerdefinierten Typen und Konstanten wiederverwendbar zu machen. Nicht erlaubt

Erlaubt

Benutzen Sie einen Unterstrich, um Ihre Variablennamen lesbarer zu machen.

Benutzen Sie niemals einen Bindestrich in einem Variablennamen; ein Bindestrich begrenzt die Komponenten einer Feldleiste.

Fragen & Antworten


Frage: Frage: Warum mu ich Feldleisten anlegen? Warum kann ich nicht einfach simple Variablen benutzen? Antwort: Antwort: Feldleisten helfen Ihnen, Ihre Variablen in Gruppen zu organisieren. Wenn Sie Hunderte von Variablen in einem Programm haben, werden die Beziehungen zwischen den Variablen klarer, wenn sie in Feldleisten organisiert sind. Die Verwendung von Feldleisten, um Felder zu gruppieren, ermglicht Ihnen auch Operationen mit einer Gruppe von Variablen, als seien diese eine einzelne Variable. Wenn Sie also zum Beispiel 100 Variablen bewegen mssen, knnen Sie normalerweise eine einzige Anweisung codieren, um die Bewegung von einer Feldleiste zu einer anderen auszufhren, anstatt 100 Zuweisungsanweisungen fr individuelle Variable zu codieren. Eine einzelne Feldleiste zu bewegen ist auch effizienter als 100 Bewegungsanweisungen, so da Ihr Programm schneller luft. Sie werden in den nchsten Kapiteln sehen, da viele Anweisungen eine Feldleiste als einen Operanden benutzen knnen. Wenn Sie Feldleisten benutzen, knnen Sie diese ausnutzen und sich viel Zeit fr Codierung und Debugging sparen. Frage: Frage: Warum wrde ich meinen eigenen strukturierten Typ statt einer DDIC- Struktur benutzen? Kann ich Feldleisten nicht mit beiden anlegen? Antwort: Antwort: Doch, das knnen Sie. Die Funktionalitt von DDIC-Strukturen berwiegt bei weitem diejenige, welche von strukturierten Typen zur Verfgung gestellt wird, weil sie Kennstze, F1 und F4-Hilfe zur Verfgung stellen knnen. Allerdings kann types benutzt werden, um verschachtelte strukturierte Typen zu definieren, die interne Tabellen enthalten. DDIC-Strukturen knnen dies nicht. Dies wird am Tag 12 im Abschnitt der internen Tabellen vorgefhrt werden.

Workshop
Der Workshop bietet Ihnen zwei Mglichkeiten zu zeigen, was Sie in diesem Kapitel gelernt haben. Die Kontrollfragen sollen Ihnen helfen, Ihr Verstndnis fr die behandelten Themen zu erhrten, und im bungsabschnitt knnen Sie Erfahrungen sammeln, indem Sie anwenden, was Sie gelernt haben. Alle Antworten finden Sie in Anhang B.

Kontrollfragen

1. Wie heit die eine vordefinierte Konstante, die in einem ABAP/4-Programm benutzt werden kann. Was ist ihr quivalent unter Zuhilfenahme eines Literals? 2. Welche Arten von Typenanweisung knnen benutzt werden, und welcher Typ kann im Data Dictionary definiert werden?

bung 1
Welchen anderen Weg gibt es, die unten genannte Variable mit Hilfe der type Anweisung zu deklarieren? data: begin of usd_amount, hotel type p decimals 2, rent_car type p decimals 2, plane type p decimals 2, food type p decimals 2, end of usd_amount, begin of amex_pt, hotel type p decimals 2, rent_car type p decimals 0, plane type p decimals 0, food type p decimals 0, end of amex_pt.

bung 2
Welche Ausgabe bewirkt dieses Programm? report ztx0816. data: begin of fld_stg1, var1 value '1', var2 value '3', var3 value '5', var4 value '7', var5 value '9', var6 value '4', var7 value '8', var8 value '6', end of fld_stg1, fld_stg2 like fld_stg1. fld_stg2 = fld_stg1. write: / fld_stg2-var1, fld_stg1-var2, fld_stg2-var6, fld_stg1-var3. write: / fld_stg1-var5, fld_stg2-var7, fld_stg2-var4, fld_stg1-var8.

Ein Imprint des Markt&Technik Buch- und Software-Verlag GmbH. Elektronische Fassung des Titels: ABAP/4 in 21 Tagen, ISBN: 3-8272-2016-X

Woche 2

Tag 9 Zuweisungen, Konvertierungen und Berechnungen


Kapitelziele
Wenn Sie das Kapitel durchgearbeitet haben, knnen Sie

allgemeine Systemvariablen benutzen sowie beliebige Systemvariablen finden und anzeigen die clear-Anweisung benutzen und ihre Wirkung auf Variablen und Feldleisten verstehen Zuweisungen mittels move- und move corresponding-Anweisungen durchfhren Datenkonvertierungen bestimmen und mit Zuweisungsanweisungen durchfhren mathematische Ausdrcke codieren

Bevor Sie weiterlesen


Programme in diesem und in den folgenden Kapiteln benutzen Ein- und Ausgabeformate, die in den Benutzervorgabewerten gesetzt werden und fr jeden Benutzer verschieden sein knnen. Bevor Sie weiterlesen, empfiehlt es sich, Ihre Benutzervorgabewerte so anzugleichen, da sie mit denen dieses Buches bereinstimmen. 1. Bitte setzen Sie jetzt Ihre Benutzervorgabewerte wie folgt: 2. Wenn Sie gerade im R/3-System angemeldet sind, sichern Sie nun Ihre Arbeit. 3. Whlen Sie den Menpfad System->Benutzervorgaben->Eigene Daten. Das Bild Pflege eigener Benutzervorgaben wird angezeigt. 4. In der Feldgruppe Festwerte whlen Sie JJJJ/MM/TT. 5. In der Feldgruppe Dezimaldarstellung whlen Sie den Punkt.

6. Drcken Sie die Schaltflche Sichern auf der Anwendungsleiste. Am Fu des Fensters erscheint die Meldung Werte fr Benutzer xxxxx gesichert. nderungen an Ihrem Benutzerprofil werden erst bei Neuanmeldung wirksam. 7. Melden Sie sich ab. Ihre neuen Benutzereinstellungen werden beim nchsten Anmelden wirksam.

Arbeiten mit Systemvariablen


Es gibt 176 Systemvariablen, die in jedem ABAP/4-Programm verfgbar sind. Sie brauchen sie nicht zu definieren; sie sind automatisch definiert und immer verfgbar. Um eine Liste der Systemvariablen anzuzeigen, zeigen sie die DDIC-Struktur syst an. Sie knnen sie ber das Dictionary :Eingangsbild oder durch Doppelklick auf den Namen einer Systemvariablen in Ihrem Programm anzeigen. Abbildung 9.1 zeigt die erste Seite von syst. Sie sehen in Abbildung 9.1, da in der ersten Spalte die Feldnamen und rechts die Beschreibungen erscheinen. Um die vollstndige Beschreibung anzusehen, blttern Sie nach rechts, indem Sie auf die Schaltflche Spalte Rechts; Nchste... unten am Fenster klicken. Um ein Feld mit mit Hilfe seines Namens zu finden, drcken Sie die Schaltflche Suchen auf der Symbolleiste. Das Fenster Feld Suchen wird angezeigt und Sie nach dem Namen des Feldes fragen, das Sie suchen mchten. Der Alias fr syst ist sy (s ausgesprochen). In Ihrem Programm knnen Sie beide Namen verwenden. Zum Beispiel knnen Sie entweder sy-datum oder syst-datum programmieren; dies ist gleichbedeutend. Die meisten Programmierer benutzen sy. Tabelle 9.1 enthlt eine kurze Liste hufig benutzter Systemvariablen. Im weiteren Verlauf dieses Buches werden zustzliche Variablen eingefhrt.

Abbildung 9.1: Dies ist die Struktur syst. Sie enthlt die Definitionen fr alle Systemvariablen. Die Schaltflche Spalte Rechts; Nchste ... blttert rechts eine Spalte nach der anderen auf und bewirkt, da die gesamte Lnge der Kurzbeschreibung sichtbar wird.

Tabelle 9.1: Hufig benutzte Systemvariablen Name Beschreibung

sy-datum Aktuelles Datum sy-uzeit Aktuelle Zeit sy-uname Aktuelle Benutzer-ID sy-subrc Letzter Rckgabewert sy-mandt Anmeldemandant sy-pagno Aktuelle Ausgabeseitennummer

sy-colno Aktuelle Ausgabespaltennummer sy-linno Aktuelle Ausgabenlistennummer sy-vline Senkrechte Linie sy-uline Waagerechte Linie sy-repid Aktueller Reportname sy-cprog Hauptprogrammname sy-tcode Aktueller Transaktionscode sy-dbcnt Aktueller Wiederholungszhler innerhalb eines select. Enthlt nach dem endselect die Zeilenzahl, die der where-Klausel entsprichtn. Listing 9.1 zeigt ein Beispielprogramm, das Systemvariablen benutzt. Listing 9.1: Grundlegende Systemvariablen benutzen 1 report ztx0901. 2 tables ztxlfa1. 3 parameters `land1 like ztxlfa1-land1 obligatory default 'US'. 4 write: / 'Current date:', sy-datum, 5 / 'Current time:', sy-uzeit, 6 / 'Current user:', sy-uname, 7 / 'Vendors having country code', `land1, 8 /. 9 select * from ztxlfa1 10 where land1 = `land1 11 order by lifnr. 12 write: / sy-dbcnt, ztxlfa1-lifnr. 13 endselect. 14 write: / sy-dbcnt, 'records found'. 15 if sy-subrc <> 0. 16 write: / 'No vendors exist for country', `land1. 17 endif. Der Code im Listing 9.1 erzeugt diese Ausgabe: Current Current Current Vendors 1 1040 2 1080 3 1090 date: 1998/02/22 time: 14:38:24 user: KENGREENWOOD having country code US

4 2000 5 V1 6 V2 7 V3 8 V4 9 V5 10 V7 10 records found


Zeile 2 definiert eine Feldleiste xtxlfal analog der gleichnamigen Tabelle. Zeile 3 definiert einen Eingabeparameter `land1. In den Zeilen 4 bis 6 werden die Langtexte current date, time und user id der Systemvariablen sy-datum, sy-uzeit und sy-uname ausgegeben. Zeile 7 gibt den Lnderschlssel aus, der in dem Eingabeparameter `land1 auf dem Selektionsbild eingegeben wird. Zeile 8 gibt eine Leerzeile aus. Zeile 9 liest Stze aus der Tabelle ztxlfal und bertrgt sie einzeln in die Feldleiste ztxlfal. Zeile 10 beschrnkt die Selektion von Stzen auf diejenigen mit dem gleichen Lnderschlssel, der auf dem Selektionsbild eingegeben wurde. Zeile 11 veranlat, da die Stze aufsteigend nach lifnr (Lieferantennumer) sortiert werden. Zeile 12 gibt den aktuellen Wiederholungszhler der Systemvariablen sy-dbcnt und die Lieferantennummer aus jedem Datensatz aus. Zeile 13 markiert das Ende der select/endselect-Schleife. Zeile 14 gibt die Gesamtanzahl der Wiederholungen der select-Schleife mit der Systemvariablen sy-dbcnt aus. Diese stimmt mit der Anzahl der Stze berein, die der where-Klausel entsprechen. In Zeile 15 wird der Rckgabewert des select in der Systemvariablen sy-subrc geprft. Falls er Null ist, wurden Stze gefunden. Falls er nicht Null ist, wurden keine Stze gefunden, und es wird eine Meldung in Zeile 16 ausgegeben.

Systemvariablen suchen
Angenommen, Sie wollen ein Programm schreiben, welches mit einem eingegebenen Lnderschlssel die Lnderbeschreibung aus Tabelle ztxt005t in der aktuellen Anmeldesprache ausgibt. Sie erinnern sich, ztxt005t ist eine Texttabelle, welche die Lnderschlsselbeschreibungen in mehreren Sprachen enthlt. Die Primrschlssel sind mandt, spras (Sprache) und land1. Eine Beispiellsung zeigt Listing 9.2, es fehlt aber eine entscheidende Information in Zeile 5: der Wert der aktuellen Anmeldesprache. In Listing 9.2 fehlt eine Variable an der Stelle des Fragezeichens. Wenn Sie mit ABAP/4 arbeiten, werden Sie oft mit der Herausforderung konfrontiert, Variablen zu finden, welche die von Ihnen bentigte Information enthalten.

Listing 9.2: Ein Beispielprogramm mit einer fehlenden Variablen 1 report ztx0902. 2 tables ztxt005t. 3 parameters `land1 like ztxlfa1-land1 obligatory default 'US'. 4 select single * from ztxt005t 5 where spras = ? "current logon language 6 and land1 = `land1. 7 if sy-subrc = 0. 8 write: 'Description:', ztxt005t-landx. 9 else. 10 write: 'No description exists for', `land1. 11 endif.

Zeile 2 definiert eine Feldleiste ztxt005t analog der gleichnamigen Tabelle. Zeile 3 definiert einen Eingabeparameter land1.. Zeile 4 bis 6 liest einen Satz aus Tabelle ztxt005t in die Feldleiste ztxt005t, mit der aktuellen Anmeldesprache aus einer noch unbekannten Quelle und mit dem Lnderschlssel aus Parameter land1. Es gibt kein endselect, da dies eine single select-Anweisung ist. Sie liefert nur einen einzigen Satz, es wird keine Schleife erzeugt. Zeile 7 prft den Rckgabewert des select und gibt die Beschreibung in Zeile 8 aus, falls ein Satz gefunden wurde. Falls kein Satz gefunden wurde, gibt Zeile 10 eine entsprechende Meldung aus.

Die aktuelle Anmeldesprache erhlt man aus einer Systemvariablen. Unglcklicherweise braucht man fr die Schaltflche Suchen auf der Drucktastenleiste deren Namen. Sie kennen den Namen des Feldes nicht, also ist die Schaltflche Suchen von geringem Nutzen. Statt dessen benutzen Sie das folgende Verfahren, um die Beschreibungen der Struktur syst zu durchsuchen.

Diese Prozedur ist sehr bequem, weil sie zur Suche von Beschreibungen jeglicher Struktur oder Tabelle verwendet werden kann. Starten Sie nun das ScreenCam How to Search the Descriptions of a Structure or Table. Durchsuchen der Beschreibungen einer Struktur oder Tabelle: 1. Beginnen Sie mit dem Fenster Dictionary: Tabelle/Struktur: Felder Anzeigen. 2. Die Maske Druckparameter wird angezeigt.

3. Wenn das Feld Ausgabegert leer ist, positionieren Sie Ihren Mauszeiger dorthin, drcken den Abwrtspfeil und whlen irgendein Ausgabegert. (Es spielt keine Rolle, welches Gert Sie whlen; es wird nicht benutzt werden.) 4. Erzeugen Sie einen neuen Spool-Auftrag. 5. Whlen Sie den Menpfad Werkzeuge->CCMS->Spool->Output management oder die Transaktion SP01. Geben Sie Ihre Spool-Auftragsnummer ein. Aus der Maske Spool: Auftrge kennzeichnen Sie den Auftrag und lassen ihn sich ber den Menpfad Spool-Auftrag->Anzeige ausgeben. 6. Tippen Sie %sc in das Feld OK-Code in der Symbolleiste ein. 7. Drcken Sie die Entertaste. Das Fenster Suchen wird angezeigt. 8. Im Feld Suchen Nach geben Sie eine Zeichenfolge ein, nach der gesucht werden soll. Wenn Sie nach der aktuellen Anmeldesprache suchen, knnten Sie Sprache eingeben. Wildcard-Zeichen sind nicht erlaubt. 9. Drcken Sie die Schaltflche Suchen. Ein zweites Suchen-Fenster erscheint und zeigt die Zeilen, welche den Text enthalten, den Sie eingegeben haben. Treffer sind hell dargestellt. 10. Um einen Treffer auszuwhlen, klicken Sie einmal auf ein hell dargestelltes Wort. Sie kehren zurck zum Fenster Druckvorschau fr xxxx; die Liste blttert nach unten bis zur Zeile, die Sie ausgewhlt haben, und der Mauszeiger wird auf diese Zeile positioniert. 11. Um erneut zu suchen, drcken Sie den Abwrts-Pfeil am Ende des OK-Code-Feldes in der Symbolleiste. Ein Kstchen klappt auf, das die zuletzt eingegebenen Kommandos enthlt. 12. Blttern Sie, falls ntig, zu dem %sc Kommando und klicken Sie darauf. %sc erscheint im OKCode. 13. Drcken Sie die Entertaste. Das Fenster Suchen wird erneut angezeigt. 14. Drcken Sie die Schaltflche Suchen. Die Suche wird ab der aktuellen Zeile gestartet. Das zweite Suchen-Fenster wird wieder angezeigt und die Treffer dargestellt. 15. Klicken Sie einmal auf ein hell dargestelltes Wort, um es anzuzeigen.

Man kann die Druckvorschau auch als Textdatei fr sptere Verwendungen auf seiner

Festplatte speichern. Das geschieht ber den Menpfad System->Liste->Sichern>Lokale Datei. Whlen Sie in der nchsten Maske unkonvertiert und geben dann den Dateinamen mit Pfadangabe ein. Zum Beispiel: c:\temp\syst.txt. Damit legen Sie die Datei auf Ihrer Festplatte ab. Dort knnen Sie sie nun mit einem beliebigen Editor bearbeiten. Indem Sie dem vorangegangenen Verfahren folgten, haben Sie herausgefunden, da die aktuelle Anmeldesprache in sy-langu gespeichert ist. Das vervollstndigte Programm erscheint in Listing 9.3. Listing 9.3: Listing 9.2 ergnzt durch die fehlende sy-Variable in Zeile 5. 1 report ztx0903. 2 tables ztxt005t. 3 parameters `land1 like ztxlfa1-land1 obligatory default 'US'. 4 select single * from ztxt005t 5 where spras = sy-langu "current logon language 6 and land1 = `land1. 7 if sy-subrc = 0. 8 write: 'Description:', ztxt005t-landx. 9 else. 10 write: 'No description exists for', `land1. 11 endif. Der Code in Listing 9.3 erzeugt diese Ausgabe: Description: United States

Zeile 5 begrenzt den select, um nur die Stze aus ztxt005t zu liefern, die den gleichen Sprachenschlssel wie die aktuelle Anmeldesprache haben. Da mandt automatisch jedem where vorangestellt wird, ist der Primrschlssel jetzt voll qualifiziert, und ein einzelner Satz wird geliefert. Beachten Sie, da der Primrindex diesen select untersttzt, so wurden die Felder der whereKlausel in derselben Reihenfolge spezifiziert, wie sie im Primrindex erscheinen.

Zuweisungsanweisungen
Eine Zuweisungsanweisung weist einer Variablen oder Feldleiste einen Wert zu. Drei Zuweisungsanweisungen werden hufig benutzt:

clear move move-corresponding

Anwenden der clear-Anweisung


Die clear-Anweisung setzt den Wert einer Variablen oder Feldleiste auf Nullen. Wenn der Datentyp c ist, wird der Wert statt dessen auf Leerzeichen gesetzt. Leerzeichen und Nullen heien StandardAnfangswerte (Defaultwerte). Man sagt oft, da clear den Variablen die Standard-Anfangswerte zuweist. Syntax der clear-Anweisung Dies ist ist die Syntax der clear-Anweisung: clear v1 [with v2 | with 'A' | with NULL] wobei gilt:

v1 und v2 sind Variablen oder Feldleistennamen. 'A' ist ein Literal beliebiger Lnge.

Es gelten folgende Punkte:

Wenn v1 eine Variable vom Typ c ohne Zustze ist, wird sie mit Leerzeichen gefllt. Wenn v1 von einem anderen Datentyp ist, wird sie mit Nullen gefllt. Wenn v1 eine Feldleiste ist, werden ihre einzelnen Komponenten mit Leerzeichen oder Nullen gefllt, je nach dem individuellen Datentyp. Wird v2 auf v1 addiert, wird das erste Byte von v2 benutzt, um die gesamte Lnge von v1 zu fllen. Wenn v1 eine Feldleiste ist, wird sie wie eine Variable vom Typ c behandelt. Wird 'A' auf v1 addiert, wird die gesamte Lnge von v1 mit dem ersten Byte des Literals 'A' gefllt. Wird Null auf v1 addiert, wird die gesamte Lnge von v1 mit hexadezimalen Nullen gefllt.

Listing 9.4 zeigt ein Beispielprogramm, welches Variablen und Feldleisten initialisiert. Listing 9.4: Variablen werden durch die clear-Anweisung auf Leerzeichen oder Nullen gesetzt. 1 report ztx0904. 2 tables ztxlfa1. 3 data: f1(2) type c value 'AB', 4 f2 type i value 12345, 5 f3 type p value 12345, 6 f4 type f value '1E1', 7 f5(3) type n value '789', 8 f6 type d value '19980101', 9 f7 type t value '1201', 10 f8 type x value 'AA',

11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41

begin of s1, f1(3) type c value 'XYZ', f2 type i value 123456, end of s1. ztxlfa1-lifnr = 'XXX'. ztxlfa1-land1 = 'CA'. write: / 'f1=''' no-gap, f1 no-gap, '''', / 'f2=''' no-gap, f2 no-gap, '''', / 'f3=''' no-gap, f3 no-gap, '''', / 'f4=''' no-gap, f4 no-gap, '''', / 'f5=''' no-gap, f5 no-gap, '''', / 'f6=''' no-gap, f6 no-gap, '''', / 'f7=''' no-gap, f7 no-gap, '''', / 'f8=''' no-gap, f8 no-gap, '''', / 's1-f1=''' no-gap, s1-f1 no-gap, '''', / 's1-f2=''' no-gap, s1-f2 no-gap, '''', / 'ztxlfa1-lifnr=''' no-gap, ztxlfa1-lifnr / 'ztxlfa1-land1=''' no-gap, ztxlfa1-land1 clear: f1, f2, f3, f4, f5, f6, f7, f8, s1, write: / 'f1=''' no-gap, f1 no-gap, '''', / 'f2=''' no-gap, f2 no-gap, '''', / 'f3=''' no-gap, f3 no-gap, '''', / 'f4=''' no-gap, f4 no-gap, '''', / 'f5=''' no-gap, f5 no-gap, '''', / 'f6=''' no-gap, f6 no-gap, '''', / 'f7=''' no-gap, f7 no-gap, '''', / 'f8=''' no-gap, f8 no-gap, '''', / 's1-f1=''' no-gap, s1-f1 no-gap, '''', / 's1-f2=''' no-gap, s1-f2 no-gap, '''', / 'ztxlfa1-lifnr=''' no-gap, ztxlfa1-lifnr / 'ztxlfa1-land1=''' no-gap, ztxlfa1-land1

no-gap, '''', no-gap, ''''. ztxlfa1.

no-gap, '''', no-gap, ''''.

Der Code in Listing 9.4 erzeugt diese Ausgabe: f1='AB' f2=' 12,345 ' f3=' 12,345 ' f4=' 1.000000000000000E+01' f5='789' f6='19980101' f7='120100' f8='AA' s1-f1='XYZ' s1-f2=' 123,456 ' ztxlfa1-lifnr='XXX ' ztxlfa1-land1='CA '

f1=' ' f2=' 0 ' f3=' 0 ' f4=' 0.000000000000000E+00' f5='000' f6='00000000' f7='000000' f8='00' s1-f1=' ' s1-f2=' 0 ' ztxlfa1-lifnr=' ' ztxlfa1-land1=' '

Zeile 2 definiert die Feldleiste ztxlfal. Zeile 4 bis 10 definieren Variablen jeden Typs und weist ihnen Anfangswerte zu. Eine weitere Feldleiste s1 wird in Zeile 11 mit Anfangswerten fr jede Komponente definiert. In den Zeilen 15 und 16 erhalten zwei dieser Komponenten Werte zugewiesen. Alle Variablen und Komponenten der Feldleisten werden durch die clear-Anwei- sung in Zeile 29 auf Nullen und Leerzeichen gesetzt. Man kann auch sagen, da alle Variablen und Komponenten auf Standard-Anfangswerte gesetzt werden. Die write-Anweisung, die in Zeile 30 beginnt, gibt die initialisierten Variablen und Komponenten aus, eingeschlossen in Einfachhochkommata und ohne Zwischenrume zwischen den Hochkommata und den eingeschlossenen Werten.

Listing 9.5 zeigt ein Beispielprogramm, das Variablen und Komponenten von Feldleisten mit anderen Werten als Leerzeichen oder Nullen fllt. Listing 9.5: Variablen, die mit anderen Werten als Leerzeichen oder Nullen gefllt sind und den with-Zusatz der clear-Anweisung verwenden 1 report ztx0905. 2 tables ztxlfa1. 3 data: f1(2) type c value 'AB', 4 f2(2) type c, 5 f3 type i value 12345, 6 begin of s1, 7 f1(3) type c value 'XYZ', 8 f2 type i value 123456, 9 end of s1. 10 write: / 'f1=''' no-gap, f1 no-gap, '''', 11 / 'f2=''' no-gap, f2 no-gap, '''', 12 / 'f3=''' no-gap, f3 no-gap, '''', 13 / 's1-f1=''' no-gap, s1-f1 no-gap, '''', 14 / 's1-f2=''' no-gap, s1-f2 no-gap, '''', 15 / 'ztxlfa1-lifnr=''' no-gap, ztxlfa1-lifnr no-gap, '''', 16 / 'ztxlfa1-land1=''' no-gap, ztxlfa1-land1 no-gap, '''',

17 18 19 20 21 22 23 24 25 26 27 28 29

/. clear: f1 with 'X', f2 with f1, f3 with 3, s1 with 'X', ztxlfa1 with 0. write: / 'f1=''' no-gap, f1 no-gap, '''', / 'f2=''' no-gap, f2 no-gap, '''', / 'f3=''' no-gap, f3 no-gap, '''', / 's1-f1=''' no-gap, s1-f1 no-gap, '''', / 's1-f2=''' no-gap, s1-f2 no-gap, '''', / 'ztxlfa1-lifnr=''' no-gap, ztxlfa1-lifnr no-gap, '''', / 'ztxlfa1-land1=''' no-gap, ztxlfa1-land1 no-gap, ''''.

Der Code in Listing 9.5 erzeugt diese Ausgabe: f1='AB' f2=' ' f3=' 12,345 ' s1-f1='XYZ' s1-f2=' 123,456 ' ztxlfa1-lifnr=' ' ztxlfa1-land1=' ' f1='XX' f2='XX' f3='50,529,027 ' s1-f1='XXX' s1-f2='1482184792 ' ztxlfa1-lifnr='##########' ztxlfa1-land1='###'

Zeile 18 fllt f1 mit dem Buchstaben X. Zeile 19 fllt f2 mit dem ersten Byte von f1, ebenfalls ein X. Zeile 20 fllt f3 mit dem ersten Byte des Literals 3. Ein bis zu neun Ziffern langes numerisches Literal wird als Vier-Byte-Ganzzahl gespeichert (siehe auch das folgende Kapitel Data Conversion). f3 wird mit dem ersten Byte dieser Vier-Byte- Ganzzahl gefllt, im wesentlichen werden f3 sinnlose Werte zugewiesen. Zeile 21 behandelt s1 als eine Typ c-Variable und fllt sie mit X. Komponente f1 ist vom Typ c, also erhlt sie gltige Werte. Komponente f2 ist vom Typ I und erhlt so ungltige Werte. Die Feldleiste ztxlfal wird mit dem ersten Byte der Vier-Byte-Ganzzahl mit Wert 0 gefllt, und wird mit sinnlosen Werten gefllt. Solche Werte werden in diesem Fall als Nummernzeichen (#) ausgegeben.

Die move-Anweisung benutzen


Um einen Wert von einem Feld zu einem anderen zu bertragen, benutzen Sie die move-Anweisung. Der vollstndige Inhalt oder ein Teil davon kann bertragen werden. Anstelle von move knnen Sie den Zuweisungsoperator = benutzen, wie es unten gezeigt wird. Beide werden als move-Anweisung bezeichnet. Die Syntax der move-Anweisung Es folgt die Syntax der move-Anweisung. Operatoren und Operanden mssen durch Leerzeichen getrennt werden. Mehrfachzuweisungen werden von rechts nach links durchgefhrt. move v1 to v2. oder v2 = v1. oder v2 = v1 = vm = vn.... oder move v1[+N(L)] to v2[+N(L)]. oder v2[+N(L)] = v1[+N(L)]. wobei gilt:

V1 ist die sendende Variable oder Feldleiste. V2 ist die empfangende Variable oder Feldleiste. N ist ein Offset vom Anfang der Variablen oder Feldleiste. L ist die Anzahl zu bertragender Byte.

Tabelle 9.2 zeigt zwei Beispiele fr den richtigem und den falschem Weg, Zuweisungen zu programmieren. Falsches Programmieren fhrt zu Syntaxfehlern.

Tabelle 9.2: Richtiges und falsches Programmieren von Zuweisungen

Richtig f1 = f2.

Falsch f1=f2.

f1 = f2 = f3. f1=f2=f3. Datenkonvertierungen Wenn zwei Variablen verschiedene Datentypen oder Lngen haben, werden die Daten beim bertragen konvertiert. Dies heit: automatische Anpassung. Wenn die Lngen der sendenden und empfangenden Variablen nicht bereinstimmen, wird eine automatische Lngenanpassung durchgefhrt. Wenn die Datentypen nicht bereinstimmen, wird eine automatische Typenkonvertierung durchgefhrt. Wenn die Datentypen des sendenden und empfangenden Feldes gleich sind, aber die Lngen unterschiedlich sind, wird eine Lngenanpassung durchgefhrt, wie in Tabelle 9.3 gezeigt. In dieser Tabelle ist das sendende Feld das Feld From.

Tabelle 9.3: Die Wirkung der Lngenanpassung hngt vom Datentyp ab. Wenn in ein lngeres Feld Typ bertragen wird, ist der Wert From: c x n p Rechts aufgefllt mit Leerzeichen Rechts aufgefllt mit Nullen Links aufgefllt mit Nullen Links aufgefllt mit Nullen

Wenn in ein krzeres Feld bertragen wird, wird der Wert From:

Rechts abgeschnitten Rechts abgeschnitten Links abgeschnitten bertragen, wenn der numerische Wert in das 'to' Feld pat. Wenn der numerische Wert zu gro fr das empfangende Feld ist, gibt es einen Programmabbruch.

Die verbleibenden Datentypen (f, i, d und t) haben alle eine feste Lnge, so da sendende und empfangende Felder immer dieselbe Lnge haben, vorausgesetzt, sie sind vom selben Datentyp. Regeln fr Typanpassungen gibt es in Tabelle 9.4. Die Konvertierungsregeln fr den Typ i sind dieselben wie fr den Typ p. Eingeschlossen sind Konvertierungen mit ungewhnlichem Verhalten. Beachten Sie die Punkte:

die spezielle Komprimierung, die von Typ c nach n durchgefhrt wird die Mglichkeit, ungltige Werte den Typen d und t zuzuweisen die unsaubere Behandlung ungltiger Zeichen whrend der Konvertierung von Typ c nach x das unerwartete Benutzen des reservierten Vorzeichenbyte in p nach c Konvertierungen das Benutzen von *, um berlufe in p nach c Konvertierungen anzuzeigen Ein vollstndig leeres c-Feld wird in ein p-Feld mit Wert Null konvertiert.

Ein vollstndiges Listing der Konvertierungsregeln finden Sie in der ABAP/4Schlsselwortdokumentation fr die move-Anweisung. Das Verfahren, diese anzuzeigen, folgt im nchsten Abschnitt.

Tabelle 9.4: Regeln fr Typenanpassungen Von-Typ Nach-Typ Konvertierungsregeln c p Das sendende Feld kann nur Zahlen, einen einzigen Dezimalpunkt und ein optionales Vorzeichen enthalten. Das Vorzeichen kann fhrend oder nachgestellt sein. Leerzeichen knnen auf jeder Seite des Wertes vorkommen. Sie werden rechtsbndig eingestellt und auf der linken Seite mit Nullen aufgefllt. Ein vollstndig leeres Sendefeld wird auf Null konvertiert. Das sendende Feld sollte ausschlielich ein gltiges Datum der Form JJJJMMTT enthalten. Ist dies nicht der Fall, gibt es keinen Fehler, statt dessen wird dem Empfangsfeld ein ungltiger Wert zugewiesen. Benutzt man diesen Wert, sind die Resultate nicht definiert. Das sendende Feld sollte ausschlielich eine gltige Uhrzeit im Format HHMMSS enthalten. Ist dies nicht der Fall, gibt es keinen Fehler, statt dessen wird dem Empfangsfeld ein ungltiger Wert zugewiesen. Benutzt man diesen Wert, sind die Resultate nicht definiert. Das sendende Feld wird von links nach rechts durchsucht, und nur die Ziffern 0-9 werden (rechtsbndig) in das Empfangsfeld bertragen und auf der linken Seite mit Nullen aufgefllt. Alle anderen Zeichen werden schlicht ignoriert. Gltige Werte fr das Sendefeld sind 0-9 und Grobuchstaben A-F. Der Wert wird linksbndig eingestellt und auf der rechten Seite mit Nullen aufgefllt oder auf der rechten Seite abgeschnitten. Alle Zeichen nach dem ersten ungltigen Wert im Sendefeld werden ignoriert.

Der Wert wird rechtsbndig im Empfangsfeld eingestellt, wobei das uerste rechte Byte fr das nachgestellte Vorzeichen reserviert wird. Das Vorzeichen wird nur angezeigt, wenn die Zahl negativ ist; positive Zahlen werden daher rechtsbndig mit einem nachgestellten Leerzeichen eingestellt. Falls Sie versuchen, einen positiven Wert mit ebenso vielen Ziffern wie das Empfangsfeld lang ist, zu bertragen, wird das System die gesamte Lnge des Empfangsfeldes fr den Wert benutzen, ohne das uerste rechte Byte fr das Vorzeichen zu reservieren. Betrachtet man das bisher Gesagte, so ist festzuhalten, da, wenn der Wert im Sendefeld nicht ins Empfangsfeld pat, die Zahl links abgeschnitten wird. Wenn abgeschnitten wurde, zeigt das System dies an, indem das uerste linke Byte durch einen Stern (*) ersetzt wird. Wenn der Wert ins Empfangsfeld pat, werden fhrende Nullen unterdrckt. Wenn das Sendefeld gleich Null ist, erhlt das Empfangsfeld eine einzige Null. Die Zahl wird als Anzahl der Tage seit 01.01.0001 interpretiert, zu einem Datum konvertiert und intern im Format JJJJMMTT abgespeichert. Die Zahl wird als Anzahl der Sekunden seit Mitternacht interpretiert, zu 24 Stunden Uhrzeit konvertiert und intern im Format HHMMSS abgespeichert. Das Datum wird zu einer Zahl konvertiert, welche die Anzahl der Tage seit 01.01.0001 reprsentiert. Die Zeit wird zu einer Zahl konvertiert, welche die Anzahl der Sekunden seit Mitternacht reprsentiert.

d t

p p

Listing 9.6 enthlt ein Demonstrationsprogramm, welches Beispiele fr Datenkonvertierungen durchfhrt. Listing 9.6: Beispiele fr Datenkonvertierungen 1 report ztx0906. 2 constants >(3) value '==>'. "defines a constant named '>' 3 data: fc(10) type c value '-A1B2C3.4', 4 fn(10) type n, 5 fp type p, 6 fd type d, 7 ft type t, 8 fx(4) type x, 9 fc1(5) type c value '-1234', 10 fc2(5) type c value '1234-', 11 fp1 type p value 123456789, 12 fp2 type p value '123456789-',

13 fp3 type p value 1234567899, 14 fp4 type p value 12345678901, 15 fp5 type p value 12345, 16 fp6 type p value 0. 17 18 fn = fc. write: / fc, >, fn, 'non-numeric chars are ignored'. 19 fd = 'ABCDE'. write: / fd, 'date and time fields are invalid'. 20 ft = 'ABCDE'. write: / ft, ' when you load them with junk'. 21 fp = sy-datum. write: / sy-datum, >, fp, 'd->p: days since 0001/01/01'. 22 fp = sy-uzeit. write: / sy-uzeit, >, fp, 'd->t: secs since midnight'. 23 fx = 'A4 B4'. write: / 'A4 B4', >, fx, 'ignore all after invalid char'. 24 fp = fc1. write: / fc1, >, fp, 'allows leading sign'. 25 fp = fc2. write: / fc2, >, fp, 'also allows trailing sign'. 26 fc = fp1. write: / fp1, >, fc, 'rightmost byte reserved for sign'. 27 fc = fp2. write: / fp2, >, fc, 'only negative numbers use it, but'. 28 fc = fp3. write: / fp3, >, fc, '+ve nums that need it use it too'. 29 fc = fp4. write: / fp4, >, fc, 'overflow indicated by leading *'. 30 fc = fp5. write: / fp5, >, fc, 'leading zeros are suppressed'. 31 fc = fp6. write: / fp6, >, fc, 'zero in = zero out'. 32 fp = ' '. write: / ' ', >, fp, 'blanks in = zero out'. Das Programm in Listing 9.6 erzeugt folgende Ausgabe: -A1B2C3.4 ==> 0000001234 non-numeric chars are ignored E ABCD date and time fields are invalid ABCDE0 when you load them with junk 1998/02/22 ==> 729,443 d->p: days since 0001/01/01 14:57:05 ==> 53,825 d->t: secs since midnight A4 B4 ==> A4000000 ignore all after invalid char -1234 ==> 1,234- allows leading sign 1234- ==> 1,234- also allows trailing sign 123,456,789 ==> 123456789 rightmost byte reserved for sign 123,456,789- ==> 123456789- only negative numbers use it, but 1,234,567,899 ==> 1234567899 +ve nums that need it use it too 12,345,678,901 ==> *345678901 overflow indicated by leading * 12,345 ==> 12345 leading zeros are suppressed 0 ==> 0 zero in = zero out ==> 0 blanks in = zero out Starten Sie jetzt den ScreenCam How to Display the Conversion Rules in the ABAP/ 4 Keyword

Documentation. Um die Konvertierungsregeln in der ABAP/4-Schlsselwortdokumentation anzuzeigen gehen Sie wie folgt vor: 1. Beginnen Sie mit dem ABAP/4-Editor: Eingangsbildschirm. 2. Whlen Sie den Menpfad Hilfsmittel->ABAP/4-Schlsselwort Dok. Das Fenster Anzeigestruktur: ABAP/4 SAP's 4GL Programmiersprache wird angezeigt. 3. Whlen Sie die Schaltflche: Suchen auf der Anwendungssymbolleiste. Die Dialogbox Suchen in den Kapiteltiteln wird angezeigt. 4. Im Feld Suchen geben Sie move ein. 5. In der Feldgruppe Art der Suche whlen Sie den Auswahlknopf: Aus Struktur starten. 6. Drcken Sie die Schaltflche Weiter. Die Dialogbox verschwindet, und die move- Zeile wird hell dargestellt. 7. Doppelklicken Sie auf die hell unterlegte Zeile. Das Fenster Anzeigen Hypertext wird angezeigt. 8. Drcken Sie zweimal die Taste Bild abwrts. Der Anfang der Konvertierungstabellen wird angezeigt. Teilfelder Teile von Feldern, die durch Offset und/oder Lnge angesprochen werden, heien Teilfelder.
Syntax eines Teilfeldes

v1[+o][(L)] = v2[+o][(L)]. Es gilt:


v1 und v2 sind Variablen oder Feldleistennamen. o ist ein Offset vom Anfang des Feldes. L ist eine Lnge in Byte.

Beachten Sie auerdem folgende Punkte:

Ein Teilfeld kann sowohl fr das Sende- als auch fr das Empfangsfeld oder fr beide spezifiziert werden. Entweder das Offset oder die Lnge ist optional. Es knnen auch beide angegeben werden.

Wenn das Offset nicht angegeben ist, beginnt das Teilfeld am Feldanfang. Wenn die Lnge nicht angeben ist, reicht das Teilfeld bis zum Ende des Feldes. Es knnen keine Leerzeichen innerhalb der Teilfeldspezifikation angegeben werden. Dem Offset, falls angegeben, wird immer ein Pluszeichen (+) vorangestellt. Die Lnge, falls angegeben, wird immer in Klammern eingeschlossen.

Listing 9.7 zeigt ein Beispielprogramm, das Zuweisungen durchfhrt und Teilfelder benutzt. Listing 9.7: Teile eines mit einer Teilfeldzuweisung bertragenen Feldes 1 report ztx0907. 2 data: f1(7), 3 f2(7). 4 f1 = 'BOY'. "same as: move 'BOY' to f1. 5 f2 = 'BIG'. "same as: move 'BIG' to f2. 6 f1+0(1) = 'T'. "f1 now contains 'TOY '. 7 write / f1. 8 f1(1) = 'J'. "same as: f1+0(1) = 'J'. 9 write / f1. "f1 now contains 'JOY '. 10 f1(1) = f2. "same as: f1(1) = f2(1). 11 write / f1. "f1 now contains 'BOY '. 12 f1+4 = f1. "same as: f1+4(3) = f1(3). 13 write / f1. "f1 now contains 'BOY BOY'. 14 f1(3) = f2(3). "same as: f1+0(3) = f2+0(3). 15 write / f1. "f1 now contains 'BIG BOY'. Das Programm in Listing 9.7 erzeugt diese Ausgabe: TOY JOY BOY BOY BOY BIG BOY

In Zeile 6 wird ein Offset von 0 und eine Lnge von 1 benutzt, um ein Teilfeld zu spezifizieren, das nur aus dem ersten Byte von f1 besteht. Wird der Buchstabe 'T' bertragen, wird also nur das erste Byte von f1 gefllt. In Zeile 8 wird das Offset von 0 weggelassen. 0 ist der Defaultwert, also ist das Teilfeld dasselbe wie in Zeile 6. In Zeile 10 wird dasselbe Teilfeld benutzt, aber diesmal wird von f2 her bertragen. Nur das erste Byte wird von f2 bertragen, da das empfangende Teilfeld nur ein einziges Byte lang ist. In Zeile 12 spezifiziert ein Offset von 4, da das Teilfeld in f1 mit dem fnften Byte beginnt und bis zum Ende von f1 reicht, es ist also drei Bytes lang. Das Sendefeld ist f1, was bewirkt, da die ersten drei Bytes von f1 in die Positionen 4 bis 6 verdoppelt werden. In Zeile 14 ersetzen die ersten drei Bytes von f2 die ersten drei Bytes von f1.

move mit Feldleisten benutzen Mit move wird ein Feldleistenname, der ohne einen Komponentennamen spezifiziert ist, wie eine Variable vom Typ c behandelt. Bild 9.2 und Listing 9.8 illustrieren diesen Sachverhalt.

Abbildung 9.2: Die Verwendung von move in einer Feldleiste ohne einen Komponentennamen bewirkt, da dieses wie eine Variable vom Typ c behandelt wird. Listing 9.8: Die move-Anweisung behandelt einen Feldleistennamen ohne Komponentennamen wie eine Variable vom Typ c. 1 report ztx0908. 2 data: f1(4) value 'ABCD', 3 begin of s1, 4 c1(1), 5 c2(2), 6 c3(1), 7 end of s1. 8 s1 = f1. "s1 is treated as a char 4 variable 9 write: / s1, "writes ABCD 10 / s1-c1, s1-c2, s1-c3. "writes A BC D Das Programm in Listing 9.8 erzeugt diese Ausgabe: ABCD A BC D

Zeile 2 definiert f1 als vier-Byte-Variable vom Typ c. Die Zeilen 3 bis 7 definieren s1 als eine Feldleiste mit drei Komponenten: f1, f2 und f3. Die Gesamtlnge von s1 berechnet sich durch die Addition der Lngen ihrer Komponenten: 1+2+1=4. Zeile 8 bertrgt die Werte von f1 nach s1 Byte fr Byte, als ob beide Variablen vom Typ c wren. Zeile 9 gibt s1 als eine Vierzeichen-Variable aus. Zeile 10 gibt die Inhalte der Komponenten von s1 aus.

bertragen von Feldleisten mit numerischen Feldern

Wenn das Sendefeld der Kategorie Zeichen (Typen c, n, d, t, oder x) angehrt, und das Ziel eine Feldleiste mit einem numerischen Feld ist (Typen i, p, oder f), wird keine Datenkonvertierung durchgefhrt. Die bertragung erfolgt so, als ob beide reine Zeichenfelder wren. Die Umkehrung stimmt ebenfalls. Es werden keine Konvertierungen durchgefhrt, wenn ein numerisches Feld in eine Feldleiste mit einem Zeichenfeld bertragen wird. In beiden Fllen sind die Ergebnisse ungltig und nicht definiert. Listing 9.9 zeigt ein Beispielprogramm, welches eine ungltige Konvertierung eines numerischen Feldes in ein Zeichenfeld durchfhrt. Listing 9.9: Ein numerisches Feld in ein Zeichenfeld zu bertragen, ist ungltig. 1 report ztx0909. 2 data: fc(5) type c, 3 begin of s, 4 fi type i, 5 end of s. 6 7 fc = '1234'. 8 s = fc. "c<-c, no conversion performed 9 write s-fi. "writes junk 10 11 s-fi = 1234. "assign a valid value 12 fc = s. "c<-c, no conversion performed 13 write / fc. "writes junk 14 15 s-fi = 1234. "assign a valid value 16 fc = s-fi. "c<-i conversion performed 17 write / fc. "writes 1234 Auf meinem Computer produziert das Programm in Listing 9.9 die folgende Ausgabe. Ihre Ergebnisse mgen wegen der ungltigen Zuweisungen fr die ersten beiden Zeilen der Ausgabe variieren.

875770,417 ### 1234

In Zeile 2 wird f1 als Ganzzahl mit dem Wert 1234 definiert. In den Zeilen 3 bis 5 wird s1 als Einzelkomponente c1 vom Typ c in Lnge l2 definiert. In Zeile 6 wird f1 nach s1 bertragen. Es wird keine Konvertierung durchgefhrt, da s1 eine Feldleiste ist, also wie Typ c behandelt wird. In Zeile 7 wird s1-c1 ausgegeben und die Ergebnisse sind sinnlos. In Zeile 8 wird s1-c1 eine gltige Zeichenkette '1234' zugewiesen. In Zeile 9 wird s1 nach f1 bertragen. Es wird keine Konvertierung durchgefhrt. Zeile 10 gibt f1 aus, und wieder sind die Ergebnisse sinnlos. In Zeile 11 wird f1 ein gltiger Wert von 1234 zugewiesen. In Zeile 12 wird f1 nach s1-c1 zugewiesen. Da die Zuweisung in die Komponente erfolgt und nicht zur Feldleiste, wird eine Konvertierung durchgefhrt, und Zeile 13 gibt einen gltigen Wert aus.

Sie sollten niemals eine Variable vom Typ c in eine Feldleiste oder aus einer Feldleiste heraus bewegen, die einen numerischen Typ beinhaltet. Die Ergebnisse sind abhngig vom Computer und daher nicht definiert.
bertragen mit Zeichendatentypen von einer Feldleiste in eine andere

Sie knnen die move-Anweisung fr zwei Feldleisten benutzen, wenn beide Leisten nur Komponenten mit Zeichendatentypen (c, n, d, t, und x) enthalten. Listing 9.10 illustriert dieses Konzept. Listing 9.10: Die Verwendung der move-Anweisung mit zwei Feldleisten, ausschlielich aus Zeichendatentypen bestehend 1 2 3 4 5 6 7 8 9 report ztx0910. data: begin of s1, d1 type d value '19980217', "8 Byte n1(4) type n value '1234', "4 Byte c1 value 'A', "1 byte c2 value 'B', "1 byte end of s1, begin of s2, y1(4) type n, "4 Byte

10 11 12 13 14 15 16 17 18 19

m1(2) type c, "2 Byte d1(2) type n, "2 Byte n1(2) type c, "2 Byte c1(4) type c, "4 Byte end of s2. s2 = s1. write: / s1, / s2, / s1-d1, s1-n1, s1-c1, s1-c2, / s2-y1, s2-m1, s2-d1, s2-n1, s2-c1.

Das Programm in Listing 9.10 erzeugt diese Ausgabe: 199802171234AB 199802171234AB 19980217 1234 A B 1998 02 17 12 34AB

Zeile 2 bis 14 definieren zwei Feldleisten, die ausschlielich aus Zeichentypfeldern bestehen. Jede Feldleiste ist insgesamt 14 Bytes lang. In Zeile 15 wird s1 nach s2 bertragen, wobei jede Feldleiste behandelt wird, als wre sie ein einziges 14 Bytes langes Typ c-Feld. In den Zeilen 16 und 17 werden beide als Zeichenfelder ausgegeben. In den Zeilen 18 und 19 werden die Komponenten jeder Feldleiste ausgegeben. S1-d1 wurde ber s2-y1, m1 und d1 verteilt. Die ersten beiden Bytes von s1-n1 wanderten in s2-n1. Die restlichen Bytes von s1 gingen nach s2-c1.

bertragen einer Feldleiste in eine andere mit numerischen Datentypen

Die meisten Betriebssysteme erfordern, da die Maschinenadresse von numerischen Feldern bestimmten Regeln gengt. Es kann zum Beispiel erforderlich sein, da die Adresse einer Vier-ByteGanzzahl durch zwei teilbar ist. Diese Regel wird oft bezeichnet als eine Vier-Byte-Ganzzahl mu auf eine gradzahlige Byte-Grenze ausgerichtet sein. Folglich wird die Regel, der eine Adresse gengen mu, als Ausrichtung bezeichnet. Um Ausrichtungsanforderungen zu erfllen, fgt ein typischer Compiler s vor einem Feld, welches eine Ausrichtung erfordert, Fllbytes ein. Wenn zum Beispiel Ihre Vier- Byte-Ganzzahl am Offset 0003 vom Anfang des Programmes beginnt, ist ein Fllbytes ntig, um sie auf eine Zwei-ByteGrenze auszurichten. Der Compiler wird ein unbenutztes Byte auf Offset 0003 setzen, so da die Ganzzahl am Offset 0004 beginnt, und sie so sauber ausrichten. Fllbytes sind fr den Programmierer unsichtbar, aber ihre Wirkung kann man manchmal sehen. Wenn Sie eine Feldleiste mit einer Mischung aus Zeichen und numerischen Feldern anlegen, werden manchmal vom System Fllbytes eingefgt, um numerische Felder auszurichten. Wenn Sie versuchen, eine move-Anweisung zu benutzen, um die Inhalte solch einer Feldleiste in eine andere zu

bertragen, knnen diese Fllbytes unerwartete Ergebnisse verursachen. Daher knnen Sie move nur verwenden, wenn einer der folgenden Punkte zutrifft: Beide Feldleisten bestehen ausschlielich aus Zeichenfeldern (Typen c, n, d, t, und x). Die Datentypen, Lngen und Positionen aller Komponenten in beiden Feldleisten stimmen exakt berein (die Namen der Komponenten brauchen nicht bereinzustimmen). Wenn sowohl die Sendefelder als auch die Empfangsfelder ausschlielich aus Zeichenfeldern zusammengesetzt sind, gibt es keine Fllbytes und das Ergebnis der move-Anweisung ist vorhersagbar. Falls es eine Mischung aus Zeichen- und numerischen Feldern gibt, knnen Fllbytes existieren und das Ergebnis der move-Anweisung kann unerwartet sein. Ein Beispiel wird in Listing 9.11 gezeigt. Listing 9.11: Fllbytes knnen unerwartete Ergebnisse verursachen, wenn Daten zwischen Feldleisten bertragen werden. 1 report ztx0911. 2 data: begin of s1, 3 c1 value 'A', "one byte 4 c2 type i value 1234, "four Byte, usually needs padding 5 c3 value 'B', "one byte 6 end of s1, 7 begin of s2, 8 c1, "one byte 9 c2(4), "four Byte, no padding 10 c3, "one byte 11 end of s2, 12 begin of s3, "s3 matches s1 exactly: 13 x1, "- data types the same 14 x2 type i, "- number of fields the same 15 x3, "- fields in the same order 16 end of s3. "(names don't have to match) 17 s2 = s1. 18 write: / s2-c1, s2-c2, s2-c3. 19 s3 = s1. 20 write: / s3-x1, s3-x2, s3-x3. Auf meiner Maschine produziert das Programm in Listing 9.11 die folgende Ausgabe. In Ihrem System knnen die Ergebnisse fr Felder mit ungltigen Zuweisungen variieren.

A ### # A 1,234 B S1-c1 ist nur ein Byte lang, so da c2 ein ungerades Offset vom Anfang der Feldleiste hat und auf den meisten Systemen ein Auffllen erfordert, wodurch s1 lnger als s2 wird. Wenn s1 nach s2 zugewiesen wird, liegt c3 auerhalb von s2 und einiges von s1-c2 fllt in s2-c3. Andererseits stimmt s3 exakt mit s1 berein, so da die bertragung in Zeile 14 perfekt funktioniert. Dieses Beispiel zeigt, da Sie die Wirkung von numerischen Feldern innerhalb einer Struktur nicht ignorieren knnen. Die Tatsache, da jedes Empfangsfeld dieselbe Anzahl Byte wie jedes Sendefeld hat, gengt nicht, um zu garantieren, da die Komponenten aufeinanderpassen. Die Ausrichtungsregeln hngen vom Betriebssystem ab, so variieren die Anzahl und Position der Fllbytes. Die Ergebnisse einer move-Anweisung auf einem Betriebssystem knnen auf einem anderen verschieden sein. Um sicherzustellen, da Ihre Programme bertragbar sind, verlassen Sie sich niemals auf Fllbytes und verwenden Sie sie nicht whrend bertragungen. Jede Feldleiste mu ausschlielich aus Zeichendatentypen bestehen, oder alle Komponenten mssen exakt bereinstimmen (mit Ausnahme des Namens).

Die move-corresponding-Anweisung
Um eine bertragung von einer Feldleiste zu einer anderen durchzufhren, in der die Datentypen und/oder Lngen nicht bereinstimmen, benutzen Sie die move-corresponding -Anweisung. Sie erzeugt individuelle move-Anweisungen fr Komponenten mit bereinstimmenden Namen. Komponenten in der Empfangsfeldleiste, die keine korrespondierenden Namen in der Sendefeldleiste haben, werden nicht verndert. Listing 9.12 zeigt dies. Syntax fr die move-corresponding-Anweisung Das folgende Listing ist die Syntax fr die move-corresponding-Anweisung. Operatoren und Operanden mssen durch Leerzeichen getrennt werden. Mehrfachzuweisungen erfolgen von rechts nach links. move-corresponding v1 to v2. wobei:

v1 die sendende Variable oder Feldleiste ist. v2 die empfangende Variable oder Feldleiste ist. Listing 9.12: Die move-corresponding-Anweisung erzeugt individuelle moveAnweisungen und fhrt so Datenkonvertierungen durch.

1 report ztx0912.

2 data: begin of s1, 3 c1 type p decimals 2 value '1234.56', 4 c2(3) value 'ABC', 5 c3(4) value '1234', 6 end of s1, 7 begin of s2, 8 c1(8), 9 x2(3) value 'XYZ', 10 c3 type i, 11 end of s2. 12 write: / 's1 :', s1-c1, s1-c2, s1-c3. 13 write: / 's2 before move-corresponding:', s2-c1, s2-x2, s2-c3. 14 move-corresponding s1 to s2. "same as coding the following two statements 15 * move s1-c1 to s2-c1. "performs conversion 16 * move s1-c3 to s2-c3. "performs conversion 17 write: / 's2 after move-corresponding:', s2-c1, s2-x2, s2-c3. Das Programm in Listing 9.12 erzeugt diese Ausgabe: s1 : 1,234.56 ABC 1234 s2 before move-corresponding: XYZ 0 s2 after move-corresponding: 1234.56 XYZ 1,234 Zeile 14 erzeugt zwei move-Anweisungen; zur Verdeutlichung sind sie als Kommentar in Zeile 15 und 16 dargestellt. Normalerweise knnen Sie diese move-Anweisungen nicht sehen; das System erzeugt und fhrt sie automatisch im Hintergrund aus. Eine move-Anweisung wird fr jede Komponente der Empfangsfeldleiste erzeugt, die denselben Namen wie eine Komponente im Sendefeld hat. In diesem Fall haben c1 und c3 dieselben Namen, es werden also zwei moveAnweisungen erzeugt. Datenkonvertierungen werden genauso durchgefhrt, als ob Sie diese Anweisungen selbst programmiert htten. Die Inhalte von c2 sind unverndert, wenn die movecorresponding-Anweisung beendet ist.

Berechnungen
Sie knnen Berechnungen mit den folgenden Anweisungen durchfhren:

compute add oder add-corresponding subtract oder subtract-corresponding multiply oder multiply-corresponding divide oder divide-corresponding

Die compute-Anweisung benutzen

Compute ist die am hufigsten benutzte Anweisung, um Berechnungen durchzufhren.


Syntax der compute-Anweisung

Das Folgende ist die Syntax der compute-Anweisung. Operatoren und Operanden mssen durch Leerzeichen getrennt werden. Es ist mehr als ein Operator pro Anweisung erlaubt. compute v3 = v1 op v2 [op vn ...]. oder v3 = v2 op v2 [op vn ...]. wobei: v3 die Empfangsvariable fr das Ergebnis der Berechnung ist. v1, v2 und vn die Operanden sind. op ein mathematischer Operator ist. Tabelle 9.5 enthlt eine Liste der gltigen Operatoren.

Tabelle 9.5: Gltige Operatoren fr die compute-Anweisung Operator Operation + * / ** DIV MOD Addition Subtraktion Multiplikation Division Exponentiation Ganzzahldivision Rest der Ganzzahldivision

Es gibt auch eingebaute Funktionen. Eine Liste erhalten Sie ber die F1-Hilfe des Schlsselwortes compute.

Die Operatorenreihenfolge ist wie folgt:


Zunchst werden eingebaute Funktionen ausgewertet, dann Exponenten, dann *,/,DIV, und MOD in der Reihenfolge ihres Vorkommens im Ausdruck, dann + und - in der Reihenfolge ihres Vorkommens im Ausdruck.

Division durch Null ergibt einen Kurzdump, auer beide Operanden sind Null. In diesem Fall ist das Ergebnis Null. Werte werden, falls ntig, whrend der Berechnung konvertiert. Die Regeln fr die Datenkonvertierung und die Reihenfolge der Datentypenprioritt (weiter unten bei der if-Anweisung beschrieben) bestimmen, wie die Konvertierung durchgefhrt wird. Mathematische Ausdrcke knnen eine beliebige Anzahl Klammern enthalten. Vor und nach jeder Klammer mu mindestens ein Leerzeichen stehen. Es gibt jedoch eine Ausnahme zu dieser Regel. Es darf kein Leerzeichen nach einem eingebauten Funktionsnamen stehen; die ffnende Klammer mu unmittelbar danach folgen. Tabelle 9.6 zeigt die richtigen und falschen Wege, mathematische Ausdrcke zu programmieren.

Tabelle 9.6: Richtige und falsche Wege, mathematische Anweisungen zu programmieren Richtig f1 = f2 + f3. Falsch f1 = f2+f3.

f1 = ( f2 + f3 ) * f4. f1 = (f2 + f3) * f4. f1 = sqrt( f2 ). f1 = sqrt ( f2 ). f1 = sqrt(f2). Der Auswahlknopf Festpunktarithmetik in den Programmattributen steuert, auf welche Weise die Dezimalberechnungen durchgefhrt werden, und sollte immer aktiv sein. Wenn er es ist, werden Zwischenergebnisse auf 31 Dezimalstellen genau berechnet und bei der Zuweisung an die Ergebnisvariable aufgerundet. Ist dem nicht so, haben die Zwischenergebnisse keine Dezimalstellen, womit die Dezimalgenauigkeit dahin ist. Wenn zum Beispiel Festpunktarithmetik nicht ausgewhlt ist, ergibt die Berechnung 1/*3 das Ergebnis Null, da das Zwischenergebnis 0.333333 auf Null gerundet wird, bevor es mit 3 multipliziert wird. Wenn es ausgewhlt ist, ist das Ergebnis 1. Die add- und add-corresponding-Anweisungen Benutzen Sie die add-Anweisung, um eine Zahl zu einer anderen zu addieren. Feldleisten mit gleichnamigen Komponenten knnen mit add-corresponding addiert werden.

Syntax fr die add-Anweisung

Nun folgt die Syntax fr die add-Anweisung. Datenkonvertierungen werden, falls ntig, durchgefhrt, ebenso wie bei der compute-Anweisung. add v1 to v2. wobei:

v2 die Variable ist, auf die addiert wird. v1 die Variable ist, die aufaddiert wird.

Die Syntax fr die subtract-, multiply- und divide-Anweisungen ist hnlich.


Syntax fr die add-corresponding-Anweisung

Untenstehend ist die Syntax fr die add-corresponding-Anweisung. add-corresponding s1 to s2. wobei: s2 die Feldleiste ist, auf die addiert wird. s1 die Feldleiste ist, die aufaddiert wird. Eine add-Anweisung wird fr jedes Paar gleichnamiger Komponenten in s1 und s2 erzeugt. Datenkonvertierungen werden in der gleichen Weise durchgefhrt, wie fr die add-Anweisung. Subtract-corresponding, multiply-corresponding und dividecorresponding funktionieren in entsprechender Weise. Beispiele bietet Listing 9.13. Listing 9.13: Die add-, subtract-, multiply-, divide- und correspondingAnweisungen. 1 2 3 4 5 6 7 8 report ztx0913. data: f1 type i f2 type i value begin of s1, c1 type i value c2 type i value c3 type i value end of s1,

value 2, 3, 10, 20, 30,

9 begin of s2, 10 c1 type i value 100, 11 x2 type i value 200, 12 c3 type i value 300, 13 end of s2. 14 add f1 to f2. write / f2. "f1 is unchanged 15 subtract f1 from f2. write / f2. 16 multiply f2 by f1. write / f2. 17 divide f2 by f1. write / f2. 18 add-corresponding s1 to s2. write: / s2-c1, s2-x2, s2-c3. 19 subtract-corresponding s1 from s2. write: / s2-c1, s2-x2, s2-c3. 20 multiply-corresponding s2 by s1. write: / s2-c1, s2-x2, s2-c3. 21 divide-corresponding s2 by s1. write: / s2-c1, s2-x2, s2-c3. Das Programm in Listing 9.13 erzeugt diese Ausgabe: 5 3 6 3 110 200 330 100 200 300 1,000 200 9,000 100 200 300 Datumsberechnungen Eine Datumsvariable (Type d) kann innerhalb mathematischer Ausdrcke benutzt werden. Weist man das Ergebnis einer Datumsberechnung einer gepackten Variablen zu, ergibt das die Differenz in Tagen. Ein Beispiel bietet Listing 9.14. Listing 9.14: Datumsberechnungen mittels der Datumsvariablen in einem Ausdruck 1 report ztx0914. 2 type-pools ztx1. "contains ztx1_amalgamation_date 3 data: d1 like sy-datum, 4 d2 like d1, 5 num_days type p. 6 d1 = d2 = sy-datum. 7 8 subtract 1 from d1. write / d1. "yesterday's date 9 d2+6 = '01'. write / d2. "first day of current month 10 subtract 1 from d2. write / d2. "last day of previous month 11

12 num_days = sy-datum - ztx1_amalgamation_date. 13 write / num_days. "number of days since amalgamation Am 22. Februar 1999 erzeugt das Programm in Listing 9.14 diese Ausgabe: 1999/02/21 1999/02/01 1999/01/31 354

In Zeile 2 bewirkt die type-pools-Anweisung, da die Konstante ztxl_amalgamation_date in das Programm eingeschlossen wird. In Zeile 6 wird das aktuelle Datum d1 und d2 zugewiesen. In Zeile 8 wird das gestrige Datum berechnet, indem 1 vom aktuellen Datum abgezogen wird. In Zeile 9 wird das Teilfeld d2 am Offset 6 mit Lnge 2 (die Lnge stammt vom Sendefeld) auf '01' gesetzt. Da Datumswerte immer im internen Format JJJJMMTT gespeichert werden, wird der Tageswert des Datums in d2 auf '01' gesetzt. Das Ergebnis ist, da d2 ein Datum gleich dem ersten Tag des aktuellen Monats enthlt. In Zeile 10 wird 1 von d2 abgezogen, das ergibt das Datum des letzten Tag des Vormonats. In Zeile 12 wird die Differenz in Tagen zwischen dem aktuellen Datum und dem Amalgamationsdatum berechnet. Das Ergebnis wird dem gepackten Feld num_days zugewiesen und in Zeile 13 ausgegeben.

Dynamische Zuweisungen
Ein Feldsymbol ist ein Zeiger, den Sie dynamisch einem Feld zuweisen knnen. Nach der Zuweisung knnen Sie das Feldsymbol irgendwo in Ihrem Programm anstelle des tatschlichen Feldnamens benutzen. Benutzen Sie die field-symbol-Anweisung, um ein Feldsymbol zu definieren, und benutzen Sie assign, um diesem ein Feld zuzuweisen. Der Feldsymbolname mu mit spitzen Klammern beginnen und enden. Listing 9.15 enthlt ein einfaches Beispiel. Listing 9.15: Ein Feldsymbol ist eine Referenz zu einem anderen Feld. 1 2 3 4 report ztx0915. data f1(3) value 'ABC'. field-symbols <f>. assign f1 to <f>. "<f> can now be used in place of f1

5 write <f>. "writes the contents of f1 6 <f> = 'XYZ'. "assigns a new value to f1 7 write / f1. Das Programm in Listing 9.15 erzeugt diese Ausgabe:

ABC XYZ

Zeile 3 definiert ein Feldsymbol mit Namen <f>. Zeile 4 weist das Feld f1 dem Feldsymbol <f> zu. <f> zeigt nun auf die Hauptspeicherstelle der Variablen f1 und kann anstelle von f1 irgendwo im Programm benutzt werden. Zeile 5 gibt <f> aus und bewirkt, da der Inhalt von f1 ausgegeben wird. Zeile 6 ndert den Inhalt von <f>, ndert aber tatschlich f1. Zeile 7 gibt den genderten Inhalt von f1 aus.

Sie knnen Feldsymbole benutzen, um sehr flexible Programme zu erzeugen. Angenommen zum Beispiel, Sie wollen ein Programm schreiben, das einen Tabellennamen als Eingabeparameter einliest und den Inhalt anzeigt: Sie knnen die Feldnamen in der write-Anweisung nicht fest programmieren, weil die Namen in jeder Tabelle verschieden sind. Sie knnen statt dessen ein Feldsymbol in der write-Anweisung benutzen, um auf das Feld einer Tabelle Bezug zu nehmen.

Zusammenfassung

Systemvariablen sind in der Struktur syst gespeichert. Sie knnen die Beschreibungen der Felder und ihrer Datenelemente durchsuchen, um Ihr gesuchtes Feld zu finden. Dieses Verfahren kann benutzt werden, um alle Felder irgendeiner Tabelle zu durchsuchen. Die Zuweisungsanweisungen sind clear, move und move-corresponding. Clear weist Standard-Anfangswerte einer Variablen oder Feldleiste zu. Sie knnen sie auch benutzen, um ein Feld mit beliebigen Zeichen oder Nullen zu fllen. Die move-Anweisung kann auch als = geschrieben werden. Mehrfachzuweisungen in einer einzigen Zeile sind mglich, beispielsweise v1 = v2 = v3. Konvertierungen werden automatisch durchgefhrt. Ein Feldleistenname ohne Komponentennamen wird wie eine Variable vom Typ c behandelt. Um Daten zwischen Feldleisten zu bertragen, welche exakt in Komponentenanzahl, Datentyp und Lnge jeder Komponente bereinstimmen, benutzen Sie move. Um Daten zwischen Feldleisten mit (wenigstens einer) gleichnamigen Komponenten, aber unterschiedlichen Datentypen oder Lngen zu bewegen, benutzen Sie move-corresponding. Um die einzelnen Bytes eines Feldwertes anzusprechen, benutzen Sie ein Teilfeld. Ein Teilfeld kann sowohl als Sende- als auch als Empfangsfeld oder als beides verwendet werden. Sie knnen Berechnungen durchfhren, indem Sie compute, add, subtract, multiply , divide, add-corresponding, subtract-corresponding, multiplycorresponding und divide-corresponding eingeben. Nicht erlaubt Bewegen Sie keine ungltigen Werte in Felder.

Erlaubt Um Konversionen zu vermeiden, benutzen Sie Felder des gleichen Datentyps.

Verwenden Sie move-corresponding, um Felder von einer zu einer anderen Feldleiste zu bewegen, wenn die Komponenten den gleichen Namen haben, aber die Datentypen und Lngen nicht zueinander passen. Verwenden Sie die clear-Anweisung, um Default-Initiale einer Variablen oder Feldleiste zuzuweisen.

Fragen & Antworten


Frage: Ich kann zwar die clear-Anweisung benutzen, um einen Wert auf Leerzeichen oder Nullen zu setzen, aber gibt es auch eine Anweisung, die eine Variable auf den Wert zurcksetzen kann, den ich mit dem value-Zusatz der data-Anweisung angegeben habe? Antwort: Nein, die gibt es leider nicht. Frage: Kann ich die move-Anweisung mit Feldleisten unterschiedlicher Lnge benutzen? Antwort: Ja, knnen Sie. Sie werden beide als Variablen vom Typ c behandelt. Der Sendewert wird entsprechend abgeschnitten oder am Ende mit Leerzeichen aufgefllt, bevor er der Empfangsfeldleiste zugewiesen wird. Frage: Warum mu ich ber Fllbytes Bescheid wissen? Kmmert sich nicht das System darum, wenn ich nur alle Regeln befolge? Antwort: Technisch gesehen, ja. Wenn Sie allerdings mehrere Programme erstellen, werden Sie gelegentlich unvermeidlich eine Feldleiste falsch mit move zuweisen. Wenn Sie Fllbytes verstehen und wissen, wie sie Ihre Ausgabe beeinflussen, sind Sie hoffentlich in der Lage, die Ursache Ihres Problems zu erkennen, und mssen nicht auf Tricks zurckgreifen, um Ihr Programm zum Laufen zu bringen. Frage: Es scheint seltsam, da ich Variablen ungltige Werte zuweisen kann. Was passiert, wenn ich solch eine Variable mit ungltigem Wert weiter benutze? Antwort: Es kann alles passieren. Ich wrde kein Programm schreiben, das sich bewut auf ungltige Variablen verlt. Versuchen Sie zum Beispiel nicht, einen speziellen Datumswert zu benutzen, der nur aus x besteht, um etwas Besonderes wie ein fehlendes Datum anzuzeigen. Das Verhalten Ihres

Programms wird unvorhersehbar, wenn Sie die erlaubten Grenzen der Sprache berschreiten. Frage: Die Syntaxmeldungen zeigen oft nicht an, was wirklich falsch ist in meinem Programm. Liegt das an mir, oder arbeitet der Syntaxprfer manchmal nicht richtig? Antwort: Anwort: Sagen wir einfach: An Ihnen liegt es nicht. Meine ewige Lieblingsmeldung ist xxxx wird erwartet. Es bedeutet in Wirklichkeit xxxx wird nicht erwartet. Wenn Sie also diese Meldung sehen, ergnzen Sie das Wort nicht, und sie wird richtig.

Workshop
Der Workshop bietet Ihnen zwei Varianten, das, was Sie in diesem Kapitel gelernt haben, zu vertiefen. Der Abschnitt mit den Kontrollfragen hilft Ihnen, Ihr Verstndnis des behandelten Stoffes zu festigen. Der bungsabschnitt ermglicht Ihnen, Erfahrungen zu sammeln, indem Sie das Gelernte anwenden. Sie finden die Antworten im Anhang B (Antworten zu Kontrollfragen und bungen).

Kontrollfragen
1. Nennen Sie mehrere Mglichkeiten, den Wert von einer Variablen zu einer anderen zu bertragen! 2. Was mu Operanden und Operatoren trennen, damit die Berechnung funktioniert?

bung 1
Benutzen Sie das Verfahren Wie man die Beschreibungen einer Struktur oder Tabelle sucht, um folgendes zu finden: 1. den Namen des Zahlungsblockfeldes in der Tabelle lfal 2. den Namen des Gruppenschlsselfeldes in der Tabelle kna1 3. den Namen des Systemfeldes, das die Position einer Zeichenkette enthlt 4. den Namen des Systemfeldes, das die Meldungsnummer enthlt 5. den Namen des Materialgruppenfeldes in der Tabelle mara Zwei Dinge sind falsch im Programm in Listing 9.16. Welche sind dies? Listing 9.16: Dieses Programm zeigt den Gebrauch einiger wichtiger Systemvariablen.

report zty0916. tables ztxlfa1. parameters land1 like ztxlfa1-land1 obligatory default 'US'. select * from ztxt005t where land1 = land1 and spras = sy-langu. write: / 'Description:', ztxt005t-landx. endselect. if sy-subrc <> 0. write: / 'No descriptions exist for country', land1. endif.

Ein Imprint des Markt&Technik Buch- und Software-Verlag GmbH. Elektronische Fassung des Titels: ABAP/4 in 21 Tagen, ISBN: 3-8272-2016-X

Woche 2

Tag 10 Allgemeine Kontrollanweisungen


Kapitelziele
Wenn Sie dieses Kapitel durchgearbeitet haben, sollten Sie folgendes knnen:

die allgemeinen Kontrollanweisungen if, case, do und while codieren Programmsequenzen unter Verwendung von exit, continue und check kontrollieren einfache Positions- und Lngenspezifikationen in der write-Anweisung codieren

Die if-Anweisung
Die if-Anweisung in ABAP/4 hat Vergleichsoperatoren fr Gleichheit und Ungleichheit und spezielle Vergleichsoperatoren fr Zeichenketten und Bitmasken.

Bitvergleiche sind nicht sehr hufig in ABAP/4 und werden hier deshalb nicht behandelt. Gleichwohl werden sie in der ABAP/4-Schlsselwrterdokumentation unter der berschrift Vergleichsoperatoren fr Bitmasken erwhnt.

Syntax fr die if-Anweisung


Es folgt die Syntax fr die if-Anweisung. if [not] exp [ and [not] exp ] [ or [not] exp ]. ---

[elseif exp. ---] [else. ---] endif. wobei gilt:


exp ist ein logischer Ausdruck, der als ein wahrer oder nicht wahrer Zustand ausgewertet wird. --- stellt jegliche Anzahl von Code-Zeilen dar. Sogar Nullzeilen sind erlaubt.

Folgende Punkte gelten:


Jedes if braucht ein entsprechendes endif. else und elseif sind optional. Klammern knnen benutzt werden. Alle Klammern mssen durch eine Leerstelle getrennt werden. Richtig ist zum Beispiel if ( f1 = f2 ) or ( f1 = f3 ), whrend if (f1 = f2) or (f1 = f3) falsch ist. Mit Hilfe von is initial knnen Variable mit Leerzeichen oder Nullen verglichen werden. Zum Beispiel ist if f1 is initial richtig, wenn f1 Typ c und leer ist. Wenn f1 irgendein anderer Datentyp ist, ist die Anweisung wahr, wenn f1 Nullen enthlt. Um die Negation zu erfllen, mu not dem logischen Ausdruck vorausgehen. Richtig ist zum Beispiel if not f1 is initial, falsch dagegen if f1 is not initial . Variablen knnen mit Nullen verglichen werden mit dem Zusatz null. Zum Beispiel: if f1 is null.

Die logischen Operatoren fr Operanden jeden Typs sind in Tabelle 10.1 aufgelistet.

Tabelle 10.1: Gebruchliche Vergleiche und ihre alternativen Formen Vergleich v1 = v2 v1 <> v2 v1> v2 v1 <v2 v1 >= v2 v1 <= v2 v1 between v2 and v3 Alternative Formen Wahr, wenn EQ NE, >< GT LT GE, => LE, =< v1 gleich v2 v1 ungleich v2 v1 ist grer als v2 v1 ist kleiner als v2 v1 ist grer oder gleich v2 v1 ist kleiner oder gleich v2 v1 liegt zwischen v2 und v3 (einschlielich)

not v1 between v2 and v3

v1 liegt auerhalb des Bereiches von v2 und v3 (einschlielich)

In Tabelle 10.1 knnen v1 und v2 Variablen, Literale oder Feldleisten sein. Im Fall von Variablen oder Literalen wird die automatische Konvertierung ausgefhrt, wenn der Datentyp oder die Lnge nicht bereinstimmen. Feldleisten werden wie Variablen vom Typ c behandelt. Der Vergleich zweier Werte, die nicht die gleichen Datentypen haben, mndet in einer internen automatischen Typenanpassung von einem oder beiden Werten. Ein Typ wird den Vorrang haben und diktieren, welche Art von Konvertierung ausgefhrt wird. Die Reihenfolge dieses Vorrangs ist:

Wenn ein Feld Typ f ist, wird das andere in Typ f konvertiert. Wenn ein Feld Typ p ist, wird das andere in Typ p konvertiert. Wenn ein Feld Typ i ist, wird das andere in Typ i konvertiert. Wenn ein Feld Typ d ist, wird das andere in Typ d konvertiert. Die Typen c und n werden allerdings nicht konvertiert. Sie werden direkt verglichen. Wenn ein Feld Typ t ist, wird das andere in Typ t konvertiert. Die Typen c und n werden allerdings nicht konvertiert. Sie werden direkt verglichen. Wenn ein Feld Typ n ist, werden beide in Typ p konvertiert (in diesem Fall kann das andere Feld nur Typ c oder x sein). An diesem Punkt ist ein Feld Typ c und das andere Typ x. x wird zu p konvertiert.

Konvertierungen folgen den gleichen Konventionen wie die, die von der move-Anweisung ausgefhrt werden. Typkonvertierungen werden detailliert beschrieben in der ABAP/4Schlsselwrterdokumentation Relational Operators for All Data Types.

Datenkonvertierungen von Literalen whrend Vergleichsoperationen


Literale sind intern mit Datentypen gespeichert, wie sie in Tabelle 10.2 gezeigt werden.

Tabelle 10.2: Datentypen von Literalen Beschreibung Zahlen mit 1 bis 9 Ziffern Datentyp i

Zahlen mit 10 oder mehr Ziffern p Alle anderen c

Typkonvertierungen fr Literale folgen der gleichen Reihenfolge von Vorrngen, und es gelten die gleichen Konvertierungsregeln.

Listing 10.1: Ein Beispiel fr die Verwendung von if im Programm 1 report ztx1001. 2 data: begin of s1, 3 x value 'X', 4 y value 'Y', 5 z value 'Z', 6 end of s1, 7 begin of s2, 8 x value 'X', 9 z value 'Z', 10 end of s2. 11 12 if s1-x = s2-x. 13 write: / s1-x, '=', s2-x. 14 else. 15 write: / s1-x, '<>', s2-x. 16 endif. 17 18 if s1-x between s2-x and s2-z. 19 write: / s1-X, 'is between', s2-x, 'and', s2-z. 20 else. 21 write: / s1-X, 'is not between', s2-x, 'and', s2-z. 22 endif. 23 24 if s1 = s2. "comparing field strings byte by byte 25 write: / 's1 = s2'. 26 else. 27 write: / 's1 <> s2'. 28 endif. 29 30 if 0 = ' '. "Watch out for this one 31 write: / '0 = '' '''. 32 else. 33 write: / '0 <> '' '''. 34 endif. Listing 10.1 zeigt ein Beispielprogramm mit den gebruchlichen Vergleichsoperatoren und einer Konvertierung. Der Code in Listing 10.1 erzeugt diese Ausgabe: X = X X is between X and Z s1 <> s2 0 = ' '

Auf Zeile 12 wird s1-x mit s2-x verglichen. Beide sind vom Typ c und haben die Lnge 1. Es erfolgt keine Konvertierung, und die Variablen sind gleich. Zeile 18 ist hnlich, benutzt aber den between-Operator. Der Wert X liegt zwischen X und Z, und daher ergibt der Test wahr. Zeile 24 vergleicht die Feldleisten s1 und s2, als ob sie Variablen vom Typ c wren. Der Wert von s1 ist deswegen XYZ, der Wert von s2 ist XZ. Sie sind ungleich. Auf Zeile 30 wird das Literal 0 mit einem Leerfeld verglichen. Die Null ist intern als Typ i gespeichert, das andere als Typ c. Wegen der Reihenfolge der Vorrnge wird Typ c in Typ i konvertiert. Die Konvertierung eines Leerzeichens in eine ganze Zahl bewirkt einen Nullwert, und der Vergleich erweist sich als unerwartet wahr.

Konvertierungen anzeigen
Wenn Sie eine Programmanalyse ausfhren, knnen Sie entscheiden, wo Konvertierungen innerhalb eines Programms vorkommen. Um eine Programmanalyse auszufhren, verwenden Sie die folgende Prozedur. 1. Starten Sie das ScreenCam How to Perform a Program Analysis. 2. Starten Sie den Report RSANAL00. 3. Es erscheint die Maske ABAP/4-Programmanalyse. 4. Drcken Sie auf Konvertierungen. 5. Klicken Sie zweimal auf irgendeine Zeile, um sie sich innerhalb des Programms anzusehen.

elseif verwenden
Sie benutzen elseif, um verschachtelte ifs zu vermeiden. Verschachtelte ifs knnen schwierig zu lesen und zu pflegen sein. (Siehe Listing 10.2). Listing 10.2: Die Verwendung von elseif ist klarer als die von verschachtelten ifs. 1 report ztx1002. 2 parameters: f1 default 'A', 3 f2 default 'B', 4 f3 default 'C'. 5 6 if f1 = f2. write: / f1, '=', f2. 7 elseif f1 = f3. write: / f1, '=', f3. 8 elseif f2 = f3. write: / f2, '=', f3. 9 else. write: / 'all fields are different'. 10 endif.

11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

*lines 5-9 do the same as lines 14-26 if f1 = f2. write: / f1, '=', f2. else. if f1 = f3. write: / f1, '=', f3. else. if f2 = f3. write: / f2, '=', f3. else. write: / 'all fields are different'. endif. endif. endif.

Der Code in Listing 10.2 erzeugt diese Ausgabe: all fields are different all fields are different

Wenn f1 = f2, ist Zeile 6 richtig. Wenn f1 = f3, ist Zeile 7 richtig. Wenn f2 = f3, ist Zeile 8 richtig. Wenn nichts davon wahr ist, ist Zeile 9 richtig. Die Zeilen 14 bis 26 fhren das gleiche wie die Zeilen 6 bis 10 aus. Sie wurden mitaufgefhrt, so da Sie die beiden Verfahren nebeneinander sehen knnen.

Verwendung von Zeichenkettenoperatoren


Besondere Operatoren fr Zeichenketten sind in Tabelle 10.3 aufgefhrt.

Tabelle 10.3: Besondere Operatoren fr Zeichenketten Case Sensitiv? Operator Bedeutet Wahr, wenn (Unterscheidung von Gro- und Kleinbuchstaben) v1 CO v2 Enthlt nur v1 besteht nur aus Ja Zeichen von v2 Nachgestellte Leerzeichen ignoriert?

Nein

v1 CN v2 not v1 CO v2

v1 enthlt Ja Zeichen, die nicht in v2 vorkommen v1 enthlt mindestens ein Zeichen aus v2 v1 enthlt nicht ein einziges Zeichen aus v2 v1 enthlt die Zeichenkette v2 v1 enthlt nicht die Zeichenkette v2 v1 enthlt die Muster in v2 v1 enthlt nicht die Muster in v2 Ja

Nein

v1 CA v2 Enthlt irgendein

Nein

v1 NA v2 not v1 CA v2

Ja

Nein

v1 CS v2 Enthlt eine Zeichenkette v1 NS v2 not v1 CS v2

Nein Nein

Ja Ja

v1 CP v2 Enthlt ein Muster v1 NP v2 not v1 CP v2

Nein Nein

Ja Ja

Diese Operatoren knnen in jedem Vergleich benutzt werden. Die CS-, NS-, CP- und NP-Operatoren ignorieren nachgestellte Leerzeichen und bercksichtigen keine Gro- /Kleinschreibung. Obwohl Sie Variable, Konstanten oder Literale mit Vergleichsoperatoren fr Zeichenketten benutzen knnen, verwendet Listing 10.3 wegen der bersichtlichkeit nur Literale. Ebenfalls wegen der bersichtlichkeit steht hier jede if-Anweisung in einer eigenen Zeile. Listing 10.3: Ein Beispielprogramm fr bungen mit CO, CN, CA und NA 1 report ztx1003. 2 * operator: co 3 write / '''AABB'' co ''AB'''. 4 if 'AABB' co 'AB'. write 'True'. else. write 'False'. endif. 5 write / '''ABCD'' co ''ABC'''. 6 if 'ABCD' co 'ABC'. write 'True'. else. write 'False'. endif. 7 8 * operator: cn 9 write / '''AABB'' cn ''AB'''. 10 if 'AABB' cn 'AB'. write 'True'. else. write 'False'. endif. 11 write / '''ABCD'' cn ''ABC'''. 12 if 'ABCD' cn 'ABC'. write 'True'. else. write 'False'. endif. 13 14 * operator: ca 15 write / '''AXCZ'' ca ''AB'''.

16 17 18 19 20 21 22 23 24

if 'AXCZ' ca 'AB'. write 'True'. else. write 'False'. endif. write / '''ABCD'' ca ''XYZ'''. if 'ABCD' ca 'XYZ'. write 'True'. else. write 'False'. endif. * operator: na write / '''AXCZ'' na ''ABC'''. if 'AXCZ' na 'ABC'. write 'True'. else. write 'False'. endif. write / '''ABCD'' na ''XYZ'''. if 'ABCD' na 'XYZ'. write 'True'. else. write 'False'. endif.

Der Code in Listing 10.3 erzeugt diese Ausgabe: 'AABB' 'ABCD' 'AABB' 'ABCD' 'AXCZ' 'ABCD' 'AXCZ' 'ABCD'

co co cn cn ca ca na na

'AB' True 'ABC' False 'AB' False 'ABC' True 'AB' True 'XYZ' False 'ABC' False 'XYZ' True

co ist der contains only-Operator. Zeile 4 ist wahr, weil 'AABB' nur Zeichen von 'AB' enthlt. Zeile 6 ist nicht wahr, weil 'ABCD' ein D enthlt, das nicht in 'ABC' ist. Die Zeilen 10 und 12 sind die Gegenstcke zu den Zeilen 4 und 6, weil cn das gleiche ist wie not v1 co v2. Die Ergebnisse werden deswegen umgekehrt. Zeile 10 ist nicht wahr, und Zeile 12 ist wahr. ca ist der contains any-Operator, und Zeile 16 ist wahr, wenn 'AXCZ' alle Zeichen von 'AB' enthlt. Es ist wahr, weil es A enthlt. Zeile 18 ist nicht wahr, weil 'ABCD' keine Zeichen von 'XYZ' enthlt. na ist gleich not v1 ca v2. Daher sind die Zeilen 22 und 24 die logische Negation der Zeilen 16 und 18.

In Bezug auf Tabelle 10.3 fhren die CP (contains pattern)- und NP (no pattern)-Operatoren einen Zeichenkettensuchvorgang aus, der einen Mustervergleich mit bestimmten Zeichen erlaubt. Der Ausdruck v1 CP v2 ist wahr, wenn v1 eine Zeichenkette enthlt, die dem Muster in v2 entspricht. Der Ausdruck v1 NP v2 ist wahr, wenn v1 keine Zeichenkette enthlt, die zum Muster in v2 pat. Er ist gleichwertig zu not v1 cp v2. Die Zeichen, die fr den Mustervergleich in v2 erlaubt sind, werden in Tabelle 10.4 aufgefhrt.

Tabelle 10.4: CP- und NP-Operatoren Zeichen Verwendung

* + #

Zu jeder Zeichensequenz passend Zu jedem einzelnen Zeichen passend Wrtlich das nchste Zeichen interpretierend

# ist das Fluchtzeichen (escape character). Das nchste ihm folgende Zeichen wird genau interpretiert. Sollte eine spezielle Bedeutung existieren, geht diese verloren. Sie knnen # auch dazu benutzen um nach Gro-/Kleinschreibung zu suchen, oder nach den Zeichen *, +, oder #. Tabelle 10.5 zeigt Beispiele dafr, wie Sie diese Zeichen benutzen knnten. Der escape character wird bentigt, wenn Sie nach Gro-/Kleinschreibung suchen wollen, wobei Sie CS, NS, CP oder NP benutzen. Sie brauchen ihn auch, wenn Sie einen Mustersuchvorgang (CP oder NP) fr eine Zeichenkette ausfhren wollen, die *, + oder # enthlt.

Tabelle 10.5: Verwendung von Zeichen Anweisung v1 CP 'A+C' Wahr, wenn v1 enthlt a an der ersten Position und c an der dritten. Jedes Zeichen kann gro oder klein geschrieben sein. Jedes Zeichen kann an der zweiten Position erscheinen. Die Zeichenkette ab kommt innerhalb v1 an beliebiger Stelle vor. Jedes Zeichen kann gro oder klein geschrieben sein.

v1 CP '*Ab*'

v1 CP '*#A#b*' v1 enthlt ein groes A, gefolgt von einem klein geschriebenen b. v1 CP '*##*' v1 enthlt ein #.

Der Gebrauch dieser Operatoren setzt immer die Systemvariable sy-fdpos ein. Wenn das Ergebnis des Vergleichs wahr ist, enthlt sy-fdpos den auf Null basierenden Offset des ersten passenden oder nicht passenden Zeichens. Ansonsten enthlt sy-fdpos die Lnge von v1. Der Wert, der syfdpos durch jeden Operator zugewiesen wird, ist in Tabelle 10.6 beschrieben. In dieser Tabelle bedeutet 1st char(v1) das Offset des ersten Zeichens der Zeichenkette bzw. des Musters von v1. Wenn Sie also 1st char(v1) in v2 sehen, lesen Sie es als das basierende Nulloffset des ersten Zeichens von v1, das auch in v2 enthalten ist. Length (v1) bedeutet die Lnge von v1. Achten Sie darauf, da die erste Spalte ABAP/4-Anweisungen enthlt.

Tabelle 10.6: Wert, der sy-fdpos durch den jeweiligen Operator zugewiesen wird Vergleich if TRUE sy-fdpos = if FALSE sy-fdpos = 1stchar (v1) not in v2

v1 CO v2 length (v1)

v1 CN v2 1stchar (v1) in v2 v1 CA v2 1stchar (v1) in v2 v1 NA v2 length (v1) v1 CS v2 1stchar (v2) in v1 v1 NS v2 length (v1) v1 CP v2 1stchar (v2) in v1

length (v1) length (v1) 1stchar (v1) in v2 length (v1) 1stchar (v1) in v2 length (v1)

Listing 10.4 ist Listing 10.3 hnlich, es sind aber Zeilen hinzugefgt worden, um nach jedem Vergleich den Wert von sy-fdpos anzuzeigen. Listing 10.4: sy-fdpos wird benutzt, um das Offset der ersten passenden oder nicht passenden Zeichen zu sehen. 1 report ztx1004. 2 * operator: co 3 write / '''AABB'' co ''AB'''. 4 if 'AABB' co 'AB'. write 'True'. else. write 'False'. endif. 5 write: 'sy-fdpos=', sy-fdpos. 6 write / '''ABCD'' co ''ABC'''. 7 if 'ABCD' co 'ABC'. write 'True'. else. write 'False'. endif. 8 write: 'sy-fdpos=', sy-fdpos. 9 10 * operator: cn 1 write / '''AABB'' cn ''AB'''. 12 if 'AABB' cn 'AB'. write 'True'. else. write 'False'. endif. 13 write: 'sy-fdpos=', sy-fdpos. 14 write / '''ABCD'' cn ''ABC'''. 15 if 'ABCD' cn 'ABC'. write 'True'. else. write 'False'. endif. 16 write: 'sy-fdpos=', sy-fdpos. 17 18 * operator: ca 19 write / '''AXCZ'' ca ''AB'''. 20 if 'AXCZ' ca 'AB'. write 'True'. else. write 'False'. endif. 21 write: 'sy-fdpos=', sy-fdpos. 22 23 write / '''ABCD'' ca ''XYZ'''. 24 if 'ABCD' ca 'XYZ'. write 'True'. else. write 'False'. endif. 25 write: 'sy-fdpos=', sy-fdpos. 26 27 28 * operator: na 29 write / '''AXCZ'' na ''ABC'''. 30 if 'AXCZ' na 'ABC'. write 'True'. else. write 'False'. endif. 31 write: 'sy-fdpos=', sy-fdpos.

32 33 write / '''ABCD'' na ''XYZ'''. 34 if 'ABCD' na 'XYZ'. write 'True'. else. write 'False'. endif. 35 write: 'sy-fdpos=', sy-fdpos. Der Code in Listing 10.4 erzeugt diese Ausgabe: 'AABB' 'ABCD' 'AABB' 'ABCD' 'AXCZ' 'ABCD' 'AXCZ' 'ABCD'

co co cn cn ca ca na na

'AB' True sy-fdpos= 4 'ABC' False sy-fdpos= 3 'AB' False sy-fdpos= 4 'ABC' True sy-fdpos= 3 'AB' True sy-fdpos= 0 'XYZ' False sy-fdpos= 4 'ABC' False sy-fdpos= 0 'XYZ' True sy-fdpos= 4

Zeile 4, ein co-Vergleich, ist wahr. Sy-fdpos enthlt deswegen 4, die Lnge des ersten Operanden. Zeile 7, auch ein co-Vergleich, ist nicht wahr, weil v1 Werte enthlt, die nicht in v2 sind. Syfdpos enthlt 3, das nullbasierende Offset des ersten Zeichens in v1, das nicht in v2 vorkommt. Obwohl die Zeilen 12 und 15 die logischen Gegenteile der Zeilen 4 und 7 sind, ndern sich die Werte von sy-fdpos nicht. Zeile 20, ein ca-Vergleich, ist wahr, weil v1 ein Zeichen von v2 enthlt. Sy-fdpos enthlt 0: das nullbasierende Offset des ersten Zeichens in v1, das auch in v2 ist. Auf Zeile 24 enthlt v1 kein Zeichen aus v2, sy-fdpos enthlt deswegen 4: die Lnge von v1. Zeile 30 ist die logische Negation eines ca-Tests. 'AXCZ' enthlt einen Wert von 'ABC', daher ist der ca-Test wahr. Die Negierung dieses Ergebnises wrde falsch erzeugen. Syfdpos ist in das nullbasierende Offset des ersten Zeichens von 'AXCZ' gesetzt, das auch in 'ABC' ist. Zeile 34 ist ebenfalls eine logische Negation eines ca-Tests. 'ABCD' enthlt keinen Wert von 'XYZ', daher wre ein ca-Test nicht wahr. Die Negierung dieses Ergebnises wrde wahr erzeugen. Sy-fdpos ist auf die Lnge von 'ABCD' eingestellt.

Die case-Anweisung
Die case-Anweisung fhrt eine Reihe von Vergleichen aus.

Syntax fr die case-Anweisung


Das Folgende ist die Syntax fr die case-Anweisung. case v1.

when v2 [ or vn ... ]. --when v3 [ or vn ... ]. --[ when others. --- ] endcase. wobei gilt:

v1 oder v2 knnen eine Variable, ein Literal, eine Konstante oder eine Feldleiste sein. --- stellt jegliche Anzahl von Code-Zeilen dar. Sogar Nullzeilen sind erlaubt.

Die folgenden Punkte gelten:


Nur Anweisungen, die dem ersten passenden when folgen, werden ausgefhrt. when others pat, wenn keines des vorhergehenden whens bereinstimmt. Wenn when others nicht codiert ist und kein when pat, macht die Verarbeitung weiter mit der ersten Anweisung, endcase folgt. Ausdrcke sind nicht erlaubt. Feldleisten werden als Typ c behandelt.

Case ist if/elseif sehr hnlich. Der einzige Unterschied ist, da Sie komplexe Ausdrcke auf jedem if/elseif angeben knnen. Mit case knnen Sie nur einen Einzelwert angeben, der verglichen werden soll, und Werte werden immer auf Gleichheit geprft. Ein Beispiel wird in Listing 10.5 gezeigt. Listing 10.5: Die case-Anweisung fhrt eine Serie von Vergleichen durch. 1 report ztx1005. 2 parameters f1 type i default 2. 3 4 case f1. 5 when 1. write / 'f1 = 1'. 6 when 2. write / 'f1 = 2'. 7 when 3. write / 'f1 = 3'. 8 when others. write / 'f1 is not 1, 2, or 3'. 9 endcase. 10 11 * The following code is equivalent to the above case statement 12 if f1 = 1. write / 'f1 = 1'. 13 elseif f1 = 2. write / 'f1 = 2'. 14 elseif f1 = 3. write / 'f1 = 3'. 15 else. write / 'f1 is not 1, 2, or 3'. 16 endif.

Der Code in Listing 10.5 erzeugt diese Ausgabe: f1 = 2 f1 = 2


Zeile 2 definiert f1 als einzelnen Zeichenparameter, der den Standardwert 2 hat. Auf Zeile 4 fngt die case-Anweisung an, und f1 wird nacheinander mit 1, 2 und 3 verglichen. Zeile 6 stimmt berein und fhrt die write-Anweisung aus, die ihr sofort folgt. Die verbleibenden when-Anweisungen werden ignoriert. Die nchste Zeile, die ausgefhrt wird, ist Zeile 12.

Die Anweisung exit


Die exit-Anweisung verhindert Weiterverarbeitungen.

Syntax fr die Anweisung exit


Dies ist die Syntax fr die exit-Anweisung. exit Listing 10.6: zeigt ein Beispielprogramm unter Verwendung von exit Listing 10.6: Mit exit wird die Programmverarbeitung unterbrochen. 1 2 3 4 report ztx1006. write: / 'Hi'. exit. write: / 'There'.

Der Code in Listing 10.6 erzeugt diese Ausgabe: Hi Exit verhindert Weiterverarbeitungen, das heit, exit auf Zeile 3 hlt Zeile 4 davon ab, ausgefhrt zu werden. Exit kann in vielen Situationen benutzt werden. Es kann unterschiedliche Wirkungen haben, die davon abhngen, wo es im Code erscheint. Es verhindert allerdings immer die Weiterverarbeitung. Innerhalb von Schleifenstrukturen verlt es die Schleifenbearbeitung, die von solchen Anweisungen wie loop, select, do und while gestartet werden. Innerhalb von Unterprogrammen verlt es die Unterprogramme, die von FORM gestartet werden. Seine Wirkungen in anderen Situationen werden dort erklrt, wo sie entstehen.

Die Anweisung do
Die do-Anweisung ist ein grundlegender Schleifenmechanismus.

Syntax fr die Anweisung do


Das Folgende ist die Syntax fr die Anweisung do.

do [ v1 times ] [ varying f1 from s-c1 next s-c2 [ varying f2 from s2c1 next s2- c2 ... ] ]. --[exit.] --enddo. wobei gilt:

v1 ist eine Variable, ein Literal, oder eine Konstante. s ist eine Feldleiste mit den Komponenten c1 und c2. f1 ist eine Variable. Die Komponenten von s mssen in den Datentyp und die Datenlnge von f1 konvertiert werden knnen. ... stellt jegliche Anzahl vollstndiger varying-Klauseln dar. --- stellt jegliche Anzahl von Code-Zeilen dar.

Die folgenden Punkte gelten:


do-Schleifen knnen unbegrenzt verschachtelt werden. exit verhindert weitere Schleifenverarbeitung und steigt sofort aus der laufenden Schleife aus. Es beendet das Programm nicht, wenn es sich im Inneren einer do- Schleife befindet. Die Verarbeitung macht weiter an der nchsten ausfhrbaren Anweisung nach enddo. Sie knnen durch die Codierung von do eine unendliche Schleife ohne weitere Zustze anlegen. In dieser Situation benutzen Sie exit innerhalb der Schleife, um die Schleifenverarbeitung zu beenden. Die Vernderung des Wertes von v1 innerhalb der Schleife wirkt sich auf die Schleifenverarbeitung nicht aus.

Innerhalb der Schleife enthlt sy-index die laufende Iterationsnummer. Zum Beispiel wird beim ersten Schleifendurchlauf sy-index den Wert 1 haben, beim zweiten Mal den Wert 2, und so weiter. Nach enddo hat sy-index den Wert, den es hatte, vor der Schleifenverarbeitung. Mit verschachtelten do-Schleifen enthlt sy-index die Iterationsanzahl der Schleife, in der es benutzt wird (siehe Listing 10.7). Listing 10.7: Sy-index enthlt die laufende Iterationsnummer.

1 report ztx1007. 2 sy-index = 99. 3 write: / 'before loop, sy-index =', sy-index, / ''. 4 do 5 times. 5 write sy-index. 6 enddo. 7 write: / 'after loop, sy-index =', sy-index, / ''. 8 9 do 4 times. 10 write: / 'outer loop, sy-index =', sy-index. 11 do 3 times. 12 write: / ' inner loop, sy-index =', sy-index. 13 enddo. 14 enddo. 15 16 write: / ''. "new line 17 do 10 times. 18 write sy-index. 19 if sy-index = 3. 20 exit. 21 endif. 22 enddo. Der Code in Listing 10.7 erzeugt diese Ausgabe: before loop, sy-index = 99 1 2 3 4 5 after loop, sy-index = 99 outer loop, sy-index = 1 inner loop, sy-index = 1 inner loop, sy-index = 2 inner loop, sy-index = 3 outer loop, sy-index = 2 inner loop, sy-index = 1 inner loop, sy-index = 2 inner loop, sy-index = 3 outer loop, sy-index = 3 inner loop, sy-index = 1 inner loop, sy-index = 2 inner loop, sy-index = 3 outer loop, sy-index = 4 inner loop, sy-index = 1 inner loop, sy-index = 2 inner loop, sy-index = 3 1 2 3

Manchmal mu man in einem Programm die Zeit totschlagen. Das sollte man nicht mit einer Leerschleife tun, da hiermit unntig CPU-Zeit verbraucht wird. Statt dessen kann man den Funktionsbaustein rzl_sleep benutzen. nderungen am Wert von sy-index beeinflussen die Schleifenkontrolle nicht. Wenn Sie zum Beispiel do 10 times codieren und whrend der allerersten Schleife den Wert von sy-index auf 11 ndern, wrde dieser Wert bewahrt bleiben, bis die enddo-Anweisung ausgefhrt wird. An diesem Punkt wird der Wert auf 1 zurckgesetzt, dann auf 2 erhht, und die Schleife wird mit der Bearbeitung fortfahren, als ob Sie sie berhaupt nicht gendert htten.

Eine Endlosschleife beenden


Es gibt Situationen, in denen sich das Programm, mit dem Sie arbeiten, in einer Endlosschleife befindet. Listing 10.8 zeigt solch ein Programm. Listing 10.8: Eine Endlosschleife kann frustrieren, wenn man nicht wei, wie man wieder herauskommt. 1 2 3 4 5 6 7 report ztx1008. do. write sy-index. if sy-index = 0. exit. endif. enddo.

Wenn Sie dieses Programm laufen lassen, wird es in einer Endlosschleife laufen, und dieser Modus wird getaktet. Die Beendigung der SAPGUI-Aufgabe oder erneutes Booten wird das Programm nicht unterbrechen, weil es in einem Arbeitsproze auf dem Applikationsserver luft und nicht auf Ihrem PC. Wenn Sie neu booten und dann nochmals einloggen, werden Sie feststellen, da Sie dieses Programm nicht einmal editieren knnen (wenn Sie im Editor waren, als Sie den Rechner neu gestartet haben). Ihr Anmeldemodus ist immer noch dort drauen auf dem Applikationsserver und hat Ihren Quelltext immer noch gesperrt. Nach ungefhr fnf oder zehn Minuten ist Ihr Anmeldemodus abgelaufen, und Sie knnen Ihren Quellcode noch einmal editieren. Das Programm knnte in dem Arbeitsproze allerdings nach wie vor laufen, was das ganze System verlangsamen wrde. Schlielich wird Ihr Programm die maximale Menge von CPU verbrauchen, die in Ihrer Konfiguration erlaubt ist, und der Arbeitsproze wird sich selbst wieder starten. Um eine Endlosschleife zu beenden, mssen Sie mindestens zwei Modi laufen haben, die mit dem Menpfad System->Erzeugen-Modus angelegt wurden. Sie mssen sie in Gang setzen, bevor Sie Ihr

Programm laufen lassen. Wenn Sie in einer Endlosschleife sind und keinen anderen Modus laufen haben, ist es zu spt. Modi, die durch nochmaliges Einloggen angelegt wurden, funktionieren nicht. Starten Sie jetzt das ScreenCam How to Terminate an Endless Loop. Eine Endlosschleife beenden: 1. Wenn Sie sich das erste Mal anmelden, whlen Sie den Menpfad System->Erzeugen-Modus. 2. Minimieren Sie Ihren neuen Modus und lassen Sie ihn im Hintergrund, bis Sie ihn brauchen. Sie knnen jetzt Programme testen. 3. Jetzt lassen Sie ein Programm laufen, das eine Endlosschleife enthlt, wie ztx1008. Sie sehen eine Sanduhr, wenn Ihr Zeiger ber dem Fenster ist. Beachten Sie Ihre Modusnummer in der Statusleiste am unteren Rand des Fensters. 4. Halten Sie die (Alt)-Taste gedrckt und bettigen Sie mehrmals (), bis der Fokus auf der R/3Ikone bleibt, die Ihren anderen Modus darstellt. 5. Lassen Sie die ()-Taste los. 6. Tippen Sie /o in das Befehlsfeld auf der Symbolleiste. 7. Die (Enter)-Taste drcken. Die Dialogbox Modusliste erscheint. Sie enthlt eine Auflistung Ihrer Modi. Links von jedem sehen Sie die zugehrige Modusnummer. 8. Suchen Sie die Nummer des Schleifenmodus, und klicken Sie einmal diese Zeile an. 9. Drcken Sie auf die Schaltflche Modus lschen.

Der varying-Zusatz
Verwenden Sie den Zusatz varying, um von einer Feldleiste Komponenten in Folge zu erhalten. next baut eine Distanz (in Byte) zwischen zwei Komponenten durch Iteration auf. Die Annahmekomponente begrndet die Anzahl von Byte, um von jeder Komponente zu lesen. Dies erklrt sich am besten durch ein Beispiel, wie es in Listing 10.9 gezeigt wird. Listing 10.9: Der varying-Zusatz wiederholt die Komponenten einer Feldleiste in Folge. 1 2 3 4 5 report ztx1009. data: f1, begin of s, c1 value 'A', c2 value 'B',

6 c3 value 'C', 7 c4 value 'D', 8 c5 value 'E', 9 c6 value 'F', 10 end of s. 11 12 write / ''. 13 do 6 times varying f1 from s-c1 next s-c2. 14 write f1. 15 enddo. 16 17 write / ''. 18 do 3 times varying f1 from s-c1 next s-c3. 19 write f1. 20 enddo. Der Code in Listing 10.9 erzeugt diese Ausgabe: A B C D E F A C E In Zeile 13 baut next per Iteration eine gleiche Distanz auf wie zwischen c1 und c2. Die Lnge von f1 bestimmt die Anzahl der Byte, die von jeder Komponente gelesen wird. Dann beginnt do bei sc1 und weist seinen Wert f1 zu. In aufeinanderfolgenden Schleifendurchlufen wird die vorher etablierte Distanz der Adresse der laufenden Komponente zugezhlt. Dies bewirkt aufeinanderfolgende Werte, die von s an f1 zugewiesen werden. Alle Komponenten von s, auf die von do zugegriffen wird, mssen durch exakt dieselbe Anzahl von Byte getrennt werden. Datenkonvertierung durch Zuordnung zu f1 wird nicht ausgefhrt. Einige Tabellen in R/3 sind nicht vllig genormt. Anstatt viele Datenstze zu haben, knnte ein einzelner Satz eine Serie von Feldern enthalten, die nacheinander wiederholt werden. Sie knnen varying benutzen, um diese Werte in Folge wiederzufinden. Zum Beispiel enthlt Tabelle lfc1 Kreditorenstammdaten. Die Felder umNNs, umNNh und umNNu enthalten alle Soll- und Habenposten eines Monats und die Verkufe in diesem Zeitraum. Diese Gruppe von Feldern wird 16mal fr jeden Satz in dieser Tabelle wiederholt (NN ist eine sequenzielle Nummer von 01 bis 16). Tabelle knc1 enthlt eine hnliche Sequenz von Feldern. In einem anderen Beispiel enthlt Tabelle mvke, innerhalb von include envke, 10 Felder fr Produktattribute: prat1 bis prata. Sie stehen nebeneinander, gleich weit voneinander entfernt, und somit kann mit varying auf sie zugegriffen werden. Ein komplexeres Beispiel fr den Gebrauch von varying zeigt Listing 10.10. Listing 10.10: Der varying-Zusatz kann mehr als einmal in der do-Anweisung auftauchen.

1 report ztx1010. 2 data: f1 type i, 3 f2 type i, 4 tot1 type i, 5 tot2 type i, 6 begin of s, 7 c1 type i value 1, 8 c2 type i value 2, 9 c3 type i value 3, 10 c4 type i value 4, 11 c5 type i value 5, 12 c6 type i value 6, 13 end of s. 14 15 do 3 times varying f1 from s-c1 next s-c3 16 varying f2 from s-c2 next s-c4. 17 write: / f1, f2. 18 add: f1 TO tot1, 19 f2 to tot2. 20 enddo. 21 write: / '---------- -----------', 22 / tot1, tot2. Der Code in Listing 10.10 erzeugt diese Ausgabe: 1 2 3 4 5 6 ---------- ----------9 12 F1 ist jeder anderen Komponente von s zugewiesen, die mit s-c1 beginnt, und f2 jeder anderen Komponente, die mit s-c2 beginnt.

Modifizierung von Werten innerhalb von do ... varying/enddo


Sie knnen den Wert von f1 oder s mit der Schleife do ... varying/enddo modifizieren. Wenn die enddo-Anweisung ausgefhrt wird, wird der gegenwrtige Wert von f1 zurckkopiert zu der Komponente, aus der er stammte, egal ob er verndert wurde oder nicht. In Listing 10.11 veranschaulicht der Report ztx1011 diese Funktionalitt. Listing 10.11: Der gegenwrtige Wert von f1 wird zurckgeschrieben zu der sendenden Komponente, wenn enddo ausgefhrt wird. 1 report ztx1011.

2 data: f1 type i, 3 begin of s, 4 c1 type i value 1, 5 c2 type i value 2, 6 c3 type i value 3, 7 c4 type i value 4, 8 c5 type i value 5, 9 c6 type i value 6, 10 end of s. 11 field-symbols <f>. 12 13 write / ''. 14 do 6 times varying f1 from s-c1 next s-c2. 15 if sy-index = 6. 16 s-c6 = 99. 17 else. 18 f1 = f1 * 2. 19 endif. 20 assign component sy-index of structure s to <f>. "<f> now points to 21 write <f>. "a component of s 22 enddo. 23 24 write / ''. 25 do 6 times varying f1 from s-c1 next s-c2. 26 write f1. 27 enddo. Der Code in Listing 10.11 erzeugt diese Ausgabe: 1 2 3 4 5 99 2 4 6 8 10 6 Die folgenden Punkte gelten:

Auf Zeile 14 werden die Werte einzeln von den Komponenten der Feldleiste s in f1 gelesen. Zeile 18 modifiziert den Wert jedes f1, indem sie ihn mit 2 multipliziert. Der letzte Wert von f1 wird nicht verndert. Statt dessen wird der sendenden Komponente der Wert 99 zugewiesen. Zeile 20 weist dem Feldsymbol <f> eine Komponente von s zu. Bei der ersten Schleife wird die Komponente 1 (c1) <f> zugewiesen. Bei der zweiten wird Komponente 2 (c2) zugewiesen, und so weiter. Zeile 21 schreibt die Inhalte der Komponente aus, die ihren Wert zu f1 gesendet hat. In der Ausgabeliste knnen Sie die Inhalte von jeder Komponente von s sehen, bevor enddo ausgefhrt wurde. Wenn die enddo-Anweisung auf Zeile 22 ausgefhrt wird, ersetzen die Inhalte von f1 die Inhalte der Sendekomponente.

Wenn man mit varying wieder durch die Schleife geht (Zeilen 25 bis 27), erscheint der neue Inhalt von s. Dies zeigt, da der Wert von f1 innerhalb der Schleife immer die Inhalte der Sendekomponente berschreibt.

Eine exit-Anweisung innerhalb der Schleife wird die modifizierten Inhalte von f1 nicht davon abhalten, zum Sendefeld zurckgeschrieben zu werden. Die einzige Mglichkeit, die Schleife zu verlassen, ohne da die Inhalte von f1 das Sendefeld berschreiben, ist, eine stop-Anweisung oder eine error message-Anweisung innerhalb der Schleife auszufhren (beide Anweisungen werden in spteren Kapiteln erklrt).

Der Anweisung while


Die while-Anweisung ist ein Schleifenmechanismus, hnlich der Anweisung do Syntax fr die Anweisung while Es folgt die Syntax fr die while-Anweisung. while exp [ vary f1 from s-c1 next s-c2 [ vary f2 from s2-c1 next s2c2 ...] --[ exit. ] --endwhile. wobei gilt:

exp ist ein logischer Ausdruck. s ist eine Feldleiste mit den Komponenten c1 und c2. f1 ist eine Variable. Die Komponenten von s mssen in den Datentyp und die Datenlnge von f1 konvertiert werden knnen. ... stellt jegliche Anzahl von kompletten vary-Klauseln dar. --- stellt jegliche Anzahl von Code-Zeilen dar.

Die folgenden Punkte gelten:

while-Schleifen knnen unendlich oft verschachtelt und auch innerhalb jeglicher anderen Art von Schleifen verschachtelt werden. exit verhindert eine weitere Schleifenverarbeitung und steigt sofort aus der laufenden Schleife aus. Die Verarbeitung macht an der nchsten ablauffhigen Anweisung nach endwhile weiter. Innerhalb der Schleife enthlt das sy-index die gegenwrtige Iterationsnummer. Nach endwhile enthlt sy-index den Wert, den es hatte, bevor es in die Schleife eintrat. Mit verschachtelten while-Schleifen enthlt sy-index die Iterationsnummer der Schleife, in der es benutzt wird. endwhile kopiert immer den Wert von f1 in die Sendekomponente zurck.

In einer while-Anweisung mit einem logischen Ausdruck und einer varying-Addition wird der logische Ausdruck zuerst ausgewertet.

while ist do sehr hnlich. Es wird hier benutzt, um eine gleiche Anzahl von Strichen auf jede Seite einer Zeichenkette zu setzen. Listing 10.12: Ein Beispiel fr die Verwendung einer while-Anweisung 1 report ztx1012. 2 data: l, "leading characters 3 t, "trailing characters 4 done. "done flag 5 parameters p(25) default ' Vendor Number'. 6 while done = ' ' "the expression is evaluated first 7 vary l from p+0 next p+1 "then vary assignments are performed 8 vary t from p+24 next p+23. 9 if l = ' ' and t = ' '. 10 l = t = '-'. 11 else. 12 done = 'X'. 13 endif. 14 endwhile. 15 write: / p. Der Code in Listing 10.12 erzeugt diese Ausgabe: ----Vendor Number ---

Die Zeilen 2 und 3 definieren zwei einzelne Zeichenvariable l und t. Zeile 3 definiert eine Flagge, um anzuzeigen, wenn die Verarbeitung beendet ist. Zeile 5 definiert p als Zeichen mit einem Standardwert 25. Auf Zeile 6 wird der Ausdruck der while-Anweisung zuerst ausgewertet. Beim ersten Schleifendurchlauf wird sie als wahr erkannt. Die Zuweisungen auf den Zeilen 7 und 8 werden dann ausgefhrt. Zeile 7 weist das erste Zeichen von p zu l zu, und Zeile 8 weist t das letzte Zeichen zu. Wenn l und t beide unbeschrieben sind, weist Zeile 10 beiden einen Strich zu. Wenn nicht, weist Zeile 12 der done-Flagge ein 'X' zu. Auf Zeile 14 kopiert endwhile die Werte von l und t zurck zu p. Die while- Schleife wiederholt diese Prozedur von Zeile 6 an so lange, bis die done-Flagge unbeschrieben ist.

Die Anweisung continue


Die continue-Anweisung ist innerhalb einer Schleife codiert. Sie verhlt sich wie goto , indem sie sofort die Kontrolle an die abschlieende Anweisung der Schleife abgibt und einen neuen Schleifendurchgang beginnt. Tatschlich bewirkt sie, da die Anweisungen darunter innerhalb der

Schleife ignoriert werden und ein neuer Schleifendurchgang beginnt. Die Wirkung der continueAnweisung ist in Abbildung 10.1 gezeigt.

Abbildung 10.1: Die Anweisung continue springt an das Ende der Schleife und ignoriert alle Anweisungen fr den momentanen Schleifendurchgang. Der Code in Abbildung 10.1 erzeugt diese Ausgabe: 1 2 9 10

Syntax fr die Anweisung continue


Es folgt die Syntax fr die Anweisung continue. Sie kann innerhalb von do, while, select oder loop benutzt werden. (Die loop-Anweisung wird im nchsten Kapitel behandelt.) [do/while/select/loop] --continue. --[enddo/endwhile/endselect/endloop] wobei gilt:

--- stellt jegliche Anzahl von Code-Zeilen dar.

Die folgenden Punkte gelten:


continue kann nur innerhalb einer Schleife verwendet werden. continue hat keine Zustze.

Listing 10.13 ist wie eine goto-Anweisung. Es verursacht einen Sprung zum Ende der Schleife. Dieses Programm entfernt berflssige Doppelpunkt- und Rckstrichzeichen von einer Eingabezeichenkette. Listing 10.13: Ein Beispiel fr die Verwendung einer continue-Anweisung

1 report ztx1013. 2 parameters p(20) default 'c::\\\xxx\\yyy'. 3 data: c, "current character 4 n. "next character 5 6 do 19 times varying c from p+0 next p+1 7 varying n from p+1 next p+2. 8 if c na ':\'. 9 continue. 10 endif. 11 if c = n. 12 write: / 'duplicate', c, 'found', 'at position', sy-index. 13 endif. 14 enddo. Der Code in Listing 10.13 erzeugt diese Ausgabe: duplicate duplicate duplicate duplicate

: \ \ \

found found found found

at at at at

position position position position

2 4 5 10

Zeile 2 definiert einen 20 Zeichen langen Eingabeparameter p und weist ihm einen Standardwert zu. Zeile 6 startet eine Schleife. Beim ersten Schleifendurchgang wird das erste Zeichen von p c zugewiesen und das nachfolgende Zeichen n. Zeile 8 ist wahr, wenn c ein anderes Zeichen als : oder / enthlt. Zeile 9 springt direkt zu Zeile 14, was zur Folge hat, da sich die Schleife wiederholt, wobei sie das nchste Zeichen benutzt. Wenn Zeile 8 nicht wahr ist, wird Zeile 11 ausgefhrt und ist wahr, wenn das nchste Zeichen das gleiche wie das gegenwrtige Zeichen ist. enddo kopiert die Werte von c und n zurck in p, und die Schleife wiederholt alles 19mal.

Die Anweisung check


Die check-Anweisung wird innerhalb einer Schleife codiert. Sie kann sich genauso verhalten wie continue, indem sie die Kontrolle sofort zur abschlieenden Anweisung der Schleife abgibt und alle Anweisungen dazwischen umgeht. Anders als continue akzeptiert sie einen logischen Ausdruck. Wenn der Ausdruck wahr ist, fhrt er nichts aus. Wenn er nicht wahr ist, springt er zum Ende der Schleife. Die Wirkung der check- Anweisung ist in Abbildung 10.2 gezeigt.

Abbildung 10.2: Die Anweisung check ist eine konditionale continue-Anweisung. Sie springt an das Schleifenende, wenn der logische Ausdruck falsch ist. Der Code in Abbildung 10.2 erzeugt die gleiche Ausgabe wie der in Abbildung 10.1: 1 2 9 10

Syntax fr die Anweisung check


Jetzt folgt die Syntax fr die check-Anweisung. Sie kann innerhalb von do, while, select oder loop benutzt werden. (Die loop-Anweisung wird im nchsten Kapitel behandelt.) [do/while/select/loop] --check exp. --[enddo/endwhile/endselect/endloop] wobei gilt:

exp ist ein logischer Ausdruck. --- stellt jegliche Anzahl von Code-Zeilen dar.

In Listing 10.14 verhlt sich check wie eine continue-Anweisung, wenn der logische Ausdruck nicht wahr ist. Wenn er wahr ist, fhrt es nichts aus. Listing 10.14: Listing 10.3 wurde neu programmiert, um die check-Anweisung anstelle von continue zu benutzen. 1 2 3 4 5 6 7 8 report ztx1014. parameters p(20) default 'c::\\\xxx\\yyy'. data: c, "current character n. "next character do 19 times varying c from p+0 next p+1 varying n from p+1 next p+2. check c ca ':\'.

9 if c = n. 10 write: / 'duplicate', c, 'found', 'at position', sy-index. 11 endif. 12 enddo. Der Code in Listing 10.14 erzeugt diese Ausgabe: duplicate duplicate duplicate duplicate : \ \ \ found found found found at at at at position position position position 2 4 5 10

Die Zeilen 8 bis 10 in Listing 10.13 wurden in Listing 10.14 durch Zeile 8 ersetzt. Das Programm arbeitet auf genau die gleiche Weise.

Die Verwendung von check oder continue innerhalb einer select-Schleife kann sehr unergiebig sein. Sie sollten nach Mglichkeit die where-Klausel so modifizieren, da sie weniger Datenstze auswhlt.

Vergleich der Anweisungen exit, continue und check


In Tabelle 10.7 werden die Anweisungen exit, continue und check miteinander verglichen.

Tabelle 10.7: Vergleich von exit, continue und check Anweisung exit continue Wirkung Verlt die momentane Schleife Bedingungsloser Sprung an das Schleifenende

check exp Springt an das Schleifenende, wenn exp falsch ist

Einfache Positions- und Lngenspezifikationen fr die Anweisung write

Die write-Anweisung erlaubt die Spezifikation einer Ausgabeposition und Lnge. Obwohl die write-Anweisung viele komplexe Spezifikationen erlaubt, werden hier elementare Positions- und Lngenspezifikationen dargestellt, um Ihnen zu ermglichen, die grundlegenden Reports in diesem und in den folgenden Kapiteln anzulegen. Ein detaillierter Umgang der writeAnweisung erscheint spter in Kapitel 14.

Syntax fr die einfache Positions- und Lngenspezifikationen in der write-Anweisung


Die Syntax fr einfache Positions- und Lngenspezifikationen ber die write-Anweisung lautet folgendermaen: write [/][P][(L)] v1. wobei gilt:

v1 ist eine Variable, ein Literal oder eine Konstante. P ist eine Zahl, die eine Position auf der gegenwrtigen Ausgabenreihe anzeigt. L ist eine Zahl, die die Anzahl von Byte anzeigt, die in der Auflistung verteilt werden, um v1 auszugeben.

Die folgenden Punkte gelten:


/ fngt eine neue Zeile an. /, P und L mssen ohne alle dazwischenliegenden Leerzeichen codiert werden.

Tabelle 10.8 zeigt die richtigen und falschen Wege, Position und Lngenspezifikationen ber die write-Anweisung zu codieren.

Tabelle 10.8: Richtige und falsche Wege, Positions- und Lngenspezifikationen ber die write-Anweisung zu codieren Richtig Falsch

write /10(2) 'Hi'. write / 10(2) 'Hi'. write / 10 (2) 'Hi'. write /10 (2) 'Hi'.

write /10( 2) 'Hi'. write /10( 2 ) 'Hi'. write (2) 'Hi'. write ( 2 ) 'Hi'. write 'Hi'(2). write 10 'Hi'. write 10'Hi'. write 'Hi' 10.

Wenn Sie zwischen / und der Positions- oder Lngenspezifikation ein Leerzeichen gelassen haben, kann der Syntaxtester dies fr Sie automatisch korrigieren. Korrigieren Sie, wenn Sie dazu aufgefordert werden. Listing 10.15 veranschaulicht den Gebrauch der einfachen Positions- und Lngenspezifikationen ber die write-Anweisung. Es zeigt auch einige der Fallen. Zeile 4 gibt ein Lineal aus, so da Sie die Anzahl der Spalten auf der Ausgabe sehen knnen. Listing 10.15: Die Verwendung einfacher Positions- und Lngenspezifikationen in der writeAnweisung 1 report ztx1015. 2 data: f1 type p value 123, 3 f2 type p value -123. 4 write: / '....+....1....+....2....+....3....+....4', 5 /1 'Hi', 4 'There', 6 /1 'Hi', 3 'There', 7 /1 'Hi', 2 'There', 8 /1 'Hi', 1 'There', 9 /2 'Hi', 'There', 10 /2(1) 'Hi', 'There', 11 /2(3) 'Hi', 'There', 12 /2 'Hi', 10(3) 'There', 13 / f1, f2, 14 / f1, 4 f2, 15 /(3) f1, 16 /(2) f1. Der Code in Listing 10.15 erzeugt diese Ausgabe: ....+....1....+....2....+....3....+....4

Hi There HiThere Hthere There Hi There H There Hi There Hi The 123 123123123 *3

Zeile 4 schreibt ein Zeilenlineal aus, so da Sie deutlich die Spalten in der Ausgabeliste sehen knnen. Zeile 5 schreibt Hi, das bei Position 1 anfngt und There, das bei Position 4 anfngt. Zeile 6 schreibt Hi, das bei Position 1 anfngt und There, das bei Position 3 anfngt. Zeile 7 schreibt Hi, das bei Position 1 anfngt und There, das bei Position 2 anfngt. There berschreibt die letzte Position von Hi. Zeile 8 schreibt Hi, das bei Position 1 anfngt und There, das auch bei Position 1 anfngt. There berschreibt Hi vollstndig, und Sie knnen nicht sagen, ob Hi berhaupt in die Liste geschrieben wurde. Zeile 9 schreibt Hi an Position 2 und There danach. Write lt ein Leerzeichen zwischen den Werten, wenn Sie keine Ausgabeposition angeben. Zeile 10 schreibt Hi, das fr eine Lnge von 1 bei Position 2 anfngt. Dies schreibt nur das erste Zeichen aus: H. Zeile 11 schreibt Hi, das fr eine Lnge von 3 bei Position 2 anfngt. Zeile 12 schreibt Hi, das an Position 2 beginnt, und There bei Position 10 fr eine Lnge von 3, wodurch The in der Liste erscheint. Zeile 13 schreibt die gepackten dezimalen Felder f1 und f2 nacheinander. Zeile 14 schreibt auch f1 und f2. f2 wird diesmal bei Position 4 beginnend geschrieben. Die Vorlaufleerzeichen, die bei Position 4 anfangen, berschreiben den Wert von f1, was zur Folge hat, da nur f2 in der Ausgabe erscheint. Zeile 15 schreibt f1 und verteilt nur 3 Byte fr den Wert in der Ausgabeliste. f1 erscheint in der Liste bei Position 1; es fllt das ganze Ausgabefeld. Zeile 16 schreibt f1 und verteilt nur 2 Byte fr den Wert in der Ausgabeliste. Der Wert von f1 kann nicht in 3 Byte angezeigt werden, so da ein Sternzeichen (*) in der ersten Spalte erscheint, um den berlauf anzuzeigen.

Zusammenfassung

Die Vergleichsanweisungen sind if und case. case stellt eine hnliche Mglichkeit wie if/elseif zur Verfgung, vergleicht aber nur zwei Werte, und nur auf ihre Gleichheit hin. Konvertierungen kommen vor, wenn unterschiedliche Datentypen verglichen werden. Das

Programmanalyse-Werkzeug legt Konvertierungen genau fest, wo immer sie vorkommen. Besondere Operatoren sind fr Zeichenkettenvergleiche verfgbar. Benutzen Sie CP und NP, um Zeichenketten mit Mustern zu vergleichen. sy-index wird nach jedem Vergleich eingestellt. Die Schleifenanweisungen sind do und while. sy-index enthlt immer den Zhler fr den laufenden Schleifendurchgang. Nach Beendigung der Schleife wird der Wert auf den Wert zurckgestellt, den er hatte, als die Schleife anfing. Obwohl Sie sy-index ndern knnen, wird sein Wert mit dem nchsten Schleifendurchgang wieder in Ausgangsposition gebracht. Benutzen Sie varying, um einer Variablen den nchsten Wert einer Serie zuzuweisen. Wenn Sie diese Variable modifizieren, kopiert enddo oder endwhile den modifizierten Wert wieder dorthin zurck, woher er stammte. Benutzen Sie einen anderen Modus und den /o Befehl, um eine Endlosschleife zu beenden. Benutzen Sie die Anweisungen exit, continue und check, um die Schleifenverarbeitung zu modifizieren. exit beendet die Schleifenverarbeitung und macht mit der Ausfhrung bei der ersten Anweisung nach der Schleife weiter. continue springt sofort zum Ende der Schleife. check exp springt zum Ende der Schleife, wenn exp nicht wahr ist. Wenn exp wahr ist, fhrt check nichts aus. ber die write-Anweisung knnen Position und Lnge sofort vor dem Ausgangswert spezifiziert werden. Es sollten keine dazwischenliegenden Leerzeichen zwischen jeder Spezifikation erscheinen. Nicht erlaubt Benutzen Sie niemals check oder continue in einer select-Schleife, um Datenstze herauszufiltern; benutzen Sie statt dessen die where-Klausel. Lesen Sie niemals mit der varying-Addition hinter dem Ende einer Variablen oder Feldleiste. Das kann zu Schutzverletzungen und unvorhergesehenem Verhalten fhren.

Erlaubt ffnen Sie immer zwei Modi, wenn Sie sich einwhlen. So knnen Sie immer eine Endlosschleife beenden. Benutzen Sie varying, um eine Serie gleichweit voneinanderentfernter Felder einer Feldleiste zu lesen.

Fragen & Antworten


Frage: Warum werden Bitoperationen nicht oft in ABAP/4 benutzt? Was wird statt dessen benutzt? Antwort: Der Gebrauch einer Bitoperation ist betriebssystemabhngig. Dies reduziert Portabilitt, so da sie nur benutzt werden, wenn unbedingt notwendig. Eine einzelne Zeichenvariable benutzt statt dessen einen einzelnen ein/aus-Wert. Meistens stellt X eingeschaltet dar, und ein Leerfeld bedeutet

aus. Frage: Warum werden X und Leerfeld benutzt, um die binren Werte von ein und aus darzustellen, und nicht 1/0, T/F oder Y/N, wie es in der Industrie blich ist? Antwort: Diese Konvention ist fr die Kompatibilitt mit zeichenorientierten Anwenderschnittstellen. Ausgeschrieben zeigt X eine gegenwrtige Selektion an, und das Leerfeld bedeutet nicht gegenwrtig. Frage: Sie empfehlen, mehrere Modi anzumelden, wann immer ich mich anmelde. Ist dies keine Ressourcenverschwendung? Wenn jeder das tte, wrde dies nicht den Applikationsserver verlangsamen? Antwort: Die kostbarsten Ressourcen sind CPU. Es ist wahr, da eine kleine Menge von zustzlichem Speicher auf dem Applikationsserver gebraucht wird, um jeden neuen Modus zu versorgen. Keine CPU wird allerdings vom stillstehenden Modus benutzt, sie verlangsamt den Server also nicht. Wenn Sie ein Programm schreiben, das in eine Schleife kommt, wird es eine enorme Menge von Ressourcen, primr CPU, verschwenden und den Server ohne Zweifel verlangsamen, whrend es luft. Wenn Sie unfhig sind, es zu stoppen, werden Sie unfhig sein, die Ressourcenverschwendung zu verhindern. Ungeprft wird das Programm laufen, womglich fr fnf oder zehn Minuten, bis es seine Zuteilung von CPU berschreitet und beendet wird. Das nchste Mal, wenn Sie es laufen lassen, knnte es das gleiche nochmals machen. Kurz gesagt: Wenn Sie eine weitere Sitzung ffnen, whlen Sie das kleinere von zwei beln. Frage: Wie beeinflussen Fllbytes den Gebrauch von varying? Mu ich irgend etwas beachten, wenn ich mich von und zu Feldleisten bewege? Antwort: Der einfachste Weg, um sicherzustellen, da varying arbeitet, ist, sich zu berzeugen, da sich die genaue Sequenz von Feldern wiederholt. Wenn die gleiche Sequenz von Feldern wiederholt wird, wird die gleiche Anzahl von Byte sie immer abtrennen. Solange Sie dieser Konvention folgen, gibt es keinen Grund, ber Fllbytes nachzudenken. Frage: Kann ich eine Variable benutzen, um die Position bzw. die Lnge einer write-Anweisung anzuzeigen? Antwort: Ja. Die write-Anweisung wird ausfhrlich in Tag 14 behandelt, und verschiedene Spezifikationen werden dort gezeigt.

Workshop
Im Workshop knnen Sie auf zwei Weisen feststellen, was Sie in diesem Kapitel gelernt haben. Die Kontrollfragen helfen Ihnen, Ihr Verstndnis fr den Stoff zu vertiefen. Der bungsabschnitt ermglicht Ihnen, Erfahrungen zu sammeln, indem Sie das Erlernte anwenden. Antworten auf die Kontrollfragen und bungen finden Sie in Anhang B.

Kontrollfragen
1. ndern Sie die if-Anweisungen in case-Anweisungen ab. write 'The number endif. if v1 eq 10. write 'The number endif. if v1 <> 5 and v1 write 'The number endif. is five.'.

is ten.'. <> 10. is not five or ten.'.

2. Welche Zeichenketten-Vergleichsoperatoren benutzen die drei Zeichen *, + und #? 3. Welche drei Programmsteuerungsanweisungen werden in diesem Kapitel besprochen? Welche Unterschiede bestehen zwischen ihnen?

bung 1
Schreiben Sie ein Programm, das die Ausgabe in der Abbildung erzeugt.

Abbildung 10.3: 10fig03.pcx Codieren Sie die Zahlen nicht hart als Zeichenkette. Berechnen Sie die Zahlen, und schreiben Sie diese einzeln aus.

Ein Imprint des Markt&Technik Buch- und Software-Verlag GmbH. Elektronische Fassung des Titels: ABAP/4 in 21 Tagen, ISBN: 3-8272-2016-X

Woche 2

Tag 11

Interne Tabellen
Kapitelziele
Wenn Sie dieses Kapitel durchgearbeitet haben, sind Sie in der Lage:

interne Tabellen mit oder ohne Kopfzeile mit der data- oder include structureAnweisung zu definieren. eine interne Tabelle mit der Kopfzeile oder einem expliziten Arbeitsbereich zu fllen. Loop at und loop at...where zu benutzen, um den Inhalt einer internen Tabelle zu lesen und sy-tabix, um den aktuellen Zeilenindex zu bestimmen. einzelne Zeilen einer internen Tabelle mit Hilfe von read table inklusive der mglichen Variationen zu lokalisieren. interne Tabellen zu sortieren und den Zusatz text zu benutzen.

Grundlagen interner Tabellen


Eine interne Tabelle ist eine temporre Tabelle, die im RAM auf dem Applikationsserver gespeichert wird. Sie wird whrend der Programmausfhrung angelegt und gefllt und gelscht, wenn das Programm endet. Wie die Tabelle einer Datenbank besteht eine interne Tabelle aus einer oder mehreren Zeilen identischer Struktur. Anders als die Tabelle einer Datenbank kann die interne Tabelle keine Daten nach Beendigung des Programms speichern. Die interne Tabelle ist als temporrer Speicher fr die Bearbeitung von Daten oder als privater temporrer Puffer zu nutzen.

Definition einer internen Tabelle


Eine interne Tabelle besteht aus einem Rumpf und einer optionalen Kopfzeile (siehe Abb. 11.1).

Der Rumpf besteht aus den Zeilen der internen Tabelle. Alle Zeilen haben die gleiche Struktur. Der Ausdruck interne Tabelle bezieht sich nur auf den Rumpf der internen Tabelle. Die Kopfzeile ist eine Feldleiste mit der gleichen Struktur wie sie die Zeilen des Rumpfs haben, allerdings besteht dieser nur aus einer Zeile. Sie ist ein Puffer, um den Datensatz zu speichern, der zu der internen Tabelle hinzugefgt wird oder von der internen Tabelle gelesen wird. Abbildung 11.1 zeigt die Definition einer internen Tabelle mit dem Namen it.

In diesem Buch wird eine Namenskonvention fr interne Tabellen gebraucht. Fr einfache Programme mit einer internen Tabelle, wird der Name der internen Tabelle gewhnlich it sein (fr interne Tabelle). Wenn mehrere interne Tabellen existieren, beginnt der Name gewhnlich immer mit it.

Abbildung 11.1: Die Definition einer internen Tabelle mit dem Namen it wird zu Beginn dieser Abbildung gezeigt. Die Kopfzeile und der Rumpf werden ebenso gezeigt. Um den Rumpf einer internen Tabelle zu definieren, benutzen Sie occurs n bei der Definition der Feldleiste auer bei tables. Mit occurs wird der Rumpf der internen Tabelle erzeugt. Der Speicherplatz eines Rumpfs wird nicht zugeordnet, bis die erste Zeile hinzugefgt wird. Ohne occurs haben Sie lediglich eine Feldleiste definiert. Um eine interne Tabelle mit einer Kopfzeile zu erzeugen, mssen Sie entweder begin of oder with header line in der Definition hinzufgen. Eine Kopfzeile wird automatisch erzeugt, wenn begin of in der Definition erscheint. Wenn Sie like anstatt begin of benutzen, wird die interne

Tabelle keine Kopfzeile haben, es sei denn, sie fgen with header line hinter der occursKlausel mit ein. Dieses wird in den Zeilen 2 bis 10 des Listings 11.1 gezeigt. Eine interne Tabelle ohne Kopfzeile benutzen Sie in der Regel nur im Fall von verschachtelten internen Tabellen. Eine verschachtelte interne Tabelle kann keine Kopfzeile haben. Listing 11.1: Grundlegende Schritte, eine interne Tabelle mit oder ohne Kopfzeile zu definieren 1 report ztx1101. 2 data: begin of it1 occurs 10, "has a header line 3 f1, 4 f2, 5 f3, 6 end of it1. 7 8 data it2 like ztxlfa1 occurs 100. "doesn't have a header line 9 10 data it3 like ztxlfa1 occurs 100 with header line. "it does now Der Programm-Code in Listing 11.1 erzeugt keine Ausgabe.

Zeile 2 beginnt mit der Definition einer internen Tabelle mit dem Namen it1. Es ist eine interne Tabelle wegen der occurs-Klausel. Sie hat drei Komponenten: f1, f2 und f3. Jede vom Typ c mit der Lnge 1. Diese interne Tabelle hat eine Kopfzeile, da die Definition die Schlsselwrter begin of enthlt. Zeile 8 definiert die interne Tabelle it2. Sie hat die gleichen Komponenten wie die DDICStruktur ztxlfa1. Sie hat keine Kopfzeile, da sie weder mit begin of noch mit with header line definiert ist. Die Definition von it3 in Zeile 10 ist fast die gleiche wie die Definition fr it2 in Zeile 8. Der einzige Unterschied ist der Zusatz with header line. Das bedeutet natrlich, da it3 eine Kopfzeile hat.

Eliminierung der Hauptursache von Irrtmern im Zusammenhang mit internen Tabellen Abbildung 11.1 zeigt eine typische Definition einer internen Tabelle. Es werden zwei Dinge definiert: der Rumpf einer internen Tabelle und eine Kopfzeile. Verwirrung kann entstehen, weil sowohl der Rumpf als auch die Kopfzeile den Namen it haben. Wenn Sie it in Ihrem Programm-Code verwenden, bestimmen Sie, ob Sie sich auf den Rumpf oder die Kopfzeile beziehen. Wenn Sie it in einem Zuweisungsausdruck verwenden, dann bezieht es sich immer auf die Kopfzeile. Zum Beispiel bezieht sich it-f1 = 'A' auf eine Komponente f1 der Kopfzeile mit dem Namen it. In f3 = it-f1 bezieht sich it auch auf die Kopfzeile. Beispiele von Definitionen interner Tabellen

Um interne Tabellen mit und ohne Kopfzeilen zu definieren, benutzen Sie bitte die Konventionen, die in Listing 11.2 empfohlen werden. Listing 11.2: Diese Definitionen erzeugen interne Tabellen mit oder ohne Kopfzeile. 1 report ztx1102. 2 data: begin of it1 occurs 10, "has a header line 3 f1, 4 f2, 5 f3, 6 end of it1. 7 8 data it2 like ztxlfa1 occurs 100. "doesn't have a header line 9 10 data it3 like ztxlfa1 occurs 100 with header line. "it does now 11 12 data it4 like it3 occurs 100. "doesn't have a header line 13 14 data begin of it5 occurs 100. "has a header line 15 include structure ztxlfa1. 16 data end of it5. 17 18 data begin of it6 occurs 100. "this is why you might use 19 include structure ztxlfa1. "the include statement 20 data: delflag, 21 rowtotal, 22 end of it6. 23 24 data: begin of it7 occurs 100, "don't do it this way 25 s like ztxlfa1, "component names will be 26 end of it7. "prefixed with it7-s27 28 data it8 like sy-index occurs 10 29 with header line. 30 31 data: begin of it9 occurs 10, 32 f1 like sy-index, 33 end of it9. Der Programm-Code in Listing 11.2 erzeugt keine Ausgabe.

Die Zeilen 2 bis 10 sind dieselben wie in Listing 11.1; sie wurden zur Wiederholung eingefgt. In Zeile 12 wird it4 mit der Feldleiste it3 definiert und nicht mit der internen Tabelle it3. Um eine interne Tabelle zu erzeugen, wird der Zusatz occurs bentigt; diese Definition hat

keine Kopfzeile, weil kein begin of oder with header line aufgefhrt ist. Die Zeilen 14 bis 16 zeigen einen alten Weg, interne Tabellen zu definieren. it5 ist die gleiche wie die in Zeile 10 definierte it3. Der Zusatz like wurde erst in Release 3.0 eingefhrt; frhere Programme nutzen Definitionen wie die in Zeile 14 bis 16. Include structure wird normalerweise nicht gebraucht. Eine Ausnahme wird in der folgenden Definition von it6 gezeigt. (Jetzt knnen Sie noch einmal die include structure-Anweisung aus dem Kapitel des 5. Tages Das Data Dictionary, Teil 3 wiederholen.) Das knnte der einzige Grund sein, warum Sie die include-Anweisung benutzen (nach Release 3.0). Sie ermglicht Ihnen, Feldleisten mit allen Komponenten einer DDIC-Struktur und einigen weiteren Feldern zu erzeugen. Die Definition von it6 beinhaltet die Komponenten von ztxlfa1 und zwei zustzliche Felder delflag und rowtotal. Diese interne Tabelle hat eine Kopfzeile, weil sie die Definition begin of enthlt. Zeile 24 bis 26 zeigt eine falsche Weise, like zu benutzen. Die Komponenten dieser internen Tabelle beginnen alle mit it7-s, z.B. it7-s-lifnr und it7-s-land1. Dies ist zwar mglich, aber wahrscheinlich wollen Sie diese Definition nicht, weil sie eine unntige Stufe in den Namen der Komponenten erzeugt. Wenn Sie eine interne Tabelle mit nur einer Komponente definieren, knnen Sie entweder den Programm-Code in Zeile 28 oder Zeile 31 benutzen.

Daten einer internen Tabelle mit der append-Anweisung hinzufgen


Um eine einer internen Tabelle einzelne Zeile hinzuzufgen, knnen Sie die append- Anweisung benutzen. Die append-Anweisung kopiert eine einzelne Zeile aus jedem Arbeitsbereich und fgt sie in den Rumpf am Ende der schon bestehenden Zeilen ein. Der Arbeitsbereich kann entweder die Kopfzeile oder jede beliebige Feldleiste mit derselben Struktur wie die Zeile in dem Rumpf sein. Syntax der append-Anweisung Das Folgende ist die Syntax der append-Anweisung. append [wa to] [initial line to] it. wobei:

wa der Name des Arbeitsbereichs ist. it der Name der vorher definierten internen Tabelle ist.

Folgende Punkte sind zu beachten:


wa mu dieselbe Struktur wie die Zeilen des Rumpfs haben. wa kann die Kopfzeile oder jede andere Feldleiste mit derselben Struktur wie die Zeile des Rumpfs sein. Wenn Sie einen Arbeitsbereich spezifizieren, benutzt das System standardmig die Kopfzeile. Die Kopfzeile ist somit der vorgegebene Arbeitsbereich.

Nach der append-Anweisung wird sy-tabix auf die relative Zeilennummer entsprechend der eingefgten Zeile gesetzt. Zum Beispiel wird nach dem Einfgen der ersten Zeile sytabix auf 1 gesetzt. Nach dem Einfgen der zweiten Zeile wird sy-tabix auf 2 gesetzt und so weiter.

Die Anweisung append it to it fgt eine Kopfzeile mit dem Namen it in den Rumpf it ein. Die Anweisung append it fgt ebenfalls eine Kopfzeile mit dem Namen it in den Rumpf it ein, da der vorgegebene Arbeitsbereich die Kopfzeile ist. blicherweise wird append it verwendet. Ein Arbeitsbereich, der ausdrcklich in der Anweisung append genannt wird, wird auch expliziter Arbeitsbereich genannt. Eine Feldleiste mit derselben Struktur wie die Zeile einer internen Tabelle kann wie ein expliziter Arbeitsbereich benutzt werden. Wenn ein Arbeitsbereich nicht genannt wird, dann wird ein impliziter Arbeitsbereich (die Kopfzeile) benutzt. Die Anweisung append initial line to it fgt eine Zeile mit initialen Werten (Leerzeichen und Nullen) in die interne Tabelle ein. Wenn Sie die Anweisungen clear it und append it hintereinander ausfhren, erhalten Sie das gleiche Ergebnis. Listing 11.3: zeigt ein Beispielprogramm, das drei Zeilen in eine interne Tabelle einfgt. 1 report ztx1103. 2 data: begin of it occurs 3, 3 f1(1), 4 f2(2), 5 end of it. 6 it-f1 = 'A'. 7 it-f2 = 'XX'. 8 append it to it. "appends header line IT to body IT 9 write: / 'sy-tabix =', sy-tabix. 10 it-f1 = 'B'. 11 it-f2 = 'YY'. 12 append it. "same as line 8 13 write: / 'sy-tabix =', sy-tabix. 14 it-f1 = 'C'. 15 append it. "the internal table now contains three rows. 16 write: / 'sy-tabix =', sy-tabix. Der Programm-Code in Listing 11.3 erzeugt folgende Ausgabe: sy-tabix = 1 sy-tabix = 2 sy-tabix = 3

Zeile 2 definiert eine interne Tabelle it mit der Kopfzeile it. Beide haben zwei Komponenten: f1 und f2.

Die Zeilen 6 bis 7 weisen den Feldern der Kopfzeile f1 und f2 Inhalte zu (siehe auch Abb. 11.2). Hier bezieht sich it auf die Kopfzeile.

Abbildung 11.2: Hier werden Zuweisungen verwendet, also bezieht sich it auf die Kopfzeile.

In Zeile 8 wird der Inhalt der Kopfzeile it in den Rumpf mit dem Namen it kopiert (siehe auch Abb. 11.3).

Abbildung 11.3: Append it to it kopiert den Inhalt der Kopfzeile it in den Rumpf it.

In den Zeilen 10 und 11 wird den Komponenten der Kopfzeile neuer Inhalt zugewiesen, der den alten Inhalt berschreibt (siehe auch Abb. 11.4).

Abbildung 11.4: Diese Zuweisungen berschreiben den existierenden Inhalt der Kopfzeile it.

In Zeile 12 wird der neue Inhalt der Kopfzeile dem Rumpf hinzugefgt (siehe auch Abb. 11.5). Diese Anweisung ist der in Zeile 8 funktional gleich. Weil der Arbeitsbereich nicht genannt wird, wird der vorgegebene Arbeitsbereich - die Kopfzeile - benutzt.

Abbildung 11.5: Der vorgegebene Arbeitsbereich ist die Kopfzeile. Damit wird it implizit dem Rumpf hinzugefgt.

In Zeile 14 wird der Wert von it-f1 gendert und in it-f2 unverndert gelassen (siehe auch Abb. 11.6).

Abbildung 11.6: Der Wert der Komponente it-f1 der Kopfzeile wird berschrieben. Der Wert in it-f2 wird nicht gendert.

In Zeile 15 wird eine dritte Zeile aus der Kopfzeile it in den Rumpf it hinzugefgt (siehe auch Abb. 11.7).

Abbildung 11.7: Hier wird der Inhalt des impliziten Arbeitsbereiches dem Rumpf hinzugefgt. Den Zusatz occurs benutzen occurs begrenzt nicht die Anzahl der Zeilen, die einer internen Tabelle hinzugefgt werden knnen. Wenn Sie zum Beispiel occurs 10 verwenden, knnen Sie mehr als 10 Zeilen einer internen Tabelle hinzufgen. Die Anzahl der Zeilen, die Sie einer internen Tabelle hinzufgen knnen, ist theoretisch nur durch die Menge des virtuellen Speichers auf dem Applikationsserver begrenzt.

In der Praxis wird Ihr Basisberater die maximale Menge an Speicher fr eine interne Tabelle begrenzen. Wenn Sie diese Menge berschreiten, wird Ihr Programm dem Arbeitsproze Speicher abziehen und er wird nicht lnger in der Lage sein, Ihr Programm auszulagern. Damit ist der Arbeitsproze fr andere Programme nicht mehr verfgbar, und zwar so lange, bis Ihr Programm vollstndig ausgefhrt ist. Um dieses Problem zu vermeiden, sollten Sie statt dessen einen Extrakt benutzen. Das System benutzt die occurs-Klausel nur als Richtwert, um zu bestimmen, wieviel Speicher zugewiesen werden soll. Wenn zum ersten Mal einer internen Tabelle eine Zeile hinzugefgt wird, dann wird genug Speicher reserviert, um die Anzahl der Zeilen zu speichern, die in der occursKlausel angegeben sind. Wenn Sie diesen Speicher verbraucht haben, wird so viel neuer Speicher zugewiesen, wie gebraucht wird. Alternativ knnen Sie auch occurs 0 spezifizieren. Das System allokiert dann 8 KB Speicherplatz. Allerdings gibt es keinen Vorteil beim Gebrauch von occurs 0, auer vielleicht, da es einfacher ist, occurs 0 zu codieren, als die Gre einer internen Tabelle zu schtzen. Um eine schnelle Ausfhrung und wenig Speicher zu verbrauchen, whlen Sie bitte den Wert fr occurs so, da der Speicherplatz der durchschnittlichen maximalen Anzahl von Zeilen in der Tabelle entspricht.

Gebrauchen Sie occurs 0 nicht, wenn Sie erwarten, da die interne Tabelle weniger als 8 KB Speicher bentigt. Wenn Sie das tun, wird das System 8 KB Speicher aus dem Anlagerungsbereich (paging area) zuweisen. Speicher wird verschwendet und das Paging-Verhalten knnte zunehmen, was eine langsamere Ausfhrung zur Folge hat. Abhngig von der occurs-Klausel und der Gre der internen Tabelle weist das System entweder aus dem Rollbereich des Programms oder dem Anlagerungsbereich des Systems Speicher zu, evtl. aus beiden Bereichen. Speicherzugriffe im Rollbereich knnen etwas schneller sein als Zugriffe im Anlagerungsbereich. Speicherzuweisungen im Seitenbereich sind immer eine Seite gro (gewhnlich 8 KB oder 8192 Byte). Es gibt zwei Methoden, wie das System Speicherzuweisungen vornimmt. Im ersten Fall ist occurs ungleich Null, und die Gre der internen Tabelle (berechnet durch occurs , multipliziert mit der Anzahl der Byte pro Zeile) ist kleiner oder gleich 8 KB. (Die Anzahl der Byte pro Zeile knnen Sie mit der Anweisung describe table erhalten, die im nchsten Kapitel detailliert beschrieben wird,

oder mit der Feldanzeige im Debugger.) Wenn die erste Zeile einer internen Tabelle hinzugefgt wird, wird Speicher aus dem Rollbereich zugewiesen. Die Menge, die zugewiesen wird, entspricht der berechneten Gre der internen Tabelle. Wenn diese Speichermenge berschritten wird, wird erneut eine gleiche Menge zugewiesen, und dieser Proze wiederholt sich, bis 8 KB berschritten werden. Wenn das passiert, werden im Folgenden immer 8 KB aus dem Seitenbereich zugewiesen. Wenn Sie occurs 0 angeben, werden alle Speicherzuweisungen im Seitenbereich vorgenommen. Dann werden immer 8 KB Seiten zugewiesen. Wenn die berechnete Gre der internen Tabelle grer als 8 KB ist, ndert das System den Wert fr occurs bei der ersten Speicherzuweisung in Null um. Alle Speicherallokationen werden dann aus dem Seitenbereich vorgenommen. Sie knnen sich die nderung von occurs mit der Anweisung describe table nach der ersten Speicherzuweisung ansehen und sich den Wert von sy-toccu anzeigen lassen. Diese Anweisung ist im Kapitel 9 Zuweisungen, Konvertierungen und Berechnungen beschrieben.

Daten aus einer internen Tabelle lesen


Zwei Anweisungen werden gewhnlich benutzt, um Daten aus einer internen Tabelle zu lesen:

loop at read table

Benutzen Sie loop at, um mehrere Zeilen einer internen Tabelle zu lesen. Nutzen Sie read table, um eine einzelne Zeile zu lesen. Mehrere Zeilen mit der Anweisung loop at lesen Um einige oder alle Zeilen einer internen Tabelle zu lesen, benutzen Sie die Anweisung loop at. loop at liest den Inhalt einer internen Tabelle, und plaziert eine nach der anderen in dem Arbeitsbereich.
Syntax der Anweisung loop at

Das Folgende ist die Syntax der loop at-Anweisung. loop at it [into wa] [from m] [to n] [where exp]. ... endloop wobei:

it der Name der internen Tabelle ist. wa der Name des Arbeitsbereichs ist. m und n sind Ganzzahlliterale, Konstanten oder Variablen, die eine relative Zeilennummer reprsentieren. Zum Beispiel bedeutet 1 die erste Zeile in der Tabelle, und 2 die zweite und so weiter.

exp ist der logische Ausdruck, der die Zeilen begrenzt, die gelesen werden. ... steht fr eine beliebige Anzahl von Programm-Code-Zeilen. Diese Programmzeilen werden fr jede gelesene Zeile der internen Tabelle ausgefhrt.

Die Zeilen werden einzeln aus der internen Tabelle gelesen und nacheinander im Arbeitsbereich plaziert. Die Programmzeilen zwischen loop at und endloop werden fr jede Zeile ausgefhrt. Die Schleife endet, wenn die letzte Zeile der internen Tabelle gelesen wurde und die Anweisung, die auf endloop folgt, wird ausgefhrt. Die folgenden Punkte sind zu beachten:

wa mu dieselbe Struktur wie die Zeilen des Rumpfs haben. wa kann die Kopfzeile oder jede andere Feldleiste mit derselben Struktur wie die Zeile des Rumpfs sein. Wenn Sie einen Arbeitsbereich spezifizieren, benutzt das System standardmig die Kopfzeile. Zum Beispiel liest loop at into it die Zeilen der internen Tabelle it, indem es eine nach der anderen in der Kopfzeile it plaziert. Eine quivalente Anweisung ist loop at it. Wenn from nicht spezifiziert ist, dann wird standardmig mit der ersten Zeile begonnen. Wenn to nicht spezifiziert ist, dann wird standardmig bis zur letzten Zeile gelesen. Komponenten von it, die in einem logischen Ausdruck spezifiziert werden, soll nicht der Name der internen Tabelle vorangestellt werden. Zum Beispiel ist where f1 = 'X' korrekt, aber it-f1 = 'X' erzeugt einen Syntaxfehler. exp kann jeder logische Ausdruck sein. Allerdings mu der erste Operand des Vergleichs immer eine Komponente der internen Tabelle sein. Wenn z.B. it eine Komponente f1 beinhaltet, dann ist f1 = 'X' korrekt und 'X' = f1 ist nicht korrekt und erzeugt einen Syntaxfehler. Die Zustze from, to und where knnen beliebig gemischt werden.

In einer Schleife enthlt sy-tabix die relative Zeilennummer des aktuellen Datensatzes. Z.B. bei der Verarbeitung des ersten Datensatzes der internen Tabelle ist der Wert von sy-tabix 1. Bei der Verarbeitung des zweiten Satzes ist sy-tabix 2. Wenn die Schleife verlassen wird, wird der Wert von sy-tabix auf den Wert zurckgesetzt, den sy-tabix hatte, bevor die Schleife begann. Wenn die Schleifen verschachtelt sind, dann bezieht sich der Wert von sy-tabix auf die aktuelle Schleife. Nach endloop wird sy-subrc Null sein, wenn irgendwelche Zeilen gelesen wurden. Es wird ungleich Null sein, wenn keine Zeile der internen Tabelle gelesen wurde. Listing 11.4 erweitert das Listing 11.3 um ein loop at und die Ausgabe der Zeilen der internen Tabelle. Listing 11.4: Dieses Programm fgt drei Zeilen aus der Kopfzeile in eine interne Tabelle it ein und erzeugt dann eine Ausgabe der drei Zeilen. 1 report ztx1104. 2 data: begin of it occurs 3,

3 f1(1), 4 f2(2), 5 end of it. 6 it-f1 = 'A'. 7 it-f2 = 'XX'. 8 append it to it. "appends header line IT to body IT 9 it-f1 = 'B'. 10 it-f2 = 'YY'. 11 append it. "same as line 8 12 it-f1 = 'C'. 13 append it. "the internal table now contains three rows. 14 sy-tabix = sy-subrc = 99. 15 loop at it. "same as: loop at it into it 16 write: / sy-tabix, it-f1, it-f2. 17 endloop. 18 write: / 'done. sy-tabix =', sy-tabix, 19 / ' sy-subrc =', sy-subrc. Der Programm-Code in Listing 11.4 erzeugt folgende Ausgabe: 1 A XX 2 B YY 3 C YY done. sy-tabix = 99 sy-subrc = 0

Die Zeilen 2 bis 13 sind dieselben wie in Listing 11.3. Es werden drei Zeilen zu einer internen Tabelle hinzugefgt. Zeile 14 erzeugt fr sy-tabix und sy-subrc einen zuflligen Wert. Zeile 15 beginnt die Schleife mit dem Lesen der ersten Zeile der internen Tabelle it und fgt sie in die Kopfzeile it ein. Zeile 16 schreibt den Wert von sy-tabix und die Werte der Komponenten der Kopfzeile aus. Zeile 17 markiert das Ende der Schleife und die Rckkehr zu Zeile 15. Zeile 15 wird wieder ausgefhrt. Jetzt wird die zweite Zeile der internen Tabelle in der Kopfzeile plaziert und der vorherige Inhalt berschrieben. Zeile 16 wird ausgefhrt und schreibt wieder die Werte der Kopfzeile aus. Zeile 17 sorgt dafr, da alle Zeilen der internen Tabelle durchlaufen werden, die gelesen werden. Wenn die letzte Zeile gelesen wurde, endet die Schleife. In Zeile 18 wird sy-tabix wieder mit dem Wert gefllt, den es hatte, bevor die Schleife ausgefhrt wurde. Sy-subrc enthlt den Wert Null, was bedeutet, da Zeilen aus der internen Tabelle mit der Anweisung loop at gelesen wurden.

Die Anzahl der gelesenen Zeilen einer internen Tabelle begrenzen

Wenn Sie die Zustze from, to und where benutzen, dann knnen Sie die Anzahl der Zeilen begrenzen, die aus einer internen Tabelle gelesen werden.

Listing 11.5: Dieses Programm ist wie Listing 11.4, allerdings werden nur einige der Zeilen gelesen. 1 report ztx1105. 2 data: begin of it occurs 3, 3 f1(1), 4 f2(2), 5 end of it. 6 it-f1 = 'A'. 7 it-f2 = 'XX'. 8 append it. 9 it-f1 = 'B'. 10 it-f2 = 'YY'. 11 append it. 12 it-f1 = 'C'. 13 append it. "it now contains three rows 14 15 loop at it where f2 = 'YY'. "f2 is right, it-f2 would be wrong here 16 write: / sy-tabix, it-f1, it-f2. 17 endloop. 18 skip. 19 20 loop at it to 2. "same as: loop at it from 1 to 2. 21 write: / sy-tabix, it-f1, it-f2. 22 endloop. 23 skip. 24 25 loop at it from 2. "same as: loop at it from 2 to 3. 26 write: / sy-tabix, it-f1, it-f2. 27 endloop. 28 skip. 29 30 loop at it from 2 where f1 = 'C'. 31 write: / sy-tabix, it-f1, it-f2. 32 endloop. Der Programm-Code in Listing 11.5 erzeugt folgende Ausgabe: 2 B YY 3 C YY 1 A XX 2 B YY

2 B YY 3 C YY 3 C YY

Die Zeilen 2 bis 13 fgen drei Zeilen in eine interne Tabelle ein. Die Zeilen 15 bis 17 lesen lediglich die Zeilen der internen Tabelle, wo f2 einen Wert gleich 'YY' hat. Nur die Zeilen 2 und 3 erfllen diese Bedingung. Zeile 18 berspringt eine Zeile in der Ausgabe, das Ergebnis ist eine Leerzeile. In den Zeilen 20 bis 22 werden nur die Zeilen 1 und 2 der internen Tabelle gelesen. In den Zeilen 23 bis 25 werden nur die Zeilen 2 und 3 der internen Tabelle gelesen. Zeile 30 liest ab Zeile 2 der internen Tabelle und sucht alle Zeilen, in denen f1 einen Wert gleich 'C' hat. Nur die dritte Zeile erfllt diese Bedingung.

Wenn Sie sicherstellen, da der Datentyp und die Lnge des Feldes in exp dem Feld der internen Tabelle entsprechen, werden keine Konvertierungen ausgefhrt. Das Ergebnis ist eine schnellere Schleife. Wenn Konvertierungen bentigt werden, werden diese bei jedem Schleifendurchlauf vollzogen, und das kann die Ausfhrung signifikant verlangsamen. Nutzen Sie like oder Konstanten, um Konvertierungen zu vermeiden.

Obwohl where nur eine Untermenge des Tabelleninhalts liefert, wird die Tabelle voll gelesen.
Die Anweisungen exit, continue, stop und check

Tabelle 11.1 illustriert die Auswirkungen von exit, continue und check beim Gebrauch innerhalb einer loop at/endloop-Schleife.

Tabelle 11.1: Anweisungen, die die Ausfhrung in Schleifen fr interne Tabelle verndern knnen.

Anweisung exit

Auswirkung Beendet die Schleife sofort. Die Programmausfhrung wird unmittelbar nach endloop fortgesetzt.

continue

Geht sofort zur endloop-Anweisung und berspringt alle Anweisungen innerhalb der Schleife. Die nchste Zeile der internen Tabelle wird zurckgegeben, und die Ausfhrung wird am Beginn der Schleife fortgesetzt. Wenn es keine weiteren Zeilen mehr zu holen gibt, dann wird die Programmausfhrung mit der ersten Anweisung nach endloop fortgesetzt.

check exp Wenn exp wahr ist, wird die Programmausfhrung fortgesetzt. Wenn exp falsch ist, dann ist das Ergebnis dasselbe wie bei continue. Eine einzelne Zeile mit der Anweisung read table lesen Um eine Zeile einer internen Tabelle zu lesen, benutzen Sie die Anweisung read table . read table liest eine Zeile, die die spezifischen Kriterien erfllt, und plaziert sie in dem Arbeitsbereich.
Syntax der Anweisung read table

Das Folgende ist die Syntax der read table-Anweisung. read table it [into wa] [index i | with key keyexp [binary search] ] [comparing cmpexp] [transporting texp]. wobei:

it der Name der internen Tabelle ist. wa der Name des Arbeitsbereichs ist. it ist ein Ganzzahlliteral, eine Konstante oder Variable, die eine relative Zeilennummer reprsentiert. Z.B. 1 bedeutet die erste Zeile der Tabelle, 2 die zweite Zeile und so weiter. keyexp ist ein Ausdruck mit einem Wert, der gefunden werden soll. cmpexp ist ein Vergleichsausdruck, der einen Test in der gefundenen Zeile ausfhrt. texp ist ein Ausdruck, der die Felder wiedergibt, die in den Arbeitsbereich transportiert werden sollen, wenn die Zeile gefunden wurde. Wenn sowohl comparing als auch transporting spezifiziert werden, dann mu comparing zuerst definiert werden.

Die folgenden Punkte sind zu beachten:


wa mu dieselbe Struktur wie die Zeilen des Rumpfs haben. wa kann die Kopfzeile oder jede andere Feldleiste mit derselben Struktur wie die Zeile des Rumpfs sein. Wenn Sie einen Arbeitsbereich spezifizieren, benutzt das System standardmig die Kopfzeile. Zum Beispiel liest read table at into it die Zeile der internen Tabelle it, indem es sie in der Kopfzeile it plaziert. Eine gleichwertige Anweisung ist read table it.

Der Zusatz index

Ein index einer Zeile einer internen Tabelle ist die relative Zeilennummer. Z.B. hat die erste Zeile

der Tabelle den Index 1, die zweite den Index 2 und so weiter. Bei der Anweisung read table liest das System die i-te Zeile aus der internen Tabelle und plaziert sie im Arbeitsbereich, wenn index i spezifiziert ist. Z.B. read table it index 7 liest die siebte Zeile einer internen Tabelle und plaziert sie in der Kopfzeile. Ist der Zugriff erfolgreich (d.h. die i-te Zeile existiert), dann wird sy-subrc Null und sy- tabix i zugewiesen (siehe Listing 11.6). Listing 11.6: Der Zusatz index in der Anweisung read table ermittelt eine einzelne Zeile ber die relative Zeilennummer. 1 report ztx1106. 2 data: begin of it occurs 3, 3 f1(2) type n, 4 f2 type i, 5 f3(2) type c, 6 f4 type p, 7 end of it, 8 wa like it. 9 10 it-f1 = '10'. it-f3 = 'AA'. it-f2 = it-f4 = 1. append it. 11 it-f1 = '20'. it-f3 = 'BB'. it-f2 = it-f4 = 2. append it. 12 it-f1 = '30'. it-f3 = 'CC'. it-f2 = it-f4 = 3. append it. 13 14 read table it index 2. 15 write: / 'sy-subrc =', sy-subrc, 16 / 'sy-tabix =', sy-tabix, 17 / it-f1, it-f2, it-f3, it-f4. 18 19 read table it into wa index 1. 20 write: /, 21 / 'sy-subrc =', sy-subrc, 22 / 'sy-tabix =', sy-tabix, 23 / it-f1, it-f2, it-f3, it-f4, 24 / wa-f1, wa-f2, wa-f3, wa-f4. 25 26 read table it index 4. 27 write: /, 28 / 'sy-subrc =', sy-subrc, 29 / 'sy-tabix =', sy-tabix, 30 / it-f1, it-f2, it-f3, it-f4, 31 / wa-f1, wa-f2, wa-f3, wa-f4. Der Programm-Code in Listing 11.6 erzeugt folgende Ausgabe: sy-subrc = 0

sy-tabix = 2 20 2 BB 2 sy-subrc = 0 sy-tabix = 1 20 2 BB 2 10 1 AA 1 sy-subrc = 4 sy-tabix = 0 20 2 BB 2 10 1 AA 1


Die Zeilen 2 bis 7 definieren eine interne Tabelle mit einer Kopfzeile. Zeile 8 definiert einen Arbeitsbereich wa wie die Kopfzeile von it. Die Zeilen 10 bis 12 fgen der internen Tabelle drei Zeilen hinzu. Zeile 14 liest die zweite Zeile. Weil kein Arbeitsbereich spezifiziert ist, werden die Inhalte in der Kopfzeile plaziert. Nach dem Lesen wird sy-subrc auf Null gesetzt. Das bedeutet, da die Zeile existiert und da sy-tabix mit der Zeilennummer gefllt wird. Zeile 19 liest Zeile 1 in den Arbeitsbereich wa. Der Inhalt der Kopfzeile ist nach dem Lesen unverndert. Zeile 26 versucht die Zeile 4 der internen Tabelle in die Kopfzeile zu lesen. Es gibt aber keine Zeile 4, also wird sy-subrc auf 4 gesetzt, sy-tabix auf 0, und die Kopfzeile und der Arbeitsbereich bleiben unverndert.

Der Zusatz with key Wenn with key keyexp spezifiziert wird, findet das System die Zeile, die dem Schlsselausdruck gleicht und plaziert sie in der Kopfzeile. Tabelle 11.2 beschreibt Schlsselausdrcke und deren Auswirkungen. Mit dem Gebrauch des Schlsselausdrucks knnen Sie eine einzelne Zeile spezifizieren, die gelesen werden soll. Wenn mehr als eine Zeile dem Ausdruck gleicht, wird die erste gefundene (diejenige mit dem niedrigsten Index) zurckgegeben.

Tabelle 11.2: Schlsselausdrcke und deren Auswirkungen Schlsselausdruck Auswirkung

c1 = v1 c2 = v2 ... Lokalisiert die erste Zeile der internen Tabelle, in der die Komponente c1 den Wert v1 und die Komponente c2 den Wert v2 hat und so weiter. v1 ist ein Literal, eine Konstante oder eine Variable.

(f1) = v1 (f2) = v2 Dasselbe wie oben, allerdings ist f1 eine Variable, die den Namen der zu vergleichenden Komponente enthlt. Der Wert in f1 mu in Grobuchstaben ausgedrckt sein. Wenn f1 leer ist, wird der Vergleich ignoriert. = wa wa ist ein Arbeitsbereich, der in seiner Struktur einer internen Tabelle gleicht. Der Schlsselausdruck lokalisiert die erste Zeile in der internen Tabelle, die exakt dem Inhalt von wa gleicht. wa ist ein Arbeitsbereich und krzer als die Struktur der internen Tabelle oder mit ihr identisch. Wenn wa n Felder hat, mssen die ersten n Felder der internen Tabelle den Feldern des Arbeitsbereichs gleichen. Der Schlsselausdruck lokalisiert die erste Zeile in der internen Tabelle, dessen n erste Felder dem Inhalt von wa gleichen. Leerzeichen werden wie zu findende Werte behandelt, sie werden keinem anderen Wert als dem Leerzeichen zugeordnet.

wa

In Release 4 werden notwendige Konvertierungen fr die ersten drei Schlsselausdrcke in der Tabelle 11.2 in derselben Reihenfolge ihres Auftretens ausgefhrt wie bei logischen Ausdrcken. In vorherigen Systemen werden Konvertierungen durchgefhrt, indem man von dem rechten Wert zu den Datentypen und Lngen der Komponente auf der linken Seite konvertiert.

Tabelle 11.3: Werte, die sy-subrc und sy-tabix zugeordnet werden. Ergebnis Lesen war erfolgreich Lesen war nicht erfolgreich, aber eine Zeile mit einem Schlssel grer als der nachgefragte existiert. sy-subrc sy-tabix 0 4 Index der gefundenen Zeile Index der Zeile mit dem nchsthheren Schlssel Nummer der Zeilen in it+1

Lesen war nicht erfolgreich, und es wurde 8 keine Zeile mit einem greren Schlssel gefunden.

Listing 11.7 veranschaulicht den Gebrauch von Schlsselausdrcken. Listing 11.7: Beim Gebrauch eines Schlsselausdruckes knnen Sie eine Zeile suchen, indem Sie den Wert anstatt des Index spezifizieren.

1 report ztx1107. 2 data: begin of it occurs 3, 3 f1(2) type n, 4 f2 type i, 5 f3(2) type c, 6 f4 type p, 7 end of it, 8 begin of w1, 9 f1 like it-f1, 10 f2 like it-f2, 11 end of w1, 12 w2 like it, 13 f(8). 14 15 it-f1 = '10'. it-f3 = 'AA'. it-f2 = it-f4 16 it-f1 = '20'. it-f3 = 'BB'. it-f2 = it-f4 17 it-f1 = '30'. it-f3 = 'CC'. it-f2 = it-f4 18 19 read table it with key f1 = '30' f2 = 3. 20 write: / 'sy-subrc =', sy-subrc, 21 / 'sy-tabix =', sy-tabix, 22 / it-f1, it-f2, it-f3, it-f4. 23 24 f = 'F2'. "must be in uppercase 25 read table it into w2 with key (f) = 2. 26 write: /, 27 / 'sy-subrc =', sy-subrc, 28 / 'sy-tabix =', sy-tabix, 29 / it-f1, it-f2, it-f3, it-f4, 30 / w2-f1, w2-f2, w2-f3, w2-f4. 31 32 clear w2. 33 w2-f1 = '10'. w2-f3 = 'AA'. w2-f2 = w2-f4 34 read table it with key = w2. 35 write: /, 36 / 'sy-subrc =', sy-subrc, 37 / 'sy-tabix =', sy-tabix, 38 / it-f1, it-f2, it-f3, it-f4. 39 40 w1-f1 = '20'. w1-f2 = 2. 41 read table it into w2 with key w1. 42 write: /, 43 / 'sy-subrc =', sy-subrc, 44 / 'sy-tabix =', sy-tabix, 45 / it-f1, it-f2, it-f3, it-f4.

= 1. append it. = 2. append it. = 3. append it.

= 1.

Der Programm-Code in Listing 11.7 erzeugt folgende Ausgabe: sy-subrc = 0 sy-tabix = 3 30 3 CC 3 sy-subrc = 0 sy-tabix = 2 30 3 CC 3 20 2 BB 2 sy-subrc = 0 sy-tabix = 1 10 1 AA 1 sy-subrc = 0 sy-tabix = 2 10 1 AA 1

Die Zeilen 2 bis 7 definieren eine interne Tabelle mit einer Kopfzeile. Zeile 8 definiert einen Arbeitsbereich w1 mit den ersten zwei gleichen Feldern wie die Kopfzeile it. Zeile 9 definiert einen Arbeitsbereich w2, der mit der ganzen Lnge der Kopfzeile it gleicht. Die Zeilen 15 bis 17 fgen drei Zeilen der internen Tabelle hinzu. Zeile 19 liest eine Zeile, die den Wert '30' in f1 und 3 in f2 hat. Nach dem Lesen wird sysubrc auf Null gesetzt. Das bedeutet, da die Zeile existiert, und da sy- tabix mit der Zeilennummer gefllt wird. Da kein Arbeitsbereich spezifiziert ist, wird der Inhalt in der Kopfzeile plaziert. Zeile 25 sucht nach einer Zeile, die den Wert 2 in der f2 Spalte hat. Wird sie gefunden, wird sie in den Arbeitsbereich geschrieben. Der Inhalt der Kopfzeile wird nach dem Lesen unverndert gelassen. Zeile 34 sucht nach einer Zeile, welche die Werte beinhaltet, die in allen Feldern von w2 spezifiziert sind. Mit dieser Syntax mu w2 der ganzen Struktur von it gleichen. Der Inhalt der gefundenen Zeile wird in der Kopfzeile plaziert. Felder, die Leerzeichen enthalten, werden in der Tabelle gesucht, es werden nicht alle Werte zugeordnet, wie es bei der Suche mit einem Standardschlssel gemacht wird (siehe nchster Abschnitt). Zeile 41 sucht nach einer Zeile, welche die Werte beinhaltet, die in allen Feldern von w1 spezifiziert sind. Mit dieser Syntax kann w1 krzer als it sein. Der Inhalt der passenden Zeile wird in der Kopfzeile plaziert. Wie zuvor werden Leerzeichen als zu suchende Werte interpretiert und knnen nur sich selbst zugeordnet werden.

Der Zusatz binary search

Wenn Sie den Zusatz with key benutzen, sollten Sie auch den Zusatz binary search benutzen. Damit wird erreicht, da die Suche der Zeile einen binren Suchalgorithmus statt des linearen Lesens der Tabelle verwendet. Dies ergibt dieselbe Ausfhrungsgeschwindigkeit wie die Suche in einer

Datenbanktabelle mittels eines Index. Zuvor mu allerdings die interne Tabelle in aufsteigender Reihenfolge in den Komponenten, die in dem Schlsselausdruck spezifiziert sind, sortiert werden. (Siehe nchster Abschnitt ber das Sortieren.) Keine Zustze Wenn weder ein Index noch ein Schlsselausdruck spezifiziert ist, wird die Tabelle von Anfang an nach einer Zeile durchsucht, die dem Standardschlssel der Kopfzeile entspricht. Der Standardschlssel ist ein imaginrer Schlssel, zusammengesetzt aus allen Zeichenfeldern der Kopfzeile (Typen c, d, t, n und x). Ein Leerzeichen in einer Spalte des Standardschlssels bewirkt, da alle Werte zueinander passen. Danach werden die Werte von sy-subrc und sys-tabix in der gleichen Art gesetzt wie bei der Anweisung read table mit einem Schlsselausdruck.

Nur Leerzeichen in einem Standardschlssel werden alle Werte zuordnen. Das bedeutet, da Sie die Typen d, t, n und x nicht lschen knnen und eine Zuordnung erhalten denn Lschen setzt die Werte auf Null und wandelt sie nicht in Leerzeichen um. Sie mssen Leerzeichen in diese Felder fllen, um eine Zuordnung zu erreichen. Das knnen Sie erreichen, wenn Sie eine Feldleiste (siehe nchstes Beispiel), ein Unterfeld oder ein Feldsymbol nutzen (siehe vorheriger Abschnitt ber Feldsymbole fr mehr Information). Listing 11.8 zeigt ein Beispiel. Listing 11.8: Dieses Programm findet eine Zeile mit denselben Werten wie sie die Standardschlsselfelder in der Kopfzeile haben. Leerzeichen in einem Standardschlsselfeld sorgen dafr, da die Spalte nicht bercksichtigt wird. 1 report ztx1108. 2 data: begin of it occurs 3, 3 f1(2) type n, "character field - part of default key 4 f2 type i, "numeric field - not part of default key 5 f3(2) type c, "character field - part of default key 6 f4 type p, "numeric field - not part of default key 7 end of it. 8 9 it-f1 = '10'. it-f3 = 'AA'. it-f2 = it-f4 = 1. append it. 10 it-f1 = '20'. it-f3 = 'BB'. it-f2 = it-f4 = 2. append it. 11 it-f1 = '30'. it-f3 = 'CC'. it-f2 = it-f4 = 3. append it. 12 13 sort it by f1 f3.

14 15 16 17 18 19 20 21 22 23 24 25 26

clear it. it(2) = ' '. it-f3 = 'BB'. read table it binary search. write: / 'sy-subrc =', sy-subrc, / 'sy-tabix =', sy-tabix, / 'f1=', it-f1, 'f2=', it-f2, 'f3=', it-f3, 'f4=', it-f4. clear it. it-f1 = '30'. it-f3 = 'AA'. read table it binary search. write: / 'sy-subrc =', sy-subrc, / 'sy-tabix =', sy-tabix, / 'f1=', it-f1, 'f2=', it-f2, 'f3=', it-f3, 'f4=', it-f4.

Der Programm-Code in Listing 11.8 erzeugt folgende Ausgabe: sy-subrc = sy-tabix = f1= 20 f2= sy-subrc = sy-tabix = f1= 30 f2=

0 2 2 f3= BB f4= 2 4 3 0 f3= AA f4= 0

Die Zeilen 2 bis 7 definieren eine interne Tabelle mit einer Kopzeile. f1 und f3 sind die Zeichendatentypen und formen damit die Standardschlssel. Die Zeilen 9 bis 11 fgen drei Zeilen der internen Tabelle hinzu. Zeile 13 sortiert it nach f1 und f3 in aufsteigender Reihenfolge. Zeile 14 lscht den Inhalt der Kopfzeile, indem alle Komponenten in Leerzeichen und Nullen gesetzt werden. Unter Nutzung eines Unterfeldes schreibt Zeile 15 Leerzeichen in das f1-Feld, so da alle Werte zugeordnet werden. Das andere Standardschlsselfeld (f3) wird mit 'BB' gefllt. Zeile 16 fhrt eine binre Suche fr eine Zeile aus, die 'BB' in der Komponente f3 beinhaltet. Nach der Suche zeigt die Ausgabe, da sy-subrc auf Null gesetzt ist. Das zeigt Ihnen an, da ein Wert gefunden wurde, der den Kriterien zugeordnet werden kann. sy-tabix enthlt den Wert 2, die relative Zeilennummer der passenden Zeile. Die Kopfzeile wird dann mit der passenden Zeile gefllt und ausgegeben. Zeile 21 lscht die Kopfzeile. Zeile 22 plaziert '30' und 'AA' in den Standardschlsselfeldern f1 und f3. Zeile 23 fhrt eine binre Suche fr f1 = '30' und f3 = 'AA' aus. Der Rckgabewert von sy-subrc ist 4. Das zeigt an, da eine passende Zeile nicht gefunden wurde und sytabix beinhaltet 3 - die Anzahl der Zeilen in der Tabelle. Der Inhalt der Kopfzeile bleibt unverndert wie in Zeile 22.

In diesem Beispiel enthlt die interne Tabelle lediglich ein paar Zeilen, so da die binre Suche nicht in mebaren Verbesserungen in der Ausfhrung resultiert. Es ist hier nur erlutert, um zu zeigen, wie es prinzipiell funktioniert.

Die Anweisung read table kann nur verwendet werden, um eine interne Tabelle zu lesen. Diese Anweisung arbeitet nicht mit Datenbanktabellen. Nutzen Sie dafr select single.
Der Zusatz comparing

Der Zusatz comparing findet Unterschiede im Inhalt des Arbeitsbereichs und der Zeile, die gefunden wurde, bevor sie im Arbeitsbereich plaziert wurde. Benutzen Sie ihn in Verbindung mit index oder with key. Nachdem eine Zeile gefunden wurde und sie denselben Inhalt wie der Arbeitsbereich hat, wird sy-subrc 0 sein. Wenn der Inhalt sich unterscheidet, dann wird sysubrc 2 sein, und der Inhalt wird mit der gefundenen Zeile berschrieben. Wenn keine Zeile gefunden wird, dann wird sy-subrc grer als 2 sein, und der Inhalt bleibt unverndert. Tabelle 11.4 beschreibt die Werte fr den Vergleichsausdruck (cmpexp in die Syntax fr read table).

Tabelle 11.4: Formen fr den Vergleichsausdruck in der Anweisung read table Cmpexp f1 f2 ... Beschreibung Nachdem eine Zeile gefunden wurde, wird der Wert von f1 in der gefundenen Zeile mit dem Wert von f1 im Arbeitsbereich verglichen. Dann wird der Wert von f2 mit dem Wert von f2 im Arbeitsbereich verglichen und so weiter. Wenn alle gleich sind, dann wird sy-subrc auf 0 gesetzt. Wenn es irgendeinen Unterschied gibt, dann wird sy-subrc auf 2 gesetzt.

all fields Alle Felder werden verglichen, so wie es fr f1 f2 ... beschrieben ist. no fields Kein Feld wird verglichen. Dieses ist der Standardfall.

Listing 11.9 zeigt ein Beispiel. Listing 11.9: Der Zusatz comparing setzt den Wert von sy-subrc auf 2, wenn irgendein Feld sich unterscheidet. 1 report ztx1109. 2 data: begin of it occurs 3, 3 f1(2) type n,

4 f2 type i, 5 f3(2) type c, 6 f4 type p, 7 end of it, 8 wa like it. 9 10 it-f1 = '10'. it-f3 = 'AA'. it-f2 = it-f4 = 1. 11 it-f1 = '20'. it-f3 = 'BB'. it-f2 = it-f4 = 2. 12 it-f1 = '30'. it-f3 = 'CC'. it-f2 = it-f4 = 3. 13 14 read table it index 2 comparing f1. 15 write: / 'sy-subrc =', sy-subrc, 16 / 'sy-tabix =', sy-tabix, 17 / it-f1, it-f2, it-f3, it-f4. 18 19 read table it into wa index 1 comparing f2 f4. 20 write: /, 21 / 'sy-subrc =', sy-subrc, 22 / 'sy-tabix =', sy-tabix, 23 / it-f1, it-f2, it-f3, it-f4, 24 / wa-f1, wa-f2, wa-f3, wa-f4. 25 26 it = wa. 27 read table it with key f3 = 'AA' comparing all 28 write: /, 29 / 'sy-subrc =', sy-subrc, 30 / 'sy-tabix =', sy-tabix, 31 / it-f1, it-f2, it-f3, it-f4, 32 / wa-f1, wa-f2, wa-f3, wa-f4. Der Programm-Code in Listing 11.9 erzeugt folgende Ausgabe: sy-subrc = 2 sy-tabix = 2 20 2 BB 2 sy-subrc = 2 sy-tabix = 1 20 2 BB 2 10 1 AA 1 sy-subrc = 0 sy-tabix = 1 10 1 AA 1 10 1 AA 1

append it. append it. append it.

fields.

In Zeile 14 lokalisiert index 2 die Zeile 2. Bevor die Zeile in die Kopfzeile kopiert wird, wird der Wert von f1 in dem Rumpf mit dem Wert von f1 in der Kopfzeile verglichen. In diesem Fall hat die Kopfzeile immer noch den Wert 3 (unverndert nach dem Hinzufgen der letzen Zeile) und die gefundene Zeile beinhaltet eine 2. Sie sind unterschiedlich, so da sy-subrc auf 2 gesetzt wird. Der Inhalt der internen Tabelle wird dann in die Kopfzeile geschrieben und der vorhandene Inhalt berschrieben. In Zeile 19 wird die Zeile 1 gefunden. Die Werte von f2 und f4 in Zeile 1 werden dann mit den Komponenten der Kopfzeile mit dem gleichen Namen verglichen. Die Kopfzeile enthlt die Zeile 2 (erhalten durch Zeile 14), und somit sind sie unterschiedlich. Als Ergebnis wird sysubrc auf 2 gesetzt. Zeile 26 kopiert den Inhalt von wa in die Kopfzeile. In Zeile 27 wird nach einer Zeile mit f3 = 'AA' gesucht. Zeile 1 pat, wie in den Werten von sy-subrc und sy-tabix in der Ausgabe ersichtlich. Zeile 1 ist schon in der Kopfzeile, deshalb stimmen alle Werte in den Feldern berein und sy-subrc wird auf 0 gesetzt.

Der Zusatz transporting Der Zusatz transporting beeinflut die Art, wie Felder von der gefundenen Zeile in den Arbeitsbereich bewegt werden. Wenn der Zusatz angegeben wird, dann werden nur die spezifizierten Komponenten in den Arbeitsbereich bewegt. Wenn keine Zeile gefunden wird, dann macht transporting nichts. Tabelle 11.5 beschreibt die Werte fr den Transportierausdruck (texp in die Syntax fr read table).

Tabelle 11.5: Formen fr den Transportierausdruck in der Anweisung read table Cmpexp f1 f2 ... Beschreibung Nachdem eine Zeile gefunden wurde, wird der Wert von f1 in der gefundenen Zeile in den Arbeitsbereich geschrieben. Dann wird der Wert von f2 in den Arbeitsbereich geschrieben und so weiter. Nur die Komponenten, die nach transporting genannt werden, werden transportiert. Alle anderen Komponenten bleiben unverndert.

all fields Alle Felder werden transportiert. Dies ist der Standardfall, und das Ergebnisist dasselbe wie ohne Ausfhrung mit dem Zusatz transporting. no fields Kein Feld wird transportiert. Kein Feld im Arbeitsbereich wird verndert.

Dieser Zusatz ist sinnvoll, wenn Sie lediglich die Existenz einer Zeile in einer internen Tabelle testen wollen, ohne den Inhalt der Kopfzeile zu verndern. Zum Beispiel knnen Sie, bevor Sie eine Zeile anfgen, bestimmen, ob diese Zeile schon in der internen Tabelle existiert. Listing 11.10 zeigt ein Beispiel.

Listing 11.10: Die effiziente Art, Zeilen in eine sortierte interne Tabelle einzufgen und die Sortierung zu erhalten 1 report ztx1110. 2 data: begin of it occurs 3, 3 f1(2) type n, 4 f2 type i, 5 f3(2) type c, 6 f4 type p, 7 end of it. 8 9 it-f1 = '40'. it-f3 = 'DD'. it-f2 = it-f4 = 4. append it. 10 it-f1 = '20'. it-f3 = 'BB'. it-f2 = it-f4 = 2. append it. 11 12 sort it by f1. 13 do 5 times. 14 it-f1 = sy-index * 10. 15 it-f3 = 'XX'. 16 it-f2 = it-f4 = sy-index. 17 read table it 18 with key f1 = it-f1 19 binary search 20 transporting no fields. 21 if sy-subrc <> 0. 22 insert it index sy-tabix. 23 endif. 24 enddo. 25 26 loop at it. 27 write: / it-f1, it-f2, it-f3, it-f4. 28 endloop. Der Programm-Code in Listing 11.10 erzeugt folgende Ausgabe: 10 20 30 40 50 1 2 3 4 5

XX BB XX DD XX

1 2 3 4 5

Die Zeilen 9 und 10 fgen zwei Zeilen in it ein. (Sie sind absichtlich nicht sortiert, um das Beispiel zu verdeutlichen.) Zeile 12 sortiert it aufsteigend nach f1, so da die folgende Anweisung read table den Zusatz binary search benutzen kann. Zeile 13 durchluft die Schleife 5mal. Jedesmal, wenn die Schleife durchlaufen wird, wird eine

neue Zeile in it erzeugt und in der Kopfzeile plaziert. (Zeilen 14, 15 und 16.) Die Zeilen 17 und 21 bestimmen, ob eine Zeile schon mit denselben Werten fr f1 existiert, die den Werten in der Kopfzeile entspricht. Wenn keine Zeile gefunden wird, dann wird sysubrc auf einen Wert ungleich 0 und sy-tabix auf den Index der Zeile mit dem nchsten Wert gesetzt, d.h. sy-tabix entspricht der Anzahl der Zeilen plus 1.

Den Inhalt einer internen Tabelle sortieren


Um den Inhalt einer internen Tabelle zu sortieren, nutzen Sie bitte die Anweisung sort. Zeilen knnen nach einer oder mehreren Spalten in aufsteigender oder absteigender Reihenfolge sortiert werden. Die Sortierreihenfolge selbst kann auch verndert werden. Syntax der Anweisung sort Das Folgende ist die Syntax der sort-Anweisung. sort it [descending] [as text] [by f1 [ascending|descending] [as text] -> f2 ...]. wobei:

it der Name der internen Tabelle ist. f1 und f2 Komponenten von it sind. ... fr jede beliebige Anzahl von Feldern steht, die optional ascending folgen knnen.

Die folgenden Punkte sind zu beachten:


ascending (aufsteigend) ist die vorgegebene Sortierreihenfolge. Wenn descending (absteigend) nach sort und vor den Komponenten erscheint, wird es die standardmige Sortierreihenfolge und gilt fr alle Komponenten. Diese Vorgabe kann fr eine Komponente berschrieben werden, wenn nach der Komponente ascending spezifiziert wird. Wenn keine Zustze angegeben sind, wird die Tabelle nach den Standardschlsselfeldern (alle Felder vom Datentyp c, n, p, d und t) in aufsteigender Reihenfolge sortiert.

Die Sortierreihenfolge fr Zeilen, die denselben Wert haben, ist nicht voraussagbar. Zeilen mit demselben Wert in einer sortierten Spalte knnen nach dem Sortieren in jeder Reihenfolge erscheinen. Listing 11.11 zeigt Beispiele der Anweisung sort und verdeutlicht auch diesen Punkt. Listing 11.11: Nutzung der Anweisung sort, um die Zeilen einer internen Tabelle zu sortieren. 1 report ztx1111. 2 data: begin of it occurs 5, 3 i like sy-index,

4 t, 5 end of it, 6 alpha(5) value 'CBABB'. 7 8 do 5 times varying it-t from alpha+0 next alpha+1. 9 it-i = sy-index. 10 append it. 11 enddo. 12 13 loop at it. 14 write: / it-i, it-t. 15 endloop. 16 17 skip. 18 sort it by t. 19 loop at it. 20 write: / it-i, it-t. 21 endloop. 22 23 skip. 24 sort it by t. 25 loop at it. 26 write: / it-i, it-t. 27 endloop. 28 29 skip. 30 sort it by t i. 31 loop at it. 32 write: / it-i, it-t. 33 endloop. 34 35 skip. 36 sort it by t descending i. 37 *same as: sort it descending by t i ascending. 38 loop at it. 39 write: / it-i, it-t. 40 endloop. 41 42 skip. 43 sort it. 44 *same as: sort it by t. 45 loop at it. 46 write: / it-t. 47 endloop. Der Programm-Code in Listing 11.11 erzeugt folgende Ausgabe:

.........1 C 2 B 3 A 4 B 5 B 3 2 4 5 1 3 5 4 2 1 3 2 4 5 1 1 2 4 5 3 A B B B C

A B B B C A B B B C A B B B C C B B B A

Die Zeilen 2 bis 5 definieren eine interne Tabelle mit zwei Komponenten: i und t. Die occurs-Klausel ist 5, und daher wird die interne Tabelle mit fnf Zeilen gefllt. Zeile 6 definiert alpha als Datentyp c mit variabler Lnge 5 und erhlt einen Vorgabewert. Die Zeilen 8 bis 11 fgen der internen Tabelle fnf Zeilen hinzu. Jede Zeile enthlt einen Buchstaben von alpha und den Wert von sy-index, wenn eine Zeile angefgt wird. Die Zeilen 13 bis 15 schreiben den Inhalt der internen Tabelle aus. Die Zeilennummer von sytabix erscheint links auf der Ausgabe. Die Zeilen der internen Tabelle sind in ihrer ursprnglichen Reihenfolge, so da die Werte von sy-index und sy-tabix passen. Zeile 18 sortiert die Zeilen so, da die Werte von t in aufsteigender Reihenfolge erscheinen. In Zeile 24 wird die interne Tabelle noch einmal mit derselben Anweisung sortiert. Beachten

Sie, da die relative Reihenfolge der Zeilen mit einem Wert 'B' nicht erhalten bleibt. Wenn Sie wollen, da die Werte in der Spalte in einer bestimmten Reihenfolge sind, mssen Sie das in der sort-Anweisung spezifizieren. Die Reihenfolge der Zeilen mit identischen Werten wird whrend der Sortierung nicht erhalten. In Zeile 30 wird die interne Tabelle nach t in aufsteigender Reihenfolge und dann nach i in absteigender Reihenfolge sortiert. In Zeile 36 wird die interne Tabelle nach t in absteigender Reihenfolge und dann nach i in aufsteigender Reihenfolge sortiert. Zeile 37 zeigt eine alternative Syntax, die dasselbe Ergebnis wie Zeile 36 liefert. In dieser Anweisung wird descending direkt hinter it plaziert und wird so die Vorgabe. Die Komponente t wird somit absteigend sortiert und bei der Komponente i wird die Vorgabe mit dem Zusatz ascending berschrieben. Zeile 43 sortiert die interne Tabelle nach den Standardschlsselfeldern (Datentypen c, n, d, t und x). In diesem Fall gibt es nur ein Feld in dem Standardschlssel t, so da die interne Tabelle lediglich nach t in aufsteigender Reihenfolge sortiert wird.

Sortierreihenfolge und der Zusatz as text Innerhalb des Betriebssystems wird jedes Zeichen, das Sie auf dem Bildschirm sehen, als ein numerischer Wert dargestellt. Whrend der Sortierung bestimmt der numerische Wert des Zeichens die Sortierreihenfolge. Luft z.B. ein ABAP/4-Programm in einer ASCII-Umgebung, hat der Buchstabe o einen dezimalen ASCII-Wert von 111 und p einen Wert von 112. Deshalb kommt p nach o in der Sortierreihenfolge. Diese Sortierreihenfolge wird binary sort sequence genannt. Wenn eine Sprache akzentuierte Zeichen wie , oder hnliche beinhaltet, dann wird ein numerischer Wert fr jede Form der akzentuierten Zeichen vorgesehen. Z.B. o und (umgelautetes o) sind einzelne und verschiedene Buchstaben, jeder mit einem individuellen numerischen Wert. (In ASCII ist der numerische Wert von 246.) Wenn Sie Daten mit akzentuierten Zeichen sortieren, dann sollten die akzentuierten Zeichen mit den nichtakzentuierten Zeichen erscheinen. o und sollen z.B. zusammen sein, danach kommt p. Leider folgen die binren Werte der akzentuierten Zeichen denen der nichtakzentuierten nicht aufeinander. Daher mu ein anderer Weg gewhlt werden, um die akzentuierten Zeichen richtig zu sortieren. Der Zusatz as text modifiziert die Sortierreihenfolge so, da die akzentuierten Zeichen richtig sortiert werden. Mit Zusatz as text wird nicht mehr die binre Sortierreihenfolge benutzt. Statt dessen bestimmt die Textumgebung die Sortierreihenfolge. Die Textumgebung ist eine Menge von Zeichen, die mit der Anmeldesprache des Benutzers bei der Anmeldung zusammenhngt. Sie wird bestimmt durch den Sprachschlssel, den Sie beim Anmelden eingeben, und besteht in erster Linie aus dem Zeichensatz der Sprache und der zugehrigen Reihenfolge. Sie knnen die Textumgebung zur Laufzeit mit der Anweisung set locale setzen. Diese Anweisung setzt den Wert von sy-langu, d.h. dem aktuellen Zeichensatz und der zugehrigen Reihenfolge der spezifizierten Sprache. Die folgenden Punkte sind bei dem Zusatz as text zu beachten:

Er kann nur mit Feldern vom Datentyp c benutzt werden. Er kann nach sort und vor den Namen der Komponenten spezifiziert werden. In diesem Fall gilt er fr alle Komponenten vom Datentyp c, die beim Sortieren benutzt werden. Er kann auch hinter einer Komponente spezifiziert werden. In diesem Fall gilt er nur fr die Komponente.

Listing 11.12 zeigt ein Beispiel. Listing 11.12: Um akzentuierte Zeichen zu sortieren, wird der Zusatz as text bentigt. 1 report ztx1112. 2 data: begin of it occurs 4, 3 t(30), 4 end of it. 5 6 it-t = 'Higgle'. append it. 7 it-t = 'Hoffman'. append it. 8 it-t = 'Hllman'. append it. 9 it-t = 'Hubble'. append it. 10 11 write: / 'sy-langu=', sy-langu. 12 sort it. "sorts by default key. t is type c, therefore orts by t. 13 loop at it. 14 write: / it-t. 15 endloop. 16 17 skip. 18 set locale language 'D'. "Equivalent to signing on in German 19 write: / 'sy-langu=', sy-langu. 20 sort it as text. "as text here applies to all type c components 21 *same as: sort it by t as text. 22 loop at it. 23 write: / it-t. 24 endloop. Der Programm-Code in Listing 11.12 erzeugt folgende Ausgabe: sy-langu= E Higgle Hoffman Hubble Hllman sy-langu= D

Higgle Hoffman Hllman Hubble

Die Zeilen 6 bis 9 fgen der internen Tabelle vier Zeilen hinzu, von denen die vierte ein beinhaltet. Zeile 11 schreibt die aktuelle Anmeldesprache aus. Zeile 12 sortiert it nach dem Standardschlssel in binrer Sortierreihenfolge gem der aktuellen Anmeldesprache. Die Ausgabe zeigt, da in der sortierten Reihenfolge an letzter Stelle erscheint. set locale in Zeile 18 ndert die Umgebung des Programms; es ist dem Anmelden in Deutsch gleichzusetzen. Sy-langu wird auf D gesetzt, und der deutsche Zeichensatz und die zugehrigen Reihenfolgen werden von nun an in dem Programm benutzt. Zeile 20 benutzt sort mit dem Zusatz as text nach dem Namen der internen Tabelle. Damit gilt as text fr alle Komponenten mit dem Datentyp c. In der Ausgabe erscheinen o und zusammen.

Nachdem Sie mit as text sortiert haben, benutzen Sie nicht den Zusatz binary search bei der Anweisung read table. Die Zeilen werden nicht in binrer Reihenfolge sortiert, so da eine binre Suche falsche Ergebnisse liefert. Um binary search erfolgreich zu benutzen, sehen Sie bitte in der ABAP/4Schlsselwortdokumentation bei den Erluterungen zur Anweisung convert into sortable nach. Sortierreihenfolgen variieren je nach Plattform. Wenn sie von einem Betriebssystem zu einem anderen transportiert werden, sind die einzigen sicheren Sortierfolgen A-Z, a-z, und 0-9, aber nicht unbedingt in der Reihenfolge.

Nach dem Sortieren knnen Sie Duplikate in einer internen Tabelle mit der Anweisung delete adjacent duplicates lschen, wie auch in der ABAP/4Schlsselwortdokumentation beschrieben.

Zusammenfassung

Eine interne Tabelle ist eine Ansammlung von Zeilen im RAM auf dem Applikationsserver. Sie besteht aus einer Kopfzeile und einem Rumpf. Die Kopfzeile ist optional. Die Kopfzeile ist der implizite Arbeitsbereich einer internen Tabelle. Die Existenz der occurs-Klausel erstellt eine interne Tabelle. Benutzen Sie die Anweisung loop at, um mehrere Zeilen einer internen Tabelle zu erhalten. Jede Zeile wird einzeln in der Kopfzeile oder einem expliziten Arbeitsbereich plaziert. Benutzen Sie from, to and where, um Zeilen zu spezifizieren, die zurckgegeben werden sollen. In der Schleife beinhaltet sy-tabix die relative Zeilennummer. Nachdem die Schleife durchlaufen ist, wird sy-subrc Null sein, wenn irgendeine Zeile in der Schleife prozessiert wurde. In der Schleife kann die Ausfhrung durch die Anweisungen exit, continue oder check verndert werden. exit beendet die Schleife und setzt die Verarbeitung mit der Anweisung nach endloop fort. continue berspringt die verbleibenden Anweisungen der Schleife und fhrt sofort mit dem nchsten Schleifendurchlauf fort. check setzt wie continue mit dem nchsten Schleifendurchlauf fort, jedoch erst, wenn ein logischer Ausdruck falsch ist. Benutzen Sie die Anweisung read table, um eine einzelne Zeile einer internen Tabelle zu lokalisieren. Mit dem Zusatz index knnen Sie eine einzelne Zeile mit der relativen Zeilennummer lokalisieren. Das ist sehr effizient, um eine Zeile zu finden. Mit dem Zusatz with key knnen Sie eine Zeile mit einem bestimmten Wert finden. comparing stellt fest, ob bestimmte Werte in dem Arbeitsbereich von Werten in der gefundenen Zeile abweichen. transporting verhindert ungewollte und unntige Zuweisungen von der gefundenen Zeile in den Arbeitsbereich. Die Anweisung sort sortiert eine interne Tabelle nach den Komponenten. Wenn keine Komponenten genannt werden, wird die Tabelle nach den Standardschlsselfeldern (Datentyp c, n, d, t und x) sortiert. Nicht erlaubt Benutzen Sie nicht occurs 0 fr interne Tabellen, die kleiner als 8 KB sind. Das bedeutet: Zuweisung von zuviel Speicher und langsamerer Ausfhrung.

Erlaubt Benutzen Sie den Zusatz binary search mit der Anweisung read table. Es steigert die Ausfhrung der Suche deutlich. Benutzen Sie den Zusatz index mit der Anweisung read table, wenn mglich. Es ist der schnellste Weg, eine Zeile zu finden.

Fragen & Antworten


Frage: In einigen Programmen habe ich einen benutzerdefinierten Datentyp mit der occurs -Klausel gesehen. Der Typ wird dann benutzt, um einen internen Tabellentyp und folglich eine interne Tabelle zu definieren. Dies wird im Listing 11.13 gezeigt. Warum wird dies so gemacht? Knnen Sie eine interne Tabelle immer mit der Anweisung data definieren? Warum fhren Sie die

Anweisung types ein? Listing 11.13: Definieren einer internen Tabelle mit einem benutzerdefinierten Typ 1 2 3 4 5 6 7 report ztx1113. types: begin of my_type, f1, f2, end of my_type, t_it type my_type occurs 10. data it type t_it.

Antwort: Es gibt keinen Vorteil bei der Nutzung von internen Tabellentypen, wie sie im Listing 11.13 gezeigt werden. Datentypen sind nur sinnvoll, wenn sie mehr als ein Datenobjekt definieren. In diesem Programm wird nur ein Datenobjekt vom Typ t_it definiert. In diesem Fall wre es einfacher, nicht die Anweisung types zu benutzen und die gesamte Definition mit data zu erzeugen. Theoretisch sind Datentypen sinnvoll, wenn Sie mehrere Datenobjekte vom gleichen Typ definieren wollen. Listing 11.14 zeigt drei Arten, mehrdimensionale interne Tabellen zu definieren: nur mit der Anweisung data, mit der Anweisung types und mit einer DDIC-Struktur. Listing 11.14: Die Definition von mehrdimensionalen Tabellen wird mit der Anweisung types vereinfacht. 1 report ztx1114. 2 3 * Define 3 identical internal tables using DATA only 4 data: begin of it_1a occurs 10, 5 f1, 6 f2, 7 end of it_1a, 8 it_1b like it_1a occurs 10 with header line, 9 it_1c like it_1a occurs 10 with header line. 10 11 * Define 3 more identical internal tables using TYPES 12 types: begin of t_, 13 f1, 14 f2, 15 end of t_, 16 t_it type t_ occurs 10. 17 data: it_2a type t_it, 18 it_2b type t_it, 19 it_2c type t_it. 20 21 * Define 3 more using a DDIC structure

22 data: it_3a like ztx_it occurs 10 with header line, 23 it_3b like ztx_it occurs 10 with header line, 24 it_3c like ztx_it occurs 10 with header line.

Bei den ersten beiden Methoden ist es Ansichtssache, welche von beiden deutlicher ist. Keine von beiden hat einen entscheidenden Vorteil. Ich glaube, da die dritte Methode die bevorzugte ist. Sie ist deutlicher. Falls Sie die Definition sehen mchten, brauchen Sie einfach nur auf den Namen der DDICStruktur doppelzuklicken. Wenn Sie sich die Struktur anschauen, so sehen Sie etwas, das aussagekrftiger ist als eine ABAP/4-Definition. Zu jedem Datenelement und auch der Struktur selbst gibt es einen kurzen Text. Diese Texte knnen auch bersetzt werden. Zustzlich ist die Struktur fr die Wiederverwendung in anderen Programmen verfgbar. Meiner Meinung nach ist der Gebrauch einer Struktur der Definition types deutlich berlegen. Es gibt jedoch einen Aspekt, worin der Datentyp der Struktur berlegen ist. Er kann Definitionen fr verschachtelte interne Tabellen enthalten. Nur in diesem Fall wrde ich einen Datentyp verwenden. In allen anderen Fllen ist eine Struktur in dem DDIC fr a date begin of oder a like der bessere Weg.

Workshop
Der Workshop bietet Ihnen zwei Wege, wie Sie berprfen knnen, was Sie in diesem Kapitel gelernt haben. Die Kontrollfragen helfen Ihnen, das Erlernte zu vertiefen, whrend die bungen Ihnen ermglichen, es praktisch anzuwenden. Antworten zu den bungen und Fragen finden Sie im Anhang B Antworten zu den Kontrollfragen und bungen.

Kontrollfragen
1. Was setzt eine Grenze fr die maximale Menge an erweitertem Speicher, die eine interne Tabelle zuweisen kann? 2. Warum sollten Sie nicht occurs 0 benutzen, wenn Sie erwarten, da die interne Tabelle weniger als 8 KB speichert? 3. Knnen Sie die Anweisung read table benutzen, um Tabellen einer Datenbank zu lesen?

bung 1
Zeigen und erklren Sie die Umwandlungen, die im Programm ztx1110 auftreten (siehe Listing 11.15). Listing 11.15: Umwandlungen (Hinweis: Programm->Analyse) 1 report ztx1110.

2 data: begin of it occurs 3, 3 f1(2) type n, 4 f2 type i, 5 f3(2) type c, 6 f4 type p, 7 end of it. 8 9 it-f1 = '40'. it-f3 = 'DD'. it-f2 = it-f4 = 4. append it. 10 it-f1 = '20'. it-f3 = 'BB'. it-f2 = it-f4 = 2. append it. 11 12 sort it by f1. 13 do 5 times. 14 it-f1 = sy-index * 10. 15 it-f3 = 'XX'. 16 it-f2 = it-f4 = sy-index. 17 read table it 18 with key f1 = it-f1 19 binary search 20 transporting no fields. 21 if sy-subrc <> 0. 22 insert it index sy-tabix. 23 endif. 24 enddo. 25 26 loop at it. 27 write: / it-f1, it-f2, it-f3, it-f4. 28 endloop.

Ein Imprint des Markt&Technik Buch- und Software-Verlag GmbH. Elektronische Fassung des Titels: ABAP/4 in 21 Tagen, ISBN: 3-8272-2016-X

Woche 2

Tag 12 Interne Tabellen, Teil 1


Kapitelziele
Wenn Sie dieses Kapitel durchgearbeitet haben, sind Sie in der Lage:

Tabellenrumpf-Operatoren zu erkennen und sie zum Testen auf die Existenz von Daten in einer internen Tabelle zu benutzen sowie den Inhalt zweier interner Tabellen auf Gleichheit zu prfen die Anzahl von Zeilen in einer internen Tabelle mit Hilfe von describe und sy- tfill zu bestimmen den Inhalt von einer internen Tabelle zu einer anderen mit Hilfe des Tabellenrumpf-Operators und der Anweisungen append lines und insert lines zu kopieren sich interne Tabellen mit Hilfe von editor-call anzusehen und zu modifizieren mit insert und modify-Anweisungen den Inhalt interner Tabellen zu ndern Zeilen aus einer internen Tabelle mit Hilfe von delete, delete . . . where, clear, clear it [], refresh und free zu lschen eine interne Tabelle mit Hilfe von append sorted by und collect zu fllen

Den Inhalt interner Tabellen testen und modifizieren


Benutzen Sie die folgenden Konstrukte, um den Inhalt interner Tabellen zu testen und zu modifizieren:

Den Tabellenrumpf-Operator describe table append lines insert lines

editor-call insert modify free delete clear refresh append sorted by collect

Der Rumpf einer internen Tabelle wird durch die Syntax it[] dargestellt, wobei it der Name irgendeiner internen Tabelle ist. it[] heit, der Rumpf der internen Tabelle it. Es darf nichts zwischen den eckigen Klammern stehen; sie mssen genauso wie eben gezeigt geschrieben werden. Sie knnen diese Syntax benutzen, um effiziente Tabellenoperationen, die keine Kopfzeile erfordern, auszufhren. Diese Operationen werden in diesem Kapitel beschrieben. Wenn eine interne Tabelle keine Kopfzeile hat, ist der interne Tabellenname selbst der Rumpf. Hat zum Beispiel eine interne Tabelle keine Kopfzeile, kann man entweder it[] oder it benutzen, um den Rumpf zu reprsentieren; beide sind gleichwertig.

Informationen ber eine interne Tabelle erhalten


Die folgenden gebruchlichen Informationen kann man ber eine interne Tabelle erhalten:

ob die interne Tabelle Daten enthlt wieviel Zeilen sie enthlt

Wie bestimmt man, ob eine interne Tabelle leer ist


Wenn der Rumpf einer internen Tabelle nur Initialwerte (Leerzeichen, Nullen) enthlt, ist er leer. Deshalb kann man zur Bestimmung, ob eine interne Tabelle Daten enthlt, den Rumpf mit der folgenden Anweisung testen: if it[] is initial. Wenn der Test wahr ist, ist die interne Tabelle leer. Wenn der Rckgabewert falsch ist, enthlt sie mindestens eine Zeile.

Die Anzahl von Zeilen einer internen Tabelle bestimmen


Um die Anzahl von Zeilen einer internen Tabelle zu bestimmen, wird die Variable sy- tfill benutzt. Sie wird durch die describe table-Anweisung gesetzt.

Syntax der describe table-Anweisung Im folgenden wird die Syntax der describe table-Anweisung gezeigt. describe table it [lines I] [occur j] wobei:

it der Name der internen Tabelle ist. i und j numerische Variable sind.

Mit dieser Anweisung werden die drei Systemvariablen aus Tabelle 12.1 gefllt.

Tabelle 12.1: Die describe table-Anweisung fllt diese Systemvariablen Variable Wert

Sy-tfill Anzahl der Zeilen Sy-tleng Sy-toccu Lnge einer Zeile in Byte Aktuelle Wert der occurs-Klausel Die folgenden Punkte gelten:

Wenn der Zusatz lines i spezifiziert wird, wird die Anzahl der Zeilen in sy-tfill und i geschrieben. Wenn der Zusatz occurs j spezifiziert wird, wird die Gre der occurs-Klausel in sytoccu und j geschrieben.

Es gibt nur eine Instanz, unter welcher sich sy-toccu von der occurs-Klausel in der Table Definition unterscheidet. Wenn nmlich sy-tleng * sy-toccu > 8192 ist und nachdem eine Zeile der internen Tabelle hinzugefgt wurde, wird sytoccu Null sein. Das zeigt an, da Speicher in 8 KB-Blcken fr diese interne Tabelle allokiert wurde.

Ein Beispielprogramm, das Informationen ber eine interne Tabelle enthlt


Listing 12.1 zeigt ein Beispielprogramm, das Informationen ber eine interne Tabelle enthlt. Listing 12.1: Die describe table-Anweisung benutzt Systemvariable, um den Tabelleninhalt zu quantifizieren. 1 report ztx1201. 2 data: begin of it occurs 3, 3 f1 value 'X', 4 end of it, 5 n type i. 6 7 if it[] is initial. 8 write: / 'it is empty'. 9 endif. 10 11 append: it, it, it. "same as writing 'append it' 3 times. 12 13 if not it[] is initial. 14 write: / 'it is not empty'. 15 endif. 16 17 write: / 'number of rows from sy-tabix:', sy-tabix. 18 describe table it lines n. 19 write: / 'number of rows from sy-tfill:', sy-tfill, 20 / 'length of a row from sy-tleng:', sy-tleng, 21 / 'occurs value from sy-toccu:', sy-toccu. Das Programm aus Listing 12.1 produziert die folgende Ausgabe: it is empty it is not empty number of rows from sy-tabix: 3 number of rows from sy-tfill: 3 length of a row from sy-tleng: 1 occurs value from sy-toccu: 3

Zeile 7 vergleicht den Rumpf der internen Tabelle mit Hilfe des Tabellenrumpf- Operators mit Initialwerten. Da die interne Tabelle zu dieser Zeit noch keine Eintrge hat, ist der Test wahr. Zeile 11 benutzt den Kettenoperator (:), um drei identische Zeilen an it anzu- hngen. Zeile 13 testet wieder den Rumpf. Dieses Mal wird der Test durch ein logisches not vorgenommen. Da die interne Tabelle Daten enthlt, ist der Test wahr. Hinter jeder append-Anweisung, wird der Wert von sy-tabix auf die Anzahl der Zeilen

der internen Tabelle gesetzt. Zeile 17 schreibt diesen Wert aus. Zeile 18 benutzt die describe-Anweisung, um die Zeilenanzahl zu bestimmen, und schreibt sie in sy-tfill. It enthlt auch die Zeilenlnge und Gre der occurs -Klausel und schreibt sie in sy-tleng und sy-toccu.

Wenn man nur Informationen braucht, ob die Tabelle Daten enthlt und nicht, wie viele Zeilen sie hat, sollte man den Rumpfoperator benutzen. Er ist effizienter als die describe table-Anweisung.

Daten von einer internen Tabelle in eine andere kopieren


Wenn zwei interne Tabellen die gleiche Struktur haben, kann man mit der folgenden Anweisung den Inhalt einer internen Tabelle in eine andere duplizieren. it2[] = it1[].

Zwei interne Tabellen haben die gleiche Struktur, wenn sie 1. die gleiche Anzahl von Komponenten haben und 2. die Datentypen- und Lngen jeder Komponente die gleichen sind wie die korrespondierenden Komponenten der anderen internen Tabelle. Nur die Namen der Komponenten mssen nicht bereinstimmen. Die vorangegangene Anweisung kopiert den Inhalt des Rumpfs von it1 und stellt ihn in den Rumpf von it2. Alle existierenden Eintrge in it2 werden berschrieben. Der Inhalt der Kopfzeilen, wenn jede interne Tabelle einen hat, bleibt unverndert. Das ist die wirkungsvollste Methode, um den Tabelleninhalt einer internen Tabelle in eine andere zu berfhren.

Teile einer internen Tabelle kopieren


Wenn man nur Teile einer internen Tabelle in eine andere kopieren oder den Inhalt der Zieltabelle nicht verndern will, benutzt man die append lines und insert lines- Anweisungen. Die append lines-Anweisung

Man benutzt append lines, um Zeilen an die Zieltabelle zu hngen.


Die Syntax von append lines

append lines of it1 [from nf] [to nt] to it2. wobei:


it1 und it2 interne Tabellen ohne Kopfzeilen sind. nf und nt numerische Variable, Literale oder Konstanten sind.

Die folgenden Punkte gelten:


Die Strukturen von it1 und it2 mssen passen. nf ist der Index der ersten Zeile, die aus it1 kopiert werden soll. Wenn die from- Ergnzung nicht angegeben ist, fngt das Kopieren aus der ersten Zeile von it1 an. nt ist der Index der letzten Zeile, die aus it1 kopiert werden soll. Wenn die Ergnzung to nicht mit angegeben wurde, wird bis zur letzten Zeile von it1 kopiert. Sind weder from noch to angegeben, wird die gesamte Tabelle angehngt. Nachdem die append lines-Anweisung ausgefhrt wurde, enthlt sy-tabix die Anzahl der Zeilen in der Tabelle.

append lines ist drei- oder viermal schneller als append to. Die insert lines-Anweisung Mit insert lines fgt man Zeilen an anderen Stellen als nur am Ende der Zieltabelle ein.
Die Syntax von insert lines

Nachfolgend sehen Sie die Syntax von insert lines. insert lines of it1 [from nf] [to nt] into it2 [index nb]. wobei:

it1 und it2 interne Tabellen ohne Kopfzeilen sind. nf, nt, und nb numerische Variable, Literale oder Konstanten sein knnen.

Alle Punkte, die fr append lines gelten, gelten auch hier. Der Unterschied ist, da Zeilen aus it1 in it2 vor Zeilennummer nb eingefgt werden. Wenn der Wert von nb der Anzahl von Zeilen in it2 plus einer entspricht, wird die Zeile an das Ende von it2 gehngt. Ist nb grer, wird die Zeile nicht angehngt, und sy-subrc ist 4. Wenn nb kleiner als 1 ist, tritt ein Laufzeitfehler auf. Man kann diese Anweisung sowohl innerhalb als auch auerhalb von loop at it2 benutzen. Benutzt man sie auerhalb, mu man mit dem Zusatz index arbeiten, Benutzt man sie innerhalb, ist index optional. Wird es nicht spezifiziert, wird die aktuelle Zeilennummer in it2 angenommen.

Beispielprogramm, das Daten zwischen zwei internen Tabellen kopiert


Listing 12.2 zeigt ein Beispielprogramm, welches Daten von einer internen Tabelle in eine andere kopiert. Listing 12.2: Dieses Programm kopiert Daten von einer internen Tabelle in eine andere unter Benutzung von append lines und insert lines. 1 report ztx1202. 2 data: begin of it1 occurs 10, 3 f1, 4 end of it1, 5 it2 like it1 occurs 10 with header line, 6 alpha(10) value 'ABCDEFGHIJ'. 7 8 do 10 times varying it1-f1 from alpha+0 next alpha+1. 9 append it1. 10 enddo. 11 12 append lines of it1 from 2 to 5 to it2. 13 loop at it2. 14 write it2-f1. 15 endloop. 16 17 insert lines of it1 from 8 into it2 index 2. 18 skip. 19 loop at it2. 20 write it2-f1. 21 endloop. 22 23 loop at it2. 24 if it2-f1 >= 'E'. 25 insert lines of it1 to 1 into it2. 26 endif. 27 endloop.

28 29 30 31 32 33 34 35 36 37 38

skip. loop at it2. write it2-f1. endloop. skip. it2[] = it1[]. loop at it2. write it2-f1. endloop.

Das Programm aus Listing 12.2 zeigt folgende Ausgabe: B C D E B H I J C D E B A H A I A J C D A E A B C D E F G H I J

Die Zeilen 8 bis 10 fllen it1 mit zehn Zeilen, welche die ersten zehn Buchstaben des Alphabets enthalten. Die Zeile 12 hngt die Zeilen 2 bis 5 von it1 an it2. it2 hat nun vier Zeilen, welche die Buchstaben B bis E enthalten. Auf Zeile 17 ist to nicht mitangegeben, somit wird das Ende von it1 angenommen. Dies wiederum fgt die Zeilen 8, 9, und 10 aus it1 nach it2 vor Zeile 2. Auf Zeile 24, wenn der Buchstabe in it2-f1 grer oder gleich E ist, wird Zeile 1 von it1 vor der aktuellen Zeile von it2 eingefgt. (Da kein from angegeben wurde, wird der Anfang von it1 angenommen.) Das bedeutet, vier Zeilen werden eingefgt. In der Ausgabe stehen die 'A' Werte. Zeile 35 kopiert den Inhalt von it1 nach it2, wobei der existierende Inhalt in it2 vollstndig berschrieben wird.

Zwei interne Tabelleninhalte vergleichen


Mit Hilfe des Tabellenrumpf-Operators knnen die Inhalte zweier interner Tabellen wie folgt verglichen werden: if it1[] = it2[]. Um dieses Konstrukt zu benutzen, mssen beide interne Tabellen die gleiche Tabellenstruktur haben. Wenn dies nicht der Fall ist, mu der Inhalt Zeile fr Zeile verglichen werden.

Die Anweisung ist wahr, wenn it1 und it2 die gleiche Anzahl an Zeilen enthalten und der Inhalt jeder Zeile identisch ist.

Mit der if-equal to-Anweisung wird in der Regel der Inhalt zweier Tabellen zu verglichen.

Die editor-call-Anweisung
Die editor-call-Anweisung zeigt hnlich wie der ABAP/4-Quellcode-Editor den Inhalt einer Tabelle an. Das ist ntzlich fr die Fehlersuche und zudem eine einfache Schnittstelle, die dem Anwender das Eingeben und Modifizieren von Daten in tabellarischer Form erlaubt.

Die Syntax der editor-call-Anweisung


Im folgenden wird die Syntax der editor-call-Anweisung erklrt. Editor-call for it [title t] [display mode]. wobei:

it der Name der internen Tabelle ist. t eine Variable, ein Literal oder eine Konstante ist.

Die folgenden Punkte gelten:


it kann nur Typ c Komponenten enthalten. Die maximale Lnge einer Zeile betrgt 72 Zeichen. t ist der Text, der in der Titelzeile des Fensters erscheint. Mit dem Zusatz display mode werden die Daten im Editor im Anzeigemodus gezeigt. Der Anwender kann Suchfunktionen auszufhren und blttern; er kann den Inhalt aber nicht ndern.

Nach Ansehen bzw. ndern des Inhalts der internen Tabelle ber den Editor drcken Sie auf folgende Schaltflchen: Sichern, Zurck, Exit oder Annullieren (Cancel). Wurden nderungen gemacht, werden Sie aufgefordert zu sichern. Nachdem die editor-call-Anweisung ausgefhrt wurde, wird sy-subrc auf die Werte wie in Tabelle 12.2 gezeigt gesetzt.

Tabelle 12.2: Werte von sy-subrc nach der editor-call-Anweisung sy-subrc Bedeutung 0 4 Der Anwender hat keine Sicherung durchgefhrt. Der Inhalt der internen Tabelle ist unverndert. Listing 12.3 zeigt ein Beispielprogramm, das die editor-call-Anweisung benutzt. In diesem Beispiel wird die interne Tabelle mit fnf Zeilen gefllt und im Editor angezeigt, so da der Anwender die Daten modifizieren kann. Der Inhalt wird dann ausgeschrieben, ebenso wie eine Nachricht, um anzuzeigen, ob die Daten gendert wurden. Listing 12.3: Die Benutzung der editor-call-Anweisung, um Daten anzusehen, zu editieren und den Inhalt einer internen Tabelle auf Fehler zu berprfen 1 report ztx1203. 2 data: begin of it occurs 10, 3 t(72), "text 4 end of it, 5 save_it like it occurs 10. "will contain copy of the original 6 7 it-t = 'Name :'. append it. 8 it-t = 'Address :'. append it. 9 it-t = 'Phone :'. append it. 10 it-t = 'Freeform Text '. append it. 11 clear it-t with '-'. append it. 12 13 save_it = it[]. "same as: save_it[] = it[]. 14 editor-call for it title 'Freeform Entry'. 15 if sy-subrc = 4. "user did not perform a save 16 write: / 'Data was not changed'. 17 elseif save_it[] <> it[]. "user performed a save 18 write: / 'Data was changed'. 19 else. 20 write: / 'Data was not changed'. 21 endif. 22 write: / sy-uline(72). 23 loop at it. 24 write: / it-t. Es wurde eine Sicherung durchgefhrt. Der Inhalt der internen Tabelle hat sich oder hat sich nicht gendert.

25 endloop. Werden keine Daten im Editor eingegeben, erzeugt das Programm aus Listing 12.3 die folgende Ausgabe: Data was not changed ------------------------------------------------------------------Name : Address : Phone : Freeform Text ------------------------------------------------------------------

Die Zeilen 2 bis 4 definieren eine interne Tabelle mit einer einzelnen Komponente t und einer Zeichenlnge von 72. Zeile 5 definiert eine zweite interne Tabelle wie die erste. Sie wird dazu benutzt, eine Kopie der Daten von it zu speichern. Sie hat keine Kopfzeile. Die Kopfzeile wurde ausgelassen, weil sie in diesem Programm nicht gebraucht wird. Die Zeilen 7 bis 11 hngen fnf Zeilen von der Kopfzeile an die interne Tabelle. Zeile 13 kopiert den Rumpf von it an den Rumpf von save_it. Da save_it keine Kopfzeile hat, kann die linke Seite der Zuweisung mit oder ohne Klammern geschrieben werden. Zeile 14 zeigt den Inhalt der internen Tabelle mit dem Titel Freeform Entry im Editor an. Zeile 15 prft den Wert von sy-subrc, um zu bestimmen, ob der Anwender gesichert hat. Wenn nicht, werden keine Daten ausgeschrieben und eine Nachricht wird angezeigt. Zeile 17 vergleicht den Inhalt von it mit dem Inhalt der Kopie in save_it. Wenn er unterschiedlich ist, wird eine Meldung ausgeschrieben. Ist er identisch, schreibt Zeile 20 eine entsprechende Meldung. Zeile 22 schreibt eine 72 Zeichen lange Unterstreichungslinie. Die Zeilen 23 bis 25 geben den neuen Inhalt der internen Tabelle einschlielich der Anwendermodifikationen aus.

Zeilen in eine interne Tabelle einfgen


Um eine einzelne Zeile in eine interne Tabelle einzufgen, benutzt man die insert- Anweisung.

Syntax der insert-Anweisung


Im folgenden wird die Syntax der insert-Anweisung gezeigt. insert [wa into] it [index n] wobei:

wa ein Arbeitsbereich mit der gleichen Struktur wie eine Zeile der internen Tabelle it ist. n eine Variable, ein numerisches Literal oder eine Konstante ist.

Die folgenden Punkte gelten:

Wenn wa angegeben ist, wird der Inhalt von wa in it eingefgt. wa mu die gleiche Struktur wie it haben. Ist wa nicht angegeben, wird der Inhalt der Kopfzeile in it eingefgt. Hat it keine Kopfzeile, mu wa angegeben werden. Ist index angegeben, wird die neue Zeile vor Zeile n eingefgt. Zeile n wird dann zu n+1. Die insert-Anweisung kann innerhalb oder auerhalb von loop at it benutzt werden. Wird sie auerhalb benutzt, mu index mit angegeben werden. Wird sie innerhalb benutzt, ist index optional. Wird sie nicht angegeben, wird die aktuelle Zeile angenommen.

Listing 12.4 enthlt ein Beispielprogramm, das die insert-Anweisung benutzt. Listing 12.4: Die Anweisung insert wird benutzt, um eine einzelne Zeile in eine interne Tabelle einzufgen. 1 report ztx1204. 2 data: begin of it occurs 5, 3 f1 like sy-index, 4 end of it. 5 6 do 5 times. 7 it-f1 = sy-index. 8 append it. 9 enddo. 10 11 it-f1 = -99. 12 insert it index 3. 13 14 loop at it. 15 write / it-f1. 16 endloop. 17 18 loop at it where f1 >= 4. 19 it-f1 = -88. 20 insert it. 21 endloop. 22 23 skip. 24 loop at it. 25 write / it-f1. 26 endloop.

Das Programm aus Listing 12.4 erzeugt die folgende Ausgabe: 1 2 993 4 5 1 2 993 884 885

Die Zeilen 6 bis 9 hngen fnf Zeilen mit den Nummern 1 bis 5 an it. Zeile 11 weist der Komponente it-f1 einen Wert von -99 zu. Zeile 12 fgt die Kopfzeile von it als neue Zeile in den Rumpf von it vor Zeile 3 ein. Die existierende Zeile 3 wird nun nach dem Einfgen zur Zeile 4. Zeile 18 verarbeitet jetzt diejenigen Zeilen der internen Tabelle, deren Wert von f1 grer oder gleich 4 ist. Vor jeder Zeile fgt Zeile 20 eine neue Zeile aus der Kopfzeile von it ein. Vor dem Einfgen ndert Zeile 19 die Komponente f1 auf den Wert 88-.

Nachdem jede insert-Anweisung ausgefhrt ist, reindexiert das System alle Zeilen unterhalb der neu eingefgten Zeile. Das schafft zustzlichen Aufwand, wenn man Zeilen nahe am Anfang einer groen internen Tabelle einfgt. Mu man einen Zeilenblock in eine groe interne Tabelle einfgen, sollte man besser eine andere Tabelle fr die neu einzufgenden Zeilen vorbereiten und dabei mit insert lines arbeiten. Somit werden die Zeilen der Zieltabelle nur einmal reindexiert, nachdem die Anweisung ausgefhrt wurde. Fgt man eine neue Zeile in it innerhalb von loop at it ein, berhrt der insert -Befehl nicht sofort die interne Tabelle. Er wird statt dessen erst beim nchsten Schleifendurchgang effektiv. Wird eine Zeile hinter der aktuellen Zeile eingefgt, wird die Tabelle bei endloop reindexiert, sytabix wird hochgezhlt und der nchste Schleifendurchgang verarbeitet die Zeile, auf die in sytabix gezeigt wird. Nehmen Sie zum Beispiel an, wir befinden uns im dritten Schleifendurchgang, und es wird eine neue Zeile vor Zeile 4 eingefgt. Wird endloop ausgefhrt, so wird die neue Zeile

zur vierten, die alte Zeile 4 wird 5 und so weiter. sy-tabix wird um 1 hochgezhlt, und der nchste Schleifendurchgang verarbeitet den eben zugefgten Satz. Befindet man sich innerhalb einer Schleife und wird eine Zeile vor der aktuellen Zeile eingefgt, wird die Tabelle wieder bei endloop reindexiert. Dieses Mal jedoch wird sy- tabix um 1 hochgezhlt zuzglich der Zeilen, die vor der aktuellen eingefgt wurden. Beim nchsten Schleifendurchgang wird die Zeile verarbeitet, die der aktuellen Zeile folgt. Nehmen Sie zum Beispiel an, im dritten Schleifendurchgang fgen Sie eine Zeile vor der Zeile 3 ein. Bei endloop wird die neue Zeile zu Zeile 3, Zeile 3 wird Zeile 4 und so weiter. Die Zeile, die gerade verarbeitet wird, hat einen Index von 4. Sy-tabix wird um 2 hochgezhlt, was 5 ergibt. Zeile 4 wurde reindexiert zu 5, somit wird Zeile 5 beim nchsten Schleifendurchgang verarbeitet.

Zeilen einer internen Tabelle modifizieren


Um eine Zeile innerhalb einer internen Tabelle zu modifizieren, benutzt man die modify Anweisung.

Syntax der modify-Anweisung.


modify it [from wa] [index n] [transport c1 c2 . . . [where exp]]. wobei:

it der Name einer internen Tabelle mit oder ohne Kopfzeile ist. wa ein Arbeitsbereich mit der gleichen Struktur wie eine Zeile im Rumpf von it ist. n eine Variable, ein numerisches Literal oder eine Konstante ist. c1 und c2 Komponenten von it sind. exp ein logischer Ausdruck ist, der Komponenten von it mit einbindet.

Die folgenden Punkte gelten:


Wenn from wa angegeben wird, wird die Zeile mit dem Inhalt von wa berschrieben. Wenn from wa nicht angegeben wird, wird die Zeile mit dem Inhalt der Kopfzeile berschrieben. Wenn index n angegeben ist, zeigt n die Zeilennummer an, die berschrieben wird. modify it kann innerhalb oder auerhalb von loop at it angegeben werden. Ist es auerhalb, mu index n angegeben werden. Ist es innerhalb, ist index n optional. Ist es nicht angegeben, wird die aktuelle Zeile modifiziert.

transporting gibt an, welche Komponenten berschrieben werden. Ohne transporting werden alle berschrieben. Der Rest bleibt unverndert. Gibt man eine where-Bedingung hinter transporting an, fhrt das dazu, da alle Komponenten berschrieben werden, die die where-Klausel erfllen. Die linke Seite jeder exp-Bedingung mu

eine Komponente von it angeben. Die gleiche Komponente kann hinter transporting und exp angegeben werden. Man kann modify it im Zusammenhang mit where benutzen:

innerhalb von loop at it mit dem Zusatz von index

Listing 12.5 zeigt ein Beispielprogramm, das den Inhalt einer internen Tabelle modifiziert. Listing 12.5: Man benutzt modify, um den Inhalt einer oder mehrerer Zeilen einer internen Tabelle zu berschreiben. 1 report ztx1205. 2 data: begin of it occurs 5, 3 f1 like sy-index, 4 f2, 5 end of it, 6 alpha(5) value 'ABCDE'. 7 8 do 5 times varying it-f2 from alpha+0 next alpha+1. 9 it-f1 = sy-index. 10 append it. 11 enddo. 12 13 it-f2 = 'Z'. 14 modify it index 4. 15 16 loop at it. 17 write: / it-f1, it-f2. 18 endloop. 19 20 loop at it. 21 it-f1 = it-f1 * 2. 22 modify it. 23 endloop. 24 25 skip. 26 loop at it. 27 write: / it-f1, it-f2. 28 endloop. 29 30 it-f2 = 'X'. 31 modify it transporting f2 where f1 <> 10. 32

33 34 35 36

skip. loop at it. write: / it-f1, it-f2. endloop.

Programm 12.5 zeigt die folgende Ausgabe: 1 2 3 5 5 A B C Z E

2 A 4 B 6 C 10 Z 10 E 2 X 4 X 6 X 10 Z 10 E

Die Zeilen 8 bis 11 addieren fnf Zeilen zu it. Jede Zeile enthlt eine sequentielle Nummer und einen Buchstaben aus dem Alphabet. Zeile 13 modifiziert den Inhalt von it-f2 mit dem Wert 'Z'. it-f1 wird nicht verndert, somit bleibt der zuletzt hinzugefgte Wert (5) erhalten. Zeile 14 berschreibt Zeile 4 mit dem Inhalt der Kopfzeile und verndert f1 zu 5 und f2 zu Z. Die Zeilen 20 bis 23 verarbeiten alle Zeilen von it und stellen eine Zeile nach der anderen in die Kopfzeile. Zeile 21 multipliziert den Inhalt der Kopfzeile der Komponente f1 mit 2. Zeile 22 kopiert den Inhalt der Kopfzeile zurck in die aktuelle Zeile des Rumpfes von it und berschreibt ihn. Zeile 30 verndert den Inhalt der Kopfzeile von Komponente f2 durch Zuweisung von 'X'. Zeile 31 verndert alle Zeilen im Rumpf, wobei f1 nicht gleich 10 ist. Nur der Wert von f2 wird aus der Kopfzeile kopiert und berschreibt f2-Werte im Rumpf. f1 bleibt unverndert im Rumpf und in der Kopfzeile.

Den Inhalt einer internen Tabelle lschen


Mit den folgenden Anweisungen lt sich der Inhalt einer internen Tabelle lschen:

free refresh

clear delete

Die Benutzung von free, um den Inhalt einer internen Tabelle zu lschen
Mit free lscht man Zeilen aus einer internen Tabelle und gibt den allokierten Speicher wieder frei. Die Syntax von free Im folgenden wird die Syntax von free erklrt. free it. wobei:

it eine interne Tabelle mit oder ohne Kopfzeile ist.

Die folgenden Punkte gelten:

Alle Zeilen werden gelscht, und der gesamte allokierte Speicher, der fr den Rumpf der internen Tabelle benutzt wurde, wird deallokiert. Die Kopfzeile, falls vorhanden, bleibt unverndert.

Man benutzt free, wenn die interne Tabelle nicht mehr gebraucht wird.

Obwohl der Speicher fr interne Tabellen automatisch nach Beendigung des Programms freigegeben wird, ist es effizienter, den Speicher selbst freizugeben. Der Grund dafr ist, da, wenn die Ausgabe dem Benutzer angezeigt wird, das Programm technisch noch nicht beendet ist. Alle Ressourcen bleiben allokiert, solange vom Anwender nicht die Schaltflche Zurck bettigt wird. Erst das setzt den Inhalt der internen Tabelle frei und beendet das Programm. Man kann den internen Tabelleninhalt frher freigeben, indem man die free-Anweisung an das Ende des Programms legt. Der Inhalt der internen Tabelle wird freigesetzt, bevor der Anwender die Liste sieht und nicht erst danach. Listing 12.6 zeigt, wie die free-Anweisung benutzt wird.

Listing 12.6: Die Benutzung der free-Anweisung, um Zeilen einer internen Tabelle zu lschen und Speicher freizugeben 1 report ztx1206. 2 data: begin of it occurs 3, 3 f1 like sy-index, 4 end of it. 5 6 do 3 times. 7 it-f1 = sy-index. 8 append it. 9 enddo. 10 11 loop at it. 12 write it-f1. 13 endloop. 14 15 free it. 16 if it[] is initial. 17 write: / 'no rows exist in it after free'. 18 endif. Das Programm erzeugt die folgende Ausgabe: 1 2 3 no rows exist in it after free Zeile 15 lscht alle Zeilen der internen Tabelle und gibt den Speicher frei.

Die Benutzung von refresh, um den Inhalt einer internen Tabelle zu lschen
Man benutzt refresh, um alle Zeilen einer internen Tabelle zu lschen, lt aber den Speicher allokiert. Syntax der refresh-Anweisung refresh it. wobei:

it eine interne Tabelle mit oder ohne Kopfzeile ist.

Die folgenden Punkte gelten:

Alle Zeilen werden gelscht. Der gesamte Speicher, der vom Rumpf der internen Tabelle benutzt wird, bleibt allokiert. Die Kopfzeile, wenn sie existiert, bleibt unverndert.

Man benutzt refresh, wenn alle Zeilen gelscht werden sollen, die interne Tabelle aber wieder benutzt werden soll. Schreibt man zum Beispiel einen Verkaufsbericht einer Zweigstelle, wird der Bericht mit allen mglichen Verkaufszahlen gefllt; die Daten werden verarbeitet und ausgeschrieben. Nach dem refresh-Kommando wird die Tabelle mit Zahlen anderer Zweigstellen gefllt, ausgeschrieben und so weiter. Wenn Sie beabsichtigen, die Tabelle sofort nach dem Lschen wieder mit Daten zu fllen, ist refresh geeigneter als free, da unntige Speicherbelegungen vermieden werden. Listing 12.7 zeigt, wie die refresh-Anweisung benutzt wird. Listing 12.7: Mit Hilfe von refresh alle Zeilen einer internen Tabelle lschen 1 report ztx1207. 2 data: begin of it occurs 3, 3 f1 like sy-index, 4 end of it, 5 i like sy-index. 6 7 do 3 times. 8 i = sy-index. 9 do 3 times. 10 it-f1 = i * sy-index. 11 append it. 12 enddo. 13 write: / ''. 14 loop at it. 15 write it-f1. 16 endloop. 17 refresh it. 18 enddo. 19 20 free it. Das Programm erzeugt die folgende Ausgabe 1 2 3 2 4 6 3 6 9

Zeile 7 beginnt mit einer Schleifenverarbeitung, die dreimal ausgefhrt wird. Sie enthlt eine verschachtelte innere Schleife. Zeile 8 speichert den aktuellen Wert von sy-index aus der ueren Schleife. In Zeile 9 fngt die innere Schleife an. In Zeile 10 wird die Anzahl der inneren Schleifendurchlufe mit der Anzahl der ueren multipliziert. Zeile 11 addiert jede Zeile zu der internen Tabelle. Zeile 13 fngt eine neue Ausgabezeile an. Die Zeilen 14 bis 16 schreiben den Inhalt der internen Tabelle aus. Zeile 17 lscht alle Zeilen aus der internen Tabelle, gibt aber den Speicher nicht frei. Hier wird refresh anstelle von free benutzt, weil die uere Schleife sich wiederholt und die interne Tabelle sofort wieder gefllt wird. Zeile 20 lscht alle Zeilen und gibt den Speicher fr die interne Tabelle frei, bevor die Liste angezeigt wird. Das macht das Programm effizienter.

Die Benutzung von clear mit einer internen Tabelle


Mit der clear-Anweisung kann man folgendes machen:

entweder alle Zeilen einer internen Tabelle lschen und den Speicher belegt lassen oder die Kopfzeile lschen (die Komponenten auf Null oder Leerzeichen setzen)

Die Syntax der clear-Anweisung bei Benutzung einer internen Tabelle Im folgenden wird die Syntax der clear-Anweisung im Zusammenhang mit der Benutzung einer internen Tabelle gezeigt. clear it | clear it[] wobei:

it der Name einer internen Tabelle ist.

Die folgenden Punkte gelten:

Wenn it eine Kopfzeile hat, lscht clear it[] alle Zeilen. Clear it lscht die Kopfzeile. Wenn it keine Kopfzeile hat, lschen beide alle Zeilen, lassen aber den Speicher allokiert.

Der Effekt von clear auf eine interne Tabelle ist in Tabelle 12.3 zusammengefat. Der Effekt von clear variiert, je nachdem, ob die interne Tabelle eine Kopfzeile hat oder nicht.

Tabelle 12.3: Der Effekt von clear auf eine interne Tabelle

Anweisung clear it

Wenn it eine Kopfzeile hat Wenn it keine Kopfzeile hat Lscht die Kopfzeile Lscht alle Zeilen Lscht alle Zeilen

clear it[] Lscht alle Zeilen

Das Programm in Listing 12.8 zeigt den Gebrauch von clear mit einer internen Tabelle. Listing 12.8: Die clear-Anweisung kann benutzt werden, um eine Kopfzeile oder den Inhalt einer internen Tabelle zu lschen. 1 report ztx1208. 2 data: begin of it occurs 3, 3 f1, 4 end of it. 5 6 it-f1 = 'X'. 7 append: it, it. 8 9 clear it. "it has a header line so clears the header line 10 write: 'f1=', it-f1. 11 12 write: / ''. 13 loop at it. 14 write it-f1. 15 endloop. 16 17 clear it[]. "same as: refresh it. 18 loop at it. 19 write it-f1. 20 endloop. 21 write: / 'sy-subrc=', sy-subrc. Das Programm erzeugt die folgende Ausgabe: f1= X X sy-subrc= 4

Zeile 6 stellt 'X' in die Kopfzeile von it. Zeile 7 hngt zwei Zeilen an it; beide haben 'X' in f1 stehen. Zeile 9 lscht die Kopfzeile von it. Zeile 10 schreibt Leerzeichen; damit wird angezeigt, da die Kopfzeile von it frei ist. Die Zeilen 13 bis 15 zeigen in der Ausgabe, da die interne Tabelle noch Daten enthlt.

Zeile 17 lscht den Rumpf von it, indem alle Zeilen gelscht werden, der Speicher aber allokiert bleibt. Der Inhalt der Kopfzeile bleibt unverndert. Die Zeilen 18 bis 20 produzieren keine Ausgabe, weil die interne Tabelle leer ist. Zeile 21 zeigt den Rckgabewert nach der Schleifenverarbeitung. Das besttigt wiederum, da keine Zeilen in der internen Tabelle existieren.

Die Benutzung von delete, um Zeilen aus einer internen Tabelle zu lschen
Mit delete lscht man eine oder mehrere Zeilen aus einer internen Tabelle. Die Syntax der delete-Anweisung Im folgenden wird die Syntax der delete-Anweisung gezeigt. delete it (a) [index n] (b) [from i] [to j] (c) [where exp] wobei:

n, i oder j numerische Literale, Variable oder Konstante sind. exp ein logischer Ausdruck ist, der die Komponenten von it mit einbindet.

Die folgenden Punkte gelten:


Die Ergnzungen, die den Punkten (a), (b) und (c) folgen, sind optional. Es kann nur ein Punkt (a), (b) oder (c) angegeben werden. delete it ohne Zusatz kann nur innerhalb loop at it benutzt werden. In diesem Fall wird die aktuelle Zeile gelscht. Wird index n angegeben, wird die n-te Zeile von it gelscht. Wird from i angegeben, werden Zeilen gelscht, die mit der i-ten anfangen. Wird to j angegeben, werden Zeilen von der j-ten einschlielich derselben gelscht. Wird from nicht mit to benutzt, wird from 1 angenommen. Der Ausdruck exp mu eine Komponente von it auf der linken Seite jedes Vergleichs haben. Hat zum Beispiel it die Komponenten f1 und f2, knnte exp so aussehen: where f1 = 'A' and f2 = 'B'.

Listing 12.9 zeigt ein Beispielprogramm, das Zeilen mit Hilfe der delete-Anweisung aus einer internen Tabelle lscht. Listing 12.9: Das Lschen von Zeilen kann ebenso mit der delete-Anweisung erfolgen. 1 report ztx1209.

2 data: begin of it occurs 12, 3 f1, 4 end of it, 5 alpha(12) value 'ABCDEFGHIJKL'. 6 7 do 12 times varying it-f1 from alpha+0 next alpha+1. 8 append it. 9 enddo. 10 11 loop at it. 12 write: / sy-tabix, it-f1. 13 endloop. 14 15 delete it index 5. 16 skip. 17 loop at it. 18 write: / sy-tabix, it-f1. 19 endloop. 20 21 delete it from 6 to 8. 22 skip. 23 loop at it. 24 write: / sy-tabix, it-f1. 25 endloop. 26 27 delete it where f1 between 'B' and 'D'. 28 skip. 29 loop at it. 30 write: / sy-tabix, it-f1. 31 endloop. 32 33 loop at it where f1 between 'E' and 'J'. 34 delete it. 35 endloop. 36 37 skip. 38 loop at it. 39 write: / sy-tabix, it-f1. 40 endloop. 41 42 read table it with key f1 = 'K' binary search. 43 write: /, / 'sy-subrc=', sy-subrc, 'sy-tabix=', sy-tabix, / ''. 44 if sy-subrc = 0. 45 delete it index sy-tabix. 46 endif. 47

48 49 50 51 52 53

skip. loop at it. write: / sy-tabix, it-f1. endloop. free it.

Das Programm erzeugt die folgende Ausgabe: 1 A 2 B 3 C 4 D 5 E 6 F 7 G 8 H 9 I 10 J 11 K 12 L 1 A 2 B 3 C 4 D 5 F 6 G 7 H 8 I 9 J 10 K 11 L 1 2 3 4 5 6 7 8 A B C D F J K L

1 A 2 F 3 J

4 K 5 L 1 A 2 K 3 L sy-subrc= 0 sy-tabix= 2 1 A 2 L

Die Zeilen 7 bis 9 fllen it mit zwlf Zeilen mit Werten von 'A' bis 'L'. Die Zeilen 11 bis 13 schreiben den Inhalt der internen Tabelle. Zeile 15 lscht die fnfte Zeile, indem 'E' aus der Tabelle entfernt wird. Zeile 21 lscht die sechste bis achte Zeile, indem G, H und I aus der internen Tabelle entfernt werden. Die neunte Zeile wird die sechste und so weiter. Zeile 27 lscht Zeilen, die f1-Werte von 'B' bis einschlielich 'D' haben. Das fhrt dazu, da die zweite, dritte und vierte Zeile gelscht werden. Zeile 33 liest Zeilen, die f1-Werte zwischen 'E' und 'J' haben. Die Zeilen 2 und 3 erfllen diese Kriterien. Die delete-Anweisung auf Zeile 34 hat keine Zustze, somit lscht sie die aktuelle Zeile bei jedem Schleifendurchgang, was dazu fhrt, da die zweite und dritte Zeile gelscht werden. Zeile 42 lokalisiert die Zeile, in der f1 den Wert 'K' hat. Obwohl it nur drei Zeilen enthlt, wird binary search der Vollstndigkeit halber benutzt. Zeile 45 wird ausgefhrt, da sy-subrc Null ist. Es lscht Zeile 2, indem es 'K' aus der internen Tabelle entfernt.

hnlich wie Einfgungen berhren Lschungen innerhalb von loop at it die interne Tabelle nicht sofort, werden aber beim nchsten Schleifendurchgang effektiv. Wird eine Zeile hinter der aktuellen Zeile gelscht, wird die Tabelle bei endloop reindexiert, sy-tabix wird hochgezhlt, und der nchste Schleifendurchgang verarbeitet die Zeile, auf die von sy-tabix gezeigt wird. Nehmen wir zum Beispiel an, wir befinden uns im dritten Schleifendurchgang, und Zeile 4 wird gelscht. Wird endloop ausgefhrt, wird also diese Zeile gelscht, Zeile 5 wird Zeile 4 und so weiter. sy-tabix wird um 1 hochgezhlt und der nchste Schleifendurchgang verarbeitet den nchsten Satz. Befindet man sich innerhalb einer Schleife, und es wird eine Zeile vor der aktuellen gelscht, wird die Tabelle bei endloop reindexiert. Dieses Mal jedoch wird sy-tabix um 1 hochgezhlt abzglich der Anzahl von Zeilen, die vor der aktuellen gelscht wurden. Beim nchsten Schleifendurchgang wird die Zeile verarbeitet, die der aktuellen folgt. Angenommen, im dritten Schleifendurchgang wird Zeile 3 gelscht. Bei endloop wird Zeile 4 zu Zeile 3 und so weiter. Sy-tabix wird mit 0 hochgezhlt. Zeile 4 wurde reindexiert zu 3, somit wird sie beim nchsten Schleifendurchgang verarbeitet.

Das Anlegen von Top-Ten-Listen mit Hilfe von append sorted by


Nehmen Sie an, Sie werden gebeten, eine Liste der zehn erfolgreichsten Vertriebsbeauftragten in Ihrer Firma zu erstellen. Das knnten Sie folgendermaen angehen:

Es werden alle Reprsentanten und ihre Verkaufszahlen in einer internen Tabelle erfat. Sie werden in absteigender Reihenfolge sortiert. Die ersten zehn werden ausgedruckt.

Das sieht nach einem gangbaren Weg aus. Jedoch kann man mit append sorted by oftmals bessere Ergebnisse erzielen.

Die Syntax von append sorted by


Im folgenden wird die Syntax von append sorted by erklrt. append [wa to] it sorted by c. wobei:

it der Name einer internen Tabelle ist. wa ein Arbeitsbereich ist, der die gleiche Struktur wie die Zeilen der internen Tabelle hat. c eine Komponente von it ist.

Die folgenden Punkte gelten:

Wenn wa nicht angegeben ist, wird die Zeile, die angehngt werden soll, aus der Kopfzeile herausgenommen. Ist wa angegeben, wird die Zeile, die angehngt werden soll, aus dem Arbeitsbereich wa genommen. Es kann nur eine Komponente c angegeben werden.

Die append sorted by-Anweisung nimmt eine Zeile aus dem Arbeitsbereich und fgt sie in der internen Tabelle dort ein, wohin sie der Reihenfolge nach gehrt. Sie hat zwei ungewhnliche Eigenschaften:

Die Anzahl der Zeilen, die angehngt werden knnen, ist durch den Wert der occursKlausel begrenzt. Ist die occurs-Klausel zum Beispiel 10, knnen maximal zehn Zeilen an die interne Tabelle angehngt werden. Nur in diesem Fall limitiert occurs die Anzahl der Zeilen, die einer internen Tabelle hinzugefgt werden knnen. Sie sortiert nur in absteigender Reihenfolge.

Der Seiteneffekt ist eine Top n List, wobei n der Zahl in der occurs-Klausel entspricht. Mit jedem append durchsucht das System den existierenden Tabelleninhalt, um zu bestimmen, wo die neue Zeile hineinpat. Die Sortierreihenfolge ist von c absteigend. Sind weniger Zeilen in der internen Tabelle als mit n in der occurs-Klausel angegeben, steht die Zeile in der Tabelle gem der Sortierreihenfolge. Sind n Zeilen in der internen Tabelle, wird die Zeile gem der Sortierreihenfolge eingefgt, und die letzte Zeile wird aufgegeben. Existiert der Wert von c in der internen Tabelle, wird die neue Zeile immer an die existierende Zeile mit dem gleichen Wert angehngt. Deshalb, wenn occurs 3 ist und Zeile 3 ein 'X' in c enthlt, wird keine neue Zeile angehngt, die ein 'X' in c enthlt. Listing 12.10 zeigt ein Beispielprogramm, das eine Liste der drei besten Verkufer erstellt. Listing 12.10: Verwendung von append sorted by, um die drei besten Verkufer herauszufinden 1 report ztx1210. 2 data: begin of it occurs 3, 3 sales type p decimals 2, 4 name(10), 5 end of it. 6 7 it-sales = 100. 8 it-name = 'Jack'. 9 append it sorted by sales. 10 11 it-sales = 50. 12 it-name = 'Jim'. 13 append it sorted by sales. 14 15 it-sales = 150. 16 it-name = 'Jane'. 17 append it sorted by sales. 18 19 it-sales = 75. 20 it-name = 'George'. 21 append it sorted by sales. 22 23 it-sales = 200. 24 it-name = 'Gina'. 25 append it sorted by sales. 26 27 it-sales = 100. 28 it-name = 'Jeff'. 29 append it sorted by sales. 30 31 loop at it.

32 write: / it-sales, it-name. 33 endloop. Das Programm erzeugt die folgende Ausgabe: 200.00 Gina 150.00 Jane 100.00 Jack

Die Zeilen 2 bis 5 definieren eine interne Tabelle mit dem occurs-Wert von 3. Wenn diese internen Tabelle mit append sorted by gefllt ist, wird die maximale Anzahl an Zeilen in der internen Tabelle auf drei begrenzt. Die Zeilen 7 und 8 weisen der Kopfzeile Werte zu. Zeile 9 durchsucht it, um die neue Zeile an die richtige Stelle zu setzen. Die interne Tabelle ist leer, somit wird die Zeile einfach angehngt (s. Abbildung 12.1).

Abbildung 12.1: Es existieren keine Zeilen in der internen Tabelle, somit wird die erste Zeile einfach angehngt.

50 kommt nach 100, wenn die Verkufe absteigend sortiert werden, also fgt Zeile 13 die neue Zeile hinter der schon existierenden ein (s. Abbildung 12.2).

Abbildung 12.2: Die zweite Zeile wird in der korrekten Sortierfolge eingefgt, somit kommt sie direkt nach der ersten Zeile.

150 kommt vor 100, d.h. Zeile 15 fgt die neue Reihe vor der ersten ein. Die interne Tabelle enthlt nun die maximale Zeilenanzahl (s. Abbildung 12.3).

Abbildung 12.3: Diesmal diktiert die Sortierreihenfolge, da die neue Zeile vor der ersten eingefgt wird.

75 kommt hinter 100, somit fgt Zeile 21 die neue Zeile hinter der zweiten Zeile ein, und die neue Zeile wird Zeile 3. Die dritte Zeile wrde zur vierten, die Tabelle kann aber nur drei Zeilen halten, somit wird die vierte ausgelassen (s. Abbildung 12.4).

Abbildung 12.4: Diese Zeile pat hinter die zweite, somit wird sie dort eingefgt. Die interne Tabelle kann maximal drei Zeilen aufnehmen, somit wird die vierte aufgegeben.

200 kommt vor 150, somit fgt Zeile 25 die Zeile vor der ersten Zeile ein. Der Rest der Zeilen wird nach unten verschoben, und die letzte Zeile wird weggelassen (s. Abbildung 12.5).

Abbildung 12.5: Diesmal soll die neue Zeile zuerst kommen. Die existierenden Zeilen werden nach unten gedrckt, und die letzte Zeile wird aufgegeben.

100 kommt hinter 150, 100 ist aber schon da. Zeile 29 versucht also, die neue Zeile hinter den existierenden Wert von 100 zu setzen. Somit wrde daraus Zeile 4, deshalb wird die Zeile nicht eingefgt (s. Abbildung 12.6).

Abbildung 12.6: Die neue Zeile wird allen existierenden Zeilen mit gleichem Wert folgen. Somit wre sie Zeile 4 und wird deshalb nicht eingefgt. Vermischen Sie nicht append sorted by mit anderen Anweisungen, die Daten an eine interne Tabelle hngen (wie insert oder append). Wenn sie it mit append sorted by fllen, sollte das auch die einzige Anweisung bleiben. Ein Vermischen dieser Anweisungen bewirkt unvorhersehbare Verhaltensweisen.

Mit append sorted by arbeiten Sie effektiver, wenn Sie einer internen Tabelle eine Zeile nach der anderen anhngen. Wenn Sie die Daten schon in einer

Datenbanktabelle haben und nur die Top Ten-Werte finden wollen, ist es ratsam, die Zeilen mit Feldoperationen einzulesen und dann zu sortieren. (Informationen ber Feldoperationen finden Sie in Kapitel 13, Interne Tabellen, Teil2.)

Eine interne Tabelle mit collect fllen


Mit Hilfe der collect-Anweisung knnen Sie beim Fllen von internen Tabellen Gesamtsummen bilden.

Die Syntax der collect-Anweisung


collect [wa into] it. Wobei:

it eine interne Tabelle ist. wa ein Arbeitsbereich ist, der die gleiche Struktur wie it hat.

Die folgenden Punkte gelten:

Wenn wa into angegeben ist, wird die Zeile, die gesammelt werden soll, aus dem Arbeitsbereich genommen. In diesem Fall wird die Kopfzeile der internen Tabelle ignoriert, sofern es eine bei it gibt. Wenn wa into nicht angegeben ist, mu die interne Tabelle eine Kopfzeile haben. Die Zeile, die gesammelt wird, wird aus der Kopfzeile von it genommen.

Wenn collect ausgefhrt wird, formt das System einen Schlssel aus dem Standardschlssel des Arbeitsbereichs. Die Standardschlsselfelder sind die Zeichenfelder (Typ c, n, d, t und x). Somit wird der Schlssel aus den Werten aller Felder von Typ c, n, d, t und x zusammengesetzt. Es ist dabei egal, ob sie nebeneinander stehen oder voneinander durch andere Felder getrennt sind. Das System durchsucht den Rumpf der internen Tabelle nach einer Zeile, die den gleichen Schlssel im Arbeitsbereich hat. Findet es keinen, wird die Zeile ans Ende der Tabelle gehngt. Findet es einen, werden die numerischen Felder (Typ i, p und f) aus dem Arbeitsbereich in die korrespondierenden Felder des gefundenen Satzes hinzugefgt. Listing 12.11 zeigt dies. Listing 12.11: collect verbindet Zeilen, wie sie der internen Tabelle hinzugefgt werden. 1 2 3 4 5 report ztx1211. data: begin of it occurs 10, date type d, " part of default key tot_sales type p decimals 2, "not part of default key name(10), " part of default key

6 num_sales type i value 1, "not part of default key 7 end of it. 8 9 it-date = '19980101'. 10 it-tot_sales = 100. 11 it-name = 'Jack'. 12 collect it. 13 14 it-date = '19980101'. 15 it-tot_sales = 200. 16 it-name = 'Jim'. 17 collect it. 18 19 it-date = '19980101'. 20 it-tot_sales = 300. 21 it-name = 'Jack'. 22 collect it. 23 24 it-date = '19980101'. 25 it-tot_sales = 400. 26 it-name = 'Jack'. 27 collect it. 28 29 it-date = '19980101'. 30 it-tot_sales = 500. 31 it-name = 'Jim'. 32 collect it. 33 34 it-date = '19980101'. 35 it-tot_sales = 600. 36 it-name = 'Jane'. 37 collect it. 38 39 it-date = '19980102'. 40 it-tot_sales = 700. 41 it-name = 'Jack'. 42 collect it. 43 44 loop at it. 45 write: / it-date, it-tot_sales, it-name, it-num_sales. 46 endloop. Das Programm erzeugt die folgende Ausgabe: 19980101 800.00 Jack 3 19980101 700.00 Jim 2

19980101 600.00 Jane 1 19980102 700.00 Jack 1

Die Zeilen 2 bis 7 definieren eine interne Tabelle mit vier Komponenten. Zwei sind Zeichentypen (date und name), und zwei sind numerisch (tot_sales und num_sales). Der Standardschlssel ist somit zusammengesetzt aus den Komponenten date und name. Die Zeilen 9 bis 11 weisen den Kopfzeilenkomponenten date, tot_sales und name Werte zu. Num_sales hat immer noch den Standardwert 1, zugewiesen in Zeile 6. Zeile 12 durchsucht den Rumpf von it nach einer Zeile, die den gleichen Wert in date und name (den Standardschlsselfeldern) hat wie in der Kopfzeile. Die interne Tabelle ist leer, somit passen keine Zeilen zueinander. Die Kopfzeile wird somit der internen Tabelle angehngt (s. Abbildung 12.7).

Abbildung 12.7: Wenn der Standardschlssel nicht im Rumpf gefunden wird, wird die Zeile angehngt. Der Standardschlssel ist aus allen nicht-numerischen Feldern zusammengesetzt, also ist er in diesem Diagramm die Kombination von date (erstes Feld) und name (drittes Feld).

Zeile 17 verhlt sich hnlich wie Zeile 12. Die interne Tabelle hat eine Zeile; die Werte in den date- und name-Feldern passen nicht zueinander, somit wird die Kopfzeile der internen Tabelle angehngt (s. Abbildung 12.8).

Abbildung 12.8: Abermals wird der Standardschlssel nicht in der Tabelle gefunden, also wird die Zeile angehngt.

Zeile 22 durchsucht die interne Tabelle nach einer Zeile, die '19980101' im Datumsfeld (date) enthlt und Jack im Namensfeld (name). Zeile 1 pat, und die numerischen Felder werden zusammengelegt. Das Kopfzeilenfeld tot_sales enthlt 2000. Das wird dem tot_sales-Feld in Zeile 1 hinzugefgt und liefert als Resultat 300. Der Wert im Feld num_sales der Kopfzeile wird nun auch dem num_sales- Feld in Zeile 1 mit einem Wert von 2 hinzugefgt. Zeile 1 wird mit diesen Werten aktualisiert. Der Inhalt der Kopfzeile bleibt unverndert (s. Abbildung 12.9).

Abbildung 12.9: Dieses Mal pat der Standardschlssel zur ersten Zeile der Tabelle. Die numerischen Felder in diesem Arbeitsbereich werden den korrespondierenden Feldern der ersten Zeile hinzugefgt.

Zeile 27 sucht nach einer Zeile mit dem Datum '19980101' und dem Namen 'Jack'. Zeile 1 pat, somit kann der Inhalt der numerischen Felder (tot_sales und num_sales) der Kopfzeile den numerischen Feldern in der gefundenen Zeile hinzugefgt werden (s. Abbildung 12.10).

Abbildung 12.10: Abermals pat der Standardschlssel zur ersten Zeile der Tabelle. Die numerischen Felder in diesem Arbeitsbereich werden den korrespondierenden Feldern der ersten Zeile hinzugefgt.

Zeile 32 pat zu Zeile 2 und addiert '500' zu tot_sales und 1 zu num_sales (s. Abbildung 12.11).

Abbildung 12.11: Dieses Mal pat der Standardschlssel zur zweiten Zeile der Tabelle. Die numerischen Felder im Arbeitsbereich werden den korrespondierenden Feldern in der zweiten Zeile hinzugefgt.

Auf Zeile 37 passen die Werte in date und name (die Standardschlsselfelder) der Kopfzeile auf keine Zeile in it, somit wird eine neue Zeile an das Ende der Tabelle angehngt (s. Abbildung 12.12).

Abbildung 12.12: Der Standardschlssel pat dieses Mal zu keiner Zeile, deshalb wird eine neue Zeile angehngt.

Zeile 42 hngt eine neue Zeile der internen Tabelle an, weil die Werte in date und name zu keiner Zeile in it passen (s. Abbildung 12.13).

Abbildung 12.13: Abermals pat der Standardschlssel zu keiner Zeile, so da noch eine neue Zeile angehngt wird.

Benutzt man collect, um Zeilen einer internen Tabelle hinzuzufgen, sollten alle Zeilen mit collect hinzugefgt werden. Man sollte collect nicht zusammen mit append oder irgendeiner anderen Anweisung mischen, um Daten einer internen Tabelle hinzuzufgen. Das Ergebnis ist nicht voraussehbar. Die einzige Anweisung, die man zum ndern von internen Tabelleninhalten benutzten kann, die mit collect gefllt wurden, ist modify ... transporting f1 f2 ..., wobei f1 und f2 numerische Felder sind (keine Standardschlsselfelder).

Zusammenfassung

Der Tabellenrumpf-Operator ermglicht es, die Existenz von Daten zu prfen, zwei interne Tabellen auf bereinstimmung zu vergleichen oder eine interne Tabelle zu duplizieren. Die describe table-Anweisung stellt die Anzahl der internen Zeilenanzahl in sytfill, die Breite einer Zeile in Byte in sy-tleng und die Gre der occurs -Klausel in sy-toccu. Um Teile einer internen Tabelle von einer zur anderen zu kopieren, benutzt man append lines of oder insert lines of. editor-call zeigt den Inhalt einer Tabelle in einem Editor an. Das ermglicht dem Anwender, Daten zu ndern. Gleichzeitig ist es ein gutes Werkzeug, um Fehler zu finden. Mit insert wird eine Zeile an einer beliebigen Stelle innerhalb der internen Tabelle hinzugefgt. Die Position kann mit Hilfe eines Index bestimmt werden, oder man kann damit innerhalb einer Schleife die aktuelle Zeile bearbeiten. modify ndert den Inhalt einer oder mehrerer Zeilen. Die Zeile kann mit Hilfe eines Index

bestimmt werden, oder man kann damit innerhalb einer Schleife die aktuelle Zeile bearbeiten. Benutzt man zustzlich die where-Klausel, kann der Inhalt vieler Zeilen gendert werden. Mit delete werden eine oder mehrere Zeilen entfernt. Wird delete innerhalb einer Schleife ohne Zusatz benutzt, wird die aktuelle Zeile gelscht. Man kann auch einen Einzelindex, einen Indexbereich oder die where-Klausel benutzen. clear it lscht die Kopfzeile von it. Gibt es keine Kopfzeile, werden alle Zeilen gelscht. Clear it[] lscht immer alle Zeilen aus it. Der interne Tabellenspeicher bleibt allokiert. Refresh lscht immer alle Zeilen und lt den Speicher allokiert. Es entspricht genau dem clear it[]. Man benutzt refresh, wenn man eine interne Tabelle wieder mit Daten fllen will. free it lscht alle Zeilen aus it und setzt den Speicher frei. Es sollte innerhalb des Programms sofort nach der Verarbeitung der internen Tabelle gesetzt werden. Mit append sorted by legt man Top-Ten-Listen an, statt Zeile fr Zeile anzuhngen und sie dann zu sortieren. Mit Hilfe von collect werden innerhalb einer internen Tabelle Summen ausgegeben, whrend sie gefllt wird. Man kann collect auch zum berprfen aller Eintrge auf Gleichheit benutzen. Nicht erlaubt Fgen Sie niemals Zeilen fr Zeile ein, wenn diese als Gruppe mit dem Befehl insert lines of oder append lines of zusammengefat werden knnen.

Erlaubt Benutzen Sie die free-Anweisung am Programmende fr alle internen Tabellen. Dies gibt Speicher frei, der nicht mehr gebraucht wird, wenn der Anwender sich die Tabelle ansieht. Benutzen Sie den Tabellenrumpf-Operator, um die Existenz von Daten innerhalb einer Tabelle zu berprfen. Benutzen Sie append sorted by, wenn Sie Top-Ten-Listen erstellen, solange die Liste noch nicht existiert und nur sortiert werden mu.

Frage & Antwort


Frage: In diesem Kapitel haben wir viele Mglichkeiten kennengelernt, hnliche Aufgaben zu lsen. Es hat den Anschein, als ob man in ABAP/4 immer verschiedene Mglichkeiten des Lsungsansatzes hat. Warum wird nicht einfach der beste Weg gezeigt und auf den Rest verzichtet?

Antwort: Es gibt einige Grnde, die fr den hier beschriebenen Weg sprechen: 1. Effektivitt und 2. das Verstehen des Programm-Codes. An der Datenmenge gemessen ist Effektivitt das primre Ziel der ABAP/4-Programmierung. Sie sollen die effizientesten Mglichkeiten der Anweisungen kennenlernen. Das kann als Ergebnis drastische Leistungssteigerungen nicht nur fr Ihr Programm bewirken. Es ist nicht unblich, Programm-Code nach bernahme in die Produktion zu berarbeiten. Da Programmierer mehr in existierenden Programm-Codes lesen als neue anlegen, sollte man verschiedene Variationen dieser Anweisungen kennen. Wenn man den SAP-Code nicht versteht, ist man auch nicht in der Lage zu verstehen, wie die Daten an die gegenwrtige Stelle kommen oder wie die Ausgabe funktioniert.

Workshop
Der Workshop bietet Ihnen zwei Mglichkeiten, Ihr gelerntes Wissen umzusetzen. Im Prfungsabschnitt werden Fragen gestellt, um Ihr Verstndnis fr den Stoff zu vertiefen, und im bungsabschnitt knnen Sie Erfahrungen sammeln, indem Sie das Erlernte anwenden. Antworten auf die Prfungsaufgaben und bungen finden Sie im Anhang B (Antworten zu Kontrollfragen und bungen).

Kontrollfragen
1. Wenn ich innerhalb einer Schleife sy-tabix ndere, ndert das die aktuelle Zeile? Zum Beispiel wrden sich die insert, modify und delete-Anweisungen auf die Zeile im Arbeitsbereich auswirken oder auf die Zeile, die ber sy-tabix angezeigt wird? 2. Wann gebrauche ich sy-toccu? Warum mu ich den Wert der occurs-Klausel whrend der Laufzeit wissen?

bung 1
Lesen Sie den Inhalt von ztxlfa1 in eine interne Tabelle ein (benutzen Sie select into table). Dann ndern Sie die land1-Spalte, so da die dritte Zeile 'US' enthlt ( benutzen Sie modify transporting where). ndern Sie auch regions, indem Sie alle MA in TX ndern (benutzen Sie modify transporting where).

Ein Imprint des Markt&Technik Buch- und Software-Verlag GmbH. Elektronische Fassung des Titels: ABAP/4 in 21 Tagen, ISBN: 3-8272-2016-X

Woche 2

Tag 13 Interne Tabellen, Teil 2


Kapitelziele
Wenn Sie dieses Kapitel beendet haben, knnen Sie:

eine interne Tabelle aus einer Datenbanktabelle mit Hilfe der leistungsfhigsten Konstrukte fllen einen Gruppenwechsel mit Hilfe von at und on change of ausfhren

Eine interne Tabelle mit Daten aus einer Datenbanktabelle fllen


Hufig stehen in ABAP/4 Daten, die man aus einer oder mehr Datenbanktabellen in eine interne Tabelle einlesen will. In diesem Abschnitt soll der effektivste Weg dahin aufgezeigt werden. Es gibt zwei Mglichkeiten, eine interne Tabellen mit Daten aus der Datenbanktabelle zu fllen:

durch das direkte Einlesen von Zeilen in die interne Tabelle durch Einlesen von einzelnen Zeilen in einen Arbeitsbereich, um sie dann der internen Tabelle anzuhngen

Direktes Einlesen von Zeilen in eine interne Tabelle


Um Zeilen direkt in eine interne Tabelle einzulesen, benutzt man die Ergnzung into table zur SQLAnweisung select. Diese Anweisung nimmt die selektierten Zeilen und liest sie in Einzeloperationen, auch als Feldoperation bezeichnet, in die interne Tabelle. Es werden keine Arbeitsbereiche belegt oder bentigt. Unter einer Feldoperation versteht man Anweisungen, die Befehle an mehrere Zeilen interner Tabellen ausfhren, anstatt Einzelstze zu verarbeiten. Feldoperationen sind immer wirksamer als

Einzelsatzoperationen.

Mit select into table beschreitet man den effizientesten Weg, eine interne Tabelle aus der Datenbank zu fllen. Die Syntax fr den Zusatz into table der select-Anweisung Die folgende Beschreibung zeigt die Syntax fr den Zusatz into table der select- Anweisung. (a) select * (b) select f1 f2 . . . from dbtab into [corresponding fields of] table it. wobei:

dbtab der Name der Datenbanktabelle ist. f1 und f2 Felder innerhalb dbtab sind. it der Name der internen Tabelle ist.

Folgende Punkte gelten:


it kann eine Kopfzeile haben. andere Zustze, wie where und order by knnen auf it folgen. es wird kein endselect mit into table benutzt. select into fngt auch keine Schleifenverarbeitung an, deshalb wird konsequenter Weise kein endselect bentigt.

Die select into table-Anweisung stellt alle selektierten Zeilen direkt in den Rumpf von it. Existierende interne Tabelleninhalte werden zuerst aufgegeben. Listing 13.1 beinhaltet ein Beispielprogramm mit select into table. Listing 13.1: Dieses Programm liest direkt aus einer Datenbanktabelle in eine interne Tabelle. 1 2 3 4 5 6 7 8 report ztx1301. tables ztxlfa1. data it like ztxlfa1 occurs 23 with header line. select * from ztxlfa1 into table it. "don't code an endselect loop at it. write: / it-lifnr, it-name1. endloop.

9 10 11 12 13

select * from ztxlfa1 into table it where lifnr between 'V2' and 'V5'. skip. loop at it.

14 write: / it-lifnr, it-name1. 15 endloop. 16 free it. Das Programm aus Listing 13.1 erzeugt die folgende Ausgabe: V9 Code Now, Specs Later Ltd. 1000 Parts Unlimited 1010 Industrial Pumps Inc. 1020 Chemical Nation Ltd. 1030 ChickenFeed Ltd. 1050 The Bit Bucket 1060 Memory Lane Ltd. 1070 Flip My Switch Inc. V10 Duncan's Mouse Inc. V6 Anna Banana Ltd. V8 Smile When You Say That Ltd. V11 Weiner Schnittsel Inc. V12 Saurkrouten 1040 Motherboards Inc. 1080 Silicon Sandwich Ltd. 1090 Consume Inc. 2000 Monitors and More Ltd. V1 Quantity First Ltd. V2 OverPriced Goods Inc. V3 Fluffy Bunnies Ltd. V4 Moo like a Cow Inc. V5 Wolfman Sport Accessories Inc. V7 The Breakfast Club Inc. V2 V3 V4 V5 OverPriced Goods Inc. Fluffy Bunnies Ltd. Moo like a Cow Inc. Wolfman Sport Accessories Inc.

Zeile 5 holt alle Datenbankzeilen aus der Tabelle ztxlfa1 und stellt sie direkt in den Rumpf der internen Tabelle it. Die Kopfzeile wird nicht benutzt und ihr Inhalt bleibt unverndert. Zeile 10 ist hnlich Zeile 5, auer da sie Kreditorennummern zwischen V2 und V5 bezieht. Der existierende Inhalt von it wird gelscht, bevor sie gefllt wird.

Benutzen Sie nie endselect mit der select into table-Anweisung, sonst entsteht ein Syntaxfehler.

Die Sortierung und select into table

Nehmen Sie an, Ihr Programm liest schon Daten in eine interne Tabelle. Wenn diese Daten sortiert werden mssen, benutzt man die sort-Anweisung. Benutzen Sie nicht order by bei der select-Anweisung, auch dann nicht, wenn diese Felder von einem Index untersttzt werden. Messungen zeigen, da die sortAnweisung etwas schneller ist. Auch wenn sie vergleichbar wren, wre sort nach wie vor die bessere Methode.

Benutzen Sie nie order by mit select into table, sondern sort in der internen Tabelle. Die Felder, die man auswhlt, mssen in die interne Tabelle passen Stellen wir uns folgendes vor:

Eine Zeile wird aus dbtab geholt. Eine Zeile wird in der internen Tabelle it allokiert. Die Zeile von dbtab wird Byte fr Byte in die neue Zeile in it bertragen.

Abbildung 13.1: Die Datenbanktabelle ztx1302 enthlt drei Felder: f1, f2 und f3. f1 ist ein einzelnes Byte, f2 ist zwei Byte lang und f3 ein Byte.

Abbildung 13.2: Der * bewirkt, da alle Felder nacheinander aus der Datenbanktabelle ztx1302 selektiert werden. Sie passen exakt in jede Zeile von it, da die Struktur von it zur Struktur der Datenbanktabelle pat.

Abbildung 13.3: In diesem Beispiel werden nur die ersten zwei Felder mit insgesamt drei Byte aus der Datenbanktabelle ztx1302 selektiert. Sie werden Byte fr Byte in die ersten drei Byte jeder Zeile von it gestellt.

Abbildung 13.4: Abermals werden die ersten zwei Felder aus der Datenbanktabelle ztx1302 selektiert, aber diemal in unterschiedlicher Reihenfolge, wie sie in der internen Tabelle erscheinen. Daraus entstehen korrupte Daten, wenn sie Byte fr Byte in jede Zeile von it gestellt werden. it-f1 empfngt das erste Byte von f2, und it-f2 empfngt das letzte Byte von f2 und ein Byte von f1. Jede Zeile von dbtab wird Byte fr Byte in eine neue Zeile von it bertragen, was der Zuweisung einer Feldleiste an die nchste entsprche. Es gibt nur einen Unterschied zwischen dieser und einer Feldleistenzuweisung: dbtab kann kleiner (in Byte) sein als it, aber nicht lnger. Wenn sie lnger ist, erfolgt ein Abbruch (short dump) mit der Meldung (Error SAPSQL_SELECT_TAB_TOO_SMALL). Die Datentypen und Lngen eines jeden Sendefeldes in dbtab sollten in das Empfangsfeld von it passen. Die briggebliebenen Felder in it werden mit Initialwerten (Leerzeichen oder Nullen) aufgefllt. Abbildung 13.1 bis 13.4 zeigen diesen Zusammenhang auf.

Tabelle 13.1 zeigt eine Zusammenfassung der Regeln von select mit into table. Die selektierten Felder mssen in die interne Tabelle passen. Tabelle 13.1 macht Sie mit den Restriktionen bekannt.

Tabelle 13.1: Regeln fr die Benutzung von select mit into table Anweisung select * Welche Felder werden selektiert? Restriktionen Alle Felder in der Datenbank Die interne Tabelle mu letztlich genauso viele Felder haben wie die Datenbanktabelle, und die Felder mssen mit Feldern der Datenbanktabelle bereinstimmen. Die interne Tabelle mu mit einem Feld wie f1 anfangen oder aber ein Feld wie f1 haben.

select f1 f1 aus der Datenbanktabelle Listing 13.2 und 13.3 illustrieren dieses Konzept.

Listing 13.2: Was passiert, wenn sich die Tabellenstruktur bei der select into-Anweisung unterscheidet? 1 report ztx1302. 2 tables ztxlfa1. 3 data begin of it occurs 2. 4 include structure ztxlfa1. 5 data: invoice_amt type p, 6 end of it. 7 8 select * from ztxlfa1 into table it where land1 = 'DE'. 9 loop at it. 10 write: / it-lifnr, it-land1, it-regio, it-invoice_amt. 11 endloop. 12 13 skip. 14 select lifnr land1 regio from ztxlfa1 into table it where land1 = 'DE'. 15 loop at it. 16 write: / it-mandt, it-lifnr, it-land1, it-regio. 17 endloop. 18 free it. Das Programm aus Listing 13.2 zeigt die folgende Ausgabe: V11 DE 07 0 V12 DE 14 0 V8 DE 03 0

V11 DE 07 V12 DE 14 V8 DE 03

Zeile 3 definiert it, als wenn alle Felder der DDIC-Struktur ztxlfa1 plus einem zustzlichen Feld vorhanden seien. Zeile 8 selektiert alle Felder aus ztxlfa1. Sie fllen den Anfang einer jeden Zeile in it. Invoice_amt ist auf Null gesetzt. Zeile 14 selektiert lifnr, land1 und regio in den ersten Teil einer jeden Zeile von it. Es beginnt allerdings mit mandt und nicht lifnr, da die DDIC-Struktur von ztxlfa1 mit mandt anfngt. Die Ausgabe zeigt, da die ersten drei Byte von lifnr in it-mandt aufhren, itlifnr wird drei Byte nach links gerckt und enthlt auch land1. regio ist leer. Listing 13.3: Ihr Programm wird einen Fehler produzieren, wenn Sie versuchen, mehr Felder in die interne Tabelle zu legen, als dafr vorgesehen sind.

1 report ztx1303. 2 tables ztxlfa1. 3 data: begin of it occurs 23, 4 lifnr like ztxlfa1-lifnr, "this is a char 10 field 5 land1 like ztxlfa1-land1, "this is a char 3 field 6 end of it. 7 8 *The next line causes a short dump. The internal table is too narrow. 9 select * from ztxlfa1 into table it. Das Programm aus Listing 13.3 zeigt die folgende Ausgabe (s. Abbildung 13.5).

Abbildung 13.5: Dieser Abbruch tritt auf, wenn der Report ztx1303 ausgefhrt wird. Es wurden mehr Felder selektiert, als in die interne Tabelle passen.

Zeile 3 definiert eine interne Tabelle, die zwei Komponenten hat. Die Gesamtlnge von it ist 13 Byte. Zeile 9 selektiert alle Felder aus ztxlfa1 nach it. Die Gesamtlnge aller Felder ist grer als 13 Byte. Somit bricht konsequenterweise das Programm ab.

Die Benutzung von corresponding fields Wenn sich die Komponenten der internen Tabelle nicht in der gleichen Reihenfolge wie die der Datenbank befinden oder sie nicht dieselben Datentypen und Lngen haben, kann man mit der Erweiterung corresponding fields arbeiten. Diese Erweiterung hat den gleichen Effekt wie die move corresponding-Anweisung fr eine Feldleiste: Sie verschiebt Felder aus der Datenbanktabelle in Felder gleichen Namens in den Rumpf der internen Tabelle.

Mit corresponding fields wird eine Zuweisung pro Feld durchgefhrt, statt einer einzelnen Zuweisung fr die gesamte Zeile. Somit wird unntiger Aufwand der select Anweisung produziert. Es sollte nur gebraucht werden, wenn unbedingt ntig. Die folgenden Punkte gelten:

Die Reihenfolge der sendenden und empfangenen Felder ist bedeutungslos. Sendefelder, die kein korrespondierendes Empfangsfeld haben, werden verworfen. Empfangsfelder, die kein korrespondierendes Sendefeld haben, bleiben unverndert.

Listing 13.4 zeigt die Effizienz und Ineffizienz bei Benutzung dieser Ergnzung. Listing 13.4: Durch corresponding fields werden interne Tabellen aus der Datenbank gefllt. 1 report ztx1304. 2 tables ztxlfa1. 3 data: begin of it1 occurs 23, 4 lifnr like ztxlfa1-lifnr, 5 lifnr_ext like ztxlfa1-lifnr, 6 land1 like ztxlfa1-land1, 7 end of it1, 8 begin of it2 occurs 23, 9 lifnr like ztxlfa1-lifnr, 10 land1 like ztxlfa1-land1, 11 end of it2. 12 13 * This is efficient usage: 14 select lifnr land1 from ztxlfa1 15 into corresponding fields of table it1 16 where lifnr between 'V10' and 'V12'. 17 loop at it1. 18 write: / it1-lifnr, it1-land1. 19 endloop. 20 21 * This is inefficient: 22 select * from ztxlfa1 23 into corresponding fields of table it2 24 where lifnr between 'V10' and 'V12'. 25 skip. 26 loop at it1. 27 write: / it1-lifnr, it1-land1. 28 endloop. 29 30 * Instead, write: 31 select lifnr land1 from ztxlfa1 into table it2 32 where lifnr between 'V10' and 'V12'. 33 skip. 34 loop at it2.

35 write: / it2-lifnr, it2-land1. 36 endloop. 37 free: it1, it2. Das Programm aus Listing 13.4 hat die folgende Ausgabe: V10 CC V11 DE V12 DE V10 CC V11 DE V12 DE V10 CC V11 DE V12 DE

Zeile 14 liest lifnr- und land1-Felder aus der Tabelle ztxlfa1- in lifnr- und land1Felder der internen Tabelle it1. Die interne Tabelle hat Feld lifnr_ext zwischen lifnr und land1, somit kann man into table nicht benutzen. Wenn it1 die Felder in dieser Reihenfolge erwartet, wre hier corresponding fields angebracht. Zeile 22 selektiert alle Felder aus Tabelle ztxlfa1 in nur zwei Felder der Tabelle it2. Das ist ineffizient. Statt dessen zeigt Zeile 31, da, wenn man nur die notwendigen Felder in der korrekten Reihenfolge selektiert, into table benutzt werden kann.

Zeilen hintereinander mit select hinzufgen


select wird benutzt, um Zeilen hintereinander hinzuzufgen. Dafr braucht man einen Arbeitsbereich und eine zweite Anweisung wie append, insert oder collect. Lt man die Ergnzung table weg, erzwingt das System, da die Zeile dem Arbeitsbereich zugewiesen wird. Es ist blich, Kopfzeilen einer internen Tabelle explizit als Arbeitsbereich zu benutzen. Alternativ wird auch der Standardtabellenarbeitsbereich gebraucht (using tables). Listing 13.5 zeigt einige Beispiele von select, um Zeilen hintereinander einer internen Tabelle hinzuzufgen. Listing 13.5: Die Benutzung von select mit der append-Anweisung, um interne Tabellen zu fllen. 1 2 3 4 5 6 7 report ztx1305. tables ztxlfa1. data it like ztxlfa1 occurs 2 with header line. *Do it this way select * from ztxlfa1 into it "notice 'table' is omitted so the where land1 = 'DE'. "row goes into the header line of it

8 append it. 9 endselect. 10 11 loop at it. 12 write: / it-lifnr, it-land1, it-regio. 13 endloop. 14 refresh it. 15 16 *Or this way 17 select * from ztxlfa1 "no 'into' so the row goes into the 18 where land1 = 'DE'. "default table work area 19 append ztxlfa1 to it. "and then is appended to it 20 endselect. 21 22 skip. 23 loop at it. 24 write: / it-lifnr, it-land1, it-regio. 25 endloop. 26 refresh it. 27 28 *Not this way 29 select * from ztxlfa1 "row goes into default table work area 30 where land1 = 'DE'. 31 it = ztxlfa1. "then is assigned to the header line 32 append it. 33 endselect. 34 35 skip. 36 loop at it. 37 write: / it-lifnr, it-land1, it-regio. 38 endloop. 39 free it. Das Programm aus Listing 13.5 hat folgende Ausgabe: V11 DE 07 V12 DE 14 V8 DE 03 V11 DE 07 V12 DE 14 V8 DE 03 V11 DE 07 V12 DE 14 V8 DE 03

Zeile 6 zeigt keine table-Anweisung vor it, somit werden die Felder aus ztxlfa1 in die

Kopfzeile von it geschrieben. Zeile 8 hngt die Kopfzeile an it. Zeile 17 enthlt keine into-Klausel, somit wird jede Zeile in den Standardtabellenarbeitsbereich ztxlfa1 geschrieben. Zeile 19 hngt den Arbeitsbereich ztxlfa1 an die interne Tabelle (die Kopfzeile wird nicht benutzt). Zeile 29 plaziert jede Zeile in den Arbeitsbereich ztxlfa1. Zeile 31 schiebt ztxlfa1 in die Kopfzeile von it vor dem Anhngen (append).

into corresponding fields kann man auch dazu benutzen, um Daten in einen Arbeitsbereich zu legen, statt in den Rumpf einer internen Tabelle. Der Effekt ist hnlich wie bei der movecorresponding-Anweisung, ist aber effizienter. Das Listing 13.6 zeigt, wie. Listing 13.6: Wie die Ergnzung corresponding fields der select-Anweisung den gleichen Effekt hat wie die move-corresponding-Anweisung 1 report ztx1306. 2 tables ztxlfa1. 3 data: begin of it occurs 2, 4 lifnr like ztxlfa1-lifnr, 5 row_id like sy-index, 6 land1 like ztxlfa1-land1, 7 end of it. 8 9 *Do it this way: 10 select lifnr land1 from ztxlfa1 11 into corresponding fields of it "notice 'table' is omitted 12 where land1 = 'DE'. 13 append it. 14 endselect. 15 16 loop at it. 17 write: / it-lifnr, it-row_id, it-land1. 18 endloop. 19 refresh it. 20 21 *Not this way: 22 select * from ztxlfa1 23 where land1 = 'DE'. 24 move-corresponding ztxlfa1 to it. 25 append it. 26 endselect. 27 28 skip. 29 loop at it. 30 write: / it-lifnr, it-row_id, it-land1. 31 endloop. 32 free it. Das Programm aus Listing 13.6 hat die folgende Ausgabe:

V11 0 DE V12 0 DE V8 0 DE V11 0 DE V12 0 DE V8 0 DE

Auf Zeile 11 wird die table-Ergnzung vor it weggelassen. Somit werden die Zeilen in die Kopfzeile geschrieben. lifnr wird in it-lifnr geschrieben und land1 in it-land1. Zeile 7 hngt die Kopfzeile an it. Zeile 22 schiebt die Zeilen in den Arbeitsbereich ztxlfa1. Zeile 24 benutzt eine hnliche Anweisung (move corresponding), um den Arbeitsbereich in die Kopfzeile von it zu transferieren. Zeile 25 hngt dann die Kopfzeile an den Rumpf von it. Das Ergebnis ist identisch mit der ersten select-Anweisung, ruft aber eine zustzliche Anweisung auf, und ist damit nicht so leistungsfhig.

Zusammenfassung von select, internen Tabellen und deren Leistungsfhigkeit


Tabelle 13 enthlt eine Liste der verschiedensten Formen des select, wie sie in internen Tabellen benutzt werden, und ihre relative Leistungsfhigkeit. Sie sind in absteigender Reihenfolge von der besten zur schlechtesten Leistungsfhigkeit beschrieben.

Tabelle 13.2: Verschiedene Formen der select-Anweisung, um eine interne Tabelle zu fllen Anweisung(en) select into table it Fllt Rumpf

select into corresponding fields of table it Rumpf select into it select into corresponding fields of it Kopfzeile Kopfzeile

Der Gebrauch von lfa1-, lfb1-, lfc1- und lfc3Beispieltabellen


Bevor wir den nchsten Abschnitt betrachten, wre es hilfreich, sich erstmal mit den Beispieltabellen ztxlfa1, ztxlfb1 und ztxlfc3 vertraut zu machen, da diese fr die nchsten Beispiele und bungen gebraucht werden. Diese Tabellen basieren auf den R/3-Tabellen lfa1, lfb1, lfc1 und lfc3. Sehen Sie sich die Strukturen dieser Tabellen im DDIC noch einmal an, whrend Sie die

untenstehende Beschreibung lesen. SAP hat R/3 so konzipiert, da es als Konglomerat vieler Firmen genutzt werden kann. Whrend der R/3Konfiguration wird jeder Firma ein Buchungskreis (company code) zugeteilt. Dieser Code ist ein Teil des Primrschlssels in vielen Stammdatentabellen, der es dem Konglomerat ermglicht, die Informationen seiner Firmen in einer Datenbank zu verwalten. Das Management kann so pro Firma individuelle Berichte zur Auswertung schreiben lassen und ebenso konsolidierte Reports ber viele Firmen. Tabelle lfa1 enthlt Kreditorenstamminformationen, die konsistent ber alle Firmen sind. Ignoriert man mandt, so enthlt der Primrschlssel nur lifnr, die Kreditorennummer. Die Felder von lfa1 enthalten zum Beispiel den Kreditornamen, die Adresse, die Telefonnummer, die Landessprache und den Industrieschlssel (abhngig vom Produkt, wie z.B. die Chemieindustrie, Bauindustrie und so weiter). Tabelle lfb1 enthlt Kreditorenstamminformationen, die spezifisch fr eine Firma sind. Ihr Primrschlssel besteht aus lifnr und bukrs: dem Firmen-Codefeld (s.a. Abb. 13.6). Innerhalb von lfb1 sind auch Firmenkontonummer, Steuerinformationen und vieles mehr gespeichert.

Abbildung 13.6: Die Beziehung zwischen den Primschlsseln. Abbildung 13.6 zeigt die Beziehung zwischen dem Primrschlssel der Tabellen lfa1 bis lfc3. Sie fangen alle mit lifnr an, und lfa1 benutzt ihn als gesamten Primrschlssel. Lfb1 benutzt die Kreditorennummer und den Buchungskreis. Lfc1 benutzt die Kreditorennummer, den Buchungskreis und das Fiskaljahr. Lfc3 benutzt die gleichen Felder einschlielich eines speziellen General Ledger (G/L, Hauptbuchhaltung)- Indikators. Tabelle lfc1 enthlt G/L-Geschftstransaktionen. Jede Zeile enthlt die Angaben eines Fiskaljahres eines Kreditors innerhalb einer Firma. Der Primrschlssel besteht aus lifnr, bukrs, gjahr und dem Fiskaljahr. Eine Serie von Feldern mit Namen umNNs, umNNh und umNNu wird 16mal innerhalb einer lfc1 Zeile wiederholt. Jeder der ersten zwlf Serien enthlt Debitorenbuchungen, Kreditbuchungen und Verkufe einer Buchungsperiode (normalerweise ein Monat) des Fiskaljahres. Die letzten vier Serien sind beendete Perioden, die fr Jahresabschlsse benutzt werden.

In einem Fiskaljahr gibt es bis zu zwlf oder dreizehn Buchungsperioden. Das wird whrend der Systemkonfiguration festgelegt. Gibt es 13 Buchungsperioden, gibt es nur drei zustzliche Abschluperioden. Tabelle lfc3 enthlt spezielle G/L-Geschftstransaktionen. Fr die Hauptbuchhaltung benutzen alternative Abstimmungskonten spezielle G/Ls. Jede Zeile der Tabelle lfc3 enthlt eine Zusammenfassung der G/Ls fr das gesamte Fiskaljahr in drei Feldern: saldv, soll1 und habn1. Diese enthalten die Bilanz, die Schuldposten und die Kreditbuchungen des Fiskaljahres. Der Primrschlssel ist der gleiche wie bei lfc1 einschlielich des speziellen G/L-Indikators: shbkz. Der Wert in diesem Feld zeigt an, welche alternativen Abstimmungskonten benutzt wurden. Viele Stammdatentabellen benutzen ein hnliches Model fr ihre Primrschlsselstrukturen. In diesem Buch werden vereinfachte Versionen dieser Tabellen benutzt: ztxlfa1, ztxlfb1, ztxlfc1 und ztxlfc3. Diese werden mit der Setup-Routine angelegt.

Gruppenwechsel
Nachdem eine interne Tabelle mit Daten gefllt wurde, mu man die Daten meistens auch wieder rausschreiben. Diese Ausgabe wird hufig Zusammenfassungen (wie z.B. Gesamtsummen) am Anfang oder am Ende des Reports haben. Ebenso kann es innerhalb eines Berichts Zwischensummen geben. Nehmen Sie einmal an, Sie mssen fr die Hauptbuchhaltung die Kennzahlen aus der Tabelle ztxlfa1 fr jeden Kreditor mit Zwischensumme pro Fiskaljahr schreiben und eine Gesamtsumme am Ende des Berichts ausgeben. Um diese Aufgabe durchzufhren, kann man die Daten in eine interne Tabelle schreiben und dann innerhalb einer Schleife die folgenden Anweisungen benutzen:

at first / endat at last / endat at new / endat at end of / endat sum on change on / endon

Die erste Anweisung in jedem dieser Anweisungspaare - sum ist ausgenommen - kontrolliert, ob der Programm-Code, der dazwischen liegt, auch ausgefhrt wird. Diese Art der Kontrolle wird auch Gruppenwechsel genannt. Der Zweck eines Gruppenwechsels ist es, den Zeilen-Code der dazwischen liegt, unter besonderen Bedingungen (d.h. spezifische Bedingungen innerhalb der Daten) whrend einer Schleifenverarbeitung auszufhren.

Die at first und at last-Anweisungen


at first und at last werden whrend der ersten oder letzten Schleifenverarbeitung einer internen Tabelle ausgefhrt. Die Syntax fr at first- und at last-Anweisungen Die folgenden Zeilen beschreiben die Syntax von at first und at last-Anweisungen. loop at it. ... at first. ... endat. at last. ... endat. ... endloop. wobei:

it eine interne Tabelle ist. ... einer beliebigen Anzahl an Zeilencode entspricht, der dazwischenliegt (auch Null).

Die folgenden Punkte sind zu beachten:

Diese Anweisungen knnen nur mit loop at benutzt werden; sie knnen nicht zusammen mit select genutzt werden. at first mu nicht zwingend vor at last stehen. Die Reihenfolge kann variieren. Die Anweisungen knnen mehrmals in der gleichen Schleife vorkommen. Zum Beispiel knnen Sie zweimal at first- und dreimal at last-Anweisungen innerhalb einer Schleife haben, die in beliebiger Reihenfolge stehen knnen. Die Anweisungen sollten nicht in sich selber verschachtelt sein (d.h. at last sollte nicht innerhalb von at first und endat stehen). Es gibt keine Ergnzungen zu diesen Anweisungen.

Beim ersten Schleifendurchgang werden die Zeilen, die zwischen at first und endat liegen, ausgefhrt. Beim letzten Schleifendurchgang werden die Zeilen, die zwischen at last und endat liegen ausgefhrt. Kommt at first mehrmals vor, werden sie alle ausgefhrt. At last verhlt sich hnlich. Man benutzt at first, um:

Schleifenverarbeitung anzustoen Gesamtsummen an den Anfang eines Berichts zu setzen

Kopfzeilen auszugeben

Man benutzt at last, um:


Schleifenverarbeitung anzustoen Gesamtsummen an das Ende eines Berichts zu setzen Fuzeilen auszugeben

Listing 13.7 zeigt ein Beispielprogramm, das diese Konstrukte benutzt. Listing 13.7: Die Benutzung von at first, um Kopfzeilen zu schreiben und at last, um die letzte Zeile zu unterstreichen 1 report ztx1307. 2 tables ztxlfc3. 3 data it like ztxlfc3 occurs 25 with header line. 4 select * from ztxlfc3 into table it where shbkz = 'Z'. 5 loop at it. 6 at first. 7 write: / 'Vendor', 8 12 'Cpny', 9 17 'Year', 10 22 'Bal C/F'. 11 uline. 12 endat. 13 write: / it-lifnr, 14 12 it-bukrs, 15 17 it-gjahr, 16 22 it-saldv. 17 at last. 18 write: / '----------', 19 12 '----', 20 17 '----', 21 22 '-------------------'. 22 endat. 23 endloop. 24 free it. Das Programm aus Listing 13.7 zeigt die folgende Ausgabe: Vendor Cpny Year Bal C/F ---------------------------------------1000 1000 1995 0.00 1000 1000 1996 5,000.00 1000 1000 1998 4,000.00 1040 4000 1997 0.00 1070 2000 1997 1,000.00

1090 2000 1997 250.50 V1 1000 1992 1,000.00 V1 3000 1990 1,000.00 V1 3000 1994 1,000.00 V4 4000 1997 100.00 V6 2000 1997 1,000.00 V6 4000 1997 0.00 ---------- ---- ---- ------------------

Die Zeilen 6 bis 11 werden nur beim ersten Schleifendurchgang bearbeitet. Das Programm schreibt Kopfzeilen, gefolgt von Unterstrichen (Zeile 11). Die Zeilen 13 bis 16 schreiben den Inhalt der Zeile. Sie werden fr jede Zeile ausgefhrt. Die Zeilen 17 bis 22 werden nur beim letzten Schleifendurchgang benutzt. Dieses Beispiel schreibt einen Unterstrich am Ende jeder Spalte.

Die Werte von Komponenten sind verschwunden Zwischen at first und endat oder zwischen at last und endat enthalten die Werte der Komponenten des Arbeitsbereichs keine Daten. Die Standardschlsselfelder sind mit Sternzeichen (*) aufgefllt und die numerischen Felder mit Nullen. endat stellt den Inhalt der Werte wieder her, den sie vor at hatten. nderungen im Arbeitsbereich innerhalb von at und endat gehen verloren. Listing 13.8 zeigt, da die Komponenten der Standardschlsselfelder innerhalb at und endat mit Sternzeichen gefllt sind und die Nicht-Schlsselfelder mit Nullen. Listing 13.8: Der Inhalt der internen Tabellenfelder zwischen at und endat 1 report ztx1308. 2 tables ztxlfc3. 3 data it like ztxlfc3 occurs 1 with header line. 4 select * up to 1 rows from ztxlfc3 into table it. 5 loop at it. 6 write: / 'Before ''at first'':', 7 / it-lifnr, it-bukrs, it-gjahr, it-shbkz, it-saldv, 8 it-solll. 9 at first. 10 write: / 'Inside ''at first'':', 11 / it-lifnr, it-bukrs, it-gjahr, it-shbkz, it-saldv, 12 it-solll. 13 it-lifnr = 'XXXX'. 14 endat. 15 write: / 'Between ''at first'' and ''at last'':', 16 / it-lifnr, it-bukrs, it-gjahr, it-shbkz, it-saldv, 17 it-solll. 18 at last. 19 write: / 'Inside ''at last'':', 20 / it-lifnr, it-bukrs, it-gjahr, it-shbkz, it-saldv,

21 22 23 24 25 26 27 28

it-solll. it-lifnr = 'XXXX'. endat. write: / 'After ''at last'':', / it-lifnr, it-bukrs, it-gjahr, it-shbkz, it-saldv, it-solll. endloop. free it.

Das Programm aus Listing 13.8 produziert die folgende Ausgabe. Before 'at first': 1000 1000 1990 A 1,000.00 500.00 Inside 'at first': ********** **** **** * 0.00 0.00 Between 'at first' and 'at last': 1000 1000 1990 A 1,000.00 500.00 Inside 'at last': ********** **** **** * 0.00 0.00 After 'at last': 1000 1000 1990 A 1,000.00 500.00

Zeile 4 selektiert eine Zeile aus ztxlfc3 nach it. Innerhalb der Schleife, die in Zeile 5 anfngt, wird der Inhalt der Zeile zuerst ausgeschrieben. Er wird dann wieder innerhalb von at first und endat geschrieben. Die Ausgabe zeigt, da die Standardschlsselfelder Sternzeichen enthalten und der Rest Nullen. Zeile 13 ordnet it-lifnr einen neuen Wert zu. Nach dem endat auf Zeile 14 zeigt die Ausgabe, da alle Werte im Arbeitsbereich wiederhergestellt wurden. nderungen an der Kopfzeile, die innerhalb von at / endat gemacht wurden, sind verloren. In Zeile 18 zeigt at last das gleiche Verhalten. In Zeile 27 steigt die Schleife beim ersten Durchgang aus, um die Ausgabe mglichst einfach zu halten.

Die Benutzung von at new und at end of


At new- und at end of-Anweisungen dienen dazu, nderungen in einer Spalte pro Schleifendurchgang ausfindig zu machen. Mit Hilfe dieser Anweisungen kann man Programm-Code am Anfang und Ende einer Gruppe von Stzen ausfhren. Die Syntax von at new und at end of Im folgenden wird die Syntax zu at new und at end of erklrt. Sort by c. Loop at it. ...

at new c. endat. ... at end of c. ... endat. ... endloop. wobei:


it eine interne Tabelle ist. c eine Komponente von it. ... Programmzeilen sein sollen.

Die folgenden Punkte sind zu beachten:

Diese Anweisungen knnen nur innerhalb einer Schleife und nicht zusammen mit select benutzt werden. At new mu nicht zwingend vor at end of stehen. Diese Anweisungen knnen in beliebiger Reihenfolge stehen. Diese Anweisungen knnen mehrmals in einer Schleife auftreten. Zum Beispiel knnen zweimal at new- und dreimal at end of-Anweisungen innerhalb einer Schleife in beliebiger Reihenfolge stehen. Diese Anweisungen sollten nicht ineinander verschachtelt werden (d.h., at end of sollte nicht innerhalb von at new / endat stehen). Es gibt fr diese Anweisungen keine Ergnzungen.

Die Benutzung von at new Jedesmal, wenn sich der Wert von c ndert, werden die Programmzeilen zwischen at new und endat ausgefhrt. Dieser Block wird ebenso bei jedem Schleifendurchgang ausgefhrt, oder wenn sich Werte links von c ndern. Zwischen at und endat werden die numerischen Felder rechts von c auf Null gesetzt. Die nicht numerischen Felder werden mit Sternzeichen (*) gefllt. Kommt at new mehrfach vor, werden alle ausgefhrt. At end of verhlt sich hnlich. Der Gruppenwechsel wird durch eine sogenannte Kontrollstufe reguliert. Im folgenden Programmausschnitt ist f2 z.B. eine solche Kontrollstufe, weil es in der at new- Anweisung erscheint. loop at it. at new f2. "(ab hier Programm-Code) endat. endloop. Man sagt, da der Gruppenwechsel angestoen wird, wenn sich die Kontrollstufe ndert. Das bedeutet, wenn sich der Inhalt der Kontrollstufe ndert, wird der Programm- Code zwischen at und endat

ausgefhrt. Ein Gruppenwechsel wird auch angestoen, wenn sich Felder vor der Kontrollstufe in der Struktur ndern. Deshalb sollte man die Struktur der internen Tabelle mit den Feldern beginnen, welche die Kontrollstufe ausmachen. Sie mssen auch nach allen Feldern vor und einschlielich c sortieren. Zwischen at und endat werden numerische Felder rechts von der Kontrollstufe zu Null, und nicht numerische Felder werden mit Sternzeichen aufgefllt. Abbildung 13.7 und 13.8 erlutern den Gebrauch von at new.

Abbildung 13.7: Diese Abbildung zeigt eine Kontrollstufe, die in Gang gesetzt wird, wenn sich der Wert von f1 ndert. Sie zeigt auch, da f2 ein Sternzeichen innerhalb des Gruppenwechsels (zwischen at und endat) enthlt.

Abbildung 13.8: Diese Abbildung zeigt, da diese Kontrollstufe angestoen wird, wenn f2 oder f1 sich ndern. Das passiert, weil f1 in der Struktur von it vor f2 kommt. Dieses Programm bietet ein Arbeitsbeispiel von Abbildung 13.7 und 13.8. Es zeigt den Punkt, an welchem ein Gruppenwechsel angestoen wird, wenn sich die Kontrollstufe ndert oder Felder sich vor der Kontrollstufe ndern. Listing 13.9: Der Programm-Code aus Abbildungen 13.7 und 13.8 in einem Beispielprogramm

1 report ztx1309. 2 data: begin of it occurs 4, 3 f1, 4 f2, 5 end of it. 6 7 it = '1A'. append it. "Fill it with data 8 it = '3A'. append it. 9 it = '1B'. append it. 10 it = '2B'. append it. 11 12 sort it by f1. "it now looks like figure 13.7 13 loop at it. 14 at new f1. 15 write: / it-f1, it-f2. 16 endat. 17 endloop. 18 skip. 19 sort it by f2. "it now looks like figure 13.8 20 loop at it. 21 at new f2. 22 write: / it-f1, it-f2. 23 endat. 24 endloop. 25 skip. 26 sort it by f1 f2. "it now looks like figure 13.8 27 loop at it. 28 at new f1. 29 write: / it-f1. 30 endat. 31 at new f2. 32 write: /4 it-f2. 33 endat. 34 endloop. 35 free it. Das Programm aus Listing 13.9 zeigt die folgende Ausgabe: 1 * 2 * 3 * 1 3 1 2 A A B B

1 A B 2 B 3 A

Zeile 12 sortiert it mit f1. Auf Zeile 14 wird at new beim ersten Schleifendurchgang angestoen und jedesmal, wenn sich f1 ndert. Zeile 19 sortiert it mit f2. Auf Zeile 20 wird at new beim ersten Durchgang angestoen oder jedesmal, wenn sich die Werte von f1 oder f2 ndern. Das passiert, weil eine Kontrollstufe angestoen wird, wenn sich f2 oder irgendein Feld vor f2 ndert. Zeile 26 sortiert it mit f1 und f2. Auf Zeile 28 wird at new jedesmal angestoen, wenn sich der Wert von f1 ndert, und auf Zeile 31 wird at new jedesmal angestoen, wenn sich f1 oder f2 ndert.

Die Benutzung von at end of Die Programmzeilen zwischen at end of und endat werden ausgefhrt:

wenn sich die Kontrollstufe ndert wenn sich irgendwelche Felder vor der Kontrollstufe ndern wenn es sich um die letzte Zeile einer Tabelle handelt

Listing 13.10 zeigt diese Anweisung. Listing 13.10: Wie at new und at end of durch Feldnderungen und Kontrollstufennderungen angestoen werden. 1 report ztx1310. 2 data: begin of it occurs 4, 3 f1, 4 f2, 5 end of it. 6 7 it = '1A'. append it. "Fill it with data 8 it = '3A'. append it. 9 it = '1B'. append it. 10 it = '2B'. append it. 11 12 sort it by f1. 13 loop at it. 14 at new f1. 15 write: / 'start of:', it-f1. 16 endat. 17 write: /4 it-f1.

18 19 20 21 22

at end of f1. write: / 'end of:', it-f1. endat. endloop. free it.

Das Programm aus Listing 13.10 zeigt folgendes: start of: 1 1 1 end of: 1 start of: 2 2 end of: 2 start of: 3 3 end of: 3

Zeile 12 sortiert it mit f1. Auf Zeile 14 wird jedesmal, wenn sich f1 ndert, at new angestoen. Auf Zeile 18 wird at end angestoen, wenn sich die Kontrollstufe beim Lesen des nchsten Satzes ndert, oder wenn es sich um die letzte Zeile handelt.

Benutzen Sie nicht Gruppenwechselanweisungen innerhalb einer Schleife mit at it where ...-Konstrukten; das fhrt zu unvorhersehbaren Ergebnissen.

Die Benutzung von sum


Mit sum werden Gesamtsummen einer Kontrollstufe ausgegeben. Syntax von sum Folgende Zeilen zeigen die Syntax der sum-Anweisung. at first/last/new/end of. ... sum ... endat.

wobei:

... Programmzeilen sein sollen

sum rechnet die Gesamtsumme einer Kontrollstufe aus. Das wird verstndlich, wenn man sich folgendes vorstellt:

Es findet alle Zeilen, die die gleichen Werte innerhalb einer Kontrollstufe haben und alle Felder links davon. Es summiert jede numerische Spalte rechts der Kontrollstufe. Es stellt die Gesamtsummen in die korrespondierenden Felder des Arbeitsbereichs.

Listing 13.11 soll dies veranschaulichen. Listing 13.11: Die sum-Anweisung 1 report ztx1311. 2 data: begin of it occurs 4, 3 f1, 4 f2 type i, 5 f3 type i, 6 end of it. 7 8 it-f1 = 'A'. it-f2 = 1. it-f3 = 10. append it. 9 it-f1 = 'B'. it-f2 = 3. it-f3 = 30. append it. 10 it-f1 = 'A'. it-f2 = 2. it-f3 = 20. append it. 11 it-f1 = 'B'. it-f2 = 4. it-f3 = 40. append it. 12 13 sort it by f1. "it now looks like figure 13.9 14 loop at it. 15 at new f1. 16 sum. 17 write: / 'total:', it-f1, it-f2, it-f3. 18 endat. 19 write: /11 it-f2, it-f3. 20 endloop. 21 free it. Das Programm aus Listing 13.11 erzeugt folgende Ausgabe: total: A 3 30 1 10 2 20 total: B 7 70 3 30 4 40

Zeile 13 sortiert it mit f1 aufsteigend. Der Inhalt nach der Sortierung ist in Abbildung 13.9 zu sehen. Beim ersten Schleifendurchgang wird der Programm-Code zwischen Zeile 15 und 18 ausgefhrt. Die Kontrollstufe hat den Wert 'A'. Bevor Zeile 16 ausgefhrt wird, enthalten die Felder des Arbeitsbereichs rechts von der Kontrollstufe Nullen. Die sum-Anweisung findet alle angrenzenden Zeilen, die ein 'A' in f1 haben. Es summiert die numerischen Spalten rechts von der Kontrollstufe und stellt das Ergebnis in den Arbeitsbereich (s.a. Abbildung 13.9). Beim zweiten Schleifendurchgang wird at new nicht angestoen. Beim dritten Schleifendurchgang enthlt f1 'B' und at new (Zeile 15) wird angestoen. Bevor Zeile 16 ausgefhrt wird, enthalten die Felder des Arbeitsbereichs rechts von der Kontrollstufe Nullen. Die sum-Anweisung findet alle angrenzenden Zeilen, die ein 'B' in f1 haben. Es summiert die numerischen Spalten rechts von der Kontrollstufe und stellt das Ergebnis in den Arbeitsbereich (s.a. Abbildung 13.10).

Abbildung 13.9: Die Abbildung zeigt, was in Listing 13.11 passiert. Beim ersten Schleifendurchgang wird der Wechsel angestoen, und die sum-Anweisung ausgefhrt. Alle Zeilen, die die gleichen Werte wie die Kontrollstufe haben, werden gefunden, und die numerischen Felder rechts von der Kontrollstufe werden im Arbeitsbereich aufsummiert.

Abbildung 13.10: Die Abbildung zeigt, was passiert, wenn der Gruppenwechsel zum zweiten Mal angestoen und die sum-Anweisung ausgefhrt wird.

Das Summieren kann in einem berlauf enden, da die Gesamtsumme in ein Feld gleicher Lnge gestellt wird. Ein berlauf produziert einen Programmabbruch mit der Fehlermeldung SUM_OVERFLOW. Bei der Benutzung von sum vermeiden Sie einen berlauf, indem Sie die Lnge der numerischen Felder erhhen, bevor Sie die interne Tabelle fllen.

Die Benutzung von on change of


Eine weitere Anweisung fr den Gruppenwechsel ist on change of. Sie verhlt sich hnlich at new. Die Syntax von on change of Folgende Zeilen zeigen die Syntax von on change of. On change of v1 [or v2 . . .]. ... [else. - - -] endon. wobei:

v1 und v2 Variable oder Feldleistennamen sind.

... Programmanweisungen sind. - - - Programmzeilen sind.

Die folgenden Punkte gelten:

Wenn sich der Wert der Variablen (v1, v2 und so weiter) von einem Test zum nchsten ndert, werden die Anweisungen, die on change of folgen, ausgefhrt. Wenn keine nderung entdeckt wird und die else-Bedingung zum Tragen kommt, werden die Anweisungen, die auf else folgen, ausgefhrt.

on change of unterscheidet sich von at new in den folgenden Punkten:

Es kann in jedem Schleifenkonstrukt benutzt werden, nicht nur mit loop at. Zum Beispiel kann es mit select und endselect, do und enddo oder while und endwhile benutzt werden, und auch innerhalb von get events. Ein einzelner on change of kann bei einem Wechsel in einem oder mehreren Feldern nach of und getrennt durch or angestoen werden. Diese Felder knnen elementare Felder oder Feldleisten sein. Befindet man sich innerhalb einer Schleife, mssen diese Felder nicht unbedingt zur Schleife gehren. Wird on change of in einer Schleife benutzt, wird ein Wechsel in einem Feld links von der Kontrollstufe keinen Gruppenwechsel anstoen. Wird on change of in einer Schleife benutzt, enthalten Felder rechts davon immer noch ihre originalen Werte; sie ndern sich nicht, um Nullen oder Sternzeichen aufzunehmen. Man kann else zwischen on change of und endon benutzen. Man kann es mit loop at it where . . . benutzen. Man kann on change of zusammen mit sum benutzen. Es summiert alle numerischen Felder, auer diejenigen, die nach of kommen. Alle Werte, die innerhalb von on change of gendert wurden, bleiben nach endon gendert. Der Inhalt der Kopfzeilen wird nicht wieder so hergestellt wie fr at und endat.

Hinter den Kulissen von on change of


Wenn eine Schleife anfngt Befehle abzuarbeiten, legt das System globale Hilfsfelder fr jedes Feld an, das in einer on change of-Anweisung vorkommt. Beim Anlegen werden diesen Feldern Standardinitialwerte mitgegeben (Leerzeichen oder Nullen). Sie werden wieder freigesetzt, wenn die Schleifenverarbeitung endet.

Da globale Hilfsfelder nicht auerhalb einer Schleife existieren, kann man on change of nicht auerhalb einer Schleife benutzen. Jedesmal, wenn on change of ausgefhrt wird, wird der Inhalt von ihren Feldern mit dem Inhalt der

globalen Hilfsfelder verglichen. Sind sie unterschiedlich, wird on change of angestoen, und die Hilfsfelder werden mit den neuen Werten aktualisiert. Bleiben sie gleich, wird der Programm-Code innerhalb von on change of nicht ausgefhrt. Dieses Konzept zeigen die Grafiken in Abbildung 13.11 bis 13.16.

Abbildung 13.11: Dies ist das erste Mal, da eine Schleife on change of benutzt.

Abbildung 13.12: Wenn on change of angestoen wird, werden die Hilfsfelder aktualisiert.

Abbildung 13.13: Dies ist der zweite Schleifendurchgang. Der Inhalt der Hilfsfelder pat, und on change of wird nicht angestoen.

Abbildung 13.14: Dies ist der dritte Schleifendurchgang. on change of wird angestoen.

Abbildung 13.15: Hier sind die Hilfsfelder aktualisiert.

Abbildung 13.16: Das ist der vierte Schleifendurchgang. on change of wird nicht angestoen. Der Gebrauch von on change of Listing 13.12.zeigt den Gebrauch von on change of. Listing 13.12: Die Benutzung von on change of auf zwei verschieden Weisen: innerhalb einer Schleife und innerhalb von select 1 report ztx1312. 2 tables ztxlfa1. 3 data: begin of it occurs 4, 4 f1 type i, 5 f2, 6 f3 type i, 7 f4, 8 end of it. 9 10 it-f1 = 1. it-f2 = 'A'. it-f3 = 11. it-f4 11 it-f1 = 3. it-f2 = 'A'. it-f3 = 22. it-f4 12 it-f1 = 1. it-f2 = 'A'. it-f3 = 33. it-f4 13 it-f1 = 2. it-f2 = 'A'. it-f3 = 44. it-f4 14 15 loop at it. 16 on change of it-f2. 17 write: / it-f1, it-f2, it-f3, it-f4. 18 endon. 19 endloop. 20 write: / 'End of loop'. 21 22 * executing the same code again - the aux 23 loop at it.

= = = =

'W'. 'X'. 'Y'. 'Z'.

append append append append

it. it. it. it.

field still contains 'A'

24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63

at first. write: / 'Looping without a reset...'. endat. on change of it-f2. write: / it-f1, it-f2, it-f3, it-f4. else. write: / 'on change of not triggered for row', sy-tabix. endon. endloop. write: / 'End of loop'. *reset the aux field to blanks clear it-f2. on change of it-f2. endon. loop at it. at first. write: / 'Looping after reset...'. endat. on change of it-f2. write: / it-f1, it-f2, it-f3, it-f4. endon. endloop. write: / 'End of loop'. free it. select * from ztxlfa1 where land1 = 'US'. on change of ztxlfa1-land1. write: / 'land1=', ztxlfa1-land1. endon. endselect. write: / 'End of select'. *executing the same select again without a reset works find select * from ztxlfa1 where land1 = 'US'. on change of ztxlfa1-land1. write: / 'land1=', ztxlfa1-land1. endon. endselect. write: / 'End of select'.

In der Version 3.0F und hher erzeugt das Programm folgende Ausgabe: 1 A 11 W End of loop Looping without a reset... on change of not triggered for row 2 on change of not triggered for row 3

on change of not triggered for row 4 End of loop Looping after reset... 1 A 11 W End of loop land1= US End of select land1= US End of select

Die Zeilen 10 bis 13 fllen die interne Tabelle mit Anfangswerten. it-f2 enthlt den Wert 'A' in allen vier Zeilen. Zeile 16 schreibt jede Zeile nach der Verarbeitung aus. Die Zeilen 17, 20, 23 und 26 werden beim ersten Schleifendurchgang angestoen. Das passiert, weil die Hilfsfelder Nullen oder Leerzeichen enthalten und sich somit von den Werten in der ersten Zeile unterscheiden. Die Werte der ersten Zeile werden in die Hilfsfelder kopiert, die Werte werden von der write-Anweisung ausgeschrieben. Zeile 20 wird nicht angestoen, da bei allen weiteren Schleifendurchlufen der Wert von it-f2 gleich 'A' ist, und das globale Hilfsfeld auch 'A' enthlt. Beachten Sie, da eine nderung des Wertes links von f2 den Befehl on change of nicht anstt wie bei at new. Die interne Tabelle wird hinter Zeile 31 nicht mehr benutzt und freigesetzt. Das lscht alle Zeilen und gibt auch wieder Speicher frei. Zeile 33 selektiert alle Zeilen aus ztxlfa1 in der Reihenfolge von land1. Obwohl dieser select 23 Zeilen zurckliefert, wie in der letzten Zeile der Ausgabe zu sehen ist, existieren nur fnf gleiche Werte von land1, die ausgeschrieben werden.

Die Benutzung von on change of


Beim ersten Schleifendurchgang werden die globalen Hilfsfelder mit Initialwerten (Leerzeichen oder Nullen) angelegt. Wenn der erste Wert einer Schleife ein Leerzeichen oder eine Null ist, wird on change of nicht angestoen. Listing 13.13 zeigt dieses Problem und liefert eine Lsung. Listing 13.13: Die erste Zeile von Schleife #1 stt on change of nicht an. 1 report ztx1313. 2 data: begin of it occurs 4, 3 f1 type i, 4 end of it. 5 6 it-f1 = 0. append it. 7 it-f1 = 3. append it. 8 it-f1 = 1. append it. 9 it-f1 = 2. append it. 10 11 loop at it. "loop #1 12 write: / '==new row==', 12 it-f1. 13 on change of it-f1.

14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29

write: / 'f1 changed:', 12 it-f1. endon. endloop. skip. loop at it. "loop #2 write: / '==new row==', 12 it-f1. on change of it-f1. write: / 'f1 changed:', 12 it-f1. else. if sy-tabix = 1. write: / 'f1 changed:', 12 it-f1. endif. endon. endloop. free it.

Das Programm aus Listing 13.13 zeigt die folgende Ausgabe: ==new row== ==new row== f1 changed: ==new row== f1 changed: ==new row== f1 changed: ==new row== f1 changed: ==new row== f1 changed: ==new row== f1 changed: ==new row== f1 changed:

0 3 3 1 1 2 2 0 0 3 3 1 1 2 2

Die Zeilen 6 bis 9 fllen die interne Tabelle mit vier Zeilen. Der Wert von it-f1 in der ersten Zeile ist Null. Auf Zeile 13 stt der erste Schleifendurchgang on change of nicht an, weil das globale Hilfsfeld eine Null enthlt. Die Zeilen 23 bis 24 wurden der Schleife #2 zugeordnet, um den Fehler zu entdecken. Beachten Sie, da at first nicht zum Entdecken dieses Problems benutzt werden kann, da alle numerischen Felder im Arbeitsbereich innerhalb von at first und endat auf Null gesetzt werden.

In Versionen vor 3.0F setzten nur select- und get-Anweisungen die globalen Hilfsfelder zurck. Wenn Sie diese jedoch selbst zurcksetzen, kann man dazu on change of in jedem Schleifenkonstrukt benutzen. Benutzen Sie diesen Programm-Code, um ein Zurcksetzen (reset) zu bewirken: clear f1. on change of f1. endon. clear schiebt Initialwerte in f1. on change of vergleicht f1 mit den globalen Hilfsfeldern. Unterscheiden sie sich, berschreibt das Entleeren mit on change of sie mit Initialwerten. Gehen Sie so vor, um die Hilfsfelder mit einem beliebigen Wert von f1 zu fllen.

Zusammenfassung

Eine Feldoperation ist der effizienteste Weg, eine interne Tabelle aus einer Datenbank zu fllen. Sie liest Zeilen direkt aus der Datenbank in den Rumpf der internen Tabelle, ohne Arbeitsbereiche zu benutzen. ber die into table-Ergnzung bei der select-Anweisung ist das so implementiert. Eine interne Tabelle mu gro genug gewhlt werden, um die selektierten Werte aus der Datenbank mit aufzunehmen. Um prziser zu sein, die Breite einer internen Tabellenzeile in Byte mu grer oder gleich der Gesamtzahl an Byte aller selektierten Spalten aus der Datenbank in der internen Tabelle sein. Ist die interne Tabellenzeile breiter, fllen die selektierten Spalten aus der Datenbank die hchstwertigen Byte jeder internen Tabellenzeile. Die briggebliebenen Byte werden auf Standardwerte gesetzt. Benutzen Sie into corresponding fields, wenn die Felder der internen Tabelle sich in unterschiedlicher Reihenfolge befinden oder untereinander von Feldern getrennt sind, die nicht aus der Datenbanktabelle selektiert wurden. Benutzen Sie at und endat, um die Verarbeitung anzustoen, die auf einem Wechsel in der Spalte einer internen Tabelle oder irgendeiner Spalte links davon basiert. Benutzen Sie sum mit at und endat oder mit on change of, um Gesamtsummen und Zwischenwerte auszurechnen. Benutzen Sie on change of innerhalb von Schleifen, um die Verarbeitung, die auf einem Wechsel in einer der selektierten Spalten basiert.

Benutzen Sie nicht select und append. Wenn mglich, benutzen Sie select into table. Benutzen Sie nicht order by mit select into table. Benutzen Sie statt dessen sort in der internen Tabelle.

Fragen & Antworten

Frage: Der erste Teil dieses Kapitels schien viel Wert auf Effizienz zu legen. Ich lerne zwar, finde aber alle diese Methoden konfus. Macht das alles wirklich Sinn? Antwort: Die Erfahrung zeigt, da Studenten, die von der Pike auf lernen, besser sind. ABAP/4-Programme verarbeiten oft viele Datenmengen, der einfache Code erhht die Verwaltungsarbeit eines Programms. Wenn Sie am Anfang nur einfache Methoden lernen, werden Sie sich schwer wieder davon lsen knnen. Schlechter Programm-Code geht zu Lasten der Performance Ihres Systems und der Programme.

Workshop
Der Workshop zeigt Ihnen zwei Wege, wie Sie berprfen knnen, was Sie in diesem Kapitel gelernt haben. Die Kontrollfrage hilft Ihnen, das Erlernte zu vertiefen, whrend die bungen Ihnen ermglichen, praktisch zu arbeiten. Antworten zu den bungen und Fragen finden Sie im Anhang B Antworten zu den Kontrollfragen und bungen.

Kontrollfrage
1. Wie sind die Werte der Felder rechts von der Kontrollstufe zwischen at- und endat -Anweisungen?

bung 1
Kopieren Sie das Programm ztx1110 nach ***e1301. ndern Sie es dahingehend, da eine gefundene Zeile mit dem Inhalt der berschrift berschrieben wird, wenn der Inhalt irgendeines Feldes dieser Reihe von dem abweicht, was in der berschrift steht. Die Ausgabe sollte folgendermaen aussehen: 10 20 30 40 50 1 2 3 4 5 XX XX XX XX XX 1 2 3 4 5

Benutzen Sie den comparing-Zusatz aus der read table-Anweisung.

bung 2
Das folgende Programm produziert einen Fehler. Beschreiben Sie das Problem, kopieren Sie das Programm nach ***302, und beheben Sie den Fehler. report zty1302

tables: ztxlfa1. data: begin of it occurs 10, lifnr like ztxlfa1-lifnr, land1 like ztxlfa1-land1, end of it. select * from ztxlfa1 into table it. loop at it. write: / it-lifnr, it-land1. endloop.

Ein Imprint des Markt&Technik Buch- und Software-Verlag GmbH. Elektronische Fassung des Titels: ABAP/4 in 21 Tagen, ISBN: 3-8272-2016-X

Woche 2

Tag 14 Die write-Anweisung


Kapitelziele
Wenn Sie dieses Kapitel beendet haben, sollten Sie in der Lage sein:

den Effekt von Datentypen bei der Ausgabe zu verstehen die Formatoptionen der write-Anweisung zu benutzen Konvertierungs-Exits (conversion exits) zu benutzen und ihre Festlegung innerhalb der Domnen zu erkennen

Standardlngen und Formatierungen


Wenn Sie keine Lngenangaben angeben oder Formatierungsoptionen bei der write- Anweisung benutzen, wird das System Standardformate und Standardlngen benutzen, die auf den Datentypen von jeder geschriebenen Variablen basieren. Im folgenden Abschnitt werden diese Standardwerte beschrieben.

Standardlngen
Die Ausgabelnge eines Feldes ist die Anzahl von Zeichen, die zur Anzeige des Feldes gebraucht wird. Die Ausgabelnge wird von einer write-Anweisung bentigt, um Platz auf der Ausgabeliste fr ein Feld zu reservieren. Felder, die innerhalb eines Programms mit Hilfe der data-Anweisung definiert werden, haben die Standardausgabelnge wie in Tabelle 14.1 gezeigt.

Tabelle 14.1: ABAP/4-Datentypen bestimmen die Standardformate und Lngen.

Daten Ausrichtung Format

Vorzeichen

Standard Ausgabe Typenlnge

i p f n c d t x

rechts rechts keine rechts links links links links

Nullen werden unterdrckt Nullen werden unterdrckt Wissenschaftl. Notation Fhrende Nullen werden angezeigt Fhrende Leerzeichen werden unterdrckt Wird von Benutzerstandards bestimmt HH:MM:SS

abschlieend 11 abschlieend 2*Feldlnge oder (2*Feldlnge)+1 fhrend keine 22 Feldlnge Feldlnge 8 6 2*Feldlnge

Felder aus dem Data Dictionary haben DDIC-Datentypen wie DEC, CHAR, CURR und so weiter. Sie basieren alle auf ABAP/4-Datentypen und vererben ihre Standardlngen und Formate. Um den ABAP/4-Datentyp zu bestimmen und somit das Standardausgabeformat, schauen Sie in die ABAP/4Schlsselwortdokumentation zur tables- Anweisung. Die Hilfe kann man sich ansehen, indem man den Cursor auf die tables- Anweisung innerhalb des Programms positioniert und die F1-Hilfe drckt. Zur Ergnzung sei gesagt, da Ausgabelnge und Dezimalstellen von DDIC-Feldern innerhalb der Domne definiert werden. Diese Felder berschreiben den Standard und sind in Abbildung 14.1 zu sehen.

Abbildung 14.1: Ausgabelnge und Dezimalstellen berschreiben die Standardwerte, die von den Datentypen vererbt werden. Ausgabelnge und deren Dezimalstellen werden allen Feldern vererbt, die von einer Domne angelegt werden. Das Beispiel in Abbildung 14.1 zeigt eine Feldlnge von 15, das bedeutet, da 15 Zeichen in jedem Feld gespeichert werden knnen, das diese Domne benutzt. Die Ausgabelnge ist 20, somit ist gengend Platz vorhanden, um Dezimalpunkte, Vorzeichen und Trennzeichen fr die Tausendernotation zu setzen.

Gepackte Felder
Die Standardausgabelnge eines Feldes von Typ p entspricht zweimal der definierten Feldlnge. Wenn Dezimalstellen definiert werden, wird die Standardausgabelnge um 1 erhht, somit ist sie 2*Feldlnge+1. Tabelle 14.2 zeigt ein Beispiel zu Standardausgabelngen von Feldern des Typs p.

Tabelle 14.2: Standardausgabelnge fr gepackte Dezimalfelder

Datendefinition data f1(4) type p.

Standardausgabelnge 8

data f2(4) type p decimals 2. 9 data f3(5) type p. 10

data f4(5) type p decimals 3. 11

Standardformat
Das Standardformat ist auf den Datentyp der Variablen zurckzufhren. Tabelle 14.1 zeigt, wie die Ausgabe fr jeden ABAP/4-Datentyp formatiert wird. Die Ausgabe von numerischen Feldern (Felder vom Typ p, I und f) ist rechts ausgerichtet, wobei fhrende Nullen unterdrckt werden, und der Rest ist links ausgerichtet. Zustzlich gibt es typspezifische Formatierungen. Standard-Datumsformate

Datumswerte werden entsprechend dem Datumsformat des Benutzerprofils ausgegeben, solange die Ausgabelnge 10 oder grer ist. Die Standardausgabelnge ist 8. Die Lnge mu entsprechend auf 10 erhht werden, um die Trennzeichen zu sehen. Wird eine Variable mit like definiert (z.B. like sydatum), dann wird die Ausgabelnge von der Domne genommen. Standard-Zeitformat Die Ausgabe der Zeit hat das Format HH:MM:SS, solange die Ausgabelnge 8 oder grer ist. Die Standardausgabelnge ist 6, d.h. auch hier mu die Lnge letztlich 8 Zeichen betragen, bevor die Trennzeichen zu sehen sind. Wird auch hier wieder eine Variable mit like definiert (z.B. like syuzeit), wird die Ausgabelnge von der Domne genommen. Numerische Standardformate Brger der Vereinigten Staaten schreiben eine Zahl wie folgt: 1,234.56. In anderen Lndern, wie z.B. in Europa wird die gleiche Nummer folgendermaen geschrieben: 1.234,56. Die Benutzung von Kommata und Dezimalstellen ist umgekehrt. R/3 ermglicht jedem Benutzer eine von diesen Einstellungen ber Einstellungen im Benutzerprofil bezglich der Dezimalnotation individuell zu bestimmen (Sie knnen aus jeder Maske heraus den Menpfad System->Benutzervorgaben->Eigene Daten auswhlen).

Um nderungen im Benutzerprofil wirksam zu machen, mu man sich im R/3 ab- und

wieder anmelden. Tabelle 14.3 zeigt die Auswirkungen fr numerische Ausgaben durch die Einstellungen fr die Dezimalnotation im Benutzerprofil.

Tabelle 14.3: Dezimalnotationseinstellungen im Benutzerprofil haben Einflu auf die numerischen Ausgabeformate. Einstellung Beispielausgabe Komma Periode 1,234.56 1.234,56

Das Standardausgabeformat fr Gleitkommavariable (Typ f) entspricht einer wissenschaftlichen Notation. Das kann mit Hilfe einer Ausgabemaske oder mit Konvertierungs-Exits modifiziert werden. berlaufformate Hat man Zahlen, die zu gro sind fr die Ausgabefelder, setzt das System ein Sternzeichen (*) in die erste Spalte der Ausgabe, um einen berlauf anzuzeigen. Vorher versucht das System aber, wenn irgendwie mglich, alle Zeichen darzustellen. Trennzeichen fr Tausend werden nur ausgegeben, wenn gengend Platz im Ausgabefeld vorhanden ist. Wenn nicht, werden sie nacheinander gelscht, und zwar beginnend von links nach rechts im Feld. Handelt es sich um eine positive Nummer und pat sie in das Ausgabefeld unter Zuhilfenahme des Vorzeichenfeldes, wird das System sie auch benutzen.

Beispielprogramm fr Standardeinstellungen
In Listing 14.1 werden Standardlngen und Formate gezeigt. Ebenso wird hier die Handhabung von Zahlen gezeigt, die nahe am berlauf des Ausgabefeldes stehen. Listing 14.1: Standardformate und Lngen 1 2 3 4 5 6 7 report ztx1401. data: t1 type t value '123456', t2 like sy-uzeit value '123456', d1 type d value '19980201', d2 like sy-datum value '19980201', f1 type f value '-1234', i1 type i value '12345678-',

8 i2 type i value '123456789-', 9 i3 type i value '1123456789-', 10 i4 type i value '1123456789', 11 n1(5) type n value 123, 12 p1(5) type p value '123456789-', 13 c1(5) type c value 'ABC', 14 x1(2) type x value 'A0B0'. 15 16 write: / t1, 26 'type t: default output length = 6', 17 /(8) t1, 26 'type t: increased output length to 8', 18 /(12) t1, 26 'type t: increased output length to 12', 19 / t2, 26 'type t: default output length = 8 (from domain)', 20 / d1, 26 'type d: default output length = 8', 21 /(10) d1, 26 'type d: increased output length to 10', 22 / d2, 26 'type d: default output length = 10 (from domain)', 23 / f1, 26 'type f: default output length = 22', 24 / i1, 26 'type i: default output length = 11', 25 / i2, 26 'type i: same output length, more digits', 26 / i3, 26 'type i: same output length, even more digits', 27 /(10) i3, 26 'type i: smaller output length, negative number', 28 /(10) i4, 26 'type i: smaller output length, positive number', 29 / n1, 26 'type n: default output length = field length', 30 / p1, 26 'type p: default output length = 2 * length = 10', 31 /(12) p1, 26 'type p: output length increased to 12', 32 /(15) p1, 26 'type p: output length increased to 15', 33 / c1, 26 'type c: output length = field length (left just)', 34 / x1, 26 'type x: default output length = 2 * length = 4'. Das Programm in Listing 14.1 erzeugt folgende Ausgabe 123456 type t: default output length = 6 12:34:56 type t: increased output length to 8 12:34:56 type t: increased output length to 12 12:34:56 type t: default output length = 8 (from domain) 19980201 type d: default output length = 8 1998/02/01 type d: increased output length to 10 1998/02/01 type d: default output length = 10 (from domain) -1.234000000000000E+03 type f: default output length = 22 12,345,678- type i: default output length = 11 123456,789- type i: same output length, more digits 1123456789- type i: same output length, even more digits *23456789- type i: smaller output length, negative number 1123456789 type i: smaller output length, positive number 00123 type n: default output length = field length 123456789- type p: default output length = 2 * length = 10 123,456,789- type p: output length increased to 12

123,456,789- type p: output length increased to 15 ABC type c: output length = field length (left just) A0B0 type x: default output length = 2 * length = 4

Zeile 16 schreibt eine Variable vom Type t mit der Standardlnge von 6. Es gibt keinen Platz fr Trennzeichen, also werden sie nicht geschrieben. Zeile 17 schreibt die gleiche Variable, allerdings mit einer Ausgabelnge von 8. Diese Ausgabelnge wurde der Variablen mit der write-Anweisung bergeben. Die Ausgabelnge berschreibt die Standardausgabelnge und stellt gengend Platz fr Trennzeichen zur Verfgung. Zeile 18 zeigt, da das Ausgabefeld grer als acht Zeichen ist. Das Zeitfeld ist innerhalb des Feldes standardmig links ausgerichtet. Zeile 19 erzeugt eine Ausgabe mit der Anweisung like sy-uzeit. Innerhalb der Domne ist die Ausgabelnge auf acht Zeichen gesetzt. Somit ist die Ausgabelnge fr das Feld t2 auch 8, was gengend Platz fr Trennzeichen lt. Zeile 20 schreibt eine Variable vom Typ d mit der Standardlnge von 8. Hier gibt es keinen Platz fr Trennzeichen, somit enthlt das Feld auch keine. Die Reihenfolge fr Jahr/Monat/Tag ist jedoch ber die Benutzereinstellungen bestimmt. Zeile 21 schreibt das gleiche Datumsfeld, allerdings mit einer Ausgabelnge von 10, somit ist auch hier jetzt Platz fr Trennzeichen. Zeile 22 schreibt Feld d2 aus. Die Lnge von d2 wird von der Domne fr sy-datum erhalten. Zeile 24 schreibt eine Ganzzahl (Integer) mit einer Standardlnge von 11. Zeile 25 schreibt eine grere Ganzzahl, aber mit der gleichen Ausgabelnge wie vorher. Das erste Trennzeichen fr Tausend ist gelscht, so da ein Extrazeichen geschrieben werden mu. Zeile 26 erhht die Zahl um 1, somit wird das zweite Trennzeichen gelscht. Zeile 27 schreibt die gleiche Nummer aus, allerdings wird jetzt die Ausgabelnge um 1 erniedrigt. Der berlaufanzeiger erscheint als erstes Zeichen im Ausgabefeld. Zeile 28 schreibt die gleiche Nummer mit der gleichen Lnge. Dieses Mal aber ist die Zahl positiv. Das System schiebt die Zahl nach rechts und benutzt ein Vorzeichenfeld, um einen berlauf zu verhindern. Zeile 29 schreibt ein numerisches Feld, das rechts ausgerichtet ist, mit fhrenden Nullen zur linken. Zeile 30 schreibt ein gepackt dezimales Feld mit einer Standardausgabelnge ohne Trennzeichen. Die Zeilen 31 und 32 erhhen die Ausgabelnge auf 12 und 15 mit rechter Ausrichtung und Trennzeichen. Zeile 33 zeigt ein links ausgerichtetes Zeichen in dem Ausgabefeld. Zeile 34 zeigt die Ausgabe eines hexadezimalen Feldes.

Ergnzungen zur write-Anweisung


In diesem Abschnitt werden einige typische Ausgabespezifikationen zur write-Anweisung erklrt.

Die Syntax der write-Anweisung


Im folgenden wird die Syntax der write-Anweisung gezeigt. write [at] [/p(l)] v1[+o(sl)] (1) under v2 | no-gap (2) using edit mask m | using no edit mask (3) mm/dd/yy | dd/mm/yy (4) mm/dd/yyyy | dd/mm/yyyy (5) mmddyy | ddmmyy | yymmdd (6) no-zero (7) no-sign (8) decimals n (9) round n (10) currency c | unit u (11) left-justified | centered | right-justified Erklrung:

v1 ist ein Literal, eine Variable oder eine Zeichenkette, p, 1 und n sind numerische Literale oder Variable. p enthlt die Position der Spezifikation. Sie identifiziert die Ausgabespalte, in welcher das Ausgabefeld beginnen soll. 1 ist die Lngenspezifikation. Sie identifiziert die Lnge des Ausgabefeldes, in welches die Werte geschrieben werden sollen. o ist ein Unterfeld, das nur numerische Literale enthlt. s1 ist ein Unterfeld, das nur numerische Literale enthlt. m ist fr die Druckaufbereitung. c ist ein Whrungsschlssel (Tabelle tcurc). u ist eine Meeinheit (Tabelle t006). n ist ein numerisches Literal oder eine Variable.

Die folgenden Punkte tauchen auf:


Wenn p oder 1 Variable sind, wird das Wort at verlangt. Ein Schrgstrich (/) fngt eine neue Zeile an, bevor der Wert der Variablen geschrieben wird.

Sind keine Ergnzungen spezifiziert und sollen zwei write-Anweisungen ausgefhrt werden (z.B. write: v1, v2.), wird der Wert von v2 in der gleichen Zeile wie v1 erscheinen, allerdings durch ein Freizeichen getrennt. Pat v2 nicht mehr in die Zeile, wird es auf die nchste Zeile geschrieben. Ist die Ausgabelnge grer als die Zeilenlnge, wird die Ausgabe rechts gekrzt. Ist der Wert rechts ausgerichtet (Variable Typ p), wird vor der Krzung der Wert so lange nach rechts geschoben, solange es die fhrenden Nullen zulassen, ohne die Ausgabe zu verkrzen. Trennzeichen werden, wenn ntig, ebenso weggenommen, um das Verkrzen zu vermeiden.

Eine neue Zeile wird whrend der Ausgabe immer nach dem Start eines Events ausgelst. Events werden in Tag 17 beschrieben.

Die Position spezifizieren


Bezglich der Syntax im obigen Beispiel spezifiziert p die Ausgabespalte. Der Ausgabewert kann alle Werte einer vorangegangenen write-Anweisung berschreiben. Das Programm in Listing 14.2 zeigt die Effekte einer Serie von write-Anweisungen. Tabelle 14.4 zeigt den kumulativen Effekt jeder write-Anweisung in Folge, um zu verdeutlichen, wie die Ausgabe aussieht. Listing 14.2: Eine Folge von write-Anweisungen, die den Effekt der Angabe der Spaltenausgabe zeigen soll 1 report ztx1402. 2 data f1(4) type p value 1234. 3 write: / '----+----1----+--', 4 / '12345678901234567'. 5 skip. 6 write /1 'X'. 7 write 'YZ'. 8 write 2 'YZ'. 9 write 3 'ABC'. 10 write 4 f1. 11 write 7 f1. 12 write 'Z'. Das Programm hat die folgende Ausgabe: ----+----1----+-12345678901234567 XYA 1 1,234 Z

Die Zeilen 3 und 4 schreiben ein Zeilenlineal, das die Formatierung der Spaltausgabe vereinfachen soll. Zeile 6 schreibt ein 'X' am Anfang von Spalte 1. Zeile 7 schreibt 'YZ' mit einem Freizeichen hinter dem 'X'. Zeile 8 schreibt 'YZ' auf Spalte 2. Somit werden das Freizeichen und das 'Y', das vorher geschrieben wurde, berschrieben. Zeile 9 schreibt 'ABC', beginnend in Spalte 3. Das berschreibt die beiden 'Z' und ein

Freizeichen.

Zeile 10 schreibt f1, beginnend in Spalte 4. Die Standardausgabelnge von f1 ist 8; das Standardformat ist rechts ausgerichtet, wobei das letzte Zeichen als Vorzeichen reserviert wird. Die drei fhrenden Leerzeichen (spaces) berschreiben die existierende Ausgabe beginnend in Spalte 5. Zeile 11 schreibt wieder f1, diesmal in Spalte 7. Zeile 12 schreibt 'Z' ein Freizeichen hinter f1. In der Ausgabe stellt sich das als zwei Leerzeichen dar. Das erste Leerzeichen hinter der 4 ist das Vorzeichenfeld von f1. Dann wird ein Leerzeichen geschrieben und letztlich das 'Z' in Spalte 16.

Tabelle 14.4: Beispiele der writeAnweisungen und korrespondierende Ausgaben Kumulative Ausgabe ----+----1----+-12345678901234567 X X YZ XYZZ

Anweisungen

write 1 'X'. write 'YZ'. write 2 'YZ'.

write 3 'ABC'. XYABC write 4 f1. write 7 f1. write 'Z'. XYA 1,234 XYA 1 1,234 XYA 1 1,234 Z

Die Lngenspezifikation
In der Syntaxbeschreibung fr die write-Anweisung spezifiziert o die Ausgabelnge. Das ist die Anzahl von Zeichen auf der Ausgabezeile, die den Ausgabewert beinhalten soll. Lnge und Position sind immer optional. Sie knnen aber mit einem Literal oder einer Variablen spezifiziert werden. Handelt es sich um eine Variable, mu das Wort at vorangestellt werden. Handelt es sich bei der Position und Lnge beide Male um Literale, so ist at optional. Wenn der Position- und Lngenbestimmung ein Schrgstrich (/) vorangestellt wird, kann kein Freiplatz dazwischen sein. Listing 14.3 zeigt Beispiele. Listing 14.3: Beispiele von der Benutzung der Position- und Lngenspezifikation

1 report ztx1403. 2 data: f1(4) type p value 1234, 3 p type i value 5, 4 l type i value 8. 5 6 write: / '----+----1----+--', 7 / '12345678901234567'. 8 skip. 9 write /(2) 'XYZ'. 10 write /(4) 'XYZ'. 11 write 'ABC'. 12 write /5(4) f1. 13 write at /p(l) f1. Das Programm erzeugt die folgende Ausgabe: ----+----1----+-12345678901234567 XY XYZ ABC 1234 1,234

Zeile 6 schreibt die ersten beiden Zeichen von 'XYZ'. Zeile 7 schreibt 'XYZ', indem vier Zeichen fr die Ausgabe benutzt werden. Es werden Standardformate benutzt, d.h., der Wert ist linksbndig ausgerichtet und rechts mit fhrenden Nullen aufgefllt. Zeile 8 schreibt 'ABC' mit einem Leerzeichen hinter den vorherigen Wert. Der vorherige Wert wurde rechts mit einem Leerzeichen gefllt. Ein anderes Leerzeichen wurde vor dem Schreiben von 'ABC' hinzugefgt. Zeile 9 schreibt f1 in ein Feld, das vier Zeichen lang ist, beginnend in Spalte 5. Zeile 10 schreibt f1 in ein acht Zeichen langes Feld, beginnend in Spalte 5. Da Variablen benutzt werden, wird das Wort at verlangt. Standardeinstellungen werden benutzt, d.h. der Wert ist rechtsbndig und fhrende Nullen werden unterdrckt. Da auch gengend Platz ist, werden ebenso die Trennzeichen mit geschrieben.

Das Arbeiten mit Unter(Sub)feldern


Man kann Subfelder in der write-Anweisung spezifizieren, indem man Offset und Lngenspezifikationen sofort hinter dem Wert ohne ein dazwischenliegendes Freizeichen benutzt. (Wenn ntig, sehen Sie sich noch einmal den vorherigen Abschnitt zur write-Anweisung an.) Man kann kein Subfeld mit einem Literal oder einem numerischen Feld (Typ p, i und f) benutzen. Listing 14.4 zeigt Beispiele.

Listing 14.4: Verwendung von Subfeldern 1 2 3 4 5 6 7 8 9 report ztx1404. data f1(4) type c value 'ABCD'. write: / '----+----1----+--', / '12345678901234567'. skip. write / f1(2). write / f1+1(2). write: /(2) f1+2(1), f1.

Das Programm aus Listing 14.4 erzeugt die folgende Ausgabe: ----+----1----+-12345678901234567 AB BC C ABCD

Zeile 7 schreibt das erste und zweite Zeichen von f1. Zeile 8 schreibt das zweite und dritte Zeichen von f1. Zeile 9 schreibt das dritte Zeichen von f1, beginnend mit einer neuen Zeile in einem Feld, das zwei Zeichen lang ist. Es ist linksbndig und rechts mit Leerzeichen (blanks) aufgefllt. Es schreibt dann den gesamten Inhalt von f1 mit einem Zwischenraum davor.

Die Ergnzung under


Indem man under benutzt, zwingt man das erste Zeichen des Feldes dazu, in der gleichen Spalte positioniert zu werden wie das erste Zeichen eines vorher geschriebenen Feldes. Man kann under nicht mit einer expliziten Positionsspezifikation benutzen. Listing 14.5 zeigt Beispiele. Listing 14.5: Die under-Ergnzung 1 report ztx1405. 2 tables: ztxlfa1. 3 4 select * up to 5 rows from ztxlfa1 order by lifnr. 5 write: /1 ztxlfa1-lifnr, 6 15 ztxlfa1-land1, 7 25 ztxlfa1-name1, 8 / ztxlfa1-spras under ztxlfa1-land1, 9 ztxlfa1-stras under ztxlfa1-name1. 10 skip.

11 endselect. Das Programm aus Listing 14.5 erzeugt die folgende Ausgabe: 1000 CA Parts Unlimited E 111 Queen St. 1010 CA Industrial Pumps Inc. E 1520 Avenue Rd. 1020 CA Chemical Nation Ltd. E 123 River Ave. 1030 CA ChickenFeed Ltd. E 8718 Wishbone Lane 1040 US Motherboards Inc. E 64 BitBus Blvd.

Zeile 6 schreibt das Feld land1, beginnend in Spalte 15. Zeile 7 schreibt das Feld name1, beginnend in Spalte 25. Zeile 8 schreibt das Feld spras, beginnend in der gleichen Spalte wie land1. Es wird konsequenterweise in Spalte 15 geschrieben. Zeile 9 schreibt das Feld stras, beginnend in der gleichen Spalte wie name1. Es wird deshalb in Spalte 25 geschrieben.

Die no-gap-Ergnzung
Indem man no-gap benutzt, wird die dazwischenliegende Lcke automatisch hinter ein Feld gesetzt, wenn das nachfolgende Feld keine Spaltenspezifikation hat. Listing 14.6. zeigt Beispiele der Benutzung von no-gap. Listing 14.6: Die Benutzung von no-gap 1 2 3 4 5 6 7 8 report ztx1406. data f1(4) value 'ABCD'. write: / f1, f1, / f1 no-gap, f1, / '''', f1, '''', / '''', 2 f1, 6 '''', / '''' no-gap, f1 no-gap, ''''.

Das Programm aus Listing 14.6 hat die folgende Ausgabe: ABCD ABCD

ABCDABCD ' ABCD ' 'ABCD' 'ABCD'

Zeile 4 schreibt f1 zweimal auf die gleiche Zeile. Da es keine bestimmte Position fr das zweite f1 gibt, wird ein einzelnes leeres Zwischenzeichen davor geschrieben. Zeile 5 schreibt f1 auch zweimal. Die Benutzung von no-gap nach dem ersten write zwingt die zwei Werte dazu, in der Ausgabe ohne Zwischenraum zu erscheinen. Zeile 6 schreibt f1 mit einem einzigen Hochkomma auf jeder Seite. Ohne den Zusatz von nogap erscheinen Zwischenrume. Zeile 7 schreibt f1, umgeben von je einem Hochkomma. Die Positionsangaben zwingen die Hochkommata, ohne Zwischenrume zu erscheinen. Zeile 8 benutzt no-gap, um die gleiche Ausgabe zu erzwingen.

Ausgabemasken (Edit Masks)


Mit Hilfe von Ausgabemasken kann man:

Zeichen der Ausgabe hinzufgen. ein Vorzeichen an den Anfang einen numerischen Feldes stellen. einen Dezimalpunkt knstlich einfgen oder an eine andere Stelle bewegen. Gleitkommazahlen ohne wissenschaftliche Notation anzeigen.

Egal wo in der Ausgabemaske, der Unterstrich (_) hat eine besondere Bedeutung. Am Anfang einer jeden Maske spielen auch V, LL, RR und == eine besondere Rolle. Alle anderen Zeichen werden ohne nderungen zur Ausgabe gebracht. Unterstriche innerhalb einer Ausgabemaske werden nacheinander mit den Zeichen aus dem Quellfeld (das Feld, das ausgeschrieben wird) ersetzt. Die Anzahl von Zeichen, die aus dem Quellfeld genommen werden, sind gleich der Anzahl von Unterstrichen in der Ausgabemaske. Wenn es zum Beispiel drei Zeichen in der Ausgabemaske gibt, werden hchstens drei Zeichen aus dem Quellfeld zur Ausgabe kommen. Alle anderen Zeichen in der Ausgabemaske werden in die Ausgabe eingesetzt. Gewhnlich mu auch die Lnge des Ausgabefeldes erhht werden, um die Extrazeichen anzupassen, die von der Ausgabemaske eingesetzt wurden. Die Anweisung write (6) 'ABCD' using edit mask '_:__:_' schreibt z.B. A:BC:D. Die Zeichen werden eins nach dem anderen aus dem Quellfeld genommen, whrend die Zeichen der Ausgabemaske an die von der Maske gekennzeichneten Stellen eingesetzt werden. Die Anweisung write 'ABCD' using edit mask '_:__:_' schreibt nur A:BC, weil die Standardausgabelnge gleich der Lnge des Quellfeldes (4) ist. Gibt es weniger Unterstriche in der Maske als in dem Quellfeld, gehrt es zum Standard, das uerste linke n-Zeichen aus dem Quellfeld zu nehmen, wobei n der Zahl von Unterstrichen in der Ausgabemaske entspricht. Das kann genauso mit den Sonderzeichen LL geschehen. Zum Beispiel,

write 'ABCD' using edit mask 'LL__:_' nimmt die linken drei Zeichen und schreibt AB:C. Benutzt man statt dessen RR, werden die uersten drei rechten Zeichen genommen, somit schreibt die Anweisung write 'ABCD' using edit mask 'RR__:_' BC:D. Gibt es mehr Unterstriche als Quellfeldzeichen, hat LL den Effekt, die Ausgabewerte linksbndig zu schreiben und RR rechtsbndig (s.a. Listing 14.7). Beginnt die Ausgabemaske mit einem V, wenn es sich auf ein numerisches Feld bezieht (Typ i, p und f), wird das Vorzeichen am Anfang dargestellt. Bezieht es sich auf ein Zeichenfeld, ist V die aktuelle Ausgabe. Listing 14.7: Verschiedene Darstellungen der Ausgabemaske 1 report ztx1407. 2 data: f1(4) value 'ABCD', 3 f2 type i value '1234-'. 4 5 write: / ' 5. ', f1, 6 / ' 6. ', (6) f1 using edit mask '_:__:_', 7 / ' 7. ', f1 using edit mask 'LL_:__', 8 / ' 8. ', f1 using edit mask 'RR_:__', 9 / ' 9. ', f2 using edit mask 'LLV______', 10 / '10. ', f2 using edit mask 'RRV______', 11 / '11. ', f2 using edit mask 'RRV___,___', 12 / '12. ', f2 using edit mask 'LLV___,___', 13 / '13. ', f1 using edit mask 'V___'. Die Ausgabe des Programms aus Listing 14.7 zeigt folgendes: 5. ABCD 6. A:BC:D 7. A:BC 8. B:CD 9. -1234 10. - 1234 11. - 1,234 12. -123,4 13. VABC

Zeile 5 gibt f1 ohne Ausgabemaske wieder. Zeile 6 gibt alle Zeichen aus f1 mit Hilfe der Doppelpunkte als Trennzeichen wieder. Es gibt drei Unterstriche in der Ausgabemaske auf Zeile 7, aber 4 Zeichen in f1. Somit werden die ersten drei Zeichen von f1 in der Ausgabemaske benutzt. Zeile 8 nimmt die letzten drei Zeichen von f1 und bernimmt sie in die Ausgabemaske. Auf Zeile 9 sind sechs Unterstriche in der Ausgabemaske, mehr als die vier Zeichen von f1. Der Ausgabewert von f1 ist linksbndig mit einem fhrenden Vorzeichen.

Auf Zeile 10 ist der Ausgabewert von f1 rechtsbndig mit einem fhrenden Vorzeichen. Die Zeilen 10 und 11 zeigen die Kombination von eingefgten Zeichen mit Ausrichtung. Die eingefgten Zeichen bewegen sich nicht relativ zum Ausgabefeld. Zeile 13 zeigt den Effekt in der Benutzung von V mit einem Zeichenfeld. Das V selbst gehrt mit zur Ausgabe.

Konvertierungs-Exits (conversion exits)

Ein Konvertierungs-Exit ist eine aufgerufene Routine, welche die Ausgabe formatiert. Beginnt die Ausgabemaske mit == gefolgt von vier Zeichen als Kennung, ruft sie einen Funktionsbaustein auf, der die Ausgabe formatiert. Diese vier Zeichen lange Kennung nennt man auch Konvertierungs-Exit oder Konvertierungsroutine. (Funktionsbausteine werden in den Kapiteln der nachfolgenden Tage behandelt, fr jetzt gengt es zu wissen, da sie wie ein Unterprogramm behandelt werden.) Der Name dieses Funktionsbausteins heit CONVERSION_EXIT_XXXX_OUTPUT, wobei XXXX der Kennung entspricht, die == folgt. Zum Beispiel write '00001000' using edit mask '==ALPHA' ruft den Funktionsbaustein CONVERSION_EXIT_ALPHA_OUTPUT auf. Die writeAnweisung gibt den Wert zuerst an den Funktionsbaustein weiter, der ihn auf irgendeine Weise ndert und den genderten Wert ausschreibt. Dieser besondere exit (ALPHA) prft den Wert, um herauszufinden, ob er nur aus Zahlen besteht. Wenn ja, werden fhrende Nullen ausgelassen und der Wert wird linksbndig ausgerichtet. Werte, die keine numerischen Zeichen enthalten, werden nicht von ALPHA gendert. SAP liefert ca. 60 Konvertierungs-Exits fr die verschiedensten Formatierungsaufgaben. Nach dem 19. Tag mit dem Thema Modularisierung: Funktionsbausteine, Teil 1 werden Sie gengend Wissen haben, um Ihre eigenen Konvertierungs-Exits zu schreiben. Konvertierungs-Exits sind sehr ntzlich bei komplexen Formatierungsarbeiten, die in mehr als einem Programm gebraucht werden. Der Konvertierungs-Exit CUNIT konvertiert automatisch den Code einer Meeinheit in eine sinnvolle Beschreibung des gegenwrtigen Anmeldemandanten. Zum Beispiel ist in R/3 der Code fr eine Materialkiste KI (KI steht fr Kiste). CUNIT konvertiert KI ins Englische mit CR. Ist man in Englisch angemeldet, wird write: '1','KI' using edit mask '==CUNIT' CR ausgeben. Bleibt man in Deutsch angemeldet, ndert sich KI nicht. Somit kann man mit einem Standardsatz von Programm-Code, der in der Datenbank gespeichert ist, sinnvolle Konvertierungen in die entsprechende Landesprache machen.

Abbildung 14.2: Beachten Sie den Inhalt des Feldes Konvert.-Routine. Konvertierungsroutinen (conversion routines) innerhalb einer Domne Konvertierungs-Exits knnen in dem Feld Konvert-Routine abgelegt werden. Dieser exit wird auf alle Felder vererbt, die diese Domne benutzen und automatisch angepat, wenn der Wert ausgeschrieben wird. Abbildung 14.2 zeigt die Domne ztxlifnr , die den Konvertierungs-Exit ALPHA benutzt. Somit wird jedesmal, wenn ztxlfa1-lifnr geschrieben wird, der Wert erst den Funktionsbaustein CONVERSION_EXIT_ALPHA_OUTPUT durchlaufen, welcher fhrende Nullen von numerischen Werten auslt und linksbndig schreibt. Ein Konvertierungs-Exit innerhalb einer Domne kann mit Hilfe von using no edit mask bei der write-Anweisung jederzeit ausgeschaltet werden. Listing 14.8: Der Gebrauch von Konvertierungs-Exits 1 report ztx1408. 2 tables: ztxlfa1, ztxmara. 3 data: f1(10) value '0000001000'. 4

5 write: / f1, 6 / f1 using edit mask '==ALPHA'. 7 8 skip. 9 select * from ztxlfa1 where lifnr = '00000010000' 10 or lifnr = 'V1' 11 order by lifnr. 12 write: / ztxlfa1-lifnr, "domain contains convers. exit ALPHA 13 / ztxlfa1-lifnr using no edit mask. 14 endselect. 15 16 skip. 17 select single * from ztxmara where matnr = 'M103'. 18 write: / ztxmara-matnr, 19 (10) ztxmara-brgew, 20 ztxmara-gewei. "domain contains convers. exit CUNIT 21 set locale language 'D'. 22 write: / ztxmara-matnr, 23 (10) ztxmara-brgew, 24 ztxmara-gewei. "domain contains convers. exit CUNIT Die Ausgabe des Programms erzeugt die folgende Liste: 0000001000 1000 1000 0000001000 V1 V1 M103 50.000 CR M103 50.000 KI

Zeile 5 schreibt den Wert von f1. Zeile 6 schreibt denselben Wert, ruft aber Konvertierungs-Exit ALPHA auf. Zeile 9 empfngt zwei Stze aus ztxlfa1 und schreibt das Feld lifnr zweimal (pro Satz einmal). Die Domne fr ztxlfa1-lifnr enthlt den Konvertierungs-Exit ALPHA, somit schreibt Zeile 12 lifnr mit Hilfe des Konvertierungs-Exits. Zeile 13 schreibt lifnr aus, stellt aber den Konvertierungs-Exit ab. Damit wird der aktuelle Wert der Tabelle ausgeschrieben. Zeile 17 selektiert einen einzelnen Satz aus ztxmara. Zeile 20 schreibt gewei (Einheit fr Gewicht) mit Hilfe des Konvertierungs-Exit CUNIT aus der Domne. Zeile 21 ndert den Text ins Deutsche. Das entspricht einer Anmeldung in Deutsch.

Zeile 24 schreibt den gleichen gewei Wert, aber diesmal wird der deutsche mnemonische Name angezeigt.

Anzeige von existierenden Konvertierungs-Exits Die folgende Prozedur erklrt, wie man sich Konvertierungs-Exits anzeigen lassen kann. Starten Sie jetzt das ScreenCam How to Display Existing Conversion Exits. 1. Aus der Entwicklungsumgebung whlen Sie den Menpfad bersicht->Infosystem. 2. Klicken Sie das Pluszeichen bei Programmierung an. Der Baum wird aufgeblttert. 3. Machen Sie das gleiche jetzt fr die Funktionsbibliothek. Gehen Sie jetzt fr die Funktionsbibliothek ebenso vor. 4. Doppelklicken Sie jetzt auf Funktionsbausteine. 5. Im Feld Funktionsbaustein geben Sie CONVERSION_EXIT_*_OUTPUT ein und drcken auf Ausfhren. Es werden alle Funktionsbausteine mit CONVERSION_EXITS fr die write-Anweisung aufgelistet.

Arbeiten mit der Datumsformatierung


Datumsformatierungen machen nicht unbedingt das, was man erwartet. Die meisten beziehen ihre Information aus dem Benutzerprofil. Tabelle 14.5 enthlt eine Beschreibung der entsprechenden Formate.

Tabelle 14.5: Ausgabe der Datumsformate Format yy = Jahr (engl. year) mm = Monat (engl. month) dd = Tag (engl. day) mm/dd/yyyy dd/mm/yyyy Schreibt das Datum wie im Benutzerprofil angegeben. Das ist der Standard. Effekt

mm/dd/yy dd/mm/yy mmddyy ddmmyy yymmdd

Schreibt das Datumsformat ebenfalls wie im Benutzerprofil angegeben Schreibt das Datumsformat ohne Trennzeichen Das ist ebenfalls eine Datumsausgabe ohne Trennzeichen

Konvertierungs-Exits IDATE und SDATE geben alternative Datumsformate. Ebenso gibt der Funktionsbaustein RH_GET_DATE_DAYNAME den Namen des Wochentages eines bestimmten Datums und Sprache wieder. Als Alternative zeigt DATE_COMPUTE_DAY eine Zahl an, die den Tag einer Woche reprsentiert. Listing 14.9 zeigt einige Formate der Datumsausgabe. Listing 14.9: Die Datumsformate 1 report ztx1409. 2 data: f1 like sy-datum value '19981123', 3 begin of f2, 4 y(4), 5 m(2), 6 d(2), 7 end of f2, 8 begin of f3, 9 d(2), 10 m(2), 11 y(4), 12 end of f3, 13 begin of f4, 14 m(2), 15 d(2), 16 y(4), 17 end of f4. 18 19 write: / f1, "user profile sets format 20 / f1 mm/dd/yyyy, "user profile sets format 21 / f1 dd/mm/yyyy, "user profile sets format 22 / f1 mm/dd/yy, "user profile fmt, display with 2-digit year 23 / f1 dd/mm/yy, "user profile fmt, display with 2-digit year 24 / f1 mmddyy, "user profile fmt, 2-digit year, no separators 25 / f1 ddmmyy, "user profile fmt, 2-digit year, no separators

26 27 28 29 30 31 32 33

/ f1 yymmdd, "yymmdd format, no separators / f1 using edit mask '==IDATE', /(11) f1 using edit mask '==SDATE'. f2 = f1. move-corresponding f2 to: f3, f4. write: /(10) f3 using edit mask '__/__/____', "dd/mm/yyyy format /(10) f4 using edit mask '__/__/____'. "mm/dd/yyyy format

Das Programm aus Listing 14.9 zeigt die folgende Ausgabe: 1998/11/23 1998/11/23 1998/11/23 98/11/23 98/11/23 981123 981123 981123 1998NOV23 1998/NOV/23 23/11/1998 11/23/1998

Zeile 2 definiert f1 like sy-datum. Die Ausgabelnge in der Domne fr sy-datum ist 10, somit werden die Trennzeichen bei der Ausgabe mitangezeigt. Die Zeilen 19, 20, 21, 22, 23, 24 und 25 machen alle das gleiche: sie schreiben f1 unter Benutzung des Formats aus dem Benutzerprofil heraus, allerdings manchmal mit und manchmal ohne Trennzeichen. Zeile 27 formatiert das Datum unter Zuhilfenahme des Konvertierungs-Exits IDATE . Zeile 28 formatiert das Datum unter Zuhilfenahme des Konvertierungs-Exits SDATE. Die Zeilen 30 bis 33 zeigen, wie man sein eigenes Ausgabeformat definieren kann. Allerdings sollt man besser seine eigene Konvertierungsroutine schreiben, was den Vorteil hat, da auch andere darauf zugreifen knnten.

Der Gebrauch von no-zero und no-sign


Die Benutzung von no-zero unterdrckt fhrende Nullen, wenn sie im Zusammenhang mit Variablen vom Typ c oder n gebraucht werden. Im Falle eines Nullwertes bleibt die Ausgabe leer. no-sign unterdrckt auch bei Variablen vom Typ i, p oder f die Ausgabe des Vorzeichens. Mit anderen Worten, negative Zahlen haben kein Vorzeichen und erscheinen positiv. Listing 14.10 erlutert diese beiden Ergnzungen.

Listing 14.10: Verwendung von no-zero und no-sign. 1 2 3 4 5 6 report ztx1410. data: c1(10) type c value '000123', n1(10) type n value 123, n2(10) type n value 0, i1 type i value '123-', i2 type i value 123.

7 write: / c1, 20 'type c', 8 / c1 no-zero, 20 'type c using no-zero', 9 / n1, 20 'type n', 10 / n1 no-zero, 20 'type n using no-zero', 11 / n2, 20 'type n: zero value', 12 / n2 no-zero, 20 'type n: zero value using no-zero', 13 / i1, 20 'type i', 14 / i2 no-sign, 20 'type i using no-sign'. Das Programm aus Listing 14.10 hat folgende Ausgabe: 000123 type c 123 type c using no-zero 0000000123 type n 123 type n using no-zero 0000000000 type n: zero value type n: zero value using no-zero 123- type i 123 type i using no-sign

Spezifizierung von Dezimalstellen und das Runden


Zwei Anweisungen sind fr das Runden zustndig:

decimals round

Drei Anweisungen werden benutzt fr die Anzahl der Dezimalstellen in der Ausgabe:

decimals currency unit

Die Benutzung der Ergnzungen decimals und round Mit decimals n wird die Anzahl der Dezimalstellen in der Ausgabeliste erhht bzw. erniedrigt. Wird

die Zahl der Dezimalstellen erniedrigt, wird der Wert vor der Ausgabe gerundet. Der Wert der Quellvariablen wird nicht gendert, nur die Ausgabe erscheint mit dem genderten Wert. Wird die Zahl der Stellen erhht, werden Nullen an das Ende des Wertes gehngt. Negative Werte von n rcken die Dezimalstelle nach rechts, multiplizieren die Zahl mit Faktor 10 und runden sie vor der Anzeige. Durch round n wird die Ausgabe mit Faktor 10 skaliert und dann vor der Anzeige gerundet. Das hat den gleichen Effekt wie das Multiplizieren mit 10**n. Positive n-Werte rcken die Dezimalstelle nach links und negative Werte nach rechts. Das kann sinnvoll sein, wenn man die Ausgabewerte mglichst nahe an Tausend erreichen will. Der Unterschied zwischen decimals und round ist, da decimals die Anzahl von Zeichen, die nach dem Dezimalpunkt zu sehen sind, nach n ndert und dann die Rundung vornimmt. Die Anweisung round rckt den Dezimalpunkt nmal nach links oder rechts, pflegt die Zeichen hinter der Dezimalstelle und macht erst danach die Rundung fr die Anzeige. Listing 14.11 illustriert die Benutzung von decimals und round. Listing 14.11: Die Benutzung von decimals und round 1 report ztx1411. 2 data f1 type p decimals 3 value '1575.456'. 3 write: / f1, 20 'as-is', 4 / f1 decimals 4, 20 'decimals 4', 5 / f1 decimals 3, 20 'decimals 3', 6 / f1 decimals 2, 20 'decimals 2', 7 / f1 decimals 1, 20 'decimals 1', 8 / f1 decimals 0, 20 'decimals 0', 9 / f1 decimals -1, 20 'decimals -1', 10 / f1 round 4, 20 'round 4', 11 / f1 round 3, 20 'round 3', 12 / f1 round 2, 20 'round 2', 13 / f1 round 1, 20 'round 1', 14 / f1 round 0, 20 'round 0', 15 / f1 round -1, 20 'round -1', 16 / f1 round -2, 20 'round -2', 17 / f1 round 3 decimals 1, 20 'round 3 decimals 1', 18 / f1 round 3 decimals 3, 20 'round 3 decimals 3'. Das Programm aus Listing 14.11 hat die folgende Ausgabe: 1,575.456 as-is 1,575.4560 decimals 4 1,575.456 decimals 3 1,575.46 decimals 2 1,575.5 decimals 1 1,575 decimals 0

158 decimals -1 0.158 round 4 1.575 round 3 15.755 round 2 157.546 round 1 1,575.456 round 0 15,754.560 round -1 157,545.600 round -2 1.6 round 3 decimals 1 1.575 round 3 decimals 3 Auf Zeile 8 rundet decimals 0 nicht auf, weil der Bruchteil der Zahl kleiner 0,5 ist.

Mit decimals werden Dezimalstellen, die in der Domne definiert wurden, berschrieben. Ungeachtet dessen, von wo die Dezimalspezifikation herkommt, es wird niemals ein aktueller Dezimalpunkt in der Zahl angezeigt. Die Zahl wird immer als Ganzzahlwert gespeichert. Die decimals-Anweisung ist eine Formatspezifikation einer Zahl, bevor sie beispielsweise in einer write-Anweisung oder in einer Kalkulation benutzt wird. Der Gebrauch von currency und unit Currency und unit sind Alternativen, welche die Position eines Dezimalpunktes in einem Feld von Typ p anzeigen. Sie knnen nicht zusammen mit decimals benutzt werden.

Die DDIC-Typen CURR und QUAN basieren auf dem ABAP/4-Datentyp p (dezimal gepackt).
Die Benutzung von currency

Wird eine Whrungssumme ausgeschrieben, sollte man mit der Ergnzung currency arbeiten. Solche Summen werden normalerweise aus einem Feld vom Typ CURR aus einer Datenbanktabelle gelesen.

Anstatt decimals wird mit currency die Anzahl der Dezimalstellen fr Whrungssummen benutzt. hnlich wie decimals, das die Anzahl der Dezimalstellen beschreibt, wird mit currency ein Whrungs-Code wie USD (U.S. Dollar), ITL (Italienische Lira) oder DEM (Deutsche Mark) spezifiziert. Das System liest aus der Tabelle TCURX die Zahl der Dezimalstellen, die fr diese Whrung bei der Anzeige benutzt werden soll. Wird der Whrungs-Code nicht in der Tabelle gefunden, wird eine Standardeinstellung von zwei Dezimalstellen benutzt. Normalerweise ist der Whrungs-Code in der gleichen oder einer hnlichen Datenbanktabelle gespeichert. So ist zum Beispiel der Whrungsschlssel fr Felder von Typ CURR (saldv, solll und habn1) in Tabelle ztxlfc3 in dem Feld ztxt001-waers gespeichert. Durch einen Doppelklick auf diese Felder kann man das herausfinden. Wenn Sie z.B. einen Doppelklick auf ztxlfc3-saldv machen, sehen Sie das Anzeigefeld ZTXLFC3-SALDV wie in Abbildung 14.3.

Abbildung 14.3: Ein Doppelklick auf das Feld saldv in Tabelle ztxlfc3 zeigt diese Maske an. Die Referenztabelle und das Referenzfeld zeigen, da ztxt001-waers den Whrungsschlssel enthalten. Die Tabelle ztxt001 selbst enthlt alle Attribute des Buchungskreises; ihr Primrschlssel ist bukrs. Nimmt man den Wert von ztxlfc3-bukrs und sieht in der Zeile in ztxt001 nach einem passenden Eintrag, sieht man, da waers den Whrungsschlssel enthlt. Listing 14.12 soll dies veranschaulichen. Listing 14.12: Die Benutzung von currency 1 report ztx1412. 2 tables: ztxlfc3. 3 data: f1 type p decimals 1 value '12345.6'. 4

5 write: / f1, 6 / f1 currency 'USD', 'USD', "US Dollars 7 / f1 currency 'ITL', 'ITL'. "Italian Lira 8 9 skip. 10 select * from ztxlfc3 where gjahr = '1997' 11 and saldv >= 100 12 order by bukrs. 13 on change of ztxlfc3-bukrs. 14 select single * from ztxt001 where bukrs = ztxlfc3-bukrs. 15 endon. 16 write: / ztxlfc3-saldv currency ztxt001-waers, ztxt001-waers. 17 endselect. Das Programm aus Listing 14.12 zeigt folgende Ausgabe: 123,456 1,234.56 USD 123,456 ITL 100.00 USD 100.00 USD 100.00 USD 100.00 USD 100,000 ITL 25,050 ITL 100,000 ITL 100,000 JPY 300,000 JPY 250.50 CAD 200.00 CAD 1,000.00 CAD 100.00 CAD

Zeile 5 schreibt den Wert von f1 wie er ist. Zeile 6 schreibt den gleichen Wert, schaut aber zuerst in der Tabelle TCURX nach 'USD', um die Anzahl der Dezimalstellen zu bestimmen. Der Wert 'USD' befindet sich nicht in dieser Tabelle, somit wird die Ausgabe mit Standardwerten gemacht (zwei Dezimalstellen). Wenn Zeile 7 ausgefhrt wird, zeigt Tabelle TCURX an, da ITL keine Dezimalstellen hat, so da der Wert ohne Dezimalstellen formatiert wird. Zeile 10 selektiert Stze aus der Tabelle ztxlfc3 in der Buchungskreisreihenfolge (bukrs). Zeile 13 wird jedesmal angestoen, wenn sich der Buchungskreis ndert. Zeile 14 sieht in der Tabelle ztxt001 nach, um die Whrung fr diese Gesellschaft zu finden. Man erhlt den Whrungsschlssel aus Feld ztxt001-waers. Zeile 16 schreibt das fortlaufende Ergebnis, indem die Zahl der Dezimalstellen benutzt wird, die vom Whrungsschlsselfeld in ztxt001-waers angezeigt wird.

Das Arbeiten mit unit

Durch die Ergnzung unit wird die Anzahl der Dezimalstellen fr Quantittsfelder angegeben. Einheiten (units) wie cm (Zentimeter) oder lb (engl. Pfund) bestimmen die Anzeige der Dezimalstellen. Der Code, wie zum Beispiel '%' oder 'KM', wird automatisch nach Einsicht in Tabelle t006 spezifiziert. Die Felder decan und andec bestimmen dann, wie viele Dezimalstellen angezeigt werden. decan gibt die Anzahl von Nullwerten an, die bei Dezimalwerten verkrzt werden. Es entfernt angehngte Nullen; decan wird nie Nullwerte der Dezimalstellen krzen. Ist zum Beispiel der Wert 12.30 und decan 1, wird die Ausgabe 12.3 sein. Ist der Wert 12.34 und decan 1, ist die Ausgabe 12.34. andec hngt Nullen dran, nachdem decan angewendet wurde. Die Anzahl der Dezimalzeichen, die angezeigt werden, mu ein Vielfaches von andec sein. Wenn ntig, wird andec die Werte rechts anpassen. Ist andec 0, werden keine Nullen angehngt. Ist der Wert zum Beispiel 12.34, nachdem decan angewendet wurde, und der Wert von andec ist 3, mu es 0, 3, 6, 9 (oder irgendein Vielfaches von 3) an Dezimalzeichen geben. Der Ausgabewert wird mit Nullen aufgefllt und wird zu 12.340. Ist der Wert nach decan 12.3456, wird daraus 12.345600. Ist der Wert nach decan 12.30 und andec ist 2, wird daraus 12.30. Tabelle 14.6 zeigt mehrere Beispiele von decan und andec sowie deren Ausgabeformat.

Tabelle 14.6: Wie die Felder von decan und andec die Ausgabe beeinflussen. Eingabe 30.1 30.1 30.1 decan andec Ergebnis 1 1 1 0 2 3 3 3 0 0 0 2 4 30.1 30.10 30.100 30.123400 30 30 30.1 30.11 30.11 30.1100

30.1234 1 30 30 30.1 30.11 30.11 30.11 1 2 2 2 2 2

Die unit-Anweisung wird typischerweise bei Feldern vom Typ QUAN benutzt, die in der Datenbank gespeichert sind. Jedes Feld mu ein Referenzfeld vom Typ UNIT haben. Die Meeinheit fr die Werte in dem Feld QUAN wird dort gespeichert. Abbildung 14.4 zeigt, da das Referenzfeld fr ztxmara-brgew ztxmara-gewei ist.

Abbildung 14.4: Wenn man auf das Feld ztxmara-brgew doppelklickt, sieht man auf einer neuen Bildschirmmaske die Referenztabelle und das Referenzfeld. Listing 14.13 erklrt die Benutzung dieser Ergnzungen. Listing 14.13: Verwendung der unit-Ergnzung 1 report ztx1413. 2 tables: ztxmara, t006. 3 data: f1 type p decimals 4 value '99.0000', 4 f2 type p decimals 4 value '99.1234', 5 f3 type p decimals 4 value '99.1200', 6 f4 type p decimals 1 value '99.1'. 7 8 write: / f1, 'as-is', 9 / f1 unit 'ML', 'ml - milliliters decan 3 andec 3', 10 / f1 unit '%', '% - percent decan 2 andec 0', 11 / f1 unit '"', '" - inches decan 0 andec 3', 12 /, 13 / f2, 'as-is', 14 / f2 unit '%', '%', 15 / f3, 'as-is', 16 / f3 unit '%', '%', 17 / f4, 'as-is', 18 / f4 unit '%', '%'.

19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39

skip. write: /12 'brgew as-is', 31 'with units', 48 'ntgew as-is', 67 'with units', 79 'units', 85 'decan', 91 'andec'. uline. select * from ztxmara. select single * from t006 where msehi = ztxmara-gewei. write: /(5) ztxmara-matnr, ztxmara-brgew, ztxmara-brgew unit ztxmara-gewei, ztxmara-ntgew, ztxmara-ntgew unit ztxmara-gewei, ztxmara-gewei, 85 t006-decan, 91 t006-andec. endselect.

Das Programm aus Listing 14.13 produziert die folgende Ausgabe: 99.0000 as-is 99.000 ml - milliliters decan 3 andec 3 99.00 % - percent decan 2 andec 0 99 " - inches decan 0 andec 3 99.1234 as-is 99.1234 % 99.1200 as-is 99.12 % 99.1 as-is 99.1 % brgew as-is w/units ntgew as-is w/units units decan andec --------------------------------------------------------------------M100 102.560 102.560 100.000 100 M3 0 3 M101 10.100 10.100 10.000 10 PAL 0 0 M102 1.000 1 0.000 0 ROL 0 0 M103 50.000 50 0.000 0 CR 0 0

Zeile 8 schreibt f1 ohne die Benutzung von unit. Zeile 9 benutzt die Einheit (unit) ML (Milliliter). In Tabelle t006 wird automatisch nach ML geschaut. Diese Zeile enthlt decan 3 und andec 3. decan 3 zwingt das System dazu,

Nullen hinter der dritten Dezimalstelle zu lschen. Andec 3 zwingt die Zahl von Dezimalstellen dazu, ein Vielfaches von 3 zu sein. An dieser Stelle ist es bereits der Fall, somit wird die Ausgabe mit drei Dezimalstellen angezeigt. Zeile 10 formatiert f1 mit dem Prozentzeichen (%), das decan 2 und andec 0 hat. Mit decan 2 bestimmt man, da anhngende Nullen nach der zweiten Dezimalstelle gelscht werden. andec 0 zeigt an, da es keine weiteren Modifikationen gibt, somit gelangen zwei Dezimalstellen zur Ausgabe. Zeile 11 benutzt die Einheit " (Zoll). Decan 0 zeigt an, da alle Dezimalnullen gekrzt werden sollen. andec 3 zeigt an, da die Anzahl an Dezimalstellen mit Nullen auf drei ergnzt wird. Zeile 13 bis 18 formatiert f2 bis f4 mit der Einheit %. In Zeile 16 krzt decan 2 die anhngenden Nullen. In Zeile 18 tut decan 2 gar nichts, weil es keine anhngenden Nullen gibt, die man krzen kann. andec ist 0, somit werden keine Nullen am Ende angehngt. Zeile 29 selektiert alle Stze aus der Tabelle ztxmara. Zeile 30 selektiert den Satz aus Tabelle t006, der die Einheit in ztxmara-gewei enthlt. Beachten Sie bitte, da das normalerweise nicht so gemacht wird, Sie sollen hier lediglich mit decan und andec vertraut gemacht werden. In den Zeilen 32 bis 35 werden die Werte von gewei und ntgew auf zwei Arten geschrieben. Erstens werden sie so geschrieben, wie sie tatschlich sind. Zweitens werden sie mit der unitErgnzung geschrieben, um das Vorher und Nachher zu zeigen. Die Zeilen 37 und 38 geben die decan- und andec-Werte aus, die fr jede Zeilenformatierung benutzt wurden.

Ausrichtung
Indem man left-justified, centered und right-justified benutzt, kann man die Ausgabewerte an das Ausgabefeld entsprechend anpassen. Listing 14.14 zeigt das. Listing 14.14: Die Ausrichtung bei der write-Anweisung 1 report ztx1414. 2 data: f1(6) value 'AB'. 3 write: / '....+....1', 4 / '1234567890', 5 / f1, 6 / f1 left-justified, 7 / f1 centered, 8 / f1 right-justified, 9 / '....+....1....+....2....+....3....+....4', 10 / '1234567890123456789012345678901234567890', 11 /(40) f1 left-justified, 12 /(40) f1 centered, 13 /(40) f1 right-justified.

Das Programm aus Listing 14.14 produziert den folgenden Ausdruck: ....+....1 1234567890 AB AB AB AB ....+....1....+....2....+....3....+....4 1234567890123456789012345678901234567890 AB AB AB

Die Zeilen 3, 4, 9 und 10 geben ein Zeilenlineal aus, damit man bei der Ausgabe auch die Spaltennummer sieht. Zeile 5 schreibt f1 mit Standardlnge und Format. Die Standardeinstellung fr eine Variable vom Typ c ist left-justification mit einer Standardausgabelnge von 6. Zeile 6 produziert die gleiche Ausgabe. Zeile 7 zentriert die Ausgabe mit der Standardlnge von 6. Zeile 8 richtet den Wert mit einer Standardlnge von 6 rechtsbndig aus. Die Zeilen 11, 12 und 13 haben eine Ausgabelnge von 40. Der Wert ist innerhalb dieser Lnge linksbndig, zentriert und rechtsbndig ausgerichtet.

Zusammenfassung

Wenn keine besonderen Einstellungen gemacht werden, gilt bei der write-Anweisung immer die Standardeinstellung. Diese Einstellungen geschehen ber die ABAP/4-Datentypen. DDICFelder basieren auf ABAP/4-Datentypen, die ihre Einstellungen vererben. Zur Ergnzung: Formatspezifikationen wie Dezimalstellen und Ausgabelngen knnen ebenso ber die Domne spezifiziert werden; das berschreibt die vererbten Felder. Datums- und Zeitfelder werden immer mit Trennzeichen ausgegeben, wenn gengend Platz vorhanden ist. Wenn nicht, werden die Trennzeichen vollstndig gelscht. Bei numerischen Feldern werden die Trennzeichen fr Tausender eins nach dem anderen von links nach rechts gelscht. Sogar das Vorzeichenfeld wird benutzt, wenn es leer ist. Bis auf yymmdd berschreiben alle vom Benutzer angelegten Datumsformate die Standardeinstellungen. Eine Ausgabemaske kann dazu benutzt werden, Zeichen in die Ausgabe zu schreiben. Man kann auch einen Konvertierungs-Exit aufrufen, der mit Hilfe des ABAP/ 4-Codes den Wert formatiert. Mit no-zero werden fhrende Nullen in Feldern vom Typ n und c unterdrckt. Mit no-sign werden anhngende Vorzeichenfelder aus der Anzeige entfernt. Mit Hilfe von decimals werden die Dezimalstellen definiert, die angezeigt werden. Mit round wird die Position des Dezimalpunktes in dem Wert bestimmt. Mit currency wird die Anzahl der Dezimalstellen bei Whrungsfeldern bestimmt. Zuerst

wird in der Tabelle tcurx der Whrungs-Code bestimmt, um die Anzahl der Dezimalstellen zu erfahren. Wird der Code nicht gefunden, werden die Standardeinstellungen mit zwei Dezimalstellen benutzt. Mit unit werden Quantittsfelder formatiert. Die Einheit (unit) wird in Tabelle t006 nachgeschlagen. decan bestimmt die Anzahl von Dezimalnullen, die entfernt werden sollen und andec die Anzahl von Nullen, die hinzugefgt werden sollen. Dezimalzahlen, die keine Nullen haben, werden nie entfernt. Mit left-justified, centerd und right-justified werden die Werte der Ausgabelnge des Feldes angepat. Nicht erlaubt Codieren Sie niemals hart decimals 2 fr Whrungen. Benutzen Sie statt dessen die Ergnzung currency.

Erlaubt Ermglichen Sie den Benutzern, Ihre eigenen Datumsformate anzulegen.

Benutzen Sie Konvertierungs-Exits fr Codieren Sie niemals Dezimalstellen Formatierungsaufgaben, besonders wenn sie komplexer sind. fr Einheiten wie % und hnliche. Benutzen Sie statt dessen die Ergnzung unit.

Fragen & Antworten


Frage: Es gibt auch Funktionsbausteine mit Namen CONVERSION_EXIT_XXXX_INPUT. Wozu dienen diese? Antwort: Das INPUT-Funktionsmodul wird jedesmal aufgerufen, wenn ein Wert in ein Feld eingegeben wird. Der INPUT-Konvertierungs-Exit konvertiert die Benutzereingabe in ein neues Format, bevor sie das Programm erhlt. Damit soll die Routine von Formatierungsaufgaben entlastet werden. Frage: Wie lege ich Konvertierungs-Exits an? Antwort: Wenn Sie gar nicht wissen, wie Sie diese anlegen sollen, sollten Sie zuerst das entsprechende Kapitel lesen. Als Beispiel legen Sie ein Modul mit Namen CONVERSION_EXIT_XXXXX_OUTPUT an, wobei XXXXX irgendein Name sein kann. Es mu einen Importparameter namens INPUT und einen Exportparameter namens OUTPUT geben. Die Originalwerte aus der write-Anweisung werden ber den Input-Parameter bergeben. Sie knnen ihn reformieren und am Ende des Funktionsbausteines an den Output-Parameter bergeben. Ein guter Weg, um anzufangen, ist, einen existierenden Funktionsbaustein zu kopieren.

Workshop
Der Workshop bietet Ihnen zwei Mglichkeiten, Ihr gelerntes Wissen umzusetzen. Im Prfungsabschnitt werden Fragen gestellt, die Ihnen helfen sollen, Ihr Verstndnis fr die besprochene Thematik zu vertiefen. Der bungsabschnitt ermglicht Ihnen, Erfahrungen zu sammeln, indem Sie das Gelernte anwenden. Antworten auf die Prfungsaufgaben und die bungen finden Sie im Anhang B (Antworten zu Kontrollfragen und bungen).

Kontrollfragen
6. 1. Was mu man tun, damit nderungen bei Benutzerstandards wirksam werden? 7. 2. Was passiert, wenn eine Ausgabemaske, die mit V beginnt, einem numerischen Feld oder einem Zeichenfeld zugeordnet wird? 8. 3. Welche Arten von Variablen knnen die no-sign-Ergnzung benutzen, damit sowohl negative als auch positive Zahlen erscheinen?

bung 1
Schreiben Sie ein Programm, da die folgende Ausgabe erzeugt: ....+....1....+....2....+....3....+....4 First December January First

Ein Imprint des Markt&Technik Buch- und Software-Verlag GmbH. Elektronische Fassung des Titels: ABAP/4 in 21 Tagen, ISBN: 3-8272-2016-X

Rckblick
In der vergangenen Woche haben Sie die folgenden Bereiche und Aufgaben bearbeitet:

Sie haben feste und variable Datenobjekte mit vor- und benutzerdefinierten Datentypen angelegt. Sie haben die Regeln der ABAP/4-Syntax und die Anweisungen zur Kontrolle des Programmflusses kennengelernt. Sie haben zugewiesene Anweisungen und Konvertierungsregeln entdeckt. Sie haben interne Tabellen definiert und sie mit impliziten und expliziten Arbeitsbereichen gefllt. Sie haben die select-Anweisung optimiert, um eine interne Tabelle direkt und effizient zu fllen. Sie haben Gruppenwechsel an internen Tabellen ausgefhrt. Sie haben die Formatierungsoptionen der write-Anweisung benutzt und die Auswirkung der Datentypen bei der Ausgabe erfahren. Sie haben conversion exits erarbeitet und ihre Prsenz in der Domne kennengelernt.

Ein Imprint des Markt&Technik Buch- und Software-Verlag GmbH. Elektronische Fassung des Titels: ABAP/4 in 21 Tagen, ISBN: 3-8272-2016-X

Auf einen Blick


Tag 15 Formatierungstechniken, Teil 1 521 Tag 16 Formatierungstechniken, Teil 2 551 Tag 17 Modularisierung: Ereignisse und Unterprogramme 569 Tag 18 Modularisierung: bergabe von Parametern an Unterprogramme 599 Tag 19 Modularisierung: Funktionsbausteine, Teil 1 627 Tag 20 Modularisierung: Funktionsbausteine, Teil 2 647 Tag 21 Selektionsbilder 677

In der drittenWoche erzeugen Sie Reports, die grafische Symbole und Ikonen verwenden, fgen Kopf- und Fuzeilen an Listen an und senden mit Hilfe der new- page printAnweisung Ausgaben in den Spoolbereich. Dann lernen Sie die Ereignisse initialisation, start-of-selection, end-of-selection, top-of-page und end-of-page kennen. Sie codieren auch interne und externe Unterprogramme und Funktionsbausteine und bergeben diesen aktuelle und formale Parameter als Wert, als Wert und Resultat und als Referenz. Schlielich errichten Sie Ausnahmen innerhalb von Funktionsbausteinen, um den Rckgabewert von sy-subrc zu setzen und legen mit der select-options-Anweisung Auswahlmasken an. Am 15. Tag verwenden Sie die grafischen Formatierungoptionen der write-Anweisung (as symbol, as icon, as line), drucken Listenausgaben und bearbeiten die Ausgabe der Schleife. Am 16. Tag benutzen Sie die gebruchlichen Formatierungsanweisungen new-line , newpage, skip, back, position und set blank lines. Mit new-page print senden Sie Ausgaben in den Spoolbereich. Am 17. Tag benutzen Sie die Ereignisse initialisation, start-of-selection und end-of-selection; Sie definieren sowohl interne und externe Unterprogramme als auch globale, lokale und statische Variable sowie Tabellen-Arbeitsbereiche. Am 18. Tag bergeben Sie aktuelle und formale Parameter an Unterprogramme auf drei Arten: als Wert (by value), als Wert und Resultat (by value and result) und als Referenz (by reference). Auerdem bergeben Sie Feldleisten und interne Tabellen an ein

Unterprogramm. Am 19. Tag verstehen und verwenden Sie die include-Anweisung, legen Funktionsgruppen und -bausteine an und definieren Import-, Export- und Changing-Parameter. Am 20. Tag verstehen Sie die Komponenten und die Struktur einer Funktionsgruppe und definieren darin globale Daten und Unterprogramme. Am 21. Tag codieren Sie Auswahlmasken, die mit dem Benutzer korrespondieren, verwenden Formatierungselemente, um effiziente und praktikable Auswahlmasken anzulegen, und verwenden diese Masken, um Datenintegritt zu erhalten.

Ein Imprint des Markt&Technik Buch- und Software-Verlag GmbH. Elektronische Fassung des Titels: ABAP/4 in 21 Tagen, ISBN: 3-8272-2016-X

Woche 3

Tag 15 Formatierungstechniken, Teil 1


Kapitelziele
Nachdem Sie dieses Kapitel durchgearbeitet haben, sollten Sie folgendes knnen:

die grafischen Formatoptionen der write-Anweisung (as symbols, icons und lines ) benutzen, Listenausgaben erzeugen und diese im Spoolbereich verndern, Kopf- und Fuzeilen anlegen (no standard page heading, top-of-page, end-ofpage), die reserve-Anweisung benutzen, um Zeilen in der Ausgabeliste zu gruppieren.

Grafische Formatierung mit Hilfe der writeAnweisung


Um einfache Grafiken zu erzeugen, knnen die drei Zustze, wie in Tabelle 15.1 gezeigt, benutzt werden.

Tabelle 15.1: Grafische Formatierungszustze zur writeAnweisung Zusatz Effekt

as symbol Zeigt ein schwarz-weies Symbol an as icon as line Zeigt eine bunte Ikone Zeigt ein Zeichen zum Zeichnen einer Zeile

Die Syntax des grafischen Zusatzes zur write-Anweisung


write n1 (a) as symbol. (b) as icon. (c) as line. wobei:

die Zustze (a), (b) und (c) exklusiv vernderlich sind. n1 der Name eines Symbols, einer Ikone oder eines line-draw-Zeichens ist.

Die Benutzung von as symbol


Als Symbol bezeichnet man ein einfaches zweifarbiges Bild eines gewhnlichen Symbols wie das eines Quadrats, Kreises, Ordners oder eines Dokuments. Die meisten Symbole nehmen den Platz eines einzelnen Zeichens in der Ausgabeliste ein, obwohl es auch welche gibt, die zwei Zeichen einnehmen, wie zum Beispiel das Symbol einer links zeigenden Hand (sym_left_hand). Eine Beispielanweisung wre write sym_left_hand as symbol. Um Symbole benutzen zu knnen, mssen die folgenden Anweisungen am Anfang des Programms stehen: include <symbol>. oder include <list>. Alle Symbole sind druckbar. Das bedeutet, da diese Symbole im Druck genauso aussehen, wie sie auf dem Bildschirm erscheinen. Der Name zwischen den spitzen Klammern ist ein sogenanntes include-Programm. Es beinhaltet einen Satz von Anweisungen, die die Namen definieren, die benutzt werden knnen. Der <symbol> include beinhaltet nur die Symboldefinitionen. Der <list> include beinhaltet Symbole, Ikonen, Zeichenlinien und Farbdefinitionen. Listing 15.1 zeigt ein Beispielprogramm, das einige Symbole benutzt. Listing 15.1: Anzeigen von Symbolen 1 2 3 4 5 6 7 8 9 report ztx1501. include <symbol>. tables ztxlfa1. write: / sym_plus_box as symbol, 'Vendor Master Tables', /4 sym_filled_circle as symbol, 'LFA1', /4 sym_filled_circle as symbol, 'LFB1', /4 sym_filled_circle as symbol, 'LFC1', / sym_plus_box as symbol, 'Customer Master Tables', /4 sym_filled_square as symbol, 'KNA1',

10 11 12 13 14 15 16 17 18 19

/4 sym_filled_square as symbol, 'KNB1', /4 sym_filled_square as symbol, 'KNC1'. skip. uline. select * up to 5 rows from ztxlfa1. write: / ztxlfa1-lifnr, ztxlfa1-name1, sym_phone as symbol, ztxlfa1-telf1. endselect.

Das Programm aus Listing 15.1 erzeugt die Ausgabe, wie sie in Abbildung 15.1 zu sehen ist.

Die Zeilen 4 bis 11 schreiben eine Liste mit hart codierten Tabellennamen aus. Die Zeilen 14 bis 19 schreiben Kreditorennummern, Namen und Telefonnummern, denen kleine Telefonsymbole vorangestellt wurden.

Der Gebrauch von as icon


Eine Ikone (icon) ist hnlich einem Symbol, ist aber ein mehrfarbiges Bild, das in der Ausgabeliste erscheinen kann. Die meisten Ikonen haben zwei Zeichen in der Ausgabeliste, einige auch mehr. Ein Beispiel einer write-Anweisung die Ikonen ausgibt, wre write icon_led_red as icon. Um berhaupt Ikonen darstellen zu knnen, mu eine include-Anweisung am Programmanfang stehen: include <icon>. oder include <list>.

Abbildung 15.1: Dies ist ein Beispiel einer Ausgabenliste mit Symbolen.

Nicht alle Ikonen sind druckbar. Die Vorgehnsweise, die angibt, welche Ikonen gedruckt werden knnen und welche nicht, folgt spter in diesem Kapitel. Listing 15.2 gibt einige einfache Ikonen aus. Listing 15.2: Wie man Ikonen der Ausgabeliste hinzufgt. 1 report ztx1502. 2 include <icon>. 3 tables: ztxmara, ztxmgef. 4 data ico like icon_generate. 5 6 write: / 'checkmark', 15 icon_checked as icon, 7 / 'red x', 15 icon_incomplete as icon, 8 / 'overview', 15 icon_overview as icon, 9 / 'time period', 15 icon_period as icon. 10 skip. 11 uline.

12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

skip. write: / 'List of Materials with Radioactive Indicators'. uline. select * from ztxmara. clear ico. if not ztxmara-stoff is initial. select single * from ztxmgef where stoff = ztxmara-stoff. if ztxmgef-lagkl = 7. ico = icon_generate. endif. endif. write: / ico as icon, ztxmara-matnr, ztxmara-mtart, ztxmara-matkl, ztxmara-brgew, ztxmara-ntgew, ztxmara-gewei. endselect.

Das Programm aus Listing 15.2 erzeugt die Ausgabe, die in Abbildung 15.2 zu sehen ist.

In den Zeilen 6 bis 9 werden vier verschiedene Ikonen ausgeschrieben. Zeile 4 definiert eine Variable mit Namen ico, die eine Ikone fr die Ausgabe enthalten soll. Es kann irgendein Ikonenname hinter like erscheinen. Zeile 15 selektiert Zeilen aus der Materialstammdatentabelle ztxmara. In Zeile 17 wird fr Gefahrengter in der Tabelle ztxmgef die Nummer fr jeden Satz nachgeschaut. Zeile 19 bestimmt, ob das Material radioaktiv ist. Wenn ja, wird die Ikone mit Namen icon_generate der Variablen ico zugeordnet. Zeile 23 schreibt den Wert von ico mit Hilfe von as icon, was zur Folge hat, da der Wert als Ikone interpretiert wird. Zustzliche Felder aus ztxmara werden ebenso ausgeschrieben.

Abbildung 15.2: Dies ist ein Beispiel einer Ausgabenliste mit Ikonen.

Die Benutzung von as line


Ein Linienzeichen ist ein Zeichen, das benutzt wird, um Linien innerhalb einer Liste zu zeichnen. Man kann damit horizontale oder vertikale Linien, einen Kasten, ein Gitter oder einer Baumstruktur hnliche Anordnungen zeichnen. Typischerweise benutzt man fr eine horizontale Linie den Befehl sy-uline. Sie wird einfach mit einer Lngenbestimmung ausgeschrieben. Um zum Beispiel eine horizontale Linie zu schreiben, die auf Position 5 mit einer Lnge von 10 beginnt, wrde man folgendermaen codieren: write 5(10) syline. Eine vertikale Linie wird mit sy- vline codiert; zum Beispiel write: sy-vline, 'X'. Es wrde eine vertikale Linie beidseitig von 'X' geschrieben werden. Wenn sich Linien in der Ausgabe kreuzen, wrde das System die notwendigen Verbindungszeichen einfgen. Zum Beispiel, wenn sich die Ecken einer horizontalen und einer vertikalen Linie kreuzen, wrde eine Kastenecke gezeichnet werden. Um die Kontrolle ber die Zeichen zum Zeichnen von Linien zu haben, gibt es zustzliche Zeichenparameter fr Linien. Listing 15.3: Symbole und Zeichenparameter 1 report ztx1503.

2 include <list>. 3 tables: ztxlfa1, ztxlfb1, ztxlfc3. 4 data: line1 like line_horizontal_line, 5 line2 like line_horizontal_line. 6 7 select * from ztxlfa1. 8 select single * from ztxlfb1 where lifnr = ztxlfa1-lifnr. 9 if sy-subrc = 0. 10 write: / sy-vline, sym_open_folder as symbol. 11 else. 12 write: / sy-vline, sym_folder as symbol. 13 endif. 14 write: ztxlfa1-lifnr, 30 sy-vline. 15 select * from ztxlfb1 where lifnr = ztxlfa1-lifnr. 16 select single lifnr from ztxlfb1 into (ztxlfb1-lifnr) 17 where lifnr = ztxlfb1-lifnr 18 and bukrs > ztxlfb1-bukrs. 19 if sy-subrc = 0. 20 line1 = line_left_middle_corner. 21 line2 = line_vertical_line. 22 else. 23 line1 = line_bottom_left_corner. 24 clear line2. 25 endif. 26 write: / sy-vline, 27 4 line1 as line, 28 ztxlfb1-bukrs, 29 30 sy-vline. 30 select * from ztxlfc3 where lifnr = ztxlfb1-lifnr 31 and bukrs = ztxlfb1-bukrs. 32 write: / sy-vline, 33 4 line2 as line, 34 8 line_left_middle_corner as line, 35 ztxlfc3-gjahr, ztxlfc3-shbkz, 36 30 sy-vline. 37 endselect. 38 if sy-subrc = 0. 39 write 8(2) line_bottom_left_corner as line. 40 endif. 41 endselect. 42 write: /(30) sy-uline. 43 endselect. Das Programm aus Listing 15.3 erzeugt die folgende Ausgabe:

Abbildung 15.3: Beispiel einer Ausgabe mit horizontalen und vertikalen Linien

Zeile 2 enthlt die Definitionen aller Symbole und Linienzeichen, so da sie in diesem Programm benutzt werden knnen. Zeile 4 definiert zwei Variable, die Linienzeichen enthalten knnen. Zeile 7 liest alle Zeilen aus ztxlfa1. Zeile 8 liest ztxlfb1, um zu sehen, ob es Abhngigkeiten zum aktuellen ztxlfa1- Satz gibt. Wenn es Abhngigkeiten gibt, schreibt Zeile 10 eine vertikale Linie und das Symbol eines offenen Ordners. Werden keine gefunden, wird eine vertikale Linie und ein geschlossener Ordner angezeigt. Zeile 14 schreibt die Kreditorennummer auf der gleichen Zeile und dann eine vertikale Linie auf Position 30. Zeile 15 liest die abhngigen Stze aus ztxlfb1. Zeile 16 fhrt eine Vorschau aus, um zu bestimmen, ob es noch mehr abhngige Stze gibt. Gibt es mehr abhngige Stze, setzt Zeile 19 die Variable line1, um ein Linienzeichen zu setzen, und die line2-Variable, um eine vertikale Linie aufzunehmen. An dieser Stelle htte man auch sy-vline anstatt line_vertical_line benutzen knnen. Zeile 26 schreibt mit Hilfe des Zusatzes as line die line1-Variable aus, so da der Wert als Linienzeichenparameter interpretiert wird. Die Zeilen 30 bis 37 schreiben die Abhngigkeiten des aktuellen Satzes aus ztxlfb1 aus. Zeile 42 schreibt eine Unterstreichungslinie mit einer Lnge von 30 Zeichen.

Anzeigen der verfgbaren Symbole, Ikonen und Zeichenlinien


Fhren Sie die Schritte 1 bis 8 aus, um sich die verfgbaren Symbole, Ikonen und Linienzeichen anzeigen zu lassen. Alle Schritte wrden eine write-Anweisung auslsen, die die selektierten Gegenstnde in eine Liste schreiben wrde. 1. Rufen Sie ein Programm im Programmeditor auf. 2. Stellen Sie den Cursor auf eine freie Zeile. 3. Drcken Sie die Schaltflche Muster. Die Maske Muster einfgen erscheint. 4. Whlen Sie die Option Write aus, und gehen Sie weiter. 5. Es wird eine neue Maske angezeigt: Zusammenstellen einer Write-Anweisung. 6. Whlen Sie Symbol, Ikone oder Linie aus. 7. Stellen Sie den Cursor rechts auf das Eingabefeld und drcken Sie (F4). Das System wird eine Liste der verfgbaren Gegenstnde anzeigen. 8. Suchen Sie sich einen Gegenstand aus, und doppelklicken Sie ihn. 9. Drcken Sie auf die Schaltflche bernehmen. Sie kommen in den Editor zurck.

Es knnen nicht alle Ikonen gedruckt werden. Die druckbaren werden in der Liste wie eben beschrieben mit angezeigt. Listing 15.4: Symbole, Ikonen und Linienzeichen 1 report ztx1504. 2 include <list>. "definitions for icons, symbols + line-draw 3 tables: ztxlfa1, ztxlfc3. 4 data: it like ztxlfc3 occurs 100 with header line, 5 ico_l like icon_green_light. 6 select * from ztxlfc3 into table it. 7 sort it by lifnr bukrs gjahr shbkz. 8 loop at it. 9 if it-saldv < 1000. 10 ico_l = icon_green_light. 11 elseif it-saldv between 1000 and 3000.

12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40

ico_l = icon_yellow_light. else. ico_l = icon_red_light. endif. at new lifnr. if sy-tabix > 1. write: /5(82) sy-uline, 19 line_bottom_middle_corner as line, 21 line_bottom_middle_corner as line. skip. endif. write: /5(15) sy-uline, /5 sy-vline, sym_documents as symbol, it-lifnr, 19 sy-vline, /5(82) s