Sie sind auf Seite 1von 1599

ABAP Programmierung (BC-ABA)

Release 4.6C

HELP.BCABA

ABAP Programmierung (BC-ABA)

SAP AG

Copyright
Copyright 2001 SAP AG. Alle Rechte vorbehalten. Weitergabe und Vervielfltigung dieser Publikation oder von Teilen daraus sind, zu welchem Zweck und in welcher Form auch immer, ohne die ausdrckliche schriftliche Genehmigung durch SAP AG nicht gestattet. In dieser Publikation enthaltene Informationen knnen ohne vorherige Ankndigung gendert werden. Die von SAP AG oder deren Vertriebsfirmen angebotenen Software-Produkte knnen SoftwareKomponenten auch anderer Software-Hersteller enthalten. Microsoft , WINDOWS , NT , EXCEL , Word , PowerPoint und SQL Server sind eingetragene Marken der Microsoft Corporation. IBM , DB2 , OS/2 , DB2/6000 , Parallel Sysplex , MVS/ESA , RS/6000 , AIX , S/390 , AS/400 , OS/390 und OS/400 sind eingetragene Marken der IBM Corporation. ORACLE ist eine eingetragene Marke der ORACLE Corporation. INFORMIX -OnLine for SAP und Informix Dynamic Server Informix Software Incorporated.
TM

sind eingetragene Marken der

UNIX , X/Open , OSF/1 und Motif sind eingetragene Marken der Open Group. HTML, DHTML, XML, XHTML sind Marken oder eingetragene Marken des W3C , World Wide Web Consortium, Massachusetts Institute of Technology. JAVA ist eine eingetragene Marke der Sun Microsystems, Inc. JAVASCRIPT ist eine eingetragene Marke der Sun Microsystems, Inc., verwendet unter der Lizenz der von Netscape entwickelten und implementierten Technologie. SAP, SAP Logo, R/2, RIVA, R/3, ABAP, SAP ArchiveLink, SAP Business Workflow, WebFlow, SAP EarlyWatch, BAPI, SAPPHIRE, Management Cockpit, mySAP.com Logo und mySAP.com sind Marken oder eingetragene Marken der SAP AG in Deutschland und vielen anderen Lndern weltweit. Alle anderen Produkte sind Marken oder eingetragene Marken der jeweiligen Firmen.

April 2001

SAP AG

ABAP Programmierung (BC-ABA)

Symbole
Symbol Bedeutung Achtung Beispiel Hinweis Empfehlung Syntax

April 2001

ABAP Programmierung (BC-ABA)

SAP AG

Inhalt
ABAP Programmierung (BC-ABA) .................................................................. 17
ABAP Einfhrung ......................................................................................................................... 20 bersicht ber das R/3-Basis-System ....................................................................................... 21 Das Basis-System im Gesamtsystem ....................................................................................... 22 Applikationsserver ..................................................................................................................... 28 Workprozesse ........................................................................................................................... 33 bersicht ber die Komponenten von Anwendungsprogrammen ......................................... 39 Aufbau von Anwendungsprogrammen...................................................................................... 40 Mgliche Bildschirmbilder ......................................................................................................... 42 Aufbau von ABAP-Programmen ............................................................................................... 47 Verarbeitungsblcke in ABAP-Programmen............................................................................. 53 ABAP-Sprachelemente ............................................................................................................. 60 Logische Datenbanken und Contexte....................................................................................... 65 Speicherstrukturen eines ABAP-Programms............................................................................ 70 ABAP-Programme anlegen und ndern..................................................................................... 72 Programme im Object Navigator ffnen.................................................................................... 74 Programme mit dem ABAP-Editor ffnen ................................................................................. 77 Programme durch Vorwrtsnavigation ffnen........................................................................... 78 Programmeigenschaften pflegen .............................................................................................. 79 Programme editieren................................................................................................................. 82 ABAP Programmiersprache ........................................................................................................85 ABAP-Syntax ................................................................................................................................ 86 Typen und Objekte ....................................................................................................................... 90 Grundlegende Sprachelemente .................................................................................................. 93 Datentypen und Datenobjekte .................................................................................................. 94 Datentypen........................................................................................................................... 95 Definition von Datentypen............................................................................................. 100 Eingebaute ABAP-Typen......................................................................................... 101 Programmlokale Datentypen ................................................................................... 104 Datentypen im ABAP Dictionary.............................................................................. 109 Der TYPE-Zusatz.......................................................................................................... 117 Der LIKE-Zusatz ........................................................................................................... 121 Datenobjekte...................................................................................................................... 123 Literale .......................................................................................................................... 124 Textsymbole.................................................................................................................. 126 Variablen....................................................................................................................... 128 Konstanten.................................................................................................................... 134 Schnittstellen-Arbeitsbereiche ...................................................................................... 135 Vordefinierte Datenobjekte ........................................................................................... 137 Kompatibilitt...................................................................................................................... 138 Attribute von Datenobjekten bestimmen............................................................................ 140 Beispiele zu Datentypen und Objekten.............................................................................. 145 Daten verarbeiten.................................................................................................................... 148 Wertzuweisungen .............................................................................................................. 149

April 2001

SAP AG

ABAP Programmierung (BC-ABA)

Werte mit MOVE zuweisen........................................................................................... 150 Werte mit WRITE TO zuweisen.................................................................................... 153 Werte auf Initialwerte setzen ........................................................................................ 155 Numerische Operationen ................................................................................................... 156 Arithmetische Berechnungen........................................................................................ 157 Mathematische Funktionen........................................................................................... 161 Kaufmnnisches Rechnen............................................................................................ 164 Datums- und Zeitberechnungen ................................................................................... 165 Verarbeitung von Zeichenketten ........................................................................................ 167 Feldinhalte verschieben................................................................................................ 168 Feldinhalte ersetzen ..................................................................................................... 171 Gro-/Kleinschreibung oder Zeichen umsetzen ........................................................... 173 Konvertierung in ein sortierbares Format ..................................................................... 174 Zeichenketten berlagern ............................................................................................. 175 Zeichenketten suchen................................................................................................... 176 Lnge einer Zeichenkette ermitteln .............................................................................. 179 Feldinhalte verdichten................................................................................................... 180 Zeichenfolgen verketten ............................................................................................... 181 Zeichenketten zerlegen ................................................................................................ 182 Teile von Zeichenketten zuweisen ............................................................................... 183 Einzelbitverarbeitung in Hexadezimalfeldern..................................................................... 184 Bits setzen und lesen.................................................................................................... 185 Bitoperationen............................................................................................................... 187 Mengenoperationen mit Bitfolgen................................................................................. 189 Typkonvertierungen ........................................................................................................... 192 Konvertierungsregeln fr elementare Datentypen........................................................ 194 Konvertierungsregeln fr Referenzen........................................................................... 200 Konvertierungsregeln fr Strukturen............................................................................. 201 Konvertierungsregeln fr interne Tabellen ................................................................... 203 Ausrichtung von Datenobjekten.................................................................................... 204 Bearbeitung von Teilfeldern ............................................................................................... 205 Feldsymbole und Datenreferenzen......................................................................................... 208 Feldsymbole....................................................................................................................... 209 Feldsymbole deklarieren............................................................................................... 211 Zuweisung von Datenobjekten an Feldsymbole........................................................... 216 Grundformen der ASSIGN-Anweisung.................................................................... 217 Strukturen komponentenweise zuweisen................................................................ 223 Casting von Datenobjekten ..................................................................................... 224 Datenbereiche fr Feldsymbole .............................................................................. 230 Datenreferenzen ................................................................................................................232 Referenzvariable........................................................................................................... 233 Datenobjekte dynamisch erzeugen .............................................................................. 234 Referenzen auf Datenobjekte beschaffen .................................................................... 235 Datenreferenzen dereferenzieren................................................................................. 236 Beispiel zu Datenreferenzen......................................................................................... 237

April 2001

ABAP Programmierung (BC-ABA)

SAP AG

Logische Ausdrcke................................................................................................................ 238 Vergleiche zwischen verschiedenen Datentypen .............................................................. 239 Vergleiche zwischen Zeichenketten .................................................................................. 243 Vergleiche zwischen Bitfolgen ........................................................................................... 247 Intervallzugehrigkeit prfen.............................................................................................. 249 Initialwert prfen................................................................................................................. 250 Selektionskriterien prfen .................................................................................................. 251 Zuweisung zu einem Feldsymbol berprfen .................................................................... 252 Mehrere logische Ausdrcke verknpfen .......................................................................... 253 Programmablaufsteuerung...................................................................................................... 254 Bedingte Verzweigungen ................................................................................................... 256 Schleifen ............................................................................................................................ 259 Bearbeitung groer Datenmengen ........................................................................................... 264 Interne Tabellen ...................................................................................................................... 265 Interne Tabellen anlegen ................................................................................................... 268 Interne Tabellentypen ................................................................................................... 269 Interne Tabellenobjekte ................................................................................................ 273 Besonderheiten bei Standard-Tabellen ........................................................................ 275 Interne Tabellen bearbeiten ............................................................................................... 278 Operationen mit der gesamten internen Tabelle .......................................................... 279 Interne Tabellen zuweisen....................................................................................... 280 Interne Tabellen initialisieren................................................................................... 282 Interne Tabellen vergleichen ................................................................................... 284 Interne Tabellen sortieren........................................................................................ 286 Interne Tabellen als Schnittstellenparameter .......................................................... 291 Attribute interner Tabellen bestimmen .................................................................... 292 Operationen mit einzelnen Zeilen................................................................................. 293 Operationen fr alle Tabellenarten.......................................................................... 296 Tabellenzeilen einfgen ..................................................................................... 297 Tabellenzeilen verdichtet einfgen..................................................................... 300 Tabellenzeilen lesen........................................................................................... 302 Tabellenzeilen ndern ........................................................................................ 308 Tabellenzeilen lschen....................................................................................... 311 Tabellenzeilen in Schleifen bearbeiten .............................................................. 315 Operationen fr Index-Tabellen............................................................................... 323 Tabellenzeilen anhngen ................................................................................... 324 Tabellenzeilen ber den Index einfgen ............................................................ 328 Tabellenzeilen ber den Index lesen ................................................................. 331 Binre Suche bei Standard-Tabellen ................................................................. 332 Tabellenzeilen nach Zeichenketten durchsuchen.............................................. 333 Tabellenzeilen ber den Index ndern............................................................... 335 Tabellenzeilen ber den Index lschen.............................................................. 338 Indexangaben bei Schleifen............................................................................... 341 Zugriff ber Feldsymbole .............................................................................................. 343 Kopfzeilen als Arbeitsbereich ....................................................................................... 345

April 2001

SAP AG

ABAP Programmierung (BC-ABA)

Extrakte ................................................................................................................................... 347 Extrakt definieren ............................................................................................................... 348 Extrakt mit Daten fllen...................................................................................................... 350 Extrakte verarbeiten...........................................................................................................352 Extrakt auslesen ........................................................................................................... 353 Extrakt sortieren............................................................................................................ 356 Gruppenstufenverarbeitung .......................................................................................... 359 Anzahlen und Summen ermitteln ................................................................................. 363 Daten aufbereiten.................................................................................................................... 366 Beispiel fr aufbereitete Daten........................................................................................... 367 Daten beim Lesen aufbereiten........................................................................................... 369 Daten ber interne Tabellen aufbereiten ........................................................................... 371 Daten ber Extrakte aufbereiten ........................................................................................ 375 Externe Datenspeicherung........................................................................................................ 377 Datenobjekte als Cluster speichern ........................................................................................ 378 Daten-Cluster im ABAP-Memory ....................................................................................... 379 Datenobjekte im Memory speichern ............................................................................. 380 Datenobjekte aus dem Memory lesen .......................................................................... 381 Daten-Cluster im Memory lschen ............................................................................... 383 Daten-Cluster in Datenbanken .......................................................................................... 384 Cluster-Datenbanken.................................................................................................... 385 Struktur von Cluster-Datenbanken .......................................................................... 386 Beispiel einer Cluster-Datenbank............................................................................ 388 Datenobjekte in Cluster-Datenbanken speichern ......................................................... 390 Inhaltsverzeichnis eines Daten-Clusters erstellen........................................................ 392 Datenobjekte aus Cluster-Datenbanken lesen ............................................................. 394 Daten-Cluster in Cluster-Datenbanken lschen ........................................................... 396 Open SQL-Anweisungen und Cluster-Datenbanken.................................................... 398 Arbeiten mit Dateien................................................................................................................ 401 Arbeiten mit Dateien auf dem Anwendungsserver ............................................................ 402 Dateihandhabung in ABAP ........................................................................................... 403 ffnen einer Datei ................................................................................................... 404 Grundform der Anweisung OPEN DATASET .................................................... 405 ffnen einer Datei zum Lesen ........................................................................... 406 ffnen einer Datei zum Schreiben ..................................................................... 407 ffnen einer Datei fr das Schreiben an das Ende der Datei............................ 410 Binrmodus angeben ......................................................................................... 412 Textmodus angeben........................................................................................... 414 ffnen einer Datei an einer bestimmten Position .............................................. 416 Betriebssystemkommandos absetzen ............................................................... 418 Empfangen der Betriebssystemnachricht .......................................................... 419 Schlieen einer Datei .............................................................................................. 420 Lschen einer Datei................................................................................................. 421 Daten in Dateien schreiben .......................................................................................... 422 Daten aus Dateien lesen .............................................................................................. 424

April 2001

ABAP Programmierung (BC-ABA)

SAP AG

Automatische Prfungen bei Dateioperationen ............................................................ 426 Berechtigungsprfung fr bestimmte Programme und Dateien .............................. 427 Allgemeine Verprobung bei Dateizugriffen.............................................................. 430 Arbeiten mit Dateien auf dem Prsentationsserver ........................................................... 433 Daten mit Benutzerdialog auf den Prsentationsserver schreiben .............................. 434 Daten ohne Benutzerdialog auf den Prsentationsserver schreiben ........................... 437 Daten mit Benutzerdialog vom Prsentationsserver lesen........................................... 440 Daten ohne Benutzerdialog vom Prsentationsserver lesen ....................................... 443 Dateien auf dem Prsentationsserver berprfen........................................................ 446 Verwendung plattformunabhngiger Dateinamen ............................................................. 449 Syntaxgruppen pflegen................................................................................................. 450 Betriebssysteme Syntaxgruppen zuordnen.................................................................. 451 Logische Pfade anlegen und definieren ....................................................................... 453 Logische Dateinamen anlegen und definieren ............................................................. 455 Verwendung von logischen Dateien in ABAP-Programmen ........................................ 456 Modularisierungstechniken....................................................................................................... 459 Quelltext-Module ..................................................................................................................... 461 Makros ............................................................................................................................... 462 Include-Programme ........................................................................................................... 465 Prozeduren.............................................................................................................................. 467 Unterprogramme................................................................................................................ 469 Definition von Unterprogrammen.................................................................................. 470 Globale Daten des Rahmenprogramms.................................................................. 471 Lokale Daten des Unterprogramms ........................................................................ 473 Die Parameterschnittstelle....................................................................................... 477 Unterprogramme beenden ...................................................................................... 483 Aufruf von Unterprogrammen ....................................................................................... 485 Benennung des Unterprogramms ........................................................................... 486 Parameterbergabe an Unterprogramme ............................................................... 490 Beispiele zu Unterprogrammen............................................................................... 493 Gemeinsamer Datenbereich.................................................................................... 498 Funktionsbausteine............................................................................................................ 501 Funktionsgruppen ......................................................................................................... 502 Funktionsbausteine aufrufen ........................................................................................ 504 Funktionsbausteine anlegen......................................................................................... 510 Organisation von externen Prozeduraufrufen.................................................................... 516 Spezielle Techniken ................................................................................................................... 518 Abfangbare Laufzeitfehler ....................................................................................................... 519 Programmberprfungen................................................................................................... 520 Laufzeitfehler abfangen ..................................................................................................... 522 Berechtigungen berprfen..................................................................................................... 524 Berechtigungskonzept ....................................................................................................... 525 Berechtigungsprfungen.................................................................................................... 527 Laufzeitmessung von Programmsegmenten .......................................................................... 529 GET RUN TIME FIELD ...................................................................................................... 530 Laufzeitmessung von Datenbankzugriffen......................................................................... 532

April 2001

SAP AG

ABAP Programmierung (BC-ABA)

Programme dynamisch generieren und starten...................................................................... 534 Ein neues Programm dynamisch anlegen ......................................................................... 535 Bestehende Programme dynamisch ndern ..................................................................... 537 Dynamische angelegte Programme starten ...................................................................... 538 Temporre Unterprogramme anlegen und starten ............................................................ 541 ABAP Bildschirmbilder.............................................................................................................. 544 Dynpros ....................................................................................................................................... 545 Bestandteile von Dynpros .......................................................................................................547 Dynproattribute .................................................................................................................. 548 Bildschirmelemente............................................................................................................ 550 Dynprofelder....................................................................................................................... 552 Die Dynproablauflogik........................................................................................................ 555 Verarbeitung von Dynpros ...................................................................................................... 557 Benutzeraktionen auf Dynpros........................................................................................... 558 Ein- und Ausgabefelder verarbeiten ............................................................................. 560 Drucktasten auf dem Dynpro ........................................................................................ 565 Ankreuzfelder und Auswahlknpfe mit Funktionscodes............................................... 568 GUI-Status verwenden ................................................................................................. 571 Funktionscodes auswerten ........................................................................................... 580 Cursorposition bestimmen............................................................................................ 582 Aufruf von ABAP-Dialogmodulen....................................................................................... 585 Einfacher Modulaufruf................................................................................................... 587 Steuerung des Datentransports.................................................................................... 590 Unbedingter Modulaufruf .............................................................................................. 593 Bedingte Modulaufrufe.................................................................................................. 597 Eingabeberprfungen ...................................................................................................... 602 Automatische Eingabeberprfungen .......................................................................... 603 Eingabeberprfungen in der Ablauflogik .................................................................... 606 Eingabeberprfungen in Dialogmodulen .................................................................... 609 Feldhilfe, Eingabehilfe und Dropdown-Boxen.................................................................... 614 Feldhilfe ........................................................................................................................ 615 Eingabehilfe .................................................................................................................. 620 Eingabehilfen des ABAP Dictionary ........................................................................ 621 Eingabehilfen des Dynpro ....................................................................................... 627 Eingabehilfen in Dialogmodulen.............................................................................. 629 Dropdown-Boxen .......................................................................................................... 633 Bildschirmbilder dynamisch modifizieren........................................................................... 637 Attribute dynamisch setzen........................................................................................... 638 Die Funktion Feldauswahl ............................................................................................ 644 Cursorposition festlegen ............................................................................................... 656 Halten von Daten dynamisch ermglichen ................................................................... 658 Komplexe Bildschirmelemente................................................................................................ 660 Statusikonen ...................................................................................................................... 661 Kontextmens .................................................................................................................... 664 Subscreens ........................................................................................................................ 672

April 2001

ABAP Programmierung (BC-ABA)

SAP AG

TabStrips............................................................................................................................ 679 Custom Controls ................................................................................................................687 Table Controls.................................................................................................................... 695 Table Controls auf dem Bildschirmbild ......................................................................... 697 Table Controls in der Ablauflogik.................................................................................. 700 Table Controls im ABAP-Programm............................................................................. 702 Table Controls: Beispiel mit Blttern ............................................................................ 707 Table Controls: Beispiel mit Modifikationen.................................................................. 710 Anhang: Die Steploop-Technik ..................................................................................... 714 Selektionsbilder.......................................................................................................................... 720 Selektionsbilder und logische Datenbanken ........................................................................... 722 Selektionsbilder definieren ...................................................................................................... 725 Eingabefelder fr Einzelwerte definieren ........................................................................... 728 Grundform von Parametern .......................................................................................... 729 Dynamischer Dictionary-Bezug .................................................................................... 731 Vorschlagswerte fr Parameter .................................................................................... 733 SPA/GPA-Parameter als Vorschlagswerte................................................................... 734 Gro- und Kleinschreibung bei Parametern ................................................................. 735 Sichtbare Lnge verkleinern ......................................................................................... 736 Mufelder definieren..................................................................................................... 737 Suchhilfe fr Parameter ................................................................................................ 738 Eingabewerte berprfen ............................................................................................. 740 Ankreuzfelder definieren............................................................................................... 741 Auswahlknpfe definieren............................................................................................. 742 Eingabefelder ausblenden ............................................................................................ 744 Eingabefelder modifizieren ........................................................................................... 745 Komplexe Selektionen definieren ...................................................................................... 747 Selektionstabellen......................................................................................................... 748 Grundform von Selektionskriterien ............................................................................... 752 Selektionskriterien und logische Datenbanken ............................................................ 757 Vorschlagswerte fr Selektionskriterien ....................................................................... 759 Eingabe auf eine Zeile beschrnken ............................................................................ 761 Eingabe auf Einzelfelder beschrnken ......................................................................... 762 Weitere Zustze fr Selektionskriterien........................................................................ 763 Selektionsbilder aufbereiten............................................................................................... 764 Leerzeilen, Linien und Kommentare............................................................................. 765 Mehrere Elemente in einer Zeile .................................................................................. 768 Elementblcke .............................................................................................................. 770 Selektionsbilder aufrufen......................................................................................................... 772 Standardselektionsbilder aufrufen ..................................................................................... 773 Eigenstndige Selektionsbilder aufrufen ........................................................................... 775 Benutzeraktionen auf Selektionsbildern.................................................................................. 782 Drucktasten auf dem Selektionsbild .................................................................................. 783 Ankreuzfelder und Auswahlknpfe mit Funktionscodes .................................................... 785 Drucktasten in der Drucktastenleiste ................................................................................. 786

10

April 2001

SAP AG

ABAP Programmierung (BC-ABA)

Standard-GUI-Status ndern ............................................................................................. 788 Selektionsbildverarbeitung ...................................................................................................... 789 Grundform .......................................................................................................................... 792 PBO des Selektionsbilds.................................................................................................... 793 Einzelfeldverarbeitung ....................................................................................................... 795 Blockverarbeitung ..............................................................................................................796 Auswahlknpfe verarbeiten................................................................................................ 798 Mehrfachselektion verarbeiten........................................................................................... 800 Feldhilfe definieren............................................................................................................. 802 Eingabehilfe definieren ...................................................................................................... 804 Subscreens und TabStrips bei Selektionsbildern ................................................................... 807 Selektionsbilder als Subscreens ........................................................................................ 808 TabStrips auf Selektionsbildern ......................................................................................... 813 Subscreens auf Selektionsbildern ..................................................................................... 817 Selektionskriterien verwenden ................................................................................................ 819 Selektionstabellen in der WHERE-Klausel ........................................................................ 820 Selektionstabellen in logischen Ausdrcken...................................................................... 821 Selektionstabellen in GET-Ereignissen ............................................................................. 824 Listen ........................................................................................................................................... 827 Listenerstellung ....................................................................................................................... 829 Einfache Listen mit der WRITE-Anweisung erstellen ........................................................ 830 Die Anweisung WRITE ................................................................................................. 831 WRITE-Ausgabedaten auf der Liste positionieren ....................................................... 834 Aufbereitungsoptionen.................................................................................................. 836 Symbole und Ikonen auf der Liste ausgeben ............................................................... 839 Linien und Leerzeilen.................................................................................................... 840 Feldinhalt als Ankreuzfeld ausgeben............................................................................ 842 WRITE ber Anweisungsmuster verwenden................................................................ 843 Komplexe Listen erstellen.................................................................................................. 847 Die Standardliste .......................................................................................................... 848 Aufbau der Standardliste ......................................................................................... 849 GUI-Status der Standardliste................................................................................... 852 Listenaufbau selbst definieren ...................................................................................... 855 Seitenkopf gestalten ................................................................................................ 856 Listenbreite festlegen .............................................................................................. 858 Leerzeilen erzeugen ................................................................................................ 860 Seitenlnge festlegen .............................................................................................. 862 Seitenfu gestalten.................................................................................................. 864 Listen mit mehreren Seiten........................................................................................... 866 Seitenvorschbe programmieren ............................................................................ 867 Standardseitenkopf einzelner Seiten....................................................................... 870 Seitenlnge einzelner Seiten................................................................................... 872 Seitenbreite von Listenstufen .................................................................................. 876 In Listen blttern ........................................................................................................... 877 Fensterweise blttern .............................................................................................. 878

April 2001

11

ABAP Programmierung (BC-ABA)

SAP AG

Seitenweise blttern ................................................................................................ 880 Zu den Rndern der Liste blttern........................................................................... 882 Spaltenweise blttern .............................................................................................. 884 Bltterbaren Teil einer Seite festlegen .................................................................... 886 Listenseiten gestalten ................................................................................................... 890 Positionierung der Ausgabe .................................................................................... 891 Absolute Positionsangaben................................................................................ 892 Relative Positionsangaben................................................................................. 895 Formatierung der Ausgabe...................................................................................... 899 Die Anweisung FORMAT ................................................................................... 900 Farben in Listen ............................................................................................ 901 Felder eingabebereit machen ....................................................................... 907 Felder als Hotspot ausgeben ........................................................................ 909 Besondere Ausgabeformate .............................................................................. 911 Linien auf Listen ................................................................................................. 915 Benutzeraktionen auf Listen....................................................................................................923 Verzweigungslisten ............................................................................................................ 924 Dialogstatus fr Listen ....................................................................................................... 930 Kontextmens fr Listen .................................................................................................... 937 Listenereignisse im ABAP-Programm ............................................................................... 939 Listen in Dialogfenstern ..................................................................................................... 944 Datenbergabe von Listen an das Programm ................................................................... 946 Automatische Datenbergabe ...................................................................................... 947 Programmgesteuerte Datenbergabe .......................................................................... 950 Verzweigungslisten beeinflussen....................................................................................... 960 In Verzweigungslisten blttern...................................................................................... 961 Cursor vom Programm aus setzen............................................................................... 963 Listenzeilen modifizieren .............................................................................................. 967 Listen und Dynpros ................................................................................................................. 970 Aufruf von Listen aus der Dynproverarbeitung .................................................................. 971 Aufruf von Dynpros aus der Listenverarbeitung ................................................................ 975 Listen drucken und ablegen .................................................................................................... 979 Drucken einer Liste nach Ihrer Erstellung.......................................................................... 980 Drucken einer Liste whrend ihrer Erstellung.................................................................... 982 Druckparameter ............................................................................................................ 983 Ausfhren und Drucken ................................................................................................ 993 Programmgesteuertes Drucken.................................................................................... 996 Listen von aufgerufenen Programmen drucken ......................................................... 1000 Drucksteuerung................................................................................................................ 1003 Linken und oberen Rand festlegen............................................................................. 1004 Druckformat festlegen................................................................................................. 1006 Ablegen von Listen mit SAP ArchiveLink......................................................................... 1010 Nachrichten............................................................................................................................... 1016 Nachrichten verwalten........................................................................................................... 1017 Nachrichten senden .............................................................................................................. 1018 Nachrichtenverarbeitung ....................................................................................................... 1020

12

April 2001

SAP AG

ABAP Programmierung (BC-ABA)

Nachrichten ohne Bildschirmbezug ................................................................................. 1021 Nachrichten auf Dynpros ................................................................................................. 1022 Nachrichten auf Selektionsbildern ................................................................................... 1023 Nachrichten auf Listen ..................................................................................................... 1024 Nachrichten in Funktionsbausteinen und Methoden ....................................................... 1025 ABAP Programmausfhrung .................................................................................................. 1026 Verarbeitungsblcke definieren.............................................................................................. 1029 Ereignisblcke....................................................................................................................... 1030 Dialogmodule ........................................................................................................................ 1033 Direkte Ausfhrung - Reports ................................................................................................. 1034 Verknpfung mit logischen Datenbanken ............................................................................. 1036 Reporttransaktionen.............................................................................................................. 1040 Ereignisblcke in ausfhrbaren Programmen....................................................................... 1041 Beschreibung der Reporting-Ereignisse .......................................................................... 1042 INITIALIZATION ......................................................................................................... 1043 AT SELECTION-SCREEN.......................................................................................... 1046 START-OF-SELECTION ............................................................................................ 1047 GET............................................................................................................................. 1048 GET LATE.............................................................................................................. 1051 END-OF-SELECTION ................................................................................................ 1053 Ereignisblcke verlassen ................................................................................................. 1055 Ereignisblcke mit STOP verlassen ........................................................................... 1056 Ereignisblcke mit EXIT verlassen ............................................................................. 1059 Ereignisblcke mit CHECK verlassen ........................................................................ 1062 GET-Ereignisblcke mit REJECT verlassen .............................................................. 1067 Dialoggesteuerte Ausfhrung - Transaktionen..................................................................... 1070 bersicht zu Dialogprogrammen .......................................................................................... 1071 Eine Beispieltransaktion................................................................................................... 1075 Transaktionspflege................................................................................................................ 1083 Dialogtransaktion ............................................................................................................. 1084 Reporttransaktion............................................................................................................. 1085 Variantentransaktion ........................................................................................................ 1086 Parametertransaktion....................................................................................................... 1087 Dynprofolgen ......................................................................................................................... 1088 Statisches Folgedynpro ................................................................................................... 1090 Dynamisches Folgedynpro .............................................................................................. 1091 Dynpros programmgesteuert beenden ............................................................................ 1093 Dynprofolgen aufrufen ..................................................................................................... 1094 Modale Dialogfenster einbetten ....................................................................................... 1097 Beispieltransaktion fr Dynprofolgen ............................................................................... 1098 Programme aufrufen ................................................................................................................ 1103 Ausfhrbare Programme (Reports) aufrufen ........................................................................ 1105 Selektionsbild des aufgerufenen Programms fllen ........................................................ 1106 Listen des aufgerufenen Programms beeinflussen ......................................................... 1110 Aufgerufenes Programm programmgesteuert verlassen................................................. 1112 Transaktionen aufrufen .........................................................................................................1114

April 2001

13

ABAP Programmierung (BC-ABA)

SAP AG

Dynprofolgen als Module aufrufen ........................................................................................ 1115 Daten zwischen Programmen bergeben............................................................................. 1119 Einstiegsbilder ber SPA/GPA-Parameter fllen............................................................. 1121 ABAP Datenbankzugriffe.........................................................................................................1125 Datenbankzugriffe im R/3-System .......................................................................................... 1126 Open SQL .................................................................................................................................. 1129 Daten lesen ........................................................................................................................... 1131 Selektion definieren ......................................................................................................... 1133 Zielbereich angeben ........................................................................................................ 1140 Datenbanktabellen angeben ............................................................................................ 1147 Zeilen auswhlen ............................................................................................................. 1154 Zeilen gruppieren ............................................................................................................. 1162 Zeilengruppen auswhlen................................................................................................ 1165 Sortierreihenfolge angeben.............................................................................................. 1167 Subqueries ....................................................................................................................... 1170 Daten ber Cursor lesen.................................................................................................. 1174 Mgliche Sperrkonflikte.................................................................................................... 1180 Daten ndern......................................................................................................................... 1181 Tabellenzeilen einfgen ................................................................................................... 1182 Tabellenzeilen ndern...................................................................................................... 1185 Tabellenzeilen lschen .................................................................................................... 1188 Tabellenzeilen einfgen oder ndern .............................................................................. 1191 Datenbanknderungen festschreiben.............................................................................. 1193 Performance-Hinweise.......................................................................................................... 1194 Treffermenge klein halten ................................................................................................ 1198 bertragene Datenmenge klein halten ............................................................................ 1199 Zahl der Zugriffe klein halten ........................................................................................... 1201 Suchaufwand klein halten ................................................................................................ 1203 Datenbanklast klein halten............................................................................................... 1205 Native SQL ................................................................................................................................ 1208 Native SQL fr Oracle ........................................................................................................... 1213 Native SQL fr Informix......................................................................................................... 1230 Native SQL fr DB2 Common Server ................................................................................... 1246 Logische Datenbanken ............................................................................................................ 1257 Aufbau logischer Datenbanken ............................................................................................. 1260 Selektionsviews..................................................................................................................... 1267 Beispiel einer logischen Datenbank ...................................................................................... 1269 Logische Datenbanken verwenden....................................................................................... 1273 Verknpfung mit ausfhrbaren Programmen................................................................... 1276 Aufruf ber Funktionsbaustein ......................................................................................... 1280 Logische Datenbanken bearbeiten ....................................................................................... 1287 Logische Datenbank anlegen .......................................................................................... 1288 Struktur bearbeiten .......................................................................................................... 1290 Suchhilfen bearbeiten ...................................................................................................... 1292 Selektionen bearbeiten .................................................................................................... 1293 Datenbankprogramm bearbeiten ..................................................................................... 1297 Freie Abgrenzungen im Datenbankprogramm ........................................................... 1304

14

April 2001

SAP AG

ABAP Programmierung (BC-ABA)

Feldselektionen im Datenbankprogramm................................................................... 1309 Suchhilfen im Datenbankprogramm ........................................................................... 1312 Eigenstndiger Aufruf und Datenbankprogramm ....................................................... 1316 Weitere Komponenten bearbeiten ................................................................................... 1317 Performanceverbesserungen........................................................................................... 1318 Arbeiten mit Contexten............................................................................................................ 1320 Was ist ein Context? ............................................................................................................. 1321 Der Context Builder in der Workbench ................................................................................. 1323 Contexte anlegen und pflegen ......................................................................................... 1324 Tabellen als Module.................................................................................................... 1325 Funktionsbausteine als Module .................................................................................. 1328 Contexte als Module ................................................................................................... 1331 Contexte testen................................................................................................................1334 Contexte puffern .............................................................................................................. 1336 Felder ............................................................................................................................... 1339 Module ............................................................................................................................. 1341 Schnittstellen.................................................................................................................... 1343 Contexte in ABAP-Programmen verwenden......................................................................... 1344 Contexte suchen und anzeigen ....................................................................................... 1345 Context-Instanzen anlegen .............................................................................................. 1347 Context-Instanzen mit Schlsselwerten versorgen.......................................................... 1348 Daten von Context-Instanzen abfragen ........................................................................... 1349 Nachrichtenbehandlung in Contexten.............................................................................. 1351 Nachrichtenbehandlung in Tabellen-Modulen ............................................................ 1352 Nachrichtenbehandlung in Funktionsbaustein-Modulen ............................................ 1355 Tips zum Arbeiten mit Contexten .......................................................................................... 1358 SAP-Transaktionskonzept....................................................................................................... 1359 Transaktionen und Logical Units of Work ............................................................................. 1360 Datenbank-LUW .............................................................................................................. 1361 SAP-LUW......................................................................................................................... 1364 SAP-Transaktionen.......................................................................................................... 1368 Das R/3-Sperrkonzept...........................................................................................................1369 Beispielprogramm fr SAP-Sperren ................................................................................ 1373 Techniken der Verbuchung ................................................................................................... 1376 Asynchron verbuchen ...................................................................................................... 1377 Asynchron in Abschnitten verbuchen .............................................................................. 1380 Synchron verbuchen ........................................................................................................ 1381 Lokal verbuchen............................................................................................................... 1382 Verbuchungsfunktionsbausteine anlegen ............................................................................. 1383 Verbuchungsfunktionsbausteine aufrufen............................................................................. 1384 Verbuchungsfunktionsbausteine direkt aufrufen ............................................................. 1385 Aufrufe in einem Unterprogramm aufnehmen ................................................................. 1386 Spezielle berlegungen zu LUWs ........................................................................................ 1387 Transaktionen, die Verbuchungsfunktionsbausteine aufrufen......................................... 1388 Dialogbausteine, die Verbuchungsfunktionsbausteine aufrufen...................................... 1389 Fehlerbehandlung bei gebndelten Aktualisierungen........................................................... 1390 ABAP Objects ........................................................................................................................... 1392

April 2001

15

ABAP Programmierung (BC-ABA)

SAP AG

Was ist Objektorientierung? ................................................................................................... 1393 Was bedeutet ABAP Objects? ................................................................................................ 1397 Von Funktionsgruppen zu Objekten ...................................................................................... 1398 Beispiel zu Instanzen von Funktionsgruppen ....................................................................... 1401 Klassen...................................................................................................................................... 1403 bersichtsgrafik zu Klassen.................................................................................................. 1408 Einfhrendes Beispiel zu Klassen......................................................................................... 1409 Behandlung von Objekten....................................................................................................... 1410 bersichtsgrafik zu Objekten ................................................................................................ 1414 Einfhrendes Beispiel zu Objekten ....................................................................................... 1415 Methoden deklarieren und aufrufen ....................................................................................... 1416 Beispiel zu Methoden in ABAP Objects ................................................................................ 1421 Vererbung.................................................................................................................................. 1433 bersichtsgrafiken zur Vererbung......................................................................................... 1438 Einfhrendes Beispiel zur Vererbung ................................................................................... 1441 Interfaces................................................................................................................................... 1443 bersichtsgrafiken zu Interfaces........................................................................................... 1449 Einfhrendes Beispiel zu Interfaces...................................................................................... 1450 Ereignisse auslsen und behandeln ...................................................................................... 1452 bersichtsgrafik zu Ereignissen............................................................................................ 1455 Einfhrendes Beispiel zu Ereignissen................................................................................... 1458 Komplexes Beispiel zu Ereignissen ...................................................................................... 1460 Class- und Interface-Pools ...................................................................................................... 1466 Anhang ...................................................................................................................................... 1469 Programme, Bildschirmbilder, Verarbeitungsblcke ........................................................... 1470 Programmeinleitende Anweisungen ...................................................................................... 1474 bersicht ber ABAP-Aufrufe................................................................................................. 1476 Kontext der Aufrufe ............................................................................................................... 1477 Interne Aufrufe ................................................................................................................. 1478 Externe Prozeduraufrufe.................................................................................................. 1480 Externe Programmaufrufe................................................................................................ 1482 Aufrufbare Einheiten ............................................................................................................. 1484 ABAP-Programme ........................................................................................................... 1485 Prozeduren....................................................................................................................... 1487 Dynpros und Dynprofolgen .............................................................................................. 1489 bersicht ber alle ABAP-Anweisungen ............................................................................... 1492 ABAP-Systemfelder ................................................................................................................. 1556 ABAP-Glossar........................................................................................................................... 1580 Syntaxkonventionen ................................................................................................................ 1599

16

April 2001

SAP AG

ABAP Programmierung (BC-ABA) ABAP Programmierung (BC-ABA)

ABAP Programmierung (BC-ABA)


Diese Dokumentation beschreibt die Programmierung von Anwendungsprogrammen in der dreistufigen Client-Server-Architektur des R/3-Systems.

Prsentation

SAP GUI

SAP GUI

SAP GUI

SAP GUI

Applikation
ABAP ABAP

Datenbank
RDBMS

R/3-Anwendungsprogramme werden in der Programmiersprache ABAP erstellt und laufen in der Anwendungsschicht des R/3-Systems. ABAP-Programme kommunizieren mit dem Datenbank-Management-System der zentralen relationalen Datenbank (RDBMS) und mit der graphischen Benutzerschnittstelle (SAP GUI) der Prsentationsschicht.

Inhalt
Die Dokumentation ist in fnf Abschnitte unterteilt: ABAP Einfhrung [Seite 20] Hier werden die Grundlagen der Anwendungsprogrammierung in R/3 dargestellt, die fr das Verstndnis der ABAP-Programmierung unerllich sind. Nach einer bersicht ber das R/3-Basis System werden die wesentlichen Merkmale von Anwendungsprogrammen und der Programmiersprache ABAP vorgestellt. Schlielich wird in einer Kurzeinfhrung gezeigt, wie Anwendungsprogramme in der ABAP Workbench angelegt werden. ABAP Programmiersprache [Seite 85] Hier wird auf die Anweisungen der Programmiersprache ABAP eingegangen. Von elementaren Sprachkonstrukten, wie Datendeklarationen, Datenverarbeitung und Ablaufsteuerung bis Modularisierung und spezielle Techniken wird gezeigt, welche ABAP-Anweisungen fr welche Zwecke eingesetzt werden.

April 2001

17

ABAP Programmierung (BC-ABA) ABAP Programmierung (BC-ABA) ABAP Bildschirmbilder [Seite 544]

SAP AG

Hier werden die verschiedenen Bildschirmbilder dargestellt, die zu ABAP-Programmen gehren knnen. Es wird gezeigt, wie die Interaktion zwischen ABAP-Programmen und Benutzer in Form von Bildschirmbildern programmiert und gesteuert wird. ABAP Programmausfhrung [Seite 1026] Hier wird auf die Ausfhrung von ABAP-Programmen im R/3-System eingegangen. Der Abschnitt zeigt, wie ABAP-Programme im R/3-System gestartet werden knnen, welche Voraussetzungen dafr gegeben sein mssen, und welche verschiedenen Arten von Programmausfhrungen es gibt. ABAP Datenbankzugriffe [Seite 1125] Hier wird gezeigt, wie ABAP mit der zentralen Datenbank des R/3-Systems arbeitet. Es wird auf die Teile der Programmiersprache eingegangen, die in der Datenbank in SQLBefehle umgesetzt werden, und es wird gezeigt, wie nderungen auf der Datenbank programmiert werden. ABAP Objects [Seite 1392] Hier wird ABAP Objects, die objektorientierte Erweiterung von ABAP eingefhrt. Es werden Objekte, Klassen und Interfaces als die grundlegenden Elemente von ABAP Objects eingefhrt. Es wird gezeigt, wie Klassen selbstndig, mit Hilfe von Interfaces oder ber Vererbung definiert werden. Es wird die Behandlung von Methoden und Ereignisse als Komponenten von Klassen gezeigt. Anhang [Seite 1469] Der Anhang enthlt zusammenfassende Beschreibungen und bersichten, wie z.B. eine ABAP-Befehlsreferenz und ein ABAP-Glossar.

Beispielprogramme
Bitte beachten Sie, da die Beispielprogramme dieser Dokumentation in jedem R/3-System ab Release 4.5 in der Transaktion ABAPDOCU zum Testen zur Verfgung stehen. Die Gliederung der Programme entspricht dabei der Struktur dieser Dokumentation.

Weiterfhrende Dokumentation
SAP Style Guide [Extern] nderungen des SAP-Standards [Extern] ABAP Workbench: Werkzeuge [Extern] ABAP Dictionary [Extern]

18

April 2001

SAP AG

ABAP Programmierung (BC-ABA) ABAP Programmierung (BC-ABA)

Remote Communications [Extern] RFC-Programmierung in ABAP [Extern] ABAP als OLE-Automation-Controller [Extern] Basis-Programmierschnittstellen [Extern] ABAP Query [Extern]

April 2001

19

ABAP Programmierung (BC-ABA) ABAP Einfhrung

SAP AG

ABAP Einfhrung

aber bevor es so richtig losgeht, sollten Sie zuerst die folgenden Abschnitte lesen:

bersicht ber das R/3-Basis-System [Seite 21] bersicht ber die Komponenten von Anwendungsprogrammen [Seite 39] ABAP-Programme anlegen und ndern [Seite 72]

20

April 2001

SAP AG

ABAP Programmierung (BC-ABA) bersicht ber das R/3-Basis-System

bersicht ber das R/3-Basis-System


Einen wesentlichen Bestandteil des gesamten R/3-Systems mit seinen Anwendungen Finanzwirtschaft, Logistik, Personalwirtschaft bildet das R/3-Basis-System, die Plattform fr alle R/3-Anwendungen. In den folgenden Abschnitten zeigen wir Ihnen, was das R/3-Basis-System ist und wie es in das Gesamtsystem eingegliedert ist. Zuerst stellen wir Ihnen das gesamte Basis-System vor. Anschlieend wenden wir uns ausfhrlicher einer zentralen Komponente zu, dem Applikationsserver. Schlielich stellen wir Ihnen Workprozesse als Komponenten der Applikationsserver vor. Das Basis-System im Gesamtsystem [Seite 22] Applikationsserver [Seite 28] Workprozesse [Seite 33]

April 2001

21

ABAP Programmierung (BC-ABA) Das Basis-System im Gesamtsystem

SAP AG

Das Basis-System im Gesamtsystem


In den folgenden Abschnitten zeigen wir Ihnen drei verschiedene Sichten auf das R/3-System. Anhand dieser Sichten zeigen wir, welche Rolle das R/3-Basis-System im Gesamtsystem spielt.

Logische Sicht
Die folgende Abbildung zeigt die logische Sicht auf das R/3-System in Form eines Blockdiagramms.

R/3 Benutzer

...
Prsentationskomponenten Prsentationskomponenten

R/3 Benutzer

ABAP ABAP Workbench Workbench

R/3 Basis System

R/3 Anwendung 1

...

R/3 Anwendung n

Kernel & Basis Dienste Kernel & Basis Dienste Datenbank Management System

Datenbank
Die logische Sicht auf das R/3-System hebt sich von einer hardware- oder softwaretechnischen Sicht dahingehend ab, da die gezeigten Komponenten nicht unbedingt Hardware- oder Software-Einheiten zugeordnet werden knnen. Die Abbildung zeigt, wie sich das R/3-BasisSystem als zentrale Plattform in das gesamte R/3-System einfgt. Die folgende Aufzhlung fat die Aufgaben der drei im R/3-Basis-System enthaltenen logischen Komponenten kurz zusammen:

Kernel & Basisdienste


Die Komponente Kernel & Basisdienste dient als hardware-, betriebssystem- und datenbankunabhngige Laufzeitumgebung aller R/3-Anwendungen. Diese Laufzeitumgebung ist hauptschlich in C/C++ geschrieben. Einige systemnahe Teile sind aber auch in der SAPeigenen Programmiersprache programmiert. Im einzelnen erfllt die Komponente Kernel & Basisdienste dabei folgende Aufgaben:

22

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Das Basis-System im Gesamtsystem

Ausfhren von Anwendungen Alle R/3-Anwendungen laufen auf Softwareprozessoren (Virtual Machines) dieser Komponente. Verwaltung von Benutzern und Prozessen An einem R/3-System knnen viele Benutzer gleichzeitig arbeiten und jeder Benutzer kann mehrere Anwendungen unabhngig voneinander ausfhren. Die Komponente bernimmt dabei die sonst blichen Aufgaben eines Betriebssystems. Benutzer melden sich am R/3-System an und fhren dort Anwendungen aus. Sie kommen mit dem eigentlichen Betriebssystem des jeweiligen Rechners nicht in Berhrung. Fr das Betriebssystem des Rechners ist das R/3-System der einzige Benutzer. Datenbankzugriffe Jedes R/3-System ist mit einem Datenbanksystem, bestehend aus Datenbank Management System (DBMS) und der eigentlichen Datenbank (Datenbestand) verknpft. Die Anwendungen greifen nicht direkt, sondern nur ber Basisdienste auf das Datenbanksystem zu. Kommunikation R/3-Anwendungen knnen sowohl mit anderen R/3-Systemen als auch mit Nicht-R/3Systemen kommunizieren. Ebenso ist der Zugriff von auerhalb auf die betriebswirtschaftliche Funktionalitt von R/3-Anwendungen mglich (BAPISchnittstelle). Die Komponente stellt alle hierfr ntigen Dienste zur Verfgung. Kontrolle und Administration des R/3-Systems Die Komponente umfat Programme, die es erlauben den laufenden Betrieb eines R/3Systems zu berwachen, zu steuern und Laufzeitparameter zu verndern.

ABAP Workbench
Die Komponente ABAP Workbench ist eine vollstndige Entwicklungsumgebung fr in ABAP geschriebenen Anwendungen. Sie dient der Erstellung oder Erweiterung, dem Test und der Organisation von Anwendungsprogrammen. Die Entwicklungsumgebung ist vollstndig in das R/3-Basis-System integriert und ist wie andere R/3-Anwendungen selbst in ABAP geschrieben.

Prsentationskomponenten
Die Prsentationskomponenten dienen der Interaktion des R/3-Systems mit dem Benutzer (Einund Ausgabe) und der Integration von Desktop-Anwendungen (z.B.Textverarbeitung, Tabellenkalkulation etc.) in das R/3-System.

Softwaretechnische Sicht
Die folgende Abbildung zeigt die softwaretechnische Sicht auf das R/3-System. Die softwaretechnische Sicht beschreibt aus welchen Softwarekomponenten das R/3-System zusammengesetzt ist. In der softwaretechnischen Sicht umfassen alle SAP GUI Komponenten und Applikationsserver eines R/3-Systems das R/3-Basis-System.

April 2001

23

ABAP Programmierung (BC-ABA) Das Basis-System im Gesamtsystem

SAP AG

...
SAP GUI

...
SAP GUI ... SAP GUI

... SAP GUI ...

Prsentationsschicht

Applikationsserver 1

Applikationsserver n

Messageserver

Applikationsschicht

Datenbank Management System

Datenbankschicht

Datenbank
Das R/3-Basis-System ist ein mehrstufiges Client/Server-System. Die einzelnen Softwarekomponenten sind auf einzelne Softwareschichten verteilt und arbeiten je nach Schicht als Client oder Server fr die Komponenten der darunter bzw. darberliegenden Schichten. In der Grundvariante umfat das R/3-System Softwareschichten: Datenbankschicht Ein zentrales Datenbanksystem, das alle Daten des R/3-Systems verwaltet, bildet die Datenbankschicht. Das zentrale Datenbanksystem besteht aus den Komponenten Datenbank Management System (DBMS) und der eigentlichen Datenbank (Datenbestand). SAP stellt selbst kein eigenes Datenbanksystem zur Verfgung. Das R/3-System untersttzt stattdessen folgende Datenbanksysteme anderer Hersteller: ADABAS D, DB2/400 (auf AS/400), DB2/Common Server, DB2/MVS,INFORMIX, Microsoft SQL Server, ORACLE und ORACLE Parallel Server. Die Datenbank enthlt nicht nur die betriebswirtschaftlichen Daten (Stammdaten und Bewegungsdaten) der Anwendungsprogramme, sondern ist die zentrale Datenablage fr das gesamte R/3-System. Insbesondere enthlt die Datenbank also auch Steuerungs- und Customizingdaten, die das Verhalten des R/3-Systems festlegen, sowie die Anwendungsprogramme selbst. Anwendungsprogramme bestehen aus Programmtexten, Bildschirmdefinitionen, Mens, Funktionsbausteinen usw. Diese Komponenten werden in einem speziellen Teil der Datenbank abgespeichert, der R/3-Repository genannt wird, und heien deshalb auch Repository-Objekte. Repository-Objekte werden mit der ABAP Workbench bearbeitet. Applikationsschicht DieSoftware-Komponenten der Applikationsschicht bestehen aus einem oder mehreren Applikationsservern und ein Message Server. Jeder Applikationsserver stellt eine Reihe von

24

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Das Basis-System im Gesamtsystem

Diensten zum Betrieb des R/3-Systems zur Verfgung. Im Prinzip gengt ein einziger Applikationsserver, um ein R/3-System zu betreiben. In der Praxis werden die Dienste meistens auf mehrere Applikationsserver verteilt, so da nicht jeder Applikationsserver jeden Dienst zur Verfgung stellt. Der Message Server realisiert die Kommunikation zwischen den Applikationsservern. ber den Message Server knnen Auftrge zwischen den Applikationsservern innerhalb eines R/3-Systems weitergeleitetet werden. Weiterhin enthlt der Message Server Informationen ber die Gruppierung von Applikationsservern und die aktuelle Lastverteilung innerhalb der Gruppen und kann so die Anmeldung von Benutzern entsprechend beeinflussen. Prsentationsschicht Die Prsentationsschicht enthlt Software-Komponenten die R/3-spezifisch SAP GUI (Graphical User Interface) genannt werden. Die Prsentationsschicht bildet die Schnittstelle zu den Benutzern. Durch ihre SAP GUI-Komponenten bietet sie eine intuitiv bedienbare graphische Oberflche ber die Benutzer Daten eingeben oder Antworten in Form von Texten oder Graphiken erhalten. Die Prsentationsschicht sendet diese Daten an die Applikationsschicht bzw. empfngt sie von dieser. Eine SAP GUI Komponente ist whrend ihrer Laufzeit immer fest mit einer Benutzeranmeldung an das R/3-System verknpft. In weiteren Ausbaustufen knnen weitere Schichten, wie z.B. ein Internet Transaction Server (ITS), hinzukommen.

Softwaretechnische Sicht und Hardwaresicht


Die softwaretechnische Sicht hat zunchst einmal nichts mit der Verteilung auf die Hardware zu tun. Sowohl in vertikaler Richtung (Schichten) als auch in horizontaler Richtung (Komponenten) sind viele verschiedene Szenarien mglich. In vertikaler Richtung gibt es die mglichen Extreme, da alle Schichten auf einem einzigen Rechner installiert sind oder jede Schicht mindestens einen eigenen Rechner beansprucht. In horizontaler Richtung ist die Verteilung der Datenbankkomponenten vom jeweiligen Datenbankssystem abhngig. Die Komponenten von Applikationsschicht und Prsentationsschicht sind ber beliebig viele Rechner verteilbar, wobei auch mehrere Applikationsserver auf einem Rechner installiert sein knnen. Bei einer hufig vorzufindende Konfiguration laufen das Datenbanksystem und ein Applikationsserver, der spezielle Dienste fr die Datenbank zur Verfgung stellt, auf einem Rechner gemeinsam, whrend alle weiteren Applikationsserver auf eigene Rechner verteilt sind. Die Komponenten der Prsentationsschicht laufen meistens auf den Desktoprechnern jedes einzelnen Benutzers.

Vorteile der mehrstufigen Architektur


Die softwaretechnische Aufteilung des R/3-Systems auf drei Schichten sorgt durch die Verteilung der Systemlast auf die verschiedenen Schichten fr kurze Antwortzeiten. Da das Datenbanksystem die zentrale Datenablage fr das gesamte R/3-System enthlt, wird es beim Betrieb des System stark belastet. Deshalb ist es sinnvoll, die Ausfhrung von Anwendungsprogrammen nicht auf dem Rechner stattfinden zu lassen, auf dem auch das Datenbanksystem installiert ist. Die Architektur des R/3-Systems ermglicht es, durch die Trennung von Applikationsschicht und Datenbankschicht diese auf verschiedenenen Rechnern zu installieren, die ber ein Netzwerk kommunizieren. Es ist sinnvoll die Verarbeitung von Benutzereingaben und die Aufbereitung der Datenausgabe von der eigentlichen Programmausfhrung zu entkoppeln. Dies liefert die Architektur des R/3Systems durch die Trennung von Prsentations- und Applikationsschicht, die zur Entlastung der Applikationsserver fhrt. SAP GUI und Applikationsserver sind so aufgebaut, da mglichst wenig Daten zwischen den beiden Schichten hin und her bewegt werden mssen, so da die Komponenten der Prsentationsschicht auch auf Rechnern bedient werden knnen, die weit

April 2001

25

ABAP Programmierung (BC-ABA) Das Basis-System im Gesamtsystem

SAP AG

entfernt von den Rechnern stehen, auf denen die Applikationsschicht installiert ist, und die ber langsame Leitungen miteinander verbunden sind. Dadurch, da die Softwarekomponenten eines R/3-Systems beinahe beliebig auf verschiedene Hardware-Einheiten verteilt werden knnen, wird eine hohe Skalierbarkeit erreicht. Insbesondere in der Applikationsschicht kann ein R/3-System leicht durch die Installation weiterer Applikationsserver an steigende Anforderungen angepasst werden.

Konsequenzen fr die Anwendungsprogrammierung


Die Trennung von Anwendungs- und Prsentationsschicht hat eine wichtige Konsequenz fr die Programmierung von Anwendungsprogrammen. Bei der Ausfhrung eines Anwendungsprogramms, das mehrere Benutzeraktionen am Bildschirm erfordert, wechselt die Kontrolle ber das Anwendungsprogramm stndig zwischen den Schichten. Whrend ein Bildschirm eingabebereit ist, ist der entsprechende SAP GUI der Prsentationsschicht aktiv. Die Applikationsschicht ist in dieser Zeit nicht fr das Anwendungsprogramm aktiv. Die Applikationsserver sind dadurch fr andere Aufgaben frei. Nach einer Benutzereingabe am Bildschirm ist die Applikationsschicht wieder fr das Anwendungsprogramm aktiv. In dieser Zeit ist die Prsentationsschicht inaktiv. Der SAP GUI ist zwar fr den Benutzer aktiv und zeigt das Bildschirmbild noch an, ist in dieser Zeit aber nicht eingabebereit. Erst wenn das Anwendungsprogramm einen weiteren Bildschirm vorbereitet und an den SAP GUI geschickt hat, wird dieser wieder aktiv, wechselt die Bildschirmanzeige und wartet auf Eingaben. Als Konsequenz dieser Technik wird die Programmlogik eines Anwendungsprogramms zwischen zwei aufeinanderfolgenden Bildschirmbildern zu einem Dialogschritt zusammengefat.

Bild 1 Bild 1
SAP GUI nicht aktiv nicht aktiv Dialogschritt

Bild 2 Bild 2
SAP GUI nicht aktiv nicht aktiv Dialogschritt

Bild 3 Bild 3
Prsentationsschicht:

SAP GUI nicht aktiv

Interaktion des Benutzers

Applikationsschicht:
Bearbeitung der Dialogschritte durch das System

26

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Das Basis-System im Gesamtsystem

Benutzersicht
Die folgende Abbildung zeigt die Benutzersicht auf das R/3-System:

R/3 Benutzer
SAP GUI SAP GUI SAP GUI Modus 11 SAP GUI SAP Modus Modus 6 ... Modus 6 GUI 1 SAP GUI SAP GUI SAP GUI Modus 11 SAP GUI SAP Modus Modus 6 ... Modus 6 GUI 2 SAP GUI SAP GUI SAP GUI Modus 11 SAP GUI SAP Modus Modus 6 ... Modus 6 GUI 3

...

Applikationsschicht Datenbankschicht R/3 System 1

Applikationsschicht Datenbankschicht R/3 System 2

Fr einen Benutzer sind die Komponenten des R/3-System unmittelbar sichtbar, die sich ihm als Fenster auf dem Bildschirm prsentieren. Diese Fenster werden von der Prsentationsschicht des R/3-Systems erstellt und sind auch Bestandteile des R/3-Basis-Systems. Vor der Anmeldung eines Benutzers an das R/3-System startet er zuerst ein Hilfsprogramm namens SAP Logon, das auf dem jeweiligen Frontend installiert ist. Im SAP Logon kann er eines der zur Verfgung stehenden R/3-Systeme auswhlen. Das Programm SAP Logon verbindet sich mit dem Message Server des ausgewhlten R/3-Systems und erhlt von diesem die Adresse eines geeigneten (wenig ausgelasteten) Applikationsservers. Schlielich startet SAP Logon einen SAP GUI, der mit diesem Applikationsserver verbunden ist. Das Programm SAP Logon wird fr diese Verbindung nicht mehr bentigt. Der SAP GUI ffnet erst das Anmeldebild und nach erfolgreicher Anmeldung das R/3Einstiegsbild in einem R/3-Fenster auf dem Bildschirm. Innerhalb des SAP GUI wird das R/3Fenster durch einen Modus reprsentiert. Der Benutzer kann nach seiner Anmeldung innerhalb eines SAP GUI bis zu fnf weitere Modi, also R/3-Fenster, ffnen, die sich untereinander fast wie unabhngige R/3-Anmeldungen verhalten. In den verschiedenen Modi knnen also parallele Anwendungen unabhngig voneinander ausgefhrt werden. Innerhalb eines Modus, kann der Benutzer Anwendungen ausfhren, die selbst weitere Fenster (z.B. Dialogfenster, Graphikfenster usw.) ffnen. Diese Fenster sind dann nicht unabhngig, sondern gehren zu diesem Modus. Sie knnen modal (das ursprngliche Fenster ist nicht eingabebereit) oder amodal (beide Fenster sind eingabebereit und wechselwirken miteinander) sein. Der Benutzer kann mit dem Programm SAP Logon weitere SAP GUIs fr das gleiche oder auch andere zur Verfgung stehende R/3-Systeme ffnen. Die einzelnen SAP GUIs und die entsprechenden R/3-Anmeldungen eines Benutzers sind vollstndig unabhngig voneinander. Somit knnen zum Beispiel auf einem einzigen Desktoprechner die Prsentationsschichten mehrerer R/3-System durch SAP GUIs vertreten sein.

April 2001

27

ABAP Programmierung (BC-ABA) Applikationsserver

SAP AG

Applikationsserver
R/3-Programme laufen auf Applikationsservern ab. Applikationsserver sind also wichtige Softwarekomponenten des R/3-Systems. In den folgenden Abschnitten beschreiben wir die Applikationsserver genauer.

Aufbau eines Applikationsservers


Alle Applikationsserver eines R/3-Systems unter Einbeziehung des Message Servers bilden die Applikationsschicht der mehrstufigen Architektur des R/3-Systems . Die Anwendungsprogramme eines R/3-Systems werden auf den Applikationsservern ausgefhrt. Die Applikationsserver kommunizieren dabei mit den Prsentationskomponenten, mit der Datenbank und ber den Message Server auch untereinander . Das folgende Bild zeigt den Aufbau eines Applikationsservers:

Benutzer 1

...
SAP GUI

Benutzer n

...

SAP GUI

Applikationsserver

Dispatcher Dispatcher

Gateway Gateway

Kontext

Kontext

Shared Shared Memory Memory

WorkWorkprozess prozess 1 1

WorkWorkprozess prozess
2 2

WorkWorkprozess prozess
3 3

Datenbank Management System

Datenbank
Die einzelnen Komponenten sind:
Workprozesse

Applikationsserver enthalten Workprozesse, deren Anzahl und Typ beim Start des R/3-Systems festgelegt wird. Workprozesse sind Komponenten, die in der Lage sind, eine Anwendung (bzw. jeweils einen Dialogschritt) auszufhren. Jeder Workprozess hat Verbindung zu einem Speicherbereich in dem sich der Kontext der gerade ausgefhrten Anwendung befindet. Der Kontext beinhaltet die aktuellen Daten des laufenden Programms und mu fr jeden Dialogschritt

28

Kontext

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Applikationsserver

dieses Programms verfgbar sein. Weiter unten erfahren Sie mehr ber die unterschiedlichen Typen von Workprozessen.
Dispatcher

Jeder Applikationserver enthlt einen Dispatcher. Der Dispatcher ist das Bindeglied zwischen den Workprozessen und den an dem Applikationsserver angemeldeten Benutzern (bzw. deren SAP GUIs). Seine Aufgabe besteht darin, jedesmal, wenn eine Benutzerinteraktion dazu fhrt, da ein Dialogschritt ausgefhrt werden soll, diesen Auftrag vom SAP GUI entgegenzunehmen und ihn an einen freien Workprozess weiterzuleiten. Auf dem gleichen Wege gelangen die Bildschirmausgaben, die aus der Ausfhrung des Dialogschritts resultieren, wieder zum Benutzer zurck.
Gateway

Jeder Applikationserver enthlt ein Gateway. Das Gateway ist die Vermittlungsinstanz fr die Kommunikationsprotokolle des R/3-Systems (RFC, CPI/C) und kann mit anderen Applikationsservern des gleichen R/3-Systems, mit anderen R/3-Systemen, mit R/2-Systemen oder mit externen (nicht-SAP) Anwendungen kommunizieren. Der hier beschriebene Aufbau der Applikationsserver untersttzt die Performance und Skalierbarkeit des gesamten R/3-Systems. Die feste Anzahl von Workprozessen und das Dispatching von Dialogschritten auf die Workprozesse sorgen fr eine gute Ausnutzung des Hauptspeichers im verwendeten Rechner, da manche Komponenten und Speicherbereiche eines Workprozesses unabhngig von den Anwendungen sind und wiederverwendet werden. Da die einzelnen Workprozesse unabhngig voneinander arbeiten, bieten sie eine optimale Vorraussetzung fr Mehrprozessor-Architekturen. Auf die Arbeitsweise des Dispatchers und die Verteilung von anfallenden Aufgaben auf Workprozessen gehen wir im Abschnitt Dispatching von Dialogschritten noch nher ein.
Shared Memory

Alle Workprozesse eines Applikationsservers verwenden einen gemeinsamen Hauptspeicher, das Shared Memory, um Kontexte zu speichern oder um selten genderte Daten lokal zu puffern. Im Shared Memory stehen die von allen Workprozessen genutzten Ressourcen (wie Programme oder Tabelleninhalte) zur Verfgung. Die Speicherverwaltung des R/3-Systems sorgt dafr, da die Workprozesse immer den aktuellen Kontext, d.h. die Datenmengen, die den aktuellen Bearbeitungszustand eines laufenden Programms enthalten, adressieren. ber ein MappingVerfahren wird zu diesem Zweck der fr die Ausfhrung eines Dialogschritts erforderliche Kontext aus dem gemeinsamen Hauptspeicher in den Adreraum des bearbeitenden Workprozessses projeziert. Dadurch sind die tatschlichen Kopiervorgnge auf ein Minimum reduziert. Die lokale Pufferung von Daten im Shared Memory des Applikationsservers entlastet die Datenbank, da mehrfaches Lesen vermieden wird. Dadurch verkrzen sich die Zugriffszeiten fr die Anwendungsprogramme erheblich. Durch die Konzentration einzelner Anwendungen (Finanzwirtschaft, Logistik, Personalwirtschaft) auf getrennte Applikationsservergruppen kann eine optimale Ausnutzung der Puffer erreicht werden.

Datenbankanbindung
Whrend des Starts eines R/3-Systems meldet jeder Applikationsserver seine Workprozesse an die Datenbankschicht an und erhlt dadurch fr jeden Workprozess genau einen fest definierten Kanal. Jeder Workprozess ist fr die gesamte Laufzeit des R/3-Systems ein Benutzer (Client) des Datenbanksystems (Server). Whrend der Laufzeit des Systems erfolgen keine

April 2001

29

ABAP Programmierung (BC-ABA) Applikationsserver

SAP AG

Ummeldungen und ein Datenbank-Kanal kann nicht von einem Workprozess zum anderen weitergereicht werden. Aus diesem Grund kann ein Workprozess Datenbanknderungen immer nur im Rahmen genau einer Datenbank-LUW (Logical Unit of Work) ausfhren. Eine DatenbankLUW ist eine nicht teilbare Folge von Datenbankoperationen. Dies hat wichtige Konsequenzen fr das Programmiermodell, auf die wir unten noch nher eingehen.

Dispatching von Dialogschritten


Die Anzahl der Benutzer, die sich an einem Applikationsserver anmelden, ist hufig um ein Vielfaches grer als die Anzahl der zur Verfgung stehenden Workprozesse und nicht durch die Architektur des R/3-System begrenzt. Jeder Benutzer kann wiederum mehrere parallele Anwendungen ausfhren. Der Dispatcher hat dabei die wichtige Aufgabe alle anfallenden Dialgschritte auf die Workprozesse des Applikationsservers zu verteilen. Wie der zeitliche Ablauf des Dispatching aussehen kann, zeigen wir Ihnen am folgenden Beispiel:

Benutzer 1

Benutzer 2

SAP GUI SAP GUI Applikationsserver

SAP GUI SAP GUI

1 4 5 3

Dispatcher

Shared Shared Memory Memory

WorkWorkprozess prozess 1 1

Kontext

2 2

3 3

1. Der Dispatcher empfngt von Benutzer 1 die Anforderung zur Ausfhrung eines Dialogsschritts und leitet diese an den gerade freien Workprozess 1 weiter. Der Workprozess adressiert den Kontext des entsprechenden Anwendungsprogramms im Shared Memory und fhrt den Dialogschritt aus. Danach ist der Workprozess wieder frei. 2. Der Dispatcher empfngt von Benutzer 2 die Anforderung zur Ausfhrung eines anderen Dialogschritts und leitet diese an den wieder freien Workprozess 1 weiter. Der Workprozess bearbeitet den Dialogschritt analog zu Schritt 1. 3. Whrend Workprozess 1 noch mit Schritt 2 beschftigt ist, empfngt der Dispatcher von Benutzer 1 die Anforderung zur Ausfhrung eines weiteren Dialogschritts und leitet diese an den gerade freien Workprozess 2 weiter. 4. Nachdem Workprozess 1 und 2 ihre Verarbeitung beendet haben, empfngt der Dispatcher wieder von Benutzer 1 eine Anforderung und leitet diese an den wieder freien Workprozess 1 weiter.

30

Kontext

Kontext

WorkWorkprozess prozess

WorkWorkprozess prozess

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Applikationsserver

5. Whrend Workprozess 1 noch mit Schritt 4 beschftigt ist, empfngt der Dispatcher von Benutzer 2 eine Anforderung zur Ausfhrung und leitet diese an den wieder freien Workprozess 2 weiter. Dem Beispiel entnehmen wir, da

ein Dialogschritt eines Programms whrend seiner Ausfhrung genau einem Workprozess zugeordnet ist. die einzelnen Dialogschritte eines Programms whrend dessen Laufzeit auf verschiedenen Workprozessen ausgefhrt werden knnen, und der Kontext des Programms fr jeden neuen Workprozess neu adressiert werden mu. ein Workprozess aufeinanderfolgend die Dialogschritte verschiedener Programme und verschiedener Benutzer ausfhrt.

Aus dem Beispiel geht nicht hervor, da der Dispatcher die Auftrge so auf die Workprozesse zu verteilen versucht, da mglichst oft der gleiche Workprozess fr aufeinanderfolgende Dialogschritte einer Anwendung verwendet wird. Dadurch kann die Neuadressierung des Programmkontexts im Shared Memory eingespart werden.

Dispatching und Programmiermodell


Nachdem die die Trennung von Anwendungs- und Prsentationsschicht die Aufteilung von Anwendungsprogrammen in Dialogschritte erforderlich machte, fhrt das im vorhergehenden Abschnitt vorgestellte Dispatching der Dialogschritte auf einzelne Workprozesse zu weiteren wichtigen Konsequenzen fr das Programmiermodell. Wie schon oben erwhnt, kann ein Workprozess Datenbanknderungen immer nur im Rahmen genau einer Datenbank-LUW (Logical Unit of Work) ausfhren. Eine Datenbank-LUW ist eine nicht teilbare Folge von Datenbankoperationen an deren Anfang und Ende ein konsistenter Datenbestand auf der Datenbank stehen mu. Anfang und Ende einer Datenbank-LUW werden durch einen Commit-Befehl an das Datenbanksystem definiert (Datenbank-Commit). Whrend einer Datenbank-LUW, also zwischen zwei Datenbank-Commits, sorgt das Datenbanksystem selbst fr die Konsistenz (Widerspruchsfreiheit) des Datenbestands. Das heit, es bernimmt selbstndig Aufgaben wie Datenbankeintrge whrend ihrer Bearbeitung zu sperren oder den alten Zustand nach einem fehlerhaften Abbruch wiederherzustellen (Rollback). Typische SAP-Anwendungsprogramme erstrecken sich ber einige Bildschirmbilder und die zugehrigen Dialogschritte. Der Benutzer fordert auf den einzelnen Bildschirmen Datenbanknderungen an, die nach Ablauf einer Bildschirmfolge zu einem konsistenten Datenbestand auf der Datenbank fhren sollen. Die einzelnen Dialogschritte laufen auf unterschiedlichen Workprozessen und ein einzelner Workprozess bearbeitet nacheinander Dialogschritte unabhngiger Anwendungen. Es ist klar, da voneinander unabhngige Anwendungen, deren Dialogschritte nacheinander auf einem Workprozess ausgefhrt werden, nicht mit der gleichen Datenbank-LUW arbeiten drfen. Daraus folgt, da ein Workprozess fr jeden Dialogschritt eine eigene Datenbank-LUW ffnen mu. Der Workprozess sendet also am Ende jedes Dialogschritts, whrend dem Datenbanknderungen ausgefhrt werden, einen Commit-Befehl (Datenbank-Commit) an die Datenbank. Diese Commit-Befehle sind nicht explizit in der Anwendung programmiert und wir nennen sie deshalb implizite Datenbank-Commits. Durch diesen impliziten Datenbank-Commit wird die Zeit, in der ein Benutzer eine DatenbankLUW aufrechterhalten kann auf maximal einen Dialogschritt beschrnkt. Dies bedeuted eine erhebliche Entlastung der Datenbank, verringert die Hufigkeit von Serialisierungen und Deadlocks und ermglicht daher eine sehr groe Zahl von Benutzern an einem System.

April 2001

31

ABAP Programmierung (BC-ABA) Applikationsserver

SAP AG

Bild 1 Bild 1
SAP GUI

Bild 2 Bild 2
SAP GUI

Bild 3 Bild 3
SAP GUI Prsentationsschicht

Dialogschritt

Dialogschritt

Applikationsschicht

Datenbank LUW

Datenbankschicht

Es stellt sich jetzt die Frage, wie sich die Verknpfung jedes einzelnen Dialogschritts mit einer Datenbank-LUW mit der Anforderung in Einklang bringen lt, da das Festschreiben (Commit) oder Zurcknehmen von Datenbanknderungen (Rollback) vom logischen Ablauf der Anwendungsprogramme abhngen sollte und nicht von der technischen Verteilung auf Dialogschritte. Wenn Aktualisierungsanforderungen voneinander abhngen, bilden sie logische Einheiten im Programmverlauf, die sich ber mehrere Dialogschritte erstrecken knnen. Die Datenbanknderungen solcher logischer Einheiten mssen zusammen ausgefhrt und entsprechend auch zusammen zurckgesetzt werden. Das SAP-Programmiermodell bietet fr diese Anforderung eine Reihe von Bndelungstechniken an, die es ermglichen, da Datenbankaktualisierungen in solchen logischen Einheiten ablaufen knnen. Die Teile von R/3-Anwendungsprogramms, die eine logisch zusammengehrende Menge von Datenbank-Operationen bndeln, bezeichnen wir als SAP-LUW. Im Gegensatz zur Datenbank-LUW umfat eine SAP-LUW die Gesamtheit der Dialogschritte einer logischen Einheit inklusive der Fortschreibung auf der Datenbank (Verbuchung).

32

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Workprozesse

Workprozesse
Workprozesse fhren die einzelnen Dialogschritte der R/3-Anwendungen aus. In den nchsten beiden Abschnitten zeigen wir einerseits den Aufbau eines Workprozesses und gehen andererseits auf die verschiedenen Typen von Workprozessen im R/3-System ein.

Aufbau eines Workprozesses


Workprozesse fhren als Komponenten von Applikationsservern die Dialogschritte von Anwendungsprogrammen aus. Das folgende Bild zeigt Ihnen, welche Komponenten jeder Workprozess enthlt, damit er R/3-Anwendungsprogramme ausfhren kann:

Workprozess
Dynpro-Prozessor Dynpro-Prozessor ABAP-Prozessor ABAP-Prozessor Datenbankschnittstelle Datenbankschnittstelle Kontext Kontext

Datenbank Management System

Datenbank
Ein Workprozess enthlt zwei Softwareprozessoren und eine Datenbankschnittstelle:
Dynpro-Prozessor

In R/3-Anwendungsprogrammen unterscheiden wir zwischen Benutzerinteraktionen und Verarbeitungslogik. Programmtechnisch wird die Benutzerinteraktion durch Dynpros (dynamische Programme) realisiert. Ein Dynpro besteht aus einer Bildschirmmaske und der zugehrigen Dynproablauflogik. Die Dynproablauflogik kontrolliert einen Groteil der Benutzerinteraktionen. Das R/3-Basis-System enthlt fr die Erstellung von Dynpros eine eigene Sprache mit Sprachelementen fr die Programmierung der Dynproablauflogik. Der DynproProzessor fhrt die Dynproablauflogik des Anwendungsprogramms aus. Er bernimmt dabei die Kommunikation zwischen Workprozess und SAP GUI (ber den Dispatcher), ruft Module der Verarbeitungslogik auf und sorgt fr die Weitergabe von Feldinhalten an die Verarbeitungslogik.
ABAP-Prozessor

Die eigentliche Verarbeitungslogik von Anwendungsprogrammen ist in der SAP-eigenen Programmiersprache ABAP geschrieben. Der ABAP-Prozessor fhrt die Verarbeitungslogik des Anwendungsprogramms aus und kommuniziert mit der Datenbankschnittstelle. Der ABAP-

April 2001

33

ABAP Programmierung (BC-ABA) Workprozesse

SAP AG

Prozessor wird vom Dynpro-Prozessor informiert, welcher Programmteil (Modul) entsprechend des Fortgangs der Dynproablauflogik abzuarbeiten ist. Das folgende Bild verdeutlicht die Zusammenarbeit zwischen Dynpro- und ABAP-Prozessor bei der Ausfhrung von Anwendungsprogrammen.

Workprozess
Dynpro-Prozessor Dynpro-Prozessor Dynpro Dynpro

ABAP-Prozessor ABAP-Prozessor

Modul 3 Modul 3 Modul 2 Modul 2 Modul 1 Modul 1

Datenbankschnittstelle Datenbankschnittstelle

Datenbankschnittstelle

Die Datenbankschnittstelle stellt folgende Dienste zur Verfgung:


Verbindungsauf- und -abbau eines Workprozesses zur Datenbank Zugang zu Datenbanktabellen Zugang zu R/3-Repository-Objekten (ABAP-Programme, Dynpros etc.) Zugang zu Kataloginformationen (ABAP Dictionary) Transaktionskontrolle (Commit- und Rollback-Behandlung) Verwaltung von Tabellenpuffern auf dem Applikationsserver

Die folgende Abbildung zeigt die einzelnen Komponenten der Datenbankschnittstelle:

34

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Workprozesse

Workprozess
Dynpro-Prozessor Dynpro-Prozessor ABAP-Prozessor ABAP-Prozessor Datenbankschnittstelle Datenbankschnittstelle

Native SQL

Open SQL

Native SQL Native SQL Modul Modul

TabellenTabellenModul Modul

PufferPufferManagement Management

Datenbankabhngige Schicht Datenbankabhngige Schicht Standard SQL (dynamic, embedded)

Datenbank Management System

Datenbank
Die Abbildung zeigt, da es zwei unterschiedliche Mglichkeiten gibt aus ABAP-Programmen auf Datenbanken zuzugreifen, nmlich Open SQL und Native SQL. Die Anweisungen von Open SQL sind eine vollstndig in ABAP integrierte Untermenge von Standard SQL. Sie erlauben dem ABAP-Programmierer einen einheitlichen Zugriff auf Daten, unabhngig vom installierten Datenbanksystem. Open SQL umfat den DML-Anteil (Data Manipulation Language) des Standards, erlaubt es also Daten zu lesen (SELECT) und zu verndern (INSERT, UPDATE, DELETE). Die im Standard definierten bereiche der DDL (Data Definition Language) und DCL (Data Control Language) werden im R/3-System vom ABAP Dictionary bzw. der Berechtigungsverwaltung bernommen, die jeweils die Funktionalitt der Datenbanken vereinheitlichen bzw, stark erweitern. Open SQL geht aber auch ber den Standard hinaus, indem es einige Anweisungen anbietet, die im Zusammenhang mit den brigen ABAP-Konstrukten, bestimmte Zugriffe vereinfachen oder beschleunigen knnen. Zustzlich bietet Open SQL die Mglichkeit, bestimmte Tabellen auf dem Applikationsserver zu puffern und dadurch Datenbankzugriffe einzusparen. Dabei bernimmt die Datenbankschnittstelle die Kontrolle ber die Abgleichung der Puffer mit der Datenbank. Die Puffer sind teilweise im Arbeitsspeicher des aktuellen Workprozesses und teilweise im gemeinsamen Speicher aller Workprozesse eines Anwendungsservers abgelegt. Bei R/3Systemen die auf mehrere Anwendungsserver verteilt sind, werden die Daten in den verschiedenen Puffern durch das Puffer-Management in festgelegten Zeitabschnitten synchronisiert. Bei der Datenbankpufferung mu man also in Kauf nehmen, da die Daten in den Puffern nicht immer aktuell sind. Deshalb wendet man Datenbankpufferung eher bei wenig vernderlichen Daten an. Native SQL ist nur sehr lose in ABAP eingebunden und erlaubt Zugriff auf den gesamten Umfang der Funktionalitt, der von der Programmierschnittstelle des Datenbanksystems zur Verfgung gestellt wird. Native SQL Anweisungen werden im Gegensatz zu Open SQL nicht geprft und bersetzt, sondern direkt an das Datanbanksystem gereicht. Ein Programm, das Native SQL

April 2001

Tabellenpuffer auf Applikationsserver


35

ABAP Programmierung (BC-ABA) Workprozesse

SAP AG

verwendet, ist abhngig vom installierten Datenbanksystem. Bei der Entwicklungen der R/3Anwendungen wird auf den Einsatz von Native SQL weitestgehend verzichtet. Nur in einigen Basis-Komponenten wird Native SQL verwendet (z.B.: im ABAP Dictionary zum Anlegen oder ndern von Tabellen). Die im Bild gezeigte datenbankabhngige Schicht verbirgt die Unterschiede zwischen den Datenbanksystemen vor dem Rest der Datenbankschnittstelle. Sie wird bei der Installation des Basis-Systems entsprechend der verwendeten Datenbank ausgewhlt. Dank der Standardisierung von SQL sind die Unterschiede im Hinblick auf die Syntax der Anweisungen gering, Semantik und Verhalten unterliegen jedoch nicht ganz dem Standard und weisen daher grere Unterschiede auf. Im Falle von Native SQL ist die Funktionalitt der datenbankabhngigen Schicht nur minimal.

Mgliche Typen von Workprozessen


Obwohl alle Workprozesse die im vorhergehenden Abschnitt beschriebenen Komponenten enthalten, knnen wir einzelnen Workprozessen verschiedene Typen zuordnen. Der Typ bestimmt, welche Arten von Aufgaben ein Workprozess im Applikationsserver erledigen soll. Der Typ bestimmt nicht die technischen Eigenschaften eines Workprozesses, sondern dient der Aufgabenverteilung auf dem Applikationsserver. Die Verteilung der Aufgaben auf die verschiedenen Workprozesse nimmt der Dispatcher vor. Fr jeden Applikationsserver wird vor dem Start des R/3-Systems festgelegt, wieviele Workprozesse er enthlt und von welchem Typ diese sind. Der Dispatcher startet die Workprozesse und verteilt an jeden Workprozess nur die Auftrge, die mit seinem Typ korrespondieren. Das erlaubt die optimierte Verteilung von Workprozesstypen hinsichtlich der Ressourcenausnutzung von Applikationsservern. Das folgende Bild zeigt nochmals den Aufbau eines Applikationsservers, wobei jetzt auch die verschiedenen mglichen Workprozesstypen dargestellt werden:

36

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Workprozesse

Benutzer 1

...
SAP GUI

Benutzer n

...

SAP GUI

Dispatcher Dispatcher
Dialog Dialog Dialog Dialog WorkWorkWorkWorkprozesse VerVerbuchungs Dialog buchungs Dialog WorkWorkWorkWorkBatch Batch Dialog Dialog WorkWorkWorkWorkprozesse

prozesse prozess prozess

prozesse prozess prozesse prozess

prozesse prozess prozess

Enqueue Enqueue WorkWorkprozess prozess

Spool Spool WorkWorkprozess prozess

Applikationsserver

Datenbank Management System

Datenbank

Im folgenden beschreiben wir die einzelnen Workprozesstypen nur kurz, da im weiteren Verlauf dieser Dokumentation nher auf einzelne Komponenten des Applikationsservers bzw. R/3Systems eingegangen wird.
Dialog-Workprozesse

Dialog-Workprozesse erledigen alle Auftrge zum Ausfhren von Dialogschritten, die durch einen aktiven Benutzer ausgelst werden.
Verbuchungs-Workprozesse

Verbuchungs-Workprozesse fhren Verbuchungsauftrge aus. Verbuchungsauftrge sind die Teile einer SAP-LUW, die smtliche aus dem Dialog resultierenden Datenbankoperationen in einer Datenbank-LUW bndeln und im Hintergrund ausfhren.
Hintergrund-Workprozesse

Hintergrund-Workprozesse verarbeiten Programme, die ohne Benutzerinteraktion ausgefhrt werden sollen (Hintergrundprogramme).
Enqueue-Workprozess

Der Enqueue-Workprozess verwaltet eine Sperrtabelle im Shared Memory. Die Sperrtabelle enthlt die logischen Datenbanksperren des R/3-Systems und spielt eine wichtige Rolle im

April 2001

37

ABAP Programmierung (BC-ABA) Workprozesse

SAP AG

Zusammenhang mit SAP-LUWs. Es darf fr ein R/3-System nur eine einzige Sperrtabelle und somit nur einen einzigen Applikationsserver mit Enqueue-Workprozessen geben.
Spool-Workprozess

Der Spool-Workprozess gibt sequentielle Datenstrme an einen Drucker oder an die optische Archivierung aus. Jeder Applikationsserver kann nur einen einzigen Spool-Workprozess enthalten. Die Dienste, die ein Applikationsserver zur Verfgung stellen kann, werden durch den Typ seiner Workprozesse bestimmt. Ein Applikationsserver kann dann entsprechend mehrere Rollen annehmen, z.B. als Dialog-Server und gleichzeitig als Enqueue-Server, wenn er aus mehreren Dialog-Workprozessen und einem Enqueue-Workprozess besteht. Die Systemadministration kann whrend des laufenden Workprozesse zwischen den Typen Dialog und Hintergrund umhngen. Damit kann ein R/3-System beispielsweise von Tag- auf Nachtbetrieb umgestellt werden, wobei es tagsber mehr Dialog- als Hintergrund-Workprozesse gibt und umgekehrt.

38

April 2001

SAP AG

ABAP Programmierung (BC-ABA) bersicht ber die Komponenten von Anwendungsprogrammen

bersicht ber die Komponenten von Anwendungsprogrammen


Diese bersicht beschreibt die Anwendungsprogrammierung im R/3-System. Alle Anwendungsprogramme und Teile des R/3-Basis-Systems werden innerhalb der Entwicklungsumgebung ABAP Workbench mit der SAP-eigenen Programmiersprache ABAP geschrieben. Die einzelnen Objekte von Anwendungsprogrammen werden in einem speziellen Teil der Datenbank abgespeichert, dem R/3-Repository. Das R/3-Repository dient als zentrale Ablage fr smtliche Entwicklungsobjekte des R/3-Systems. In den folgenden Abschnitten gehen wir auf die Grundlagen und Eigenschaften der Anwendungsprogrammierung ein. Aufbau von Anwendungsprogrammen [Seite 40] Mgliche Bildschirmbilder [Seite 42] Aufbau der Verarbeitungslogik [Seite 47] Verarbeitungsblcke in ABAP-Programmen [Seite 53] ABAP-Sprachelemente [Seite 60] Logische Datenbanken und Contexte [Seite 65] Speicherstrukturen eines ABAP-Programms [Seite 70]

April 2001

39

ABAP Programmierung (BC-ABA) Aufbau von Anwendungsprogrammen

SAP AG

Aufbau von Anwendungsprogrammen


R/3-Anwendungsprogramme laufen auf den Workprozessen der Applikationserver des R/3Basis-Systems ab. Aus diesem Grund sind R/3-Anwendungsprogramme unabhngig von Hardware und Betriebssystem. Sie sind aber nicht auerhalb eines R/3-Systems einsetzbar. Wie wir in bersicht ber das R/3-Basis-System [Seite 21] gesehen haben, stellt ein Workprozess einen Dynpro-Prozessor zur Bearbeitung von Benutzerinteraktionen, einen ABAPProzessor zur Bearbeitung von Verarbeitungslogik und eine Datenbankschnittstelle fr die Verbindung zum Datenbanksystem zur Verfgung. Diese Komponenten eines Workprozesses bestimmen wie folgt den Aufbau von Anwendungsprogrammen:

SAP GUI SAP GUI

Ablauflogik Ablauflogik (Dynpros) (Dynpros)

Verarbeitungslogik Verarbeitungslogik (ABAP-Programme) (ABAP-Programme)

Weitere Weitere Schnittstellen Schnittstellen

DatenbankDatenbankschnittstelle schnittstelle
Anwendungsprogramme bestehen aus zwei Komponenten mit unterschiedlichen Aufgaben:
Ablauflogik

Die Komponente von Anwendungsprogrammen, die auf Benutzeraktionen auf Bildschirmen reagieren werden durch Dynpros (dynamische Programme) realisiert. Dynpros laufen auf dem Dynpro-Prozessor eines Workprozesses ab. Sie sind definiert durch eine Ablauflogik, die mit einer speziellen Teilmenge von ABAP, der Dynprosprache, programmiert wird, und durch ihre Verknpfung mit Bildschirmmasken. Der SAP GUI prsentiert dem Benutzer die Bildschirmmasken und bermittelt die Benutzeraktionen an die zugehrigen Teile der Ablauflogik. Dynpros reagieren beim Programmablauf auf Benutzeraktionen und geben Sie durch den Aufruf von Programm-Modulen an die Verarbeitungslogik weiter.
Verarbeitungslogik

Die Komponente von Anwendungsprogrammen, welche speziell die Datenverarbeitung im R/3System erledigt, wird durch ABAP-Programme (Advanced Business Application Programming) realisiert. ABAP-Programme laufen auf dem ABAP-Prozessor eines Workprozesses ab. Sie

40

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Aufbau von Anwendungsprogrammen

erhalten Bildschirmeingaben vom Dynproprozessor und senden Bildschirminhalte an den Dynproprozessor. Die Verarbeitungslogik greift ber die Datenbankschnittstelle des jeweiligen Workprozesses auf das Datenbanksystem zu. Hierfr enthlt ABAP enthlt einen speziellen Befehlssatz namens Open SQL, mit dem unabhngig von der verwendeten Datenbank lesend und schreibend auf Daten zugegriffen werden kann. Die Open SQL-Befehle werden in der Datenbankschnittstelle in die Befehle der verwendeten Datenbank umgesetzt. Weiterhin gibt es die Mglichkeit ber sogenannte Native SQL-Befehle die Datenbank ohne Umsetzung anzusprechen. Weitere Datenschnittstellen wie z. B. Speicher, sequentielle Dateien und externe Schnittstellen bieten zustzliche Mglichkeiten zum Senden und Empfangen von Daten in ABAPProgrammen. In der Zusammenarbeit mit Dynpros spielen ABAP-Programme beim Programmablauf eher eine passive Rolle, da sie Module zur Verfgung stellen, die von der Ablauflogik aufgerufen werden.

April 2001

41

ABAP Programmierung (BC-ABA) Mgliche Bildschirmbilder

SAP AG

Mgliche Bildschirmbilder
Jedes Bildschirmbild, das ein Benutzer im R/3-System angezeigt bekommt, gehrt zu einem Dynpro eines Anwendungsprogramms. Dynpros reagieren auf Benutzereingaben auf den Bildschirmen, senden Daten zum Bildschirm und empfangen Daten vom Bildschirm. Es gibt drei Mglichkeiten die Bildschirmein- und -ausgabe zu organisieren. Diese unterscheiden sich in der Art, wie sie programmiert werden und in der Art und Weise welche Benutzerinteraktionen typischerweise auf ihnen ausgefhrt werden.
Dynpros

Im allgemeinsten Fall erstellt der Anwendungsprogrammierer die Dynpros seiner Programme vollstndig selbst, das heit er programmiert alle Details der Ablauflogik und verknpft sie mit selbstdefinierten Bildschirmmasken. Die Erstellung beider Anteile findet ausschlielich mit dem Werkzeug Screen Painter der ABAP Workbench statt.
Selektionsbilder und Listen

Fr hufige Anwendungsflle bietet das R/3 System zwei spezialisierte Dynpros, nmlich Selektionsbilder und Listen an. Die Bildschirme und die Bildschirmablauflogik dieser Dynpros werden aus ABAP-Befehlen der Verarbeitungslogik generiert. Der Programmierer mu in diesem Fall nicht mit dem Werkzeug Screen Painter arbeiten, sondern er definiert den gesamten Interaktionsteil dieser Bildschirme in der Verarbeitungslogik. Bildschirme im R/3-System enthalten Menuleisten, Symbolleisten und Drucktastenleisten. Diese drei Objekte, dienen der direkten Eingabe von Benutzeranweisungen auf Bildschirmen und werden unter dem Begriff Status zusammengefat. Jeder Status ist ein Entwicklungsobjekt des zugehrigen Anwendungsprogramms und bildet einen eigenstndigen Teil der Bildschirmbilder. Ein Status ist somit kein interner Teil eines Dynpros und kann in verschiedenen Dynpros wiederverwendet werden. Fr die Definition von Status enthlt die ABAP Workbench das Werkzeug Menu Painter. Fr Dynpros und Listen kann der Status vom Programmierer frei definiert werden. Bei Selektionsbildern ist der Status fest vordefiniert. Im folgenden gehen wir etwas nher auf die drei Bildschirmarten ein.

Dynpros
Jedes Dynpro enthlt eine frei programmierbare Bildschirmmaske zur Datenein- und -ausgabe. Bei der Darstellung der Bildschirmmaske durch den SAP GUI werden zwei Ereignisse ausgelst: Das Ereignis PBO (Process Before Output) tritt vor der Darstellung der Bildschirmmaske auf dem Bildschirm auf. Das Ereignis PAI (Process After Input) tritt durch eine Benutzeraktionen auf dem Bildschirm ein. Jede Bildschirmmaske ist mit genau zwei Verarbeitungsblcken der Ablauflogik verknpft, die auf diese Ereignisse reagieren, nmlich der PBO-Block und der PAI-Block. Die Zusammenfassung des PAI-Blocks eines Dynpros mit dem PBO-Block des darauf folgenden Dynpros bildet einen Dialogschritt des Anwendungsprogramms. Die Dynprosprache zur Programmierung der Ablauflogik ist eine spezielle Teilmenge von ABAP und enthlt nur wenige Sprachelemente. Die Anweisungen sind syntaktisch zwar hnlich zu den brigen ABAP-Anweisungen, es drfen aber keine Dynproanweisungen in ABAP-Programmen verwendet werden und umgekehrt. Die wichtigsten Dynprosprachelemente sind MODULE, FIELD, CHAIN, und LOOP. Sie dienen ausschlielich der Anbindung der Verarbeitungslogik an

42

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Mgliche Bildschirmbilder

die Ablauflogik, d.h. dem Aufruf von Modulen in der Verarbeitungslogik und der Steuerung der Datenbergabe z.B. in Abhngigkeit von Fehlerberprfungen. Die Bildschirmmasken von Dynpros enthalten alle blichen Elemente grafischer Oberflchen (Ein- und Ausgabefelder, Drucktasten, Auswahlknpfe etc.). Die folgende Abbildung zeigt ein Beispiel fr eine Bildschirmmaske eines Dynpros:

Alle aktiven Elemente einer Bildschirmmaske haben Namen und sind mit sogenannten Dynprofeldern im Shared Memory verknpft. Dynprofelder knnen an das ABAP-Dictionary angebunden werden und erhalten dadurch automatische Feld- und Wertehilfefunktionen, sowie Konsistenzprfungen. Benutzeraktionen ndern die Feldinhalte der entsprechenden Dynprofelder. Der Wertetransport zwischen Dynpros und Verarbeitungslogik erfolgt dadurch, da beim PAI-Ereignis die Inhalte der Dynprofelder an gleichnamige Variablen im ABAP-Programm bergeben werden. Jedes Dynpro ruft im zugehrigen ABAP-Programm sogenannte Dialogmodule auf, welche die Inhalte der Bildschirmmasken vorbereiten (PBO) und die Benutzereingaben verarbeiten (PAI). Es gibt zwar ABAP-Anweisungen zum ndern von Bildschirmeigenschaften, wie z.B. das Ein- und Ausblenden von Bildschirmelementen, aber keine ABAP-Anweisungen fr deren Definition. Dynpros dienen dem Dialog zwischen Benutzer und Anwendungsprogrammen. Typischerweise werden Dynpros in stark dialogorientierten Programmen eingesetzt und dienen der Ausfhrung einer Anwendung, die aus der Bearbeitung einer Folge von Bildschirmen besteht. Sie kommen insbesondere immer dann zum Tragen, wenn die Mglichkeiten der spezialisierten Dynpros, nmlich des Selektionsbilds oder der Liste, nicht ausreichen.

Selektionsbilder
Selektionsbilder sind spezialisierte Dynpros zur Werteingabe in ABAP-Programmen. Sie werden allerdings nicht mit dem Werkzeug Screen Painter sondern ausschlielich ber ABAP-Befehle in

April 2001

43

ABAP Programmierung (BC-ABA) Mgliche Bildschirmbilder

SAP AG

der Verarbeitungslogik definiert. Das Selektionsbild wird entsprechend dieser Befehle generiert. Die Bildschirmablauflogik bleibt dabei fr den Anwendungsprogrammierer verborgen. Die Definition von Selektionsbildern erfolgt im Deklarationsteil von ABAP-Programmen ber spezielle Deklarationsanweisungen wie PARAMETERS, SELECT-OPTIONS und SELECTIONSCREEN. Diese Anweisungen deklarieren und formatieren die Eingabefelder eines Selektionsbilds. Die folgende Abbildung zeigt ein Beispiel fr ein Selektionsbild:

Die wichtigsten Elemente von Selektionsbildern sind Eingabefelder fr Einzelwerte und fr sogenannte Selektionstabellen. Selektionstabellen dienen dazu, komplexere BenutzerAbgrenzungen aufzunehmen. Bei Verwendung von Selektionstabellen in ABAP bernimmt das System vollstndig deren Verarbeitung. Wie bei jedem Dynpro stehen fr Eingabefelder, die einen Bezug zum ABAP-Dictionary haben, auch auf Selektionsbildern automatische Feld- und Wertehilfefunktionen zur Verfgung. Der Benutzer kann auf Selektionsbildern vorgefertigte Stze von Eingabewerten in der Form sognannter Varianten verwenden. Selektionsbilder werden aus ABAP-Programmen ber die Anweisung CALL SELECTIONSCREEN aufgerufen. Bei ausfhrbaren Programmen (Typ 1) ruft die ABAP-Laufzeitumgebung das im Deklarationsteil definierte Selektionsbild automatisch auf. Selektionsbilder lsen Ereignisse aus und knnen damit in ABAP-Programmen sogenannte Ereignisblcke aufrufen. Da auf Selektionsbildern hauptschlich Eingabefelder definiert werden, ist der Dialog von Selektionsbildern eingabebezogener als der von frei definierten Dynpros. Auf Dynpros sind Einund Ausgabe gleichberechtigt. Selektionsbilder knnen deshalb immer dann sinnvoll eingesetzt werden, wenn Benutzereingaben fr den weiteren Programmverlauf wesentlich sind. Beispielsweise werden Selektionsbilder vor Datenbankzugriffen eingesetzt, um die einzulesende Datenmenge einzuschrnken.

44

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Mgliche Bildschirmbilder

Listen
Listen sind Bildschirme zur formatierten und strukturierten Darstellung von Daten. Listen werden ausschlielich ber ABAP-Befehle definiert, gestaltet und gefllt. Das System stellt eine in ABAP definierte Liste auf einem speziellen Listen-Dynpro dar. Wie bei Selektionsbildern bleibt dabei die Bildschirmablauflogik fr den Anwendungsprogrammierer verborgen. Die wichtigste Aufgabe von Listen ist die Datenausgabe. Sie erlauben aber auch Benutzerinteraktionen. Sie reagieren auf Mausklick und knnen Eingabefelder enthalten. Die Listendarstellung erfolgt aber mit einer vllig anderen Technik als die Dynprodarstellung. Eingabefelder auf Listen sind nicht mit Dynprofeldern gleichzusetzen denn der Datentransport zwischen Listen und ABAP-Programm geht anders vonstatten als bei Dynprofeldern. Wenn Eingabefelder auf Listen mit dem ABAP-Dictionary verknpft sind stehen auch bei ihnen automatische Feld- und Wertehilfefunktionen zur Verfgung. Die folgende Abbildung zeigt ein Beispiel fr eine Liste:

Die Definition von Listen erfolgt ber einen speziellen Satz von Anweisungen (Listenanweisungen WRITE, SKIP, ULINE, NEW-PAGE etc.) in den Verarbeitungsblcken von ABAP-Programmen. Bei der Ausfhrung dieser Anweisungen wird systemintern eine Liste beschrieben. Die Anzeige von Listen auf Bildschirmen und die Behandlung von Benutzeraktionen auf Listen erledigt ein systeminternes Programm, welches wir als Listenprozessor bezeichnen. Im R/3-System knnen nur Daten, die intern als Liste abgespeichert sind an das Spoolsystem z.B. zwecks Druckausgabe gesendet werden. In ABAP-Programmen kann mit der Anweisung LEAVE TO LIST-PROCESSING das Listendynpro als Folgebild definiert und eine beschriebene Liste damit zur Anzeige gebracht werden. Bei ausfhrbaren Programmen vom Typ 1 ruft die ABAP-Laufzeitumgebung die im Programm definierte Liste automatisch auf. Ein Programm kann einen Stapel von bis zu 21 Listen verwalten. Beispielsweise knnen ber einer Grundliste bis zu 20 Detaillisten erzeugt werden. Benutzeraktionen auf Listen lsen Ereignisse aus und knnen damit im ABAPProgramm sogenannte Ereignisblcke aufrufen.

April 2001

45

ABAP Programmierung (BC-ABA) Mgliche Bildschirmbilder

SAP AG

Listen sind hauptschlich ausgabeorientiert. Benutzeraktionen auf Listen dienen meistens der bernahme von Listeninhalten in die weitere Programmverarbeitung und nicht der direkten Eingabe von Werten. Der Einsatz von Listen ist deshalb immer dann sinnvoll, wenn mit Ausgabedaten gearbeitet wird, wenn Daten gedruckt werden sollen und wenn Benutzeraktionen sich auf Ausgabedaten beziehen.

46

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Aufbau von ABAP-Programmen

Aufbau von ABAP-Programmen


Die ABAP-Programme der Verarbeitungslogik bernehmen die zentrale Rolle der Datenverarbeitung in der R/3-Anwendungsprogrammierung. Die Programmiersprache ABAP ist speziell fr dialogorientierte Datenbankanwendungen konzipiert. In den folgenden Abschnitten gehen wir detailliert auf Aufbau und Ausfhrung von ABAP-Programmen ein.

Programmaufbau
ABAP-Programme dienen der Datenverarbeitung whrend der einzelnen Dialogschritte eines Anwendungsprogramms. Das bedeutet, da ABAP-Programme nicht als eine einzige sequentielle Einheit aufgebaut sein knnen, sondern in Abschnitte unterteilt sein mssen, die den einzelnen Dialogschritten zugeordnet werden knnen. Um dieser Anforderung gerecht zu werden, sind ABAP-Programme modular aus Verarbeitungsblcken aufgebaut. Ein Verarbeitungsblock besteht aus (normalerweise mehreren) ABAP-Anweisungen. Verarbeitungsblcke sind nicht schachtelbar und die Programmausfhrung beruht auf dem Aufruf von Verarbeitungsblcken. Das folgende Bild zeigt den Aufbau eines ABAP-Programms:

Deklarationsteil fr globale Daten

Dialogmodule

Ereignisblcke

Unterprogramme

etc.

Jedes ABAP-Programm besteht aus den folgenden zwei Teilen:


Deklarationsteil fr globale Daten, Klassen und Selektionsbilder

Der erste Teil eines ABAP-Programms ist der Deklarationsteil fr globale Daten, Klassen und Selektionsbilder. Dieser Teil wird gebildet aus:

allen Datendeklarationsanweisungen fr globale Daten. Globale Daten sind in allen internen Verarbeitungsblcken sichtbar. Sie werden durch die Datendeklarationsanweisungen definiert, die vor dem ersten Verarbeitungsblock, in Dialogmodulen oder in Ereignisblcken stehen. In den letztgenannten beiden Verarbeitungsblcken sind mit zwei Ausnahmen keine lokalen Daten deklarierbar. allen Definitionen von Selektionsbildern. allen Deklarationen von programminternen Klassen (Anweisung CLASS DEFINITION). Programminterne Klassen sind Teil von ABAP Objects, der objektorientierten Erweiterung von ABAP.

Datendeklarationsanweisungen, die Prozeduren (Methoden, Unterprogramme, Funktionsbausteine) aufgefhrt sind, bilden den Deklarationsteil fr die lokalen Daten dieser Verarbeitungsblcke. Diese Daten sind auch nur innerhalb der Prozeduren sichtbar.

April 2001

47

ABAP Programmierung (BC-ABA) Aufbau von ABAP-Programmen Container fr Verarbeitungsblcke

SAP AG

Der zweite Teil eines ABAP-Programms umfat alle Verarbeitungsblcke des Programms. Folgende Typen von Verarbeitungsblcken sind mglich:

Dialogmodule (kein lokaler Datenbereich) Ereignisblcke (bis auf zwei Ausnahmen kein lokaler Datenbereich) Prozeduren (Methoden, Unterprogramme und Funktionsbausteine mit jeweils lokalem Datenbereich)

Whrend Dialogmodule und Prozeduren durch definierende ABAP-Schlsselwrter eingeschlossen sind, werden Ereignisblcke durch Ereignisschlsselwrter eingeleitet und durch den nchsten Verarbeitungsblock beendet.
Alle ABAP-Anweisungen (bis auf die deklarativen Anweisungen des Deklarationsteils) sind Teil eines Verarbeitungsblocks. Nichtdeklarative ABAP-Anweisungen, die zwischen dem Deklarationsteil fr globale Daten und einem Verarbeitungsblock stehen, werden automatisch dem Ereignisblock START-OF-SELECTION zugeordnet. Aufruf von Verarbeitungsblcken

Der Aufruf von Verarbeitungsblcken kann werden entweder von auerhalb des ABAPProgramms oder durch ABAP-Befehle, die selbst wieder in Verarbeitungsblcken stehen, erfolgen. Dialogmodule und Ereignisblcke werden von auerhalb des ABAP-Programms aufgerufen, Prozeduren werden durch ABAP-Befehle in ABAP-Programmen aufgerufen. Der Aufruf von Ereignissblcken unterscheidet sich wie folgt von den Aufrufen von anderen Verarbeitungsblcken: Ereignisblcke werden aufgrund von Ereignissen aufgerufen. Benutzeraktionen auf Selektionsbildern und Listen aber auch die Laufzeitumgebung lsen Ereignisse aus, die in ABAP-Programmen behandelt werden knnen. Nur fr Ereignisse, auf die das Programm reagieren soll, mssen Ereignisblcke definiert sein (whrend z.B. zu einem Unterprogrammaufruf sehr wohl ein Unterprogramm existieren mu). Das bedeutet, da ein ABAP-Programm auf bestimmte Ereignisse reagieren kann, aber nicht mu.

Programmausfhrung und Programmtypen


Ein ABAP-Programm auszufhren bedeutet, seine Verarbeitungsblcke aufzurufen. ABAPProgramme werden von auerhalb des Programms gesteuert. Die Steuerung erfolgt durch die Prozessoren des aktuellen Workprozesses. Fr den zeitlichen Ablauf fassen wir DynproProzessor und ABAP-Prozessor der beteiligten Workprozesse zur ABAP-Laufzeitumgebung zusammen. Die Laufzeitumgebung steuert Bildschirme und ABAP-Verarbeitungsblcke. Die Laufzeitumgebung enthlt einige spezialisierte Steuerungsablufe, die Bildschirme und ABAPVerarbeitungsblcke in bestimmten, zweckgebundenen Reihenfolgen aufrufen knnen. Wir bezeichnen diese zeitlich aufeinanderfolgenden Abschnitte auch als Prozessoren. Bei der Ausfhrung eines ABAP-Programms wechseln sich die einzelnen Prozessoren hintereinander ab und es hat immer ein bestimmter Prozessor die Kontrolle.

48

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Aufbau von ABAP-Programmen

Bildschirm Bildschirm SAP GUI Prozessor ABAP-Laufzeitumgebung PBOLogik Dynpro-Ablauflogik PAILogik Prozessor Prozessor

Deklarationsteil fr globale Daten ABAP-Programm

Verarbeitungsblock

Verarbeitungsblock

Verarbeitungsblock

Im R/3-System unterscheiden wir zwischen verschiedenen Typen von ABAP-Programmen. Die Programmtypen mssen bei der Programmerstellung festgelegt werden. Sie definieren die grundlegenden technische Eigenschaften des Programms. Das wesentliche Unterscheidungsmerkmal zwischen den einzelnen Programmtypen ist die Art und Weise wie die Verarbeitungsblcke der Programme von der Laufzeitumgebung aufgerufen werden. Bei der Ausfhrung eines Anwendungs-Programms mu zumindest der erste Verarbeitungsblock eines ABAP-Programms von auerhalb des Programms, also aus der Laufzeitumgebung aufgerufen werden. Aus diesem Verarbeitungsblock heraus knnen dann weitere Verarbeitungsblcke aufgerufen oder die Kontrolle wieder an die Laufzeitumgebung abgegeben werden. Beim Start eines ABAP-Programms wird ein vom Programmtyp abhngiger Prozessor in der Laufzeitumgebung gestartet, der den ersten ABAP-Verarbeitungsblock aufruft. Der Start eines ABAP-Programms kann durch den Benutzer, aber auch durch das System, z.B. bei der Hintergrundverarbeitung, oder durch externe Schnittstellen, z.B. bei Remote-Function-Calls (RFC) erfolgen. Beim Programmstart durch Benutzer unterscheiden wir zwischen der direkten Ausfhrung durch Angabe des Programmnamens und dem Start ber Transaktionscodes. Sie knnen jedes Anwendungsprogramm mit einem Transaktionscode versehen. Der Benutzer kann das Programm dann ber die direkte Eingabe des Transaktionscodes starten. Weiterhin werden in der Regel alle Transaktionscodes auch mit Menpfaden auf den Bildschirmen des R/3-Systems verknpft. Folgende Programmtypen sind fr Anwendungsprogramme von Bedeutung:
Typ 1

Ein Typ 1-Programm hat die wichtige technische Eigenschaft, da es nicht unmittelbar ber selbstdefinierte Dynpros gesteuert werden mu. Bei einem Typ 1-Programm bernehmen Prozessoren der Laufzeitumgebung automatisch und in einer vorgegebenen Reihenfolge die

April 2001

49

ABAP Programmierung (BC-ABA) Aufbau von ABAP-Programmen

SAP AG

Aufrufe von Verarbeitungsblcken und gegebenenfalls von Bildschirmen (Selektionsbilder und Listen). Benutzeraktionen auf den Bildschirmen knnen den Aufruf weiterer Verarbeitungsblcke vernanlassen. Ein Typ 1-Programm und damit der zugehrige Prozessor in der Laufzeitumgebung wird ausschlielich ber die Anweisung SUBMIT aus anderen ABAP-Programm heraus gestartet. Das R/3-System bietet verschiedene Mglichkeiten, die Ausfhrung von Typ 1-Programmen durch Angabe des Programmnamens auf Bildschirmbildern zu starten. Deshalb sprechen wir bei Typ 1Programmen auch von ausfhrbaren Programmen. Bei Typ 1-Programmen luft in der Laufzeitumgebung eine vordefinierte Folge von ProzessSchritten ab. Der Ablauf ermglicht erst eine Eingabe von Selektionsparametern auf einem Selektionsbild, dann eine Datenselektion und Datenverarbeitung und schlielich die Datenausgabe auf einer Liste, ohne da der Programmierer eigene Dynpros definieren mu. Weiterhin steuert die Laufzeitumgebung die Zusammenarbeit mit einer logischen Datenbank. Eine logische Datenbank ist ein spezielles ABAP-Programm zum Lesen von Daten aus Datenbanktabellen. Der vorgegebene Ablauf eines Typ 1-Programms orientiert sich somit an den Aufgaben des Reporting. Dazu zhlen Selektionseingabe, das Lesen von Daten, die Datenverarbeitung und die Darstellung der Daten. Aus diesem Grund werden ausfhrbare Programme vom Typ 1 im R/3-System oft als Report und das Starten von ausfhrbaren Programmen als Reporting bezeichnet. Da die Definition von Ereignisblcken nicht vorgeschrieben ist, kann der Programmierer entscheiden, auf welche Ereignisse das ausfhrbare Programm reagieren soll. Weiterhin kann er jederzeit eigene Dynpros oder Verarbeitungsblcke aufrufen, um den vorgegebenen Ablauf zu verlassen, z.B. um Daten statt auf einer Liste in einer Tabelle auf einem Dynpro darzustellen. Das einfachste ausfhrbare Programm enthlt z.B. nur den Standardverarbeitungsblock STARTOF-SELECTION. Fr die Ausfhrung von ausfhrbaren Programmen ist kein Benutzerdialog notwendig. Das Selektionsbild kann ber Varianten gefllt werden und Ausgabedaten knnen statt auf die Liste direkt ins Spool-System gestellt werden. Deshalb sind ausfhrbare Programme Voraussetzung fr die Hintergrundverarbeitung im R/3-System. Wenn ein ausfhrbares Programme vom Typ 1 mit Transaktionscodes versehen wird, kann der Benutzer das Programm auch ber den Transaktionscode starten. Auch in diesem Fall findet in der Laufzeitumgebung der reporting-orientierte Ablauf statt, weshalb wir solche Transaktionen auch als Report-Transaktionen bezeichnen. Der Einsatz von ausfhrbaren Programmen ist immer dann sinnvoll, wenn der Programmablauf ganz oder teilweise dem vordefinierten Ablauf in der Laufzeitumgebung entspricht. Vor Release 4.5A waren ausfhrbare Programme die Voraussetzung fr den Einsatz von logischen Datenbanken. Inzwischen knnen logische Datenbanken aber auch selbstndig aufgerufen werden.
Typ M

Die wichtigste technische Eigenschaft von Typ M-Programmen ist die Tatsache, da sie ausschlielich ber die Ablauflogik von Dynpros gesteuert werden. Diese Programme mssen ber Transaktionscodes aufgerufen werden, die mit einem Dynpro (Startdynpro) des Programms verknpft sind. Bei diesen Programmen mu der Programmierer also eigene Dynpros definieren, wobei das Startdynpro auch ein Selektionsbild sein kann. Beim Start des Programms ber den Transaktionscode wird in der Laufzeitumgebung ein Prozessor gestartet, der zunchst das Startdynpro aufruft, welches dann ein Dialogmodul des zugehrigen ABAP-Programms aufruft. Der weitere Ablauf ist vllig beliebig. Das Dialogmodul kann beispielsweise

50

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Aufbau von ABAP-Programmen

die Kontrolle an das Dynpro zurckgeben, dann verzweigt der Ablauf zu einem Folgedynpro. Jedes Dynpro hat ein statisches oder dynamisches Folgedynpro. Dynpros und ihre Folgedynpros sind die Bestandteile von frei definierbaren Dynprofolgen. andere Dynprofolgen, Selektionsbilder oder Listen aufrufen, von denen dann wiederum die entsprechenden Verarbeitungsblcke im ABAP-Programm gestartet werden. andere interne oder externe Verarbeitungsblcke aufrufen. andere Anwendungsprogramme ber CALL TRANSACTION oder SUBMIT aufrufen.

Da ABAP-Programme mit dem Programmattribut Typ M hauptschlich Dialogmodule der zugehrigen Dynpros enthalten, bezeichnen wir sie als Modulpool. Die Arbeit mit Modulpools ist bei stark dialogorientierten Programmen mit vielen Dynpros sinnvoll, in denen der Programmablauf weitgehend durch die Ablauflogik von Dynprofolgen definiert wird.
Typ F

Typ F-Programme knnen nicht ber Transaktionscodes oder Eingabe des Namens gestartet werden, sondern dienen ausschlielich als Container fr Funktionsbausteine. Funktionsbausteine sind spezielle Prozeduren im R/3-System, die aus anderen ABAPProgrammen aufgerufen werden knnen. Wir bezeichnen Typ F-Programme auch als Funktionsgruppen. Funktionsbausteine drfen nur in Funktionsgruppen programmiert werden. Zur Erstellung von Funktionsbausteinen und Funktionsgruppen enthlt die ABAP Workbench das spezielle Werkzeug Function Builder. Auer Funktionsbausteinen knnen Funktionsgruppen globale Datendeklarationen und Unterprogramme enthalten, die fr alle Funktionsbausteine sichtbar sind. Wie Programme vom Typ 1 und M knnen Funktionsgruppen Bildschirme, also eigene Dynpros, Selektionsbilder und Listen enthalten. Die Verarbeitung dieser Bildschirme, d,h. die Reaktion auf Benutzeraktionen in Ereignisblcken und Dialogmodulen, findet ebenfalls in der Funktionsgruppe statt. Der Aufruf der Bildschirme erfolgt aus den Funktionsbausteinen der Gruppe. Eine Funktionsgruppe mit Bildschirmen und einem einzigen Funktionsbaustein ermglicht also die Modularisierung von Bildschirmablufen.
Typ K

Typ K-Programme knnen nicht ber Transaktionscodes oder Eingabe des Namens gestartet werden, sondern ein Typ K-Programm dient ausschlielich als Container fr eine globale Klasse in ABAP Objects. Wir bezeichnen Typ K-Programme als Klassen-Definitionen. Zur Erstellung von Klassen-Definitionen enthlt die ABAP Workbench das spezielle Werkzeug Class Builder.
Typ J

Typ J-Programme knnen nicht ber Transaktionscodes oder Eingabe des Namens gestartet werden, sondern ein Typ J-Programm dient ausschlielich als Container fr ein globales Inrterface in ABAP Objects. Wir bezeichnen Typ J-Programme als Interface-Definitionen. Interface-Definitionen werden wie Klassen-Definitionen mit dem Werkzeug Class Builder der ABAP Workbench erstellt.
Typ S

Typ S-Programme knnen nicht ber Transaktionscodes oder Eingabe des Namens gestartet werden, sondern ein Typ S-Programm dient ausschlielich als Container fr Unterprogramme, die extern aus anderen ABAP-Programmen aufgerufen werden knnen. Wir bezeichnen Typ SProgramme als Subroutinenpool. Subroutinenpools knnen keine Bildschirme enthalten.

April 2001

51

ABAP Programmierung (BC-ABA) Aufbau von ABAP-Programmen Typ I

SAP AG

Typ I-Programme sind nicht ausfhrbar, sondern dienen ausschlielich als Mittel um Programmtexte in kleine editierbare Einheiten zu gliedern. Wir nennen Typ-I Programme Include-Programme. Der Programmtext in Include-Programmen kann ber die Anweisung INCLUDE an beliebigen Stellen anderer ABAP-Programm eingefgt werden. Include-Programme stehen technisch in keinerlei Zusammenhang mit Verarbeitungsblcken. Es bietet sich aber an logische Programmeinheiten, wie den Deklarationsteil fr globale Daten, mehrere gleichartige oder einzelne Verarbeitungsblcke in jeweils eigene Include-Programme aufzuteilen. Die ABAP Workbench untersttzt die automatische Aufteilung von Modulpools und Funktionsgruppen auf Include-Programme.

52

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Verarbeitungsblcke in ABAP-Programmen

Verarbeitungsblcke in ABAP-Programmen
Die folgenden Abschnitten fhren die mglichen Verarbeitungsblcke von ABAP-Programmen und ihren Aufruf ein.

Programm-Konstruktor
Direkt nach dem Laden eines Programms vom Typ 1, M, F und S kann ein spezieller Verarbeitungsblock genau einmal ausgefhrt werden. Dieser Verarbeitungsblock wird mit dem Ereignisschlsselwort LOAD-OF-PROGRAM als Ereignisblock definiert. Der Verarbeitungsblock zu LOAD-OF-PROGRAM spielt fr diese ABAP-Programme in etwa die gleiche Rolle, wie ein Konstruktor fr Klassen in ABAP Objects.

Dialog-Module
Dialogmodule werden aus der Ablauflogik aufgerufen (Dynpro-Befehl MODULE). Fr die verschiedenen Zustnde eine Dynpros (PAI, PBO, Benutzereingaben) knnen somit im zugeordneten ABAP-Programm Dialogmodule programmiert werden. Die Zusammenfassung aller PAI- und PBO-Module zweier aufeinanderfolgender Dynpros ist die Verarbeitungslogik eines Dialogschritts. Das Zusammenspiel zwischen Ablauflogik und Bildschirmen steuert ein Dialogprozessor. Syntaktisch werden Dialogmodule durch die Anweisung MODULE eingeleitet und durch die Anweisung ENDMODULE beendet.

Bildschirm Bildschirm SAP GUI

Bildschirm Bildschirm

Dialogprozessor ABAP-Laufzeitumgebung PBOLogik Dynpro-Ablauflogik PAILogik PBOLogik PAILogik

Deklarationsteil fr globale Daten ABAP-Programm

PBODialogmodul

PBODialogmodul

PAIDialogmodul

PAIDialogmodul

Die Datenbergabe zwischen Dynpros und ABAP-Programm erfolgt dadurch, da in Dynpros und ABAP-Programm namensgleiche Felder verwendet werden. Die Dynpros werden nicht im ABAP-Programm definiert.

April 2001

53

ABAP Programmierung (BC-ABA) Verarbeitungsblcke in ABAP-Programmen

SAP AG

Ereignisblcke zu Selektionsbildern
Das Selektionsbild ist ein spezielles Dynpro, das vollstndig mit ABAP-Befehlen im Deklarationsteil gestaltet wird. Die verschiedenen Zustnden des Selektionsdynpros (PAI, PBO, Benutzereingaben) werden von einem Selektionsbildprozessor in bestimmte Ereignisse verwandelt und fr diese knnen im Programm die Ereignisblcke zu Selektionsbildern programmiert werden. Der Selektionsbildprozessor umfat auch die Dynproablauflogik des Selektionsbilds.

SAP GUI

SelektionsSelektionsbild bild

ABAP-Laufzeitumgebung

Selektionsbildprozessor PBOLogik PAILogik

Dynpro-Ablauflogik Deklarationsteil
PARAMETERS SELECT-OPTIONS SELECTION-SCREEN

Ereignisblock
AT SELECTIONSCREEN OUTPUT

Ereignisblock
AT SELECTIONSCREEN

Ereignisblock
AT SELECTIONSCREEN ON <field>

ABAP-Programm
Der Programmierer erstellt die Dynproablauflogik eines Selektionsbilds nicht selbst und fr die entsprechenden Dynpro-Ereignisse PBO und PAI knnen keine eigenen Dialogmodule angelegt werden. Die Datenbergabe zwischen Selektionsbildern und ABAP-Programm erfolgt ber die Felder (Parameter und Selektionstabellen), die bei der Definition des Selektionsbilds im Deklarationsteil des ABAP-Programms angelegt werden.

Ereignisblcke zu Listen
Listen sind spezielle Bildschirme zur formatierten Datenausgabe. Listen werden in beliebigen Verarbeitungsblcken eines ABAP-Programms ber einen speziellen Befehlssatz erzeugt (Listen-Anweisungen sind z.B. WRITE, NEW-PAGE). Ein Listenprozessor erledigt die Anzeige von Listen auf Bildschirmen und die Behandlung von Benutzeraktionen auf Listen. Der Listenprozessor umfat auch die Dynproablauflogik der Listen. Der Programmierer erstellt die Dynproablauflogik einer Liste nicht selbst und fr die entsprechenden Dynpro-Ereignisse PBO und PAI knnen keine eigenen Dialogmodule angelegt werden.

54

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Verarbeitungsblcke in ABAP-Programmen

Liste SAP GUI Listenprozessor PBOLogik Dynpro-Ablauflogik Verarbeitungsblock


WRITE ULINE SKIP

ABAP-Laufzeitumgebung

PAILogik

Ereignisblock
TOPOFPAGE

Ereignisblock
AT LINESELECTION

Ereignisblock
AT USERCOMMAND

ABAP-Programm
Whrend der Listenerstellung kann es zum Aufruf von bestimmten Ereignisblcken kommen, die der Seitengestaltung dienen. In obigen Bild ist das der Ereignisblock TOP-OF-PAGE, der sozusagen aus dem ABAP-Programm selbst aufgerufen wird. Whrend der Listenanzeige kann der Benutzer Interaktionen ausfhren, welche der Listenprozessor in Ereignisse (z.B AT LINESELECTION) verwandelt. Im Programm knnen Ereignisblcke fr diese interaktiven Listenereignissen programmiert werden. Die Datenbergabe von der Liste zu dem ABAPProgramm erfolgt ber spezielle Variablen oder ber einen internen Speicherbereich, den sogenannten HIDE-Bereich.

Ereignisblcke fr ausfhrbare Programme


Beim Start von ausfhrbaren Programmen vom Typ 1 bernimmt ein in der Laufzeitumgebung vorgegebener Ablauf die Kontrolle. Es werden eine Reihe bestimmter Prozessoren hintereinander ausgefhrt. Diese Prozessoren lsen bestimmte Ereignisse aus, fr die Ereignisblcke definiert werden knnen. ABAP-Programme vom Typ 1 sind also ereignisorientiert.

April 2001

55

ABAP Programmierung (BC-ABA) Verarbeitungsblcke in ABAP-Programmen

SAP AG

SAP GUI Initialisierung Laufzeitumgebung

SelektionsSelektionsbild bild Reportingprozessor Selektionsbildprozessor

Liste

Listenprozessor

Ablauflogik
Deklarationsteil fr globale Daten Ereignisblock INITIALIZATION Ereignisblock AT SELECTION SCREEN Ereignisblock STARTOFSELECTION Ereignisblock ENDOFSELECTION Ereignisblock AT LINESELECTION

ABAP-Programm
Der Ablauf ist wie folgt: 1. Die Laufzeitumgebung erzeugt das Ereignis INITIALIZATION und ruft damit den entsprechenden Ereignisblock auf, falls er im ABAP-Programm definiert ist. 2. Falls im Deklarationsteil des Programms ein Selektionsbild deklariert ist, geht die Kontrolle an den Selektionsbildprozessor ber. Dieser erzeugt die entsprechenden Ereignisse und ruft dadurch die zugehrigen Ereignisblcke auf. 3. Die Kontrolle geht an den sogenannten Reportingprozessor ber. Dieser erzeugt ein Ereignis START-OF-SELECTION und ruft damit den entsprechenden Ereignisblock auf, falls er im ABAP-Programm definiert ist. 4. Falls eine logische Datenbank verwendet wird, ruft die logische Datenbank an dieser Stelle weitere Ereignisblcke auf. 5. Der Reportingprozessoer erzeugt ein Ereignis END-OF-SELECTION und ruft damit den entsprechenden Ereignisblock auf falls er im ABAP-Programm definiert ist. 6. Falls im Programm eine Liste beschrieben wurde, geht die Kontrolle an den Listenprozessor ber. Der Listenprozessor stellt die im ABAP-Programm beschriebene Liste dar. Er verwandelt Benutzeraktionen auf der Liste in Ereignisse und ruft dadurch die zugehrigen Ereignisblcke auf. 7. Falls im Deklarationsteil des Programms ein Selektionsbild deklariert ist, wird nach Beendigung des Programms (Verlassen der Liste), das gleiche Programm automatisch wieder aufgerufen.

56

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Verarbeitungsblcke in ABAP-Programmen

Unterprogramme
Unterprogramme werden aus ABAP-Programmen (Anweisung PERFORM) aufgerufen. Syntaktisch werden Unterprogramme durch die Anweisung FORM eingeleitet und durch die Anweisung ENDFORM beendet.

Verarbeitungsblock
PERFORM

Unterprogramm
FORM ... ENDFORM

Unterprogramm
FORM ... ENDFORM

ABAP-Programm Unterprogramm
FORM ... ENDFORM

Unterprogramm
FORM ... ENDFORM

ABAP-Programm
Unterprogramme knnen in beliebigen ABAP-Programmen definiert werden. Der Aufruf von Unterprogrammen ber die Anweisung PERFORM erfolgt entweder innerhalb eines ABAPProgramms als interne Unterprogramme oder ber Programmgrenzen hinweg als externe Unterprogramme. Bei internen Performs knnen globale Daten zur Datenbergabe verwendet werden. Bei externen Aufrufen mu eine parametrisierte bergabe von Aktual- an Formalparameter erfolgen.

Funktionsbausteine
Funktionsbausteine sind externe Funktionen mit fest definierter Schnittstelle. Funktionsbausteine werden aus ABAP-Programmen mit der Anweisung CALL FUNCTION aufgerufen. Syntaktisch werden Funktionsbausteine durch die Anweisung FUNCTION eingeleitet und durch die Anweisung ENDFUNCTION beendet.

April 2001

57

ABAP Programmierung (BC-ABA) Verarbeitungsblcke in ABAP-Programmen

SAP AG

Verarbeitungsblock
CALL FUNCTION

ABAP-Programm Deklarationsteil fr globale Daten Funktionsgruppe


Funktionsbausteine werden ausschlielich mit dem Werkzeug Function Builder der ABAP Worbench innerhalb spezieller ABAP-Programme namens Funktionsgruppen definiert. Aus anderen ABAP-Programmen sind sie also nur extern aufrufbar. Im Unterschied zu Unterprogrammen erfolgt die Datenbergabe daher immer ber eine explizit definierte Parameter-Schnittstelle.

Funktionsbaustein
FUNCTION ... ENDFUNCTION

Funktionsbaustein
FUNCTION ... ENDFUNCTION

Methoden
Methoden enthalten die Funktionalitt von Klassen in ABAP Objects. Wie Funktionsbausteinen haben sie eine fest definierte Schnittstelle. Methoden werden aus ABAP-Programmen mit der Anweisung CALL METHOD aufgerufen. Syntaktisch werden Funktionsbausteine durch die Anweisung METHOD eingeleitet und durch die Anweisung ENDMETHOD beendet.

58

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Verarbeitungsblcke in ABAP-Programmen

Verarbeitungsblock
CALL METHOD

ABAP-Programm

Deklarationsteil von Attributen und Methoden Definition Klasse

Methode
METHOD ... ENDMETHOD

Methode
METHOD ... ENDMETHOD

Implementierung

Methoden werden ausschlielich im Implemetierungsteil von Klassen definiert. Dies geschieht entweder global mit dem Werkzeug Class Builder der ABAP Worbench oder lokal innerhalb von ABAP-Programmen. Methoden arbeiten mit Attributen ihrer Klasse oder mit Daten, die ber die explizit definierte Parameter-Schnittstelle bergeben werden.

April 2001

59

ABAP Programmierung (BC-ABA) ABAP-Sprachelemente

SAP AG

ABAP-Sprachelemente
Der Quelltext eines ABAP-Programms besteht aus Kommentaren und ABAP-Anweisungen. Kommentare unterscheiden sich durch die voranstehenden Zeichen * (am Zeilenanfang) und " (an beliebiger Zeilenposition) von den ABAP-Anweisungen. ABAP-Anweisungen beginnen immer mit einem ABAP-Schlsselwort und werden durch einen Punkt (.) abgeschlossen. Anweisungen knnen sich ber mehrere Programmzeilen erstrecken und es knnen mehrere Anweisungen in einer Zeile stehen. ABAP-Anweisungen arbeiten mit ABAP-Datentypen und -objekten.

Anweisungen und Schlsselwrter


Die erste Position einer ABAP-Anweisung nimmt ein ABAP-Schlsselwort ein. Dieses bestimmt die Kategorie der Anweisungen. Wir unterscheiden folgende Kategorien von Anweisungen:
Deklarative Anweisungen

Diese Anweisungen definieren Datentypen oder deklarieren Datenobjekte, mit denen die anderen Anweisungen eines Programms oder einer Routine arbeiten. Die Gesamtheit aller deklarativen Anweisungen eines Programms oder einer Routine bilden den Deklarationsteil des Programms oder der Routine. Beispiele fr Schlsselwrter deklarativer Anweisungen sind:
TYPES, DATA, TABLES Modularisierungs-Anweisungen

Diese Anweisungen definieren Verarbeitungsblcke in einem ABAP-Programm. Schlsselwrter fr Modularisierungs-Anweisungen teilen sich auf in:

Zeitpunkt-Schlsselwrter Anweisungen mit diesen Schlsselwrtern definieren Ereignisblcke. Ereignisblcke werden nicht durch spezielle Anweisungen beendet, sondern durch die Modularisierungs-Anweisung des nchsten Verarbeitungsblocks. Beispiele fr Zeitpunkt-Schlsselwrter sind:
AT SELECTION SCREEN, START-OF-SELECTION, AT USER-COMMAND

Definierende Schlsselwrter Anweisungen mit diesen Schlsselwrter definieren Unterprogramme, Funktionsbausteine, Dialogmodule und Methoden. Diese Verarbeitungsblcke werden durch entsprechende END-Anweisungen abgeschlossen. Beispiele fr definierende Schlsselwrter:
FORM ... ENDFORM, FUNCTION ... ENDFUNCTION, MODULE ... ENDMODULE.

Steuernde Anweisungen

Diese Anweisungen steuern den Ablauf eines ABAP-Programms innerhalb eines Verarbeitungsblocks abhngig von bestimmten Bedingungen.

60

April 2001

SAP AG

ABAP Programmierung (BC-ABA) ABAP-Sprachelemente

Beispiele fr Schlsselwrter steuernder Anweisungen sind:


IF, WHILE, CASE Aufrufende Anweisungen

Diese Anweisungen rufen Verarbeitungsblcke (durch Modularisierungs-Anweisungen definiert) im gleichen oder einem externen ABAP-Programm auf oder verzweigen vollstndig in andere Programme. Beispiele fr Schlsselwrter aufrufender Anweisungen sind:
PERFORM, CALL, SET USER-COMMAND, SUBMIT, LEAVE TO Operationale Anweisungen

Diese Anweisungen bearbeiten die Daten, die durch deklarative Anweisungen definiert werden. Beispiele fr Schlsselwrter operationaler Anweisungen sind:
WRITE, MOVE, ADD Datenbank-Anweisungen

Diese Anweisungen greifen ber die Datenbankschnittstelle auf Datenbanktabellen des zentralen Datenbanksystems zu. In ABAP hat der Programmierer Zugriff auf zwei Arten von Anweisungen, nmlich Open SQL und Native SQL. Open SQL Open SQL ist eine Teilmenge von Standard SQL92 und beschrnkt sich auf DML-Anweisungen (Data Manipulation Language), wie z.B. SELECT, INSERT und DELETE. DDL-Anweisungen (Data Definitionion Language), wie z.B. CREATE TABLE oder CREATE INDEX, sind nicht in Open SQL enthalten, sondern in dem Werkzeug ABAP Dictionary der ABAP Workbench verborgen. Open SQL stellt die Schnittmenge der DML-Funktionalitt von SQL92 zur Verfgung, fr die alle von SAP untersttzten Datenbanksystemen eine gemeinsame Programmierschnittstelle haben. Weiterhin enthlt Open SQL einige SAP-spezifische Erweiterungen. ABAP-Programme, die ausschlielich Open SQL-Befehle fr Datenbankzugriffe verwenden, sind unabhngig vom Datenbanksystem. Die Open SQL-Befehle werden in der Datenbankschnittstelle in herstellerspezifisches Standard SQL umgesetzt. Native SQL Native SQL-Anbweisungen werden in der Datenbankschnittstelle ohne Umsetzung direkt an die Datenbank bergeben. ber Native SQL knnen ABAP-Programme alle Eigenschaften der verwendeten Datenbank nutzen. Insbesondere erlauben Native SQL-Anweisungen auch DDL (Data Definition Language) Operationen. Das Werkzeug ABAP Dictionary verwendet solche Native SQL-Anweisungen z.B. zum Anlegen von Datenbanktabellen. In ABAP-Programmen selbst sind DDL-Anweisungen dagegen nicht sinnvoll, da dann die zentrale Verwaltung der angelegten Objekte durch das ABAP-Dictionary nicht gegeben ist. Wegen der mangelnden Standardisierung der Programmierschnittstellen von SQL92, sind ABAP-Programme, die Native SQL-Anweisungen enthalten, datenbankabhngig.

Datentypen und -objekte


Die physikalischen Einheiten, mit denen ABAP-Anweisungen zur Laufzeit arbeiten, nennen wir programmlokale Datenobjekte. Der Inhalt von Datenobjekten belegt Platz im Speicher des Programms. ABAP-Anweisungen greifen ber den Namen der Datenobjekte auf diesen Inhalt zu. Beispielsweise schreiben Anweisungen den Inhalt von Datenobjekten auf Listen oder in

April 2001

61

ABAP Programmierung (BC-ABA) ABAP-Sprachelemente

SAP AG

Datenbanken, bergeben ihn an Routinen, verndern ihn durch Zuweisungen oder vergleichen ihn in logischen Ausdrcken. Jedes ABAP-Datenobjekt hat bestimmte technische Eigenschaften, die zu jedem Zeitpunkt der Laufzeit eines ABAP-Programms vollstndig spezifiziert sind. Die technischen Eigenschaften eines Datenobjekts sind: Datentyp, Feldlnge und Anzahl der Nachkommastellen. Der Datentyp bestimmt wie der Inhalt eines Datenobjekts von ABAP-Anweisungen interpretiert wird. Datentypen treten in ABAP zum einen als Attribute von Datenobjekten auf, zum anderen knnen sie eigenstndig definiert werden fr eine sptere Verwendung mit einem Datenobjekt. Die Definition von eigenstndigen Datentypen kann programmintern im Deklarationsteil mit der Anweisung TYPES oder programmbergreifend im ABAP-Dictionary erfolgen. Die Verwendung bestimmter Datentypen richtet sich nach der Verwendung der Datenobjekte im Programm. Die Aufgaben von ABAP-Programmen reichen von der Weitergabe einzelner Eingabedaten an Datenbanken bis zur Verarbeitung und Ausgabe strukturierter Massendaten aus Datenbanken. Fr diesen Zweck bietet die Sprache ABAP folgende Datentypen an:
Vordefinierte und benutzerdefinierte elementare Datentypen

Es gibt fnf vordefinierte nichtnumerische Typen: Zeichenketten (C), numerische Zeichenketten (N), Datumsfelder (D), Zeitfelder (T) und Hexadezimalfelder (X) und drei vordefinierte numerische Typen: Integer (I), Gleitpunktzahlen (F) und gepackte Zahlen (P). Mit den Datentypen D, F, I, und T ist die Feldlnge fest vorgegeben. Die Feldlnge gibt den Speicherplatz in Bytes wieder, die von einem Datenobjekt im Speicher belegt wird. Bei den brigen Datentypen C, N, X und P ist die Feldlnge nicht implizit durch den Typ festgelegt, sondern wird bei der Deklaration eines Datenobjekts im Programm definiert. Der Datentyp P ist von besonderer Bedeutung fr exakte Berechnungen, z.B. im kaufmnnischen Bereich. Hierfr wird bei der Deklaration eines Datenobjekts vom Typ P die Anzahl der Nachkommastellen definiert. ABAP erlaubt mit der Anweisung TYPES die Definition von benutzerdefinierten elementaren Datentypen, die auf den vordefinierten elementaren Datentypen beruhen. Dabei werden smtliche technischen Merkmale des neuen Datentyps festgeschrieben. Beispielsweise kann man basierend auf dem vordefinierten Typ P einen neuen Typ P_2 definieren, der zwei Nachkommastellen hat, und diesen verwenden, um entsprechende Datenobjekte zu deklarieren. Elementare Datentypen verwendet man zur Definition einzelner elementarer Datenobjekte. Solche Objekte dienen z.B. dem Transfer von einzelnen Ein- und Ausgabewerten, als Hilfsfelder fr Berechnungen oder zum Speichern von Zwischenergebnissen. Die im folgenden beschriebenen aggregierten Datentypen werden aus den elementaren Datentypen aufgebaut. Bei den aggregierten Datentypen unterscheiden wir zwischen Strukturen (auch Feldleisten genannt) und internen Tabellen.
Strukturen (Feldleisten)

Strukturen bestehen aus einer Folge beliebiger Datentypen und spezifizieren ein Datenobjekt technisch vollstndig. Auf solche Datenobjekte kann sowohl komponentenweise als auch insgesamt zugegriffen werden. Es gibt in ABAP keine Strukturen. Der Aufbau einer Struktur mu entweder in ABAP-Programmen selbst oder im ABAP-Dictionary definiert werden.

62

April 2001

SAP AG

ABAP Programmierung (BC-ABA) ABAP-Sprachelemente

Strukturen dienen in ABAP-Programmen zur Zusammenfassung von logisch zusammengehrigen Arbeitsbereichen. Da die Einzelelemente von Strukturen beliebige Datentypen haben knnen, also wiederum Strukturen oder interne Tabellen sein knnen, sind die Einsatzmglichkeiten von Strukturen sehr umfassend. Beispielsweise dienen Strukturen mit elementaren Elementen der programminternen Darstellung von Zeilen aus Datenbanktabellen und Strukturen mit aggregierten Elementen werden eingesetzt, um alle Eigenschaften eines Bildschirms oder Controls in einem Datenobjekt zusammenzufassen.
Interne Tabellen

Interne Tabellen bestehen aus einer Folge von Zeilen gleichen Datentyps. Interne Tabellen sind charakterisiert durch

einen Zeilentyp. Der Zeilentyp einer internen Tabelle kann ein beliebiger ABAP-Datentyp sein, also ein elementarer Typ, eine Struktur oder eine interne Tabelle.

einen Schlssel Der Schlssel von internen Tabellen dient der Identifikation von Tabellenzeilen. Er lt sich aus den elementaren Feldern der Zeilen aufbauen. Wir knnen weiterhin zwischen eindeutigen und nichteindeutigen Schlsseln unterscheiden.

die Zugriffsart Die Zugriffsart definiert, wie ABAP auf die interne Tabelle zugreift. Bei der Zugriffsart lassen sich unsortierte und sortierte Indextabellen sowie Hash-Tabellen unterscheiden. Bei Index-Tabellen wird intern ein linearer Index gefhrt, so da der Zugriff auf Tabellenzeilen sowohl ber Indexangabe als auch ber den Schlssel erfolgen kann. Bei Hash-Tabellen wird kein linearer Index gefhrt. Der Zugriff auf Tabellenzeile erfolgt ausschlielich unter Angabe des Schlssels. Hierbei fhrt das System intern einen Hash-Algorithmus aus.

Interne Tabellen werden immer dann eingesetzt, wenn mehrfache Daten einer festen Struktur programmintern verwendet werden. Ein wichtiges Einsatzgebiet ist z.B. die programminterne Speicherung von Daten aus der Datenbank.
Datentyp fr Referenzen

Referenzen dienen zur Zeit ausschlielich als Objektreferenzen in ABAP Objects. Referenzen liegen in Referenzvariablen und der Datentyp der Referenzvariablen bestimmt, wie das Programm die Referenz behandelt. Wir unterscheiden zwischen Datentypen fr Klassen- und Interfacereferenzen. Referenzvariablen werden in ABAP wie andere Datenobjekte mit elementarem Datentyp behandelt. Das bedeuted, da eine Referenzvariable nicht nur als Einzelfeld, sondern auch als kleinste unteilbare Einheit komplexer Datenobjekte wie Strukturen oder interne Tabellen definiert werden kann.
Deklaration von Datenobjekten

Abgesehen von Schnittstellenparametern von Routinen werden alle Datenobjekte eines ABAPProgramms oder einer Routine mit deklarativen Anweisungen in deren Deklarationsteil. Diese deklarativen Anweisungen legen den Datentyp und gegebenenfalls die noch fehlenden technischen Eigenschaften nmlich Feldlnge und Nachkommastellen vor der eigentlichen Programmausfhrung fest. Eine Ausnahme bilden die internen Tabellen.

April 2001

63

ABAP Programmierung (BC-ABA) ABAP-Sprachelemente

SAP AG

Bei der Deklaration eines Datenobjekts als interne Tabelle werden genau alle technischen Eigenschaften festgelegt mit Ausnahme der Feldlnge des Datenobjekts. Bei internen Tabellen liegt nur die Lnge einer Zeile fest, whrend die Anzahl der Zeilen also die eigentliche Lnge des Datenobjekts im Speicher dynamisch whrend des Programmablaufs angepat wird. Interne Tabellen sind somit dynamisch erweiterbare Datenobjekte einer festen Struktur. Schnittstellenparameter von Routinen werden dagegen erst beim Aufruf der Routine als lokale Datenobjekte erzeugt. Die technischen Eigenschaften eines Schnittstellenparameters knnen entweder in der Routine selbst festgelegt werden oder sie werden beim Aufruf der Routine von den bergabeparametern bernommen.

64

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Logische Datenbanken und Contexte

Logische Datenbanken und Contexte


Dieser Abschnitt beschreibt fhrt logische Datenbanken und Contexte ein, die das Lesen von Daten von der Datenbank erleichtern. Bei beiden werden die eigentlichen Open SQLAnweisungen in eigenen ABAP-Programmen gekapselt.

Logische Datenbanken
Logische Datenbanken sind spezielle ABAP-Programme, die Daten aus Datenbanktabellen lesen und ausfhrbaren ABAP-Programmen (Typ 1) zur Verfgung stellen. Zur Laufzeit kann man sich logische Datenbank und ausfhrbares ABAP-Programm als ein einziges ABAP-Programm denken, dessen Verarbeitungsblcke in bestimmter vorgegebener Reihenfolge von der Laufzeitumgebung aufgerufen werden. Logische Datenbanken werden mit einen eigenen Tool der ABAP Workbench gepflegt und knnen mit ausfhrbaren Programmen bei der Festlegung der Programmattribute verknpft werden. Eine logische Datenbank kann mit beliebig vielen ausfhrbaren Programmen verknpft werden. Seit Release 4.5A knnen logische Datenbanken auch selbstndig aufgerufen werden.

Aufbau einer logischen Datenbank


Den Aufbau einer logischen Datenbank knnen wir in drei Teile gliedern, die im folgenden Bild dargestellt sind:

April 2001

65

ABAP Programmierung (BC-ABA) Logische Datenbanken und Contexte

SAP AG

Logische Datenbank

Struktur Selektionen Datenbankprogramm

Verarbeitungsblock
GET TABLE ...

Ausfhrbares Programm
Struktur

Die Struktur legt die Datenbanktabellen legt die Auswahl der Datenbanktabellen fest, auf welche die logische Datenbank zugreifen kann. Sie bernimmt die gegebene Hierarchie der Datenbanktabellen, die durch Fremdschlsselbeziehungen festgelegt ist und regelt die Reihenfolge des Zugriffs auf mehrere Datenbanktabellen.
Selektionsteil

Der Selektionsteil definiert Eingabefelder fr Abgrenzungen in der logischen Datenbank, welche die Laufzeitumgebung zu Beginn des ausfhrbaren Programms auf dem Selektionsbild zur Anzeige bringt. Die entsprechenden Felder sind auch im ausfhrbaren ABAP-Programm sichtbar und knnen dort fr eine eventuelle Vorbelegung des Selektionsbilds gendert werden.
Datenbankprogramm

Das Datenbankprogramm einer logischen Datenbank ist ein Container fr spezielle Unterprogramme, in denen unter anderem die Daten aus den Datenbanktabellen gelesen werden. Diese Unterprogramme werden vom Reportingprozessor der Laufzeitumgebung in einer von der Struktur vorgebenenen Reihenfolge aufgerufen.

66

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Logische Datenbanken und Contexte

Ausfhrung von Typ 1-Programmen mit logischer Datenbank


Das folgende Bild zeigt die wichtigsten Verarbeitungsblcke, die bei der Ausfhrung eines ausfhrbaren Programms, das mit einer logischen Datenbank verknpft ist, aufgerufen werden.

SAP GUI Initialisierung Laufzeitumgebung

SelektionsSelektionsbild bild Reportingprozessor Selektionsbildprozessor

Liste

Listenprozessor

Ablauflogik
Unterprogramm FORM INIT. ... ENDFORM. Unterprogramme FORM PBO. FORM PAI. ... ENDFORM. Unterprogramm FORM PUT TABLE1. ..PUT.. ENDFORM. Unterprogramm FORM PUT TABLE2. ..PUT.. ENDFORM.

Datenbank-Programm
Ereignisblock INITIALIZATION Ereignisblock AT SELECTION SCREEN Ereignisblock STARTOFSELECTION Ereignisblock GET TABLE1 ... Ereignisblock GET TABLE2 ... Ereignisblock ENDOFSELECTION

Ausfhrbares Programm (Typ 1)

Die Aufrufe der Laufzeitumgebung hngen zum einen von der Struktur der logischen Datenbank und zum anderen von der Definition des ausfhrbaren Programms ab. Die Struktur der logischen Datenbank bestimmt, in welcher Reihenfolge die Unterprogramme der logischen Datenbank aufgerufen werden, die wiederum GET-Ereignisblcke im ausfhrbaren Programm aufrufen. Die im ausfhrbaren Programm definierten GET-Ereignisblcke bestimmen die Lesetiefe der logischen Datenbank. TABLES- oder NODES-Anweisungen im Deklarationsteil des ausfhrbaren Programms bestimmen welche der in der logischen Datenbank definierten Eingabefelder auf dem Selektionsbild aufgenommen werden und definieren Schnittstellen-Arbeitsbereiche fr die Datenbergabe zwischen logischer Datenbank und ausfhrbarem Programm.

April 2001

67

ABAP Programmierung (BC-ABA) Logische Datenbanken und Contexte

SAP AG

Der eigentliche Zugriff auf die Datenbank des R/3-Systems erfolgt ber Open SQL-Anweisungen, die in den PUT_<TABLE>-Unterprogrammen programmiert sind. Die eingelesenen Daten werden ber die Schnittstellen-Arbeitsbereiche an das ausfhrbare Programm bergeben. Nach dem Einlesen der Daten im logischen Datenbankprogramm hat das ausfhrbare Programm die Mglichkeit diese Daten in den GET-Ereignisblcken zu verarbeiten. Dadurch wird eine Trennung von Datenauslese und Datenverarbeitung erreicht.

Einsatz logischer Datenbanken


Logische Datenbanken dienen primr der Wiederverwendung vordefinierter Funktionalitt zum Lesen von Daten aus Datenbanktabellen. SAP liefert zu allen Anwendungen logische Datenbanken aus. Diese Datenbanken sind performanceoptimiert und enthalten weitere Funktionalitten wie z.B. Berechtigungsprfungen und Suchhilfen. Der Einsatz von logischen Datenbanken ist dann sinnvoll, wenn die auszulesenden Datenbanktabellen sich weitgehend mit der Struktur der logischen Datenbank decken und der Ablauf des Programms (DatenselektionDatenauslese-Datenverarbeitung-Datenanzeige) den Anforderungen der Anwendung entspricht.

Contexte
In der Anwendungsprogrammierung werden oft aus wenigen Grunddaten, die z.B. vom Benutzer beim Benutzerdialog eingegeben werden, weitere Daten abgeleitet. Zu diesem Zweck werden entweder die relationalen Beziehungen zwischen Daten in der Datenbank verwendet, um basierend auf den Grunddaten weitere Daten zu lesen, oder man leitet weitere Werte aus den Grunddaten durch ABAP-Anweisungen ab. Dabei kommt es hufig vor, da in einem Programm oder sogar ber mehrere Programme hinweg bestimmte Beziehungen zwischen Daten immer in der gleichen Form zur Datenbeschaffung verwendet werden. Somit werden die gleichen Datenbankzugriffe oder Berechnungen immer wieder neu ausgefhrt, obwohl das Ergebnis im System schon einmal vorhanden war. Dies fhrt zu einer unntigen Systembelastung, die durch den Einsatz von Contexten vermindert werden kann. Contexte werden im Werkzeug Context-Builder der ABAP Workbench definiert. Sie bestehen aus einzugebenden Schlsselfeldern, aus Beziehungen zwischen diesen Feldern und daraus ableitbaren weiteren Feldern bestehen. Contexte knnen die abgeleiteten Felder ber Fremdschlsselbeziehungen zwischen Tabellen, ber Funktionsbausteine oder aus anderen Contexten beziehen.

68

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Logische Datenbanken und Contexte

Verarbeitungsblock Deklarationsteil
CONTEXTS CONTEXT_DEMO. DATA: DEMO_INST TYPE CONTEXT_DEMO. SUPPLY KEY1 = ... KEY2 = ... TO CONTEXT DEMO_INST. DEMAND RESULT1 = ... RESULT2 = ... RESULT3 = ... FROM CONTEXT DEMO_INST.

ABAP-Programm

CONTEXT_DEMO Fields: KEY1 KEY2 ... RESULT1 RESULT2 ...


Context

Modules: MODULE1 MODULE2 ...

Puffer

DB
In einem Anwendungs-Programm arbeitet man mit den Instanzen eines Contexts. Es knnen mehrere Instanzen zu einem Context verwendet werden. Das Anwendungs-Programm versorgt mit der Anweisung SUPPLY die Instanzen von Contexten mit Eingabewerten fr die Schlsselfelder und kann mit der Anweisung DEMAND die abhngigen Felder aus den Instanzen von Contexten abfragen. Zu jedem Context gehrt ein transaktionsbergreifender Puffer auf dem Anwendungsserver. Bei der Abfrage einer Instanz nach Werten sucht das Context-Programm zuerst im zugehrigen Puffer nach einem Datensatz mit den entsprechenden Schlsselfeldern. Falls vorhanden, wird die Instanz mit diesen Daten versorgt, ansonsten leitet das Context-Programm die abhngigen Daten aus den eingegebenen Schlsselfeldern ab und schreibt den Datensatz in den Puffer.

April 2001

69

ABAP Programmierung (BC-ABA) Speicherstrukturen eines ABAP-Programms

SAP AG

Speicherstrukturen eines ABAP-Programms


In der bersicht ber das R/3-Basis-System [Seite 21] haben wir gesehen, da jeder Benutzer innerhalb eines SAP GUI bis zu sechs R/3-Fenster ffnen kann. Jedes dieser Fenster entspricht einem Modus auf dem Applikationsserver der einen eigenen Speicherbereich im Shared Memory belegt. Das erste Anwendungsprogramm, das in einem Modus gestartet wird, ffnet innerhalb des Modus einen ersten internen Modus. Der Speicherbereich des internen Modus enthlt das Anwendungsprogramm und seine Arbeitsdaten. Beim Aufruf von externen Routinen werden deren Rahmenprogramme und Arbeitsdaten mit in den Speicherbereich des internen Modus geladen. Es ist immer nur ein interner Modus aktiv. Falls das aktive Anwendungsprogramm ein weiteres Anwendungsprogramm aufruft, wird ein weiterer interner Modus erffnet. Dabei mssen wir zwei Flle unterscheiden. Wenn nach der Ausfhrung des aufgerufenen Programms nicht in das vorherige Programm zurckgekehrt wird, ersetzt der interne Modus des aufgerufenen Programms den ersten internen Modus und dessen Speicherinhalt wird vollstndig gelscht. Wird aber in das aufrufende Programm zurckgekehrt, bleibt sein Modus whrend der Ausfhrung des aufgerufenen Programms erhalten. Er ist aber inaktiv und seine Speicherinhalte werden auf einem Stack abgelegt. Im Speicherbereich eines jeden Modus gibt es einen Bereich namens ABAP-Memory. Das ABAP-Memory steht allen internen Modi gemeinsam zur Verfgung. ABAP-Programme knnen ber die Anweisungen EXPORT und IMPORT auf diesen Speicherbereich zugreifen. Daten innerhalb dieses Speicherbereichs bleiben ber eine Abfolge von Programmaufrufen erhalten. Um Daten an ein aufgerufenes Programm zu bergeben, mssen diese vor dem Programmaufruf aus dem aufrufenden internen Modus mit der EXPORT-Anweisung in das ABAP-Memory gestellt werden. Dann ersetzt der interne Modus des aufgerufenen Programms den internen Modus des aufrufenden Programms und die Daten knnen mit der IMPORTAnweisung aus dem ABAP-Memory gelesen werden. Sollen bei Rckkehr ins aufrufende Programm wieder Daten bergeben werden, verluft die Prozedur umgekehrt. Schlielich hat jedes Anwendungsprogramm Zugriff auf das sogenannte SAP-Memory. Das SAP-Memory ist ein Speicherbereich, auf den smtliche Modi eines SAP-GUI gemeinsamen Zugriff haben. Im SAP-Memory knnen also Daten sowohl programmbergreifend innerhalb eines Modus als auch ber einen Modus hinaus bergeben werden. Im SAP-Memory stehen fr Anwendungsprogramme nur spezielle Parameter zur Verfgung, die sogenannten SPA/GPAParameter. Diese Parameter knnen z.B. bei der Systemanmeldung benutzerspezifisch oder aus Anwendungsprogrammen ablaufspezifisch gesetzt werden und dienen hufig der Vorbelegung von Eingabefeldern auf Bildschirmen. Das SAP-Memory ist die einzige Verbindung zwischen den unterschiedlichen Modi eines SAP GUI. Die folgende Abbildung zeigt wie ein Anwendungsprogramm auf die verschiedenen Speicherbereiche innerhalb des Shared Memory zugreift:

70

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Speicherstrukturen eines ABAP-Programms

Hauptmodus 1 (gebunden an ein GUI-Fenster) Interner Modus 3 Interner Modus 2 Hauptprogramm der Transaktion/ des Reports ABAP Memory

Hauptmodus 6

...
Funktionsgruppe 1

...

externe FORM 1

...
Interner Modus 1 Funktionsgruppe n Hauptprogramm der Transaktion/ des Reports Funktionsgruppe 1 Interner Modus 1

... ... ...

externe FORM n externe FORM 1

SAP Memory

In diesem Bild ist ein Anwendungsprogramm im zweiten internen Modus des ersten Modus aktiv. Es hat Zugriff auf den Speicherbereich seines internen Modus, auf das ABAP-Memory und das SAP-Memory. Das Programm im ersten internen Modus hat das gerade aktive Programm aufgerufen und seine Daten liegen inaktiv auf einem Stack. Falls das gerade aktive Programm ein weiteres Programm aufruft und nach dessen Ausfhrung fortfahren will, wird das aufgerufene Programm in einem neuen dritten internen Modus aktiviert.

April 2001

...

71

ABAP Programmierung (BC-ABA) ABAP-Programme anlegen und ndern

SAP AG

ABAP-Programme anlegen und ndern


ABAP-Programme sind Objekte des R/3 Repository. Sie pflegen daher ABAP-Programme wie alle anderen Repository-Objekte (z.B. ABAP Dictionary-Tabellen oder Benutzungsoberflchen von Bildschirmen) mit einem Werkzeug der ABAP Workbench [Extern], nmlich dem ABAPEditor. Dieser Abschnitt ist ein kurzer Ausflug zur ABAP Workbench und bietet Ihnen einen zusammenfassenden berblick darber, wie Sie neue ABAP-Programme anlegen und bestehende ABAP-Programme ndern knnen. Er beschreibt also die verschiedenen Mglichkeiten, den ABAP-Editor zu starten. Im folgenden ist mit dem Ausdruck 'ein Programm ffnen' immer 'den ABAP-Editor fr ein Programm aufrufen' gemeint.

ABAP-Editor starten
Um den ABAP-Editor zu starten, um damit ABAP-Programme anzulegen oder zu ndern, bietet Ihnen das R/3-System im wesentlichen drei Mglichkeiten:

Programme im Object Navigator ffnen [Seite 74] Der Object Navigator der ABAP Workbench (Transaktion SE80) bietet Ihnen auf der linken Bildschirmseite eine hierarchische bersicht ber alle R/3-Repository Objekte und zwar geordnet nach Entwicklungsklassen, Benutzernamen des Programmierers, Objekttypen und so weiter. Durch die Auswahl von Programmen erlaubt der Object Navigator Direktzugriff auf alle Einzelteile eines Programms wie z.B. Hauptprogramm, Include-Programme, Klassen oder globale Daten. ber die Auswahl eines Programmobjekts im Object Navigator und dem Aufruf einer Pflegefunktion ffnen Sie auf der rechten Bildschirmseite direkt das passende Werkzeug, nmlich den ABAP Editor, fr dieses Objekt. Dieser Einstieg eignet sich fr prinzipiell fr alle ABAP-Programme, da Sie im Object Navigator immer einen berblick ber alle zum Programm gehrigen Komponenten haben. Insbesondere Bildschirme und deren Benutzungsoberflchen werden angezeigt.

Programme mit dem ABAP-Editor ffnen [Seite 77] Um direkt ber das Werkzeug ABAP-Editor ein Programmobjekt zu ffnen, whlen Sie den Knoten ABAP Editor unter ABAP WorkbenchEntwicklung im SAP-Standardmen der Benutzungsoberflche SAP Easy Access [Extern] (bzw. starten Sie die Transaktion SE38). Bei der nderung von Programmen mssen Sie den Namen des zu pflegenden Programms und sein Umfeld genau kennen. Dieser Einstieg eignet sich ausschlielich fr die Pflege und das Anlegen von relativ einfachen oder kurzen Programmen, die nur wenige oder gar keine zugehrigen Komponenten haben.

Programme durch Vorwrtsnavigation ffnen [Seite 78] Immer wenn Sie beim Arbeiten mit einem Werkzeug der ABAP Workbench den Cursor auf den Namen eines R/3-Repository Objekts positionieren und das Objekt (z.B. durch einen Maus-Doppelklick) auswhlen, ffnet das System das Objekt mit dem zugehrigen Werkzeug. Dies gilt insbesondere also auch fr das Editieren von ABAP-Programmen. Die Vorwrtsnavigation per Doppelklick bietet sich an jeder Stelle an, an der Namen von ABAP-Programmen in der ABAP Workbench auftauchen.

72

April 2001

SAP AG

ABAP Programmierung (BC-ABA) ABAP-Programme anlegen und ndern

Namen von ABAP-Programmen


Der Name eines ABAP Programms mu aus mindestens einem Zeichen bestehen und kann eine maximale Lnge von 30 Zeichen haben. Folgende Zeichen sollen in Programmnamen nicht verwendet werden: Punkt (.), Komma (,), Leerzeichen (), Klammern ' ( ' '), Hochkomma ('), Anfhrungszeichen ("),Gleichheitszeichen (=),Stern (*),Umlaute und scharfes 's' (, , , , , und ), Prozentzeichen (%) und Bindestrich (-).

Programmeigenschaften
Wie viele Repository-Objekte haben ABAP-Programme Eigenschaften, die sehr wichtig fr ihre Funktion im R/3-System sind. Eine Einfhrung finden Sie unter Programmeigenschaften pflegen [Seite 79].

Quelltext
ABAP-Quelltexte definieren die Verarbeitungslogik von R/3-Anwendungsprogrammen. Programme editieren [Seite 82] gibt Ihnen eine Einfhrung zum Schreiben von ABAP-Quelltext.

April 2001

73

ABAP Programmierung (BC-ABA) Programme im Object Navigator ffnen

SAP AG

Programme im Object Navigator ffnen


Um ABAP-Programme im Object Navigator der ABAP Workbench zu ffnen, whlen Sie Object Navigator unter ABAP WorkbenchEbersicht im SAP-Standardmen der Benutzungsoberflche SAP Easy Access [Extern] (bzw. starten Sie die Transaktion SE80). Im Einstiegsbild des Object Navigators knnen Sie links oben Programm auswhlen und direkt einen Programmnamen eingeben oder sich smtliche Programme einer bestimmten Entwicklungsklasse anzeigen lassen.

Eine bestimmtes Programm ffnen


Geben Sie einen Programmnamen ein und besttigen sie mit whlen Sie Enter. Falls das Programm noch nicht existiert, werden Sie in einem Dialogfenster gefragt, ob Sie es anlegen wollen, ansonsten werden die Programmobjekte links als Knoten einer Baumstruktur angezeigt, ber die zu den betreffenden Werkzeugen navigiert werden kann.

Anlegen eines neuen Programms


1. Es erscheint das Dialogfenster Programm anlegen, das es Ihnen ermglicht ein TopInclude anzulegen. Ein Top-Include ist ein spezielles Include-Programm, in dem bei komplexen Programmen die globalen Deklarationen abgelegt werden knnen. Bei der Programmierung von Modulpools sollte der Programmnamen mit den vier Buchstaben 'SAPM' beginnen, denn nur dann schlgt das System einen Namen fr das TOP-Include vor, das automatisch in die vollstndige Navigation eingebunden ist. 2. Es erscheint das Bild ABAP: Programmeigenschaften, in dem Sie die Programmeigenschaften pflegen mssen (siehe unten). Die Pflege der Programmeigenschaften ist ein wichtiger Vorgang beim Anlegen eines Programms. Fllen Sie die Eingabefelder des Bilds ABAP: Programmeigenschaften sorgfltig aus. 3. Sichern Sie die Programmeigenschaften. Das Programm ist nun im R/3 Repository vorhanden und Sie knnen den Quelltext im ABAP Editor eingeben.

Programme einer Entwicklungsklasse ffnen


Geben Sie den Namen einer vorhandenen Entwicklungsklasse ein und besttigen Sie mit Enter. Der Object Navigator zeigt Ihnen in der Baumstruktur eine hierarchische bersicht ber smtliche zur angegebenen Entwicklungsklasse gehrigen R/3-Repository Objekte.

74

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Programme im Object Navigator ffnen

Entwicklungsklasse
Objektarten Entw.Kl. DDIC-Objekte Programme Funktionsgruppen Includes Transaktionen Logische Datenbanken Nachrichtenklassen . . .

Programm
Objektarten Programm DDIC-Strukturen Typen Felder Ereignisse Unterprogramme Dynpros . . .

An dieser Stelle gibt es mehrere Mglichkeiten:

Falls auf diesem Bild der Knoten Programme nicht vorhanden ist, knnen Sie durch Auswahl des Knotens Objektarten Entwicklungsklasse diesen Knoten durch das Anlegen eines Programms erzeugen. Whlen Sie hierfr auf dem erscheinenden Dialogfenster (Objektauswahl) den Reiter Programm. Geben Sie einen Namen ein und whlen Anlegen. Es erscheint das Dialogfenster Programm anlegen. Ab hier verfahren Sie genauso wie beim Anlegen eines bestimmten Programms.

Falls auf diesem Bild der Knoten Programme vorhanden ist, knnen Sie auch hier durch Positionierung des Cursors auf den Knoten Programme und die Auswahl von Anlegen (rechte Maustaste) eine neues Programm anlegen. Falls auf diesem Bild der Knoten Programme vorhanden ist, knnen Sie sich smtliche Programme der Entwicklungsklasse als Verzweigungen dieses Knotens anzeigen lassen. Positionieren Sie den Cursor auf einen Programmnamen und doppelklicken Sie dort bzw. whlen Sie Anzeigen oder ndern (rechte Maustaste). Dadurch ffnen Sie auf der rechten Seite den ABAP-Editor fr das ausgewhlte Programm.

Der Object Navigator zeigt die bersicht ber alle zu einem Programm gehrigen Komponenten (Objektarten) als Verzweigungen eines Programmknotens an. Bei der Auswahl der Komponenten des Programms wird auf der rechten Seite nicht unbedingt der ABAP-Editor fr den Quelltext des Programms geffnet, sondern immer das passende Werkzeug fr die ausgewhlte Komponente. In Einzelfllen, z.B. fr Include-Programme, kann das wiederum der ABAP-Editor sein. Dann bearbeiten Sie aber nur die Komponente und nicht den Quelltext des Gesamtprogramms.

April 2001

75

ABAP Programmierung (BC-ABA) Programme im Object Navigator ffnen

SAP AG

76

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Programme mit dem ABAP-Editor ffnen

Programme mit dem ABAP-Editor ffnen


Um ABAP-Programme mit dem ABAP-Editor direkt zu ffnen, whlen Sie den Knoten ABAP Editor unter ABAP WorkbenchEntwicklung im SAP-Standardmen der Benutzungsoberflche SAP Easy Access [Extern] (bzw. starten Sie die Transaktion SE38).

Neues Programm anlegen


Falls das Programm noch nicht existiert, whlen Sie Anlegen. Es erscheint das Bild ABAP: Programmeigenschaften, in dem Sie die Programmeigenschaften pflegen mssen (siehe unten). Bei diesem Einstieg bietet Ihnen das System nicht das Anlegen eines Top-Includes an. Diese Art der Programmerzeugung eignet sich also hauptschlich fr kurze ausfhrbare Testprogramme. Nach der Eingabe und dem Sichern der Programmeigenschaften ist das neue Programm im R/3 Repository vorhanden.

Vorhandenes Programm pflegen


Fr ein vorhandenes Programm knnen Sie auf dem Einstiegsbild der Transaktion SE38 eines der folgenden Teilobjekt markieren und Anzeigen oder ndern whlen, um das Teilobjekt zu pflegen.
Quelltext

Hiermit starten Sie den ABAP-Editor.


Varianten

Hier pflegen Sie Varianten. Varianten ermglichen es Ihnen Fixwerte fr die Eingabefelder auf einem Selektionsbild zu definieren.
Eigenschaften

Hier pflegen Sie die Programmeigenschaften (siehe unten).


Dokumentation

Hier knnen Sie eine programmspezifische Dokumentation fr ein ausfhrbares Programm (Report) pflegen. Das System ffnet den SAPscript-Editor, wo Sie die Dokumentation entsprechend der vorgegebenen Maske eintragen knnen. Der Benutzer kann sich die Dokumentation beim Ausfhren des Programms ber System Dienste Reporting (Transaktion SA38) ber Springen Dokumentation ansehen. Falls das Programm als Knoten in einem Berichtsbaum abgelegt ist (Transaktion SERP), kann der Benutzer auch dort Springen Doku anzeigen whlen, um die Dokumentation zu sehen.
Textelemente

Hier pflegen Sie Textelemente. Textelemente sind eine Ablage fr alle Texte, die auf den Selektionsbildern oder den Ausgabelisten eines Programms erscheinen.. Sie gelangen auch im ABAP-Editor immer ber den Menpunkt Springen oder ber die Vorwrtsnavigation zu diesen Teilobjekten.

April 2001

77

ABAP Programmierung (BC-ABA) Programme durch Vorwrtsnavigation ffnen

SAP AG

Programme durch Vorwrtsnavigation ffnen


Wenn Sie beim Arbeiten in der ABAP Workbench den Cursor auf einen Programmnamen positionieren und das entsprechende Programm durch einen Doppelklick auswhlen, ffnet das System den ABAP-Editor fr dieses Programm. Weitere Mglichkeiten zur Vorwrtsnavigation finden Sie auch immer in den Menleisten der Werkzeuge der ABAP Workbench z.B. unter Springen oder Umfeld. Die folgenden Beispiele zeigen Ihnen einige Mglichkeiten der Vorwrtsnavigation.

Nehmen Sie an, da Sie gerade ein Programm editieren und die Zeile

SUBMIT ZZHKTST 1.
bearbeiten. Diese Anweisung ruft ein ausfhrbares Programm (Report) aus einem anderen ABAP-Programm heraus auf. Wenn Sie den Cursor auf den Namen ZZHKTST1 positionieren und doppelklicken gibt es zwei Mglichkeiten: 1. Das Programm ZZHKTST1 existiert schon. Das System ffnet den Editor fr ZZHKTST1 und Sie knnen das Programm lesen oder editieren. 2. Das Programm ZZHKTST1 existiert noch nicht. Das System zeigt ein Dialogfenster, das Ihnen erlaubt das Programm anzulegen. Nach der Bearbeitung von ZZHKTST1 knnen Sie ber die Auswahl von Back in die ABAP-Editor Sitzung des ursprnglichen Programms zurcknavigieren.

ffnen Sie in der Baumstruktur des Object Navigators den Knoten eines Programms, das mindestens ein Dynpro als Unterobjekt enthlt. Positionieren Sie den Cursor unter dem Knoten Dynpros auf einem Dynpro. Durch die Auswahl von Anzeigen, ndern oder Doppelklicken ffnen sie das Werkzeug Screen Painter und gelangen in die Bildschirmablauflogik dieses Dynpros: Hier sehen Sie normalerweise mehrere Dynpro-Anweisungen MODULE, welche die ABAP-Module im zugehrigen ABAP-Programm aufrufen. Positionieren Sie den Cursor auf ein Modul und klicken Sie doppelt. Das System ffnet den ABAP-Editor fr das zugehrige Include-Programm an der Stelle, an der das Modul programmiert ist. Das Include-Programm dient der QuelltextModularisierung des ABAP-Programms.

Wenn Sie im ABAP-Editor den Cursor hinter einer INCLUDE-Anweisung auf den Namen eines Include-Programms positionieren und dort doppelklicken, ffnen Sie das Include-Programm.

78

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Programmeigenschaften pflegen

Programmeigenschaften pflegen
Die Programmeigenschaften teilen der ABAP-Laufzeitumgebung mit, wie ein ABAP-Programm ausgefhrt wird. Das wichtigste Programmattribut hierfr ist der Typ, mit dem Sie entscheiden, wie ein ABAP-Programm ausgefhrt werden kann. Weiterhin bestimmen Sie in den Programmeigenschaften zu welcher Anwendung ein Programm gehrt und bestimmen gegebenenfalls die logische Datenbank fr ausfhrbare Programme (Reports). Sie mssen die Eigenschaften sorgfltig angeben, damit das System das Programm richtig verarbeiten kann. Sie pflegen die Programmeigenschaften auf dem Bild ABAP: Programmeigenschaften. Die Liste mglicher Programmtypen erhalten Sie ber die Auswahl der Eingabehilfe. Wenn Sie ein ausfhrbares Programm (Report, interner Typ = 1) auswhlen, ergnzt das System automatisch die Eingabefelder fr spezifische Eigenschaften. Nur dann sehen Sie die zustzlichen Eingabefelder Logische Datenbank und Selektionsbildversion.

bersicht ber alle Programmeigenschaften


Im folgenden finden Sie Informationen ber die Programmeigenschaften. Beachten Sie, da einige der Eigenschaften nur fr ausfhrbare Programme gelten und nicht fr andere ABAPProgramme. Zustzliche Informationen ber die Programmeigenschaften erhalten Sie, indem Sie in den jeweiligen Eingabefeldern des Bilds ABAP: Programmeigenschaften die Feldhilfe oder Eingabehilfe auswhlen.
Titel

Im Mufeld Titel geben Sie eine Programmbezeichnung an, die die Funktion des Programms beschreiben sollte. Das System nimmt den Titel automatisch in die Textelemente des Programms auf. Der Titel kann daher auch mit der Textelementpflege bearbeitet werden.
Originalsprache

Die Originalsprache ist die Anmeldesprache, unter der das Programm angelegt wird, und wird vom System gesetzt. Die Originalsprache ist nderbar, wenn ein Programmierer das Programm oder Komponenten des Programms unter einer anderen Anmeldesprache pflegt.
Typ

Im Feld Typ mssen Sie den Programmtyp spezifizieren. Mit Ausfhrbares Programm deklarieren Sie Ihr Programm als ausfhrbar. Das bedeutet, da das Programm eigenstndig ablauffhig ist und im R/3-System ohne Transaktionscode gestartet werden kann. Ausfhrbare Programme knnen auch im Hintergrund gestartet werden. Mit Modulpool deklarieren Sie Ihr Programm als einen Pool fr Dialogmodule. Das bedeutet, da Ihr Programm nicht eigenstndig ablauffhig ist, sondern als Rahmenprogramm fr Programmodule der Dialogprogrammierung dient. Diese Programmodule enthalten die Anwendungslogik einer Transaktion und werden von einer getrennt programmierten Bildschirmablauflogik (Dynpro-Programmierung mit dem Werkzeug Screen Painter) aufgerufen. Die Bildschirmablauflogik selbst kann nur ber einen Transaktionscode aufgerufen werden. Neben ausfhrbaren Programmen und Modulpools sollten Sie auch Include-Programme kennen. Ein Include-Programm ist ein unabhngiges Programm mit zwei Hauptfunktionen: Zum einen

April 2001

79

ABAP Programmierung (BC-ABA) Programmeigenschaften pflegen

SAP AG

enthlt es Programmcode, der von verschiedenen Programmen genutzt werden kann. Zum anderen dient es zur Modularisierung von Programmquellcode, der aus verschiedenen logisch zusammenhngenden Teilen besteht. Jeder dieser Teile ist in einem anderen Include-Programm gespeichert. Include-Programme verbessern die Lesbarkeit des Quellcodes und vereinfachen seine Pflege.
Status

Diese optionale Angabe hat protokollarischen Character und beschreibt den Status der Programmentwicklung, wie z.B. Testprogramm oder Produktives Kundenprogramm
Anwendung

Dieses optionale Feld enthlt den Namen der Anwendung, in der das Programm bentigt wird, wie z.B. Finanzbuchhaltung.
Berechtigungsgruppe

In dieses Feld knnen Sie den Namen einer Programmgruppe eintragen. Dadurch knnen Sie verschiedene Programme in Gruppen fr Berechtigungsprfungen zusammenfassen. Der Gruppenname ist ein Feld der beiden Berechtigungsobjekte S_DEVELOP (Programmentwicklung und Programmausfhrung) und S_PROGRAM (Programmpflege). Berechtigungen knnen somit programmgruppenspezifisch an Benutzer vergeben werden. Mehr Informationen zu Berechtigungen finden Sie in der Dokumentation BC - Benutzer und Rollen [Extern].
Entwicklungsklasse

Die Entwicklungsklasse ist wichtig fr Transporte zwischen Systemen. Sie fassen WorkbenchObjekte, die einer Entwicklungsklasse zugeordnet sind, in einem Transportauftrag zusammen. Wenn Sie in einem Team arbeiten, mssen Sie Ihr Programm vielleicht einer bestehenden Entwicklungsklasse zuordnen oder eine neue anlegen. Programme, die der Entwicklungsklasse $TMP zugeordnet sind, sind private Objekte, die nicht in andere Systeme transportiert werden knnen. Sie knnen die Entwicklungsklasse direkt in dieses Feld eintragen. Ansonsten fordert das System die Entwicklungsklasse beim Abspeichern der Eigenschaften mit einem Dialogfenster an: Die Auswahl der Taste Lokales Objekt auf dem Dialogfenster ist gleichbedeutend mit der Eingabe $TMP im Feld Entwicklungsklasse. Sie knnen die Entwicklungsklasse eines Programms nachtrglich ndern.
Logische Datenbank Nur fr ausfhrbare Programme

Diese Eigenschaften legen fest, welche logische Datenbank das ausfhrbare Programm (Report) benutzt, um Daten zu lesen.
Selektionsbildversion Nur fr ausfhrbare Programme

Wenn Sie keine Selektionsbildversion angegeben haben, legt das System automatisch ein Standardselektionsbild an, das auf den Selektionskriterien der logischen Datenbank sowie den programmspezifischen Parametern und Selektionsoptionen beruht. Wenn Sie ein anderes Selektionsbild der logischen Datenbank verwenden wollen, geben Sie in diesem Feld eine Nummer an. Die Nummer mu kleiner als 1000 sein und einem zustzlichen

80

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Programmeigenschaften pflegen

Selektionsbild der logischen Datenbank entsprechen. Sie erhalten einen berblick ber eventuell vorhandene zustzliche Selektionsbilder mit der Wertehilfe oder im Selektions- Include der logischen Datenbank (Programm DBxxxSEL, wobei xxx der Name der logischen Datenbank ist.
Editorsperre

Wenn Sie dieses Attribut setzen, knnen andere Benutzer Ihr Programm nicht ndern, umbenennen oder lschen. Sie allein knnen das Programm ndern, Eigenschaften, Textelemente oder Dokumentation pflegen oder die Sperre zurcknehmen.
Festpunktarithmetik

Wenn Sie dieses Attribut setzen, rundet das System Felder des Datentyps P entsprechend der Anzahl der Dezimalstellen oder fllt sie mit Nullen. Das Dezimalzeichen ist in diesem Fall immer der Punkt (.), unabhngig von der Angabe im Benutzerstammsatz. SAP empfiehlt, immer das Attribut Festpunktarithmetik zu setzen.
Start ber Variante Nur fr ausfhrbare Programme

Wenn Sie dieses Attribut setzen, knnen Benutzer Ihr Programm nur ber eine Variante starten. Vor dem Starten des Programms mssen Sie mindestens eine Variante anlegen.

April 2001

81

ABAP Programmierung (BC-ABA) Programme editieren

SAP AG

Programme editieren
Sie editieren Programme mit dem Werkzeug ABAP Editor [Extern]. Ausfhrliche Informationen finden Sie in der entsprechenden Dokumentation. Hier folgen ein paar Tips fr den Einstieg:

Programmaufbau
Im folgenden finden Sie eine Kurzbersicht zum Programmaufbau. Bis auf die erste Anweisung ist die Reihenfolge nicht zwingend, sollte aber wegen der bersichtlichkeit eingehalten werden. 1. Die erste Programmanweisung Die erste Anweisung eines ABAP-Programms ist immer eine programmeinleitende Anweisung [Seite 1474]. Hufig sind REPORT und PROGRAM. Die Funktionalitt beider Anweisungen ist identisch Der Name in den Anweisungen REPORT und PROGRAM mu nicht unbedingt mit dem Programmnamen bereinstimmen, sollte es aber aus dokumentarischen Grnden. Wenn Sie ein neues Programm anlegen erzeugt das System automatisch die erste ABAP-Anweisung, zum Beispiel.

REPORT <name>. fr ausfhrbare Programme oder PROGRAM <name>. fr Modulpools


Als Report-/Programmnamen setzt das System den Namen ein, unter dem Sie das Programm angelegt haben. 2. Datendeklaration Als nchstes sollten Sie smtliche Deklarationen Ihres Programms durchfhren. Dazu gehren, die Definition von Selektionsbildern, die Deklaration von programmlokalen Klassen und Interfaces oder globale Datendeklarationen. 3. Verarbeitungslogik Danach folgt die Verarbeitungslogik, die aus einer Reihe von Verarbeitungsblcken besteht. 4. Unterprogramme Smtliche internen Prozeduren (z.B. Unterprogramme) eines ABAP-Programms sollten als letzte Einheiten am Ende des Programms aufgelistet sein. Die Modularisierung von Programmen in Quelltextmodule durch Include-Programme ndert nichts an obigem prinzipiellen Aufbau. Wenn Sie beispielsweise der Vorwrtsnavigation der ABAP Workbench beim Anlegen von Dialogprogrammen folgen, legt das Ihnen System automatisch eine Reihe von Includes an, welche die oben aufgefhrten Programmteile in der richtigen Reihenfolge enthalten. Das Top-Include enthlt meistens die Anweisung PROGRAM sowie die globalen Datendeklarationen. Danach folgen Includes fr die einzelnen Dialogmodule geordnet nach PBO und PAI. Weitere Includes knnen z.B. Unterprogramme enthalten. Diese Includes dienen der bersichtlichkeit und haben keinen Einflu auf die Funktionalitt.

Programmlayout
Um ein qualitativ einwandfreies Programm zu schreiben, sollten Sie sich an bestimmte Layoutstandards fr ABAP-Programme halten. Beachten Sie bitte die folgenden Vorschlge:

82

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Programme editieren

Programme kommentieren
Kommetnieren Sie ihr Programm ausreichend. Erlutern Sie beispielsweise in der berschriftszeile fr ein Unterprogramm, wofr das aufgerufene Programm verwendet wird, und geben Sie die ntigen Informationen und Referenzen an. Der ABAP Editor [Extern] untersttzt die Kommentierung durch vordefinierte Kommentarblcke. Setzen Sie Kommentare innerhalb einer Programmzeile nur sparsam ein und wenn das Programm dadurch nicht unbersichtlich wird.

Anweisungsblcke einrcken
Fassen Sie zusammengehrige Anweisungen in einem Block zusammen. Rcken Sie jeden Block um mindestens zwei Spalten ein:
GET DO IF ENDIF ENDDO

Modularisieren
Modularisierung Sie ihre Programme. Wenn Sie grere Verarbeitungsblcke beispielsweise als Methoden schreiben, ist die logische Struktur Ihres Programms leichter zu erkennen. Programme mit Klassen und Methoden werden insgesamt vielleicht lnger, aber Sie werden bald feststellen, da dieses Verfahren die bersichtlichkeit betrchtlich erhht, besonders bei komplexen Programmen.

Pretty Printer
Verwenden Sie den Pretty Printer des ABAP Editor [Extern]. Er erleichtert es Ihnen, die Layoutrichtlinien einzuhalten.

Anweisungsmuster
Anweisungsmuster erleichtern es, ABAP-Programme zu schreiben. Sie liefern die genaue Syntax und entsprechen den ABAP-Layoutrichtlinien. Sie knnen zwei Arten von vordefinierten Strukturen in Ihren Programmcode im ABAP-Editor einfgen: Schlsselwortstrukturen und Kommentarzeilen. Whlen Sie Muster im ABAP-Editor. Eine Liste aller vordefinierten Schlsselwortstrukturen erhalten Sie, indem Sie den Cursor auf das Feld Anderes Muster stellen und die F4-Hilfe aufrufen.

Programm prfen
Wenn Sie mit dem Editieren fertig sind oder einen Zwischenstand erreicht haben, prfen Sie die Syntax, indem Sie Prfen anwhlen. Das System berprft den Programmcode auf Syntaxfehler und Kompatibilittsprobleme. Wenn es einen Fehler findet, erscheint eine Nachricht, die auf den Fehler hinweist und falls mglich eine Lsung oder Korrektur anbietet. Der Cursor kann auf die

April 2001

83

ABAP Programmierung (BC-ABA) Programme editieren

SAP AG

betreffende Stelle positioniert werden. Vor der vollstndigen Fertigstellung eines Programms sollte auf alle Flle eine erweiterte Programmprfung ber Programm Prfen Erweiterte Programmprfung im ABAP-Editor durchgefhrt werden. Die dort angezeigten Fehler und Warnungen sollten behoben werden. Manche Fehler, die von der erweiterten Programmprfung gefunden werden, zeigen an, da das Programm nicht ablauffhig ist. Andere verhindern zwar nicht unbedingt die Lauffhigkeit des Programms, weisen aber z.B. auf Unsauberkeiten hin, die einer geordneten Software-Entwicklung im Weg stehen. Auerdem knnen manche Warnungen in spteren Releases zu echten Syntax-Fehlern verschrft werden.

Programm sichern und aktivieren


Sichern Sie den Code durch Sichern. Der Quelltext wird in der Programmbibliothek gespeichert. Vor dem ersten Ausfhren des Programms auerhalb des ABAP-Editors mu eine aktive Fassung des Programms durch die Auswahl der Funktion Aktivieren erzeugt werden.

Programm testen
Sie knnen ausfhrbare Programme im Editor testen. Dazu whlen Sie Programm Ausfhren im ABAP-Editor. Dabei wird ein temporres aktives Laufzeitobjekt erzeugt, das nicht den gleichen Namen wie das Programm hat. Das System fhrt das Programm aber genauso aus, als htten Sie es auerhalb des ABAP-Editors gestartet. Wenn Sie beispielsweise einen Modulpool angelegt haben, knnen Sie ihr Programm nicht im Editor testen. Fr einen Modulpool mssen Sie einen Transaktionscode und eine Bildschirmablauflogik anlegen, bevor Sie das Programm ausfhren. Zum Testen eines Programms gehrt oft auch eine Laufzeitanalyse [Extern], die Ihnen zeigt wieviel Zeit Ihr Programm in der Client-Server-Umgebung des R/3-Systems verbraucht und wofr es diese Zeit braucht. Mehr Information zu diesem Thema finden Sie in der entsprechenden Dokumentation.

84

April 2001

SAP AG

ABAP Programmierung (BC-ABA) ABAP Programmiersprache

ABAP Programmiersprache
Prsentation

Applikation
ABAP ABAP

Datenbank

ABAP-Syntax [Seite 86] Typen und Objekte [Seite 90] Grundlegende Sprachelemente [Seite 93] Bearbeitung groer Datenmengen [Seite 264] Externe Datenspeicherung [Seite 377] Modularisierungstechniken [Seite 459] Spezielle Techniken [Seite 518]

April 2001

85

ABAP Programmierung (BC-ABA) ABAP-Syntax

SAP AG

ABAP-Syntax
Die Syntax der Programmiersprache ABAP besteht aus den folgenden Syntaxelementen:

Anweisungen
Ein ABAP-Programm besteht aus einzelnen Anweisungen. Jede Anweisung beginnt mit einem Schlsselwort und endet mit einem Punkt.

PROGRAM first_program. WRITE 'Erstes Programm'.


Dieses Beispiel enthlt zwei Anweisungen, jede in einer Zeile. Die Schlsselwrter sind PROGRAM und WRITE. Das Programm zeigt eine Liste am Bildschirm an. In diesem Fall enthlt die Liste die Zeile Erstes Programm. Das Schlsselwort bestimmt die Kategorie der Anweisung. Eine bersicht ber die verschiedenen Kategorien befindet sich unter ABAP-Sprachelemente [Seite 60].

PROGRAM FIRST_TEST. PROGRAM FIRST_TEST. NODES SPFLI. NODES SPFLI. GET SPFLI. GET SPFLI. WRITE SPFLI-CITYFROM. WRITE SPFLI-CITYFROM. WRITE SPFLI-CITYTO UNDER SPFLI-CITYFROM. WRITE SPFLI-CITYTO UNDER SPFLI-CITYFROM.

Schlsselwort

Operand

Zusatz

Operand

Die Abbildung zeigt die Struktur einer ABAP-Anweisung.

Formatierung von ABAP-Anweisungen


ABAP hat keine Formateinschrnkungen. Anweisungen knnen in freiem Format eingegeben werden, d.h., Anweisungen knnen eingerckt werden, mehrere Anweisungen knnen in eine Zeile geschrieben werden oder eine Anweisung in kann mehrere Zeilen geschrieben werden. Wrter innerhalb einer Anweisung mssen durch mindestens ein Leerzeichen getrennt werden. Das System interpretiert das Zeilenende ebenfalls als Leerzeichen.

Das folgende Programm

86

April 2001

SAP AG

ABAP Programmierung (BC-ABA) ABAP-Syntax

PROGRAM test. WRITE 'Dies ist eine Anweisung'.


knnte auch so geschrieben werden:

PROGRAM test. WRITE 'Dies ist eine Anweisung'.


oder so:

PROGRAM test. WRITE 'Dies ist eine Anweisung'.


Die freie Formatierung sollte genutzt werden, um die Lesbarkeit eines Programms zu verbessern. Ein unbersichtliches Layout sollte dagegen vermieden werden.

Besonderheit bei Textliteralen


Textliterale [Seite 124] sind in Hochkommata eingeschlossene Folgen von alphanumerischen Zeichen im Programmtext. Wenn ein Textliteral innerhalb einer ABAP-Anweisung ber mehrere Zeilen ausgedehnt wird, fhrt dies zu folgenden Schwierigkeiten:

Alle Leerzeichen zwischen den Hochkommata werden als zum Textliteral gehrig interpretiert. Der Editor interpretiert Buchstaben in Textliteralen, die nicht innerhalb einer Zeile durch Hochkommata abgeschlossen sind, als Grobuchstaben.

Um Textliterale einzugeben, die nicht in eine Zeile passen, kann man im Editor mit dem Zeichen & aufeinanderfolgende Textliterale zu einem Textliteral verknpfen.

Das folgende Programm

PROGRAM test. WRITE 'Dies ist eine Anweisung'.


fgt alle Leerzeichen zwischen den Hochkommata in das Literal ein und setzt die Buchstaben in Groschreibung um. Das Programm

PROGRAM test. WRITE 'Dies' & ' ist ' & 'eine Anweisung'.
bildet aus den drei Textliteralen ein einziges Textliteral.

Kettenstze
Die Sprache ABAP ermglicht es, aufeinanderfolgende Anweisungen, die den gleichen Anfang haben, miteinander zu verketten. Um eine Folge von getrennten Anweisungen miteinander zu verketten, schreibt man den fr alle Anweisungen identischen Anfang nur einmal, gefolgt von einem Doppelpunkt (:). Nach dem

April 2001

87

ABAP Programmierung (BC-ABA) ABAP-Syntax

SAP AG

Doppelpunkt werden die brigen Teile der einzelnen Anweisungen angegeben und mit einem Komma (,) voneinander getrennt. Die Anweisungskette mu durch einen Punkt (.) abgeschlossen werden.

Anweisungsfolge:

WRITE spfli-cityfrom. WRITE spfli-cityto. WRITE spfli-airpto.


Anweisungskette:

WRITE: spfli-cityfrom, spfli-cityto, spfli-airpto.


In der Kette trennt ein Doppelpunkt den Anfang der Anweisung von den variablen Teilen. Nach dem Doppelpunkt oder Komma knnen beliebig viele Leerzeichen eingefgt werden. Die gleiche Anweisung kann z.B. auch so geschrieben werden:

WRITE:

spfli-cityfrom, spfli-cityto, spfli-airpto.

In einer Anweisungskette ist der Anfang (vor dem Doppelpunkt) nicht auf das Schlsselwort der Anweisungen beschrnkt.

Anweisungsfolge:

sum = sum + 1. sum = sum + 2. sum = sum + 3. sum = sum + 4.


Anweisungskette:

sum = sum + : 1, 2, 3, 4.

Kommentare
Kommentare sind Texte, die zur Erluterung zwischen die Anweisungen eines ABAP-Programms geschrieben werden knnen. Kommentare unterscheiden sich durch die voranstehenden Zeichen * (am Zeilenanfang) und " (an beliebiger Zeilenposition) von den ABAP-Anweisungen. Wenn die ganze Zeile Kommentar ist, wird am Anfang der Zeile ein Stern (*) eingegeben. Das System ignoriert die gesamte Zeile bei der Programmgenerierung. Wenn nur ein Teil der Zeile Kommentar sein soll, wird vor dem Kommentar ein Anfhrungszeichen eingegeben. Das System interpretiert Kommentare, die durch das Anfhrungszeichen gekennzeichnet sind, als Leerzeichen.

************************************************ * PROGRAM SAPMTEST * * WRITTEN BY KARL BYTE, 06/27/1995 *

88

April 2001

SAP AG

ABAP Programmierung (BC-ABA) ABAP-Syntax

* LAST CHANGED BY RITA DIGIT, 10/01/1995 * * TASK: DEMONSTRATION * ************************************************ PROGRAM sapmtest. ************************************************ * DECLARATIONS * ************************************************ DATA: flag(1) TYPE c, number TYPE i. ...... ************************************************ * PROCESSING BLOCKS * ************************************************ ...... " global flag " counter

April 2001

89

ABAP Programmierung (BC-ABA) Typen und Objekte

SAP AG

Typen und Objekte


In ABAP unterscheiden wir zwischen Typen und Objekten. Typen sind reine Beschreibungen, an denen kein Speicher hngt. Objekte sind Instanzen von Typen und belegen Speicher. Ein Typ charakterisiert die technischen Eigenschaften aller Objekte des betreffenden Typs. Die ABAP Typen bilden die ABAP-Typenhierarchie. Die Hierarchie der ABAP Objekte spiegelt die ABAP-Typenhierarchie.

90

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Typen und Objekte

Typen Objekte Typen Objekte Datentypen Datenobjekte Datentypen Datenobjekte Elementare Typen Elementare Datenobjekte Elementare Typen Elementare Datenobjekte Feste Lnge Statische Datenobjekte Feste Lnge Statische Datenobjekte C Textfeld C Textfeld N Numerisches Textfeld N Numerisches Textfeld D Datumsfeld D Datumsfeld T Zeitfeld T Zeitfeld X Hexadezimalfeld X Hexadezimalfeld P Gepackte Zahl P Gepackte Zahl I I Ganze Zahl Ganze Zahl F Gleitpunktzahl F Gleitpunktzahl Variable Lnge Dynamische Datenobjekte Variable Lnge Dynamische Datenobjekte STRING Zeichenfolge STRING Zeichenfolge XSTRING Bytefolge XSTRING Bytefolge Komplexe Typen Komplexe Datenobjekte Komplexe Typen Komplexe Datenobjekte Strukturtypen Strukturen Strukturtypen Strukturen Tabellentypen Interne Tabellen Tabellentypen Interne Tabellen Referenztypen Referenzvariablen Referenztypen Referenzvariablen Datenreferenzen Datenreferenzvariablen Datenreferenzen Datenreferenzvariablen Objektreferenzen Objektreferenzvariablen Objektreferenzen Objektreferenzvariablen Objekttypen Objekttypen Klassen Objekte Klassen Objekte Interfaces Interfaces Klassenreferenzen Klassenreferenzvariablen Klassenreferenzen Klassenreferenzvariablen Interfacereferenzen Interfacereferenzvariablen Interfacereferenzen Interfacereferenzvariablen

Zeichenartige Typen

Numerische Typen

Wir unterscheiden prinzipiell zwischen Daten- und Objekttypen.

Datentypen [Seite 95] dienen der Beschreibung von Datenobjekten [Seite 123]. Sie unterteilen sich weiter in elementare, Referenz- und komplexe Typen. Es gibt eingebaute (vordefinierte) Datentypen oder sie knnen lokal im Programm und systemweit im R/3Repository definiert werden.

April 2001

91

ABAP Programmierung (BC-ABA) Typen und Objekte

SAP AG

Objekttypen dienen der Beschreibung von Objekten in ABAP Objects [Seite 1392]. Sie unterteilen sich in Klassen und Interfaces. Objekttypen enthalten zum einen obige Datentypen zum anderen aber auch Funktionalitt. Objekttypen sind nicht eingebaut, sondern mssen im Programm oder im R/3-Repository definiert werden. Klassen beschreiben ein Objekt vollstndig. Sie definieren welche Datentypen und welche Funktionalitt ein Objekt enthlt. Interfaces beschreiben einen Teilaspekt eines Objekts. Die Datentypen und Funktionen eines Interfaces knnen von mehreren Klassen implementiert werden. Objekte (Instanzen) knnen nur von Klassen erzeugt werden. Objektreferenzen knnen aber sowohl mit Bezug auf Klassen, als auch mit Bezug auf Interfaces typisiert werden.

Bei den Objekten als Instanzen von ABAP Typen unterscheiden wir prinzipiell zwischen Datenobjekten und Objekten.

Datenobjekte [Seite 123] sind Felder im eigentlichen Sinn. Sie enthalten die programmlokalen Daten, mit denen ein Programm zur Laufzeit arbeitet. Objekte [Seite 1410] sind echte Software-Objekte in ABAP Objects [Seite 1392] und untersttzen die objektorientierte Programmierung indem sie auer Daten auch Methoden und Ereignisse enthalten.

92

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Grundlegende Sprachelemente

Grundlegende Sprachelemente
Datentypen und Datenobjekte [Seite 94] Daten verarbeiten [Seite 148] Feldsymbole und Datenreferenzen [Seite 208] Logische Ausdrcke [Seite 238] Programmablaufsteuerung [Seite 254]

April 2001

93

ABAP Programmierung (BC-ABA) Datentypen und Datenobjekte

SAP AG

Datentypen und Datenobjekte


Programme arbeiten mit programmlokalen Daten. Daten sind Bytefolgen im Arbeitsspeicher des Programms. Zusammengehrige Bytefolgen heien Felder. Jedes Feld hat eine Lnge, eine Identitt (Name) und als weiteres Attribut einen Datentyp. Jede Programmiersprache hat ein Konzept, das beschreibt, wie der Inhalt eines Felds, also die Bytefolge, in Abhngigkeit vom Datentyp interpretiert wird. Im ABAP-Typkonzept bezeichnen wir Felder als Datenobjekte. Datenobjekte sind sozusagen Instanzen von abstrakten Datentypen. Konsequenterweise tauchen Datentypen in ABAP nicht nur als Attribute von Feldern auf, sondern knnen auch eigenstndig definiert werden. Fr Datentypen und Datenobjekte gibt es es getrennte Namensrume. Das heit, ein Name kann gleichzeitig der Name eines Datenobjekts und der Name eines Datentyps sein.

Datentypen
Datentypen treten in ABAP zum einen als Attribute von Datenobjekten auf, zum anderen knnen sie eigenstndig definiert werden. Die Definition von eigenstndigen Datentypen baut auf einem Satz von vordefinierten elementaren Datentypen auf. Sie kann programmintern im Deklarationsteil eines Programms mit der Anweisung TYPES oder programmbergreifend im ABAP Dictionary erfolgen. Eigenstndige Datentypen knnen zur Deklaration von Datenobjekten und zur Typberprfung bei generischen Operationen verwendet werden.

Datenobjekte
Datenobjekte sind die physikalischen Einheiten, mit denen ABAP-Anweisungen zur Laufzeit arbeiten. Jedes ABAP-Datenobjekt hat bestimmte technische Eigenschaften, die zu jedem Zeitpunkt der Laufzeit eines ABAP-Programms vollstndig spezifiziert sind. Die technischen Eigenschaften eines Datenobjekts sind: Feldlnge, Anzahl der Nachkommastellen und Datentyp. ABAP-Anweisungen arbeiten mit dem Inhalt von Datenobjekten und interpretieren ihn entsprechend des Datentyps. Datenobjekte werden entweder statisch im Deklarationsteil eines ABAP-Programms (wichtigste Anweisung: DATA) oder dynamisch zur Laufzeit (z.B. beim Aufruf von Prozeduren) erzeugt. Zustzlich zu Feldern im Speicherbereich werden auch Literale aus dem Programmcoding wie Datenobjekte behandelt. Datentypen [Seite 95] Datenobjekte [Seite 123] Weitere Informationen zu Datentypen und Datenobjekten: Kompatibilitt [Seite 138] Attribute von Datenobjekten bestimmen [Seite 140] Beispiele zu Datentypen und Objekten [Seite 145]

94

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Datentypen

Datentypen
Die folgende Abbildung zeigt eine bersicht ber die Datentypen in ABAP. Datentypen sind ein Teilbaum der ABAP-Typenhierarchie [Seite 90].
Datentypen Datentypen Elementare Typen Elementare Typen Feste Lnge Feste Lnge C C N N D D T T X X P P II F F Variable Lnge Variable Lnge STRING STRING XSTRING XSTRING Komplexe Typen Komplexe Typen Strukturtypen Strukturtypen Tabellentypen Tabellentypen Referenztypen Referenztypen Datenreferenzen Datenreferenzen Objektreferenzen Objektreferenzen Klassenreferenzen Klassenreferenzen Interfacereferenzen Interfacereferenzen

Zeichenartige Typen

Numerische Typen

Datentypen unterteilen sich in elementare, Referenz- und komplexe Typen.

Elementare Typen
Elementare Typen sind atomar in dem Sinn, da sie nicht aus anderen Typen zusammengesetzt sind. Sie sind nochmals in solche fixer und solche variabler Lnge unterteilt.

April 2001

95

ABAP Programmierung (BC-ABA) Datentypen

SAP AG

Elementare Typen fixer Lnge


Es gibt acht in ABAP eingebaute elementare Typen fixer Lnge:

Vier zeichenartige Typen: Zeichenfelder (C), numerische Zeichenfelder (N), Datumsfelder (D) und Zeitfelder (T). Ein hexadezimaler Typ: Bytefelder (X). Drei numerische Typen: Integer (I), Gleitpunktzahlen (F) und gepackte Zahlen (P).

Elementare Typen variabler Lnge


Es gibt zwei in ABAP eingebaute elementare Typen variabler Lnge:

STRING fr Zeichenfolgen XSTRING fr Bytefolgen

Referenztypen
Referenztypen beschreiben Datenobjekte, die Referenzen (Zeiger) auf andere Objekte (Datenobjekte und Objekte aus ABAP Objects) enthalten. Referenztypen bilden eine Hierarchie, welche die Hierarchie der Objekte abbildet, auf welche die Referenzen zeigen knnen. Es gibt keine vordefinierten Referenzen, sondern sie mssen im Programm definiert werden.

Komplexe Typen
Komplexe Typen sind aus anderen Typen zusammengesetzt. Sie erlauben die Verwaltung und Bearbeitung von semantisch zusammengehrigen Datenmengen unter einem Namen. Auf ein Datenobjekt eines komplexen Typs kann insgesamt oder komponentenweise zugegriffen werden. Es gibt in ABAP keine eingebauten komplexen Datentypen. Ein komplexer Datentyp mu entweder im ABAP-Programm oder im ABAP Dictionary definiert werden. Sie sind in Strukturen und interne Tabellen unterteilt.

Strukturen
Eine Struktur (auch Feldleiste genannt) ist eine Folge beliebiger elementarer Typen, Referenztypen oder komplexer Datentypen. Strukturen dienen in ABAP-Programmen zur Zusammenfassung von logisch zusammengehrigen Arbeitsbereichen. Da die Einzelelemente von Strukturen beliebige Datentypen haben knnen, sind die Einsatzmglichkeiten von Strukturen sehr umfassend. Beispielsweise dienen Strukturen mit elementaren Elementen der Darstellung von Zeilen aus Datenbanktabellen und Strukturen mit komplexen Elementen werden eingesetzt, um alle Eigenschaften eines Bildschirms oder Controls in einem Datenobjekt zusammenzufassen. Bei Strukturen spielen folgende Begriffe eine Rolle:

Geschachtelte und nicht-geschachtelte Strukturen. Flache und tiefe Strukturen.

96

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Datentypen

Geschachtelte Strukturen sind Strukturen, die wiederum Strukturen als Komponenten enthalten. Flache Strukturen enthalten nur elementare Datentypen fixer Lnge, also keine internen Tabellen, Referenztypen oder Strings. Fr den Begriff tiefe Struktur spielt es keine Rolle, ob die Struktur geschachtelt oder nicht geschachtelt ist. Geschachtelte Strukturen sind solange flach, wie keiner der obigen Typen in irgendeiner Schachtelungsebene enthalten ist. Jede Struktur, die unabhngig von der Schachtelung mindestens eine interne Tabelle, einen Referenztyp oder einen String als Komponente enthlt bezeichnen wir als tief. Dementsprechend heien interne Tabellen, Referenzen und Strings auch tiefe Datentypen. Der technische Unterschied zwischen den tiefen und den brigen Datentypen ist der, da beim Anlegen eines tiefen Datenobjekts im Speicher, an der Stelle, an der bei einem flachen Typ der tatschliche Feldinhalt abgelegt wird, bei tiefen Typen nur ein Zeiger angelegt wird, der auf den wirklichen Feldinhalt bzw. auf weitere Verwaltungsinformationen zeigt. Nur bei flachen Strukturen befindet sich also der Dateninhalt der Struktur innerhalb der Speichergrenzen der Struktur selbst. Tiefe Strukturen enthalten an der Position der tiefen Komponenten dagegen Zeiger auf die Daten. Aus diesem Grund werden tiefe Strukturen bei Zuweisungen, Offset-/Lngenzugriffen etc. auch anders behandelt als flache Strukturen.

Interne Tabellen
Interne Tabellen bestehen aus einer Folge von Zeilen gleichen Datentyps. Interne Tabellen sind charakterisiert durch

den Zeilentyp, der ein beliebiger elementarer Typ, ein Referenztyp oder komplexer Datentyp sein kann. einen Schlssel, welcher der Identifikation von Tabellenzeilen dient. Er lt sich aus den elementaren Feldern der Zeilen aufbauen. Wir unterscheiden weiterhin zwischen eindeutigen und nicht eindeutigen Schlsseln. die Zugriffsart, die definiert, wie ABAP auf die Tabelle zugreift. Bei der Zugriffsart lassen sich unsortierte und sortierte Indextabellen sowie Hash-Tabellen unterscheiden. Bei Index-Tabellen wird intern ein linearer Index gefhrt, so da der Zugriff auf Tabellenzeilen sowohl ber Indexangabe als auch ber den Schlssel erfolgen kann. Bei Hash-Tabellen wird kein linearer Index gefhrt. Der Zugriff auf Tabellenzeilen erfolgt ausschlielich unter Angabe des Schlssels. Hierbei fhrt das System intern einen Hash-Algorithmus aus.

Interne Tabellen werden immer dann eingesetzt, wenn mehrfache Daten einer festen Struktur programmintern verwendet werden. Ein wichtiges Einsatzgebiet ist z.B. die programminterne Speicherung von Daten aus der Datenbank.

Beispiele komplexer Datentypen


Die folgende Liste enthlt einige Beispiele fr komplexe Datentypen, geordnet nach steigender Komplexitt: 1. Strukturen, die aus einer Serie von elementaren Datentypen fixer Lnge bestehen (nichtgeschachtelte, flache Strukturen). 2. Interne Tabellen, deren Zeilentyp ein elementarer Typ ist (Vektor). 3. Interne Tabellen, deren Zeilentyp eine nicht-geschachtelte Struktur ist ('echte' Tabellen) 4. Strukturen mit Strukturen als Komponenten (geschachtelte Strukturen, flach oder tief). 5. Strukturen mit internen Tabellen als Komponenten (Beispiel fr tiefe Strukturen) 6. Interne Tabellen, deren Zeilentyp wiederum interne Tabellen enthlt.

April 2001

97

ABAP Programmierung (BC-ABA) Datentypen

SAP AG

1 1 2 2 3 3

4 4

5 5

6 6

Die Abbildung zeigt, wie aus Einzelfeldern komplexe Typen beliebiger Komplexitt aufgebaut werden knnen.

Weitere Themen zu Datentypen


Die verschiedenen Datentypen knnen auf unterschiedlichen Ebenen des R/3-Systems definiert werden. Nhere Informationen hierzu finden sich unter Definition von Datentypen [Seite 100] In bestimmten ABAP-Anweisungen kann man sich mit dem Zusatz TYPE auf vorhandene Datentypen beziehen. Dies setzt voraus, da die Datentypen an der gewnschten Stelle sichtbar sind. Nhere Informationen hierzu finden sich unter Sichtbarkeit von Datentypen [Seite 117] Bei der Arbeit mit Daten ist es wichtig zu wissen, ob die Datentypen kompatibel sind oder nicht. Nhere Informationen hierzu finden sich unter Kompatibilitt von Datentypen [Seite 138].

98

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Datentypen

April 2001

99

ABAP Programmierung (BC-ABA) Definition von Datentypen

SAP AG

Definition von Datentypen


Die folgende Abbildung zeigt wo die Datentypen in ABAP definiert werden knnen:

Datentypen Eingebaute ABAP-Typen Programmlokale Typen im Typen ABAP Dictionary ABAP Dictionary Typen Objekte in Typgruppen

Wir unterscheiden zwischen


Eingebauten ABAP-Typen [Seite 101], die im Kernel vordefiniert sind. Programmlokalen Datentypen [Seite 104], die in ABAP-Programmen definiert werden knnen Datentypen im ABAP Dictionary [Seite 109], die systemweit allen Programmen zur Verfgung stehen. Im ABAP Dictionary knnen Typen entweder als Dictionary-Objekt oder in sogenannten Typgruppen definiert werden.

100

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Eingebaute ABAP-Typen

Eingebaute ABAP-Typen
Diese Datentypen sind im Kernel des R/3-Systems eingebaut und in jedem ABAP-Programm sichtbar. Die eingebauten Typen knnen zum einen bei der Definition von programmlokalen Datentypen und Datenobjekten zum anderen bei der Typisierung von Schnittstellenparametern und Feldsymbolen verwendet werden. Vor Release 4.5A wurden eingebaute Datentypen auch als vordefinierte Datentypen bezeichnet. Seit Release 4.5A kann man aus der Sicht eines ABAP Programms Datentypen auch programmbergreifend im ABAP Dictionary (vor)definieren. Deshalb ist der Begriff 'vordefiniert' nicht mehr eindeutig und wird durch 'eingebaut' ersetzt.

Eingebaute elementare ABAP-Typen fixer Lnge


Diese eingebauten elementaren Datentypen dienen der Typisierung von Einzelfeldern, deren Lnge zur Laufzeit immer festgelegt ist. Die folgende Tabelle fat die elementaren eingebauten Datentypen fixer Lnge zusammen. Die Feldlngen sind in Bytes angegeben.
Datentyp Initiale Gltige Initialwert Bedeutung Feldlnge Feldlnge

Numerische Typen I F P Zeichenartige Typen C D N T Hexadezimaler Typ X 1 1 - 65535 X'0 0' Hexadezimalfeld Die Datentypen D, F, I und T beschreiben die technischen Eigenschaften eines Datenobjekts vollstndig. Die Datentypen C, N, P und X sind generisch. Wenn ein generischer Typ zur Definition eines programmlokalen Datentyps oder bei der Deklaration eines Datenobjekts verwendet wird, mssen Feldlnge und beim Typ P die Anzahl der Dezimalstellen im Programm festgelegt werden. Bei Verwendung der generischen Datentypen fr die Typisierung von Schnittstellenparametern oder Feldsymbolen mssen die technischen Eigenschaften nicht spezifiziert werden. 1 8 1 6 1 - 65535 8 1 - 65535 6 ' ' '00000000' '0 0' '000000' Textfeld (alphanumerische Zeichen) Datumsfeld (Format: JJJJMMTT) Numerisches Textfeld (numerische Zeichen) Zeitfeld (Format HHMMSS) 4 8 8 4 8 1 - 16 0 0 0 Ganze Zahl Gleitpunktzahl Gepackte Zahl

April 2001

101

ABAP Programmierung (BC-ABA) Eingebaute ABAP-Typen

SAP AG

Der Initialwert, und bei den generischen Typen die initiale Feldlnge, sind Werte, die bei Verwendung von Kurzformen der Anweisungen TYPES und DATA implizit eingesetzt werden. Die eingebauten Typen fixer Lnge sind unterteilt in:

Numerische Typen
Neben fnf nichtnumerischen Typen, Texfelder (C), numerische Textfelder (N), Datumsfelder (D), Zeitfelder (T) und Hexadezimalfelder (X), gibt es drei numerische Typen, die der Reprsentation und Berechnung von Zahlen in ABAP dienen. Der Datentyp N ist kein numerischer Typ. Daten vom Typ N knnen nur numerische Zeichen (0,1,2,,9) enthalten, werden intern aber nicht als Zahlen reprsentiert. Typische N-Felder sind Kontonummern und Postleitzahlen.

Ganze Zahlen - Typ I Der Wertebereich reicht von -2**31 bis zu 2**31-1 und bercksichtigt nur ganze Zahlen. Bei arithmetischen Rechnungen (z.B. Divisionsrechnungen), die keine ganzen Zahlen ergeben, wird das Ergebnis gerundet, nicht abgeschnitten. Daten vom Typ I werden u.a. fr Zhler, Stckzahlen, Indizes oder Zeitrume verwendet.

Gepackte Zahlen - Typ P Daten vom Typ P knnen Ziffern nach dem Dezimalpunkt aufweisen. Die Anzahl der Dezimalstellen ist generisch und wird im Programm festgelegt. Der Wertebereich von Typ P Daten hngt sowohl von ihrer Gre als auch von der Anzahl der Stellen hinter dem Dezimalpunkt ab. Die gltige Gre liegt zwischen 1 und 16 Bytes. Zwei Dezimalstellen werden in ein Byte gepackt, wobei das letzte Byte nur eine Stelle und das Vorzeichen enthlt. Hinter dem Dezimalpunkt sind bis zu 14 Stellen erlaubt. Der Initialwert ist Null. Bei der Arbeit mit Daten vom Typ P empfiehlt es sich, im ABAP-Editor das Programmattribut Festpunktarithmetik zu setzen, sonst werden P-Zahlen wie ganze Zahlen behandelt. Daten vom Typ P werden fr die Angabe von Entfernungen, Gewichten, Geldbetrgen usw. verwendet.

Gleitpunktzahlen - Typ F Der Wertebereich von Gleitpunktzahlen reicht von 1x10**-307 bis zu 1x10**308 fr positive und negative Zahlen, einschlielich der 0 (null). Der Genauigkeitsbereich ist ungefhr 15 Stellen, abhngig von der Gleitpunktarithmetik der Hardware-Plattform. Da Daten vom Typ F intern in ein binres System konvertiert werden, knnen Rundungsfehler auftreten. Obwohl der ABAP-Prozessor versucht, diese Fehler auf ein Minimum zu beschrnken, sollten Sie diesen Datentyp nicht einsetzen, wenn es Ihnen auf Genauigkeit ankommt. In diesem Fall benutzen Sie besser Daten vom Typ P. Daten vom Typ F werden benutzt, wenn sehr groe Wertebereiche bentigt werden und es auf Rundungsfehler nicht ankommt.

Berechungen mit I- und F-Feldern sind schneller als mit P-Feldern. Arithmetische Operationen mit I- und F-Feldern sind eng verwandt mit Maschinensprache-Anweisungen, whrend P-Felder grere Software-Untersttzung erfordern. Dennoch gibt es zu Daten vom Typ P keine Alternative, wenn es um Genauigkeit oder bestimmte Anforderungen an den Wertebereich geht.

Zeichenartige Typen
Von den fnf nichtnumerischen Typen bezeichnen wir die vier Typen C, D, N, T als zeichenartige Typen und Felder mit solch einem Typ als Zeichenfeld. Jede Stelle eines

102

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Eingebaute ABAP-Typen

solchen Felds belegt im Speicher den Platz fr den Code eines Zeichens. Zur Zeit arbeitet ABAP nur mit Einbyte-Codes wie ASCII und EBCDI. Die Erweiterung auf UNICODE, wo ein Zeichen zwei oder vier Bytes belegt ist in Vorbereitung.

Hexadezimaltyp
Der brige nichtnumerische Typ X interpretiert immer einzelne Bytes im Speicher. Ein Byte wird durch die zweistellige Hexadezimaldarstellung dargestellt. Die Felder dieses Typs heien Hexadezimalfelder. In Hexadezimalfeldern kann auch eine Einzelbitverarbeitung [Seite 184] durchgefhrt werden.

Eingebaute elementare ABAP-Typen variabler Lnge


Diese eingebauten elementaren Datentypen dienen der Typisierung von Einzelfeldern, deren Lnge erst zur Laufzeit festgelegt wird. Es gibt zwei in ABAP eingebaute elementare Typen variabler Lnge, die zusammenfassend auch Strings genannt werden:

STRING fr Zeichenfolgen Eine Zeichenfolge ist ein zeichenartiger Typ variabler Lnge. Eine Zeichenfolge kann beliebig viele alphanumerische Zeichen aufnehmen. Die Lnge einer Zeichenfolge ist die Anzahl der Zeichen multipliziert mit der Lnge der internen Darstellung des Zeichens.

XSTRING fr Bytefolgen Eine Bytefolge ist ein Hexadezimaltyp variabler Lnge. Eine Bytefolge kann beliebig viele Bytes aufnehmen. Die Lnge einer Bytefolge entspricht der Anzahl der Bytes.

Beim Anlegen von Strings als Datenobjekte wird nur ein Verwaltungseintrag namens StringHeader statisch vereinbart wird. Die eigentlichen Datenobjekte werden zur Laufzeit durch operationale Anweisungen dynamisch erzeugt und verndert. Der Initialwert eines Strings ist der leere String mit der Lnge 0. Eine Struktur, die einen String enthlt wird intern als tiefe Struktur behandelt. Das bedeutet, da es keine Konvertierungsregeln fr Strukturen [Seite 201] gibt, die Strings enthalten.

Eingebaute komplexe Datentypen


ABAP enthlt keine eingebauten komplexen Datentypen, die bei der Definition von programmlokalen Datentypen oder von Datenobjekten verwendet werden knnen. Alle komplexen Datentypen beruhen auf den elementaren ABAP-Typen und werden erst im ABAPProgramm oder im ABAP Dictionary konstruiert.

April 2001

103

ABAP Programmierung (BC-ABA) Programmlokale Datentypen

SAP AG

Programmlokale Datentypen
Jedes ABAP-Programm kann seine eigenen Datentypen definieren und innerhalb eines Programms knnen Prozeduren [Seite 467] nochmals eigene lokale Datentypen definieren. Programmlokale Datentypen werden mit der Anweisung

TYPES <t> ... [TYPE <type>|LIKE <obj>] ...


definiert. Der Name des Datentyps <t> kann bis zu 30 Zeichen lang sein. Es knnen alle Ziffern, Buchstaben und der Unterstrich verwendet werden. Der Name darf nicht aus Ziffern alleine bestehen. Die Sonderzeichen + . , : ( ) - < > drfen nicht verwendet werden. Die brigen Sonderzeichen sind fr den internen Gebrauch reserviert. Die Namen der eingebauten ABAPTypen (C, D, F, I, N, P, T, X, STRING, XSTRING) drfen nicht verwendet werden, ebensowenig der Name des generischen Typs TABLE. Es sollten keine Namen verwendet werden, die mit einem Schlsselwort oder einem Zusatz von ABAP-Anweisungen bereinstimmen. Es sollten

Namen verwendet werden, die die Bedeutung des Typs verstndlich machen, ohne da zustzliche Kommentare erforderlich werden. zur Gliederung zusammengesetzter Name der Unterstrich verwendet werden. als erstes Zeichen stets ein Buchstaben verwendet werden.

Programmlokale Datentypen werden entweder mit Bezug auf bekannte Datentypen definiert oder neu konstruiert. Ein bekannter Typ kann sein

ein eingebauter ABAP-Typ, auf den mit dem TYPE-Zusatz verwiesen wird. ein bereits vorhandener programmlokaler Datentyp, auf den mit dem TYPE-Zusatz verwiesen wird. der Datentyp eines programmlokalen Datenobjekts, auf den mit dem LIKE-Zusatz verwiesen wird. ein Datentyp im ABAP Dictionary, auf den mit dem TYPE-Zusatz verwiesen wird. Aus Kompatibilittsgrnden zu vorhergehenden Releases kann auch mit dem LIKE-Zusatz auf Datenbanktabellen und flache Strukturen des ABAP Dictionary verwiesen werden. In neuen Programmen sollte aber auch hier der TYPE-Zusatz verwendet werden.

Die bekannte Typen mssen an der Definitionstelle sichtbar [Seite 117] sein. Falls der bekannte Datentyp generisch ist, knnen mit weiteren Zustzen die noch offenen Eigenschaften des Typs <t> spezifiziert werden.

Elementare Datentypen
Programmlokale elementare Datentypen werden ausschlielich durch Bezug auf eingebaute elementare Typen definiert. Die Syntax fr die Definition elementarer Datentypen ist:

TYPES <t>[(<length>)] [TYPE <type>|LIKE <obj>] [DECIMALS <dec>].


Dabei ist <type> entweder einer der eingebauten ABAP-Typen C, D, F, I, N, P, T, X, STRING oder XSTRING, ein vorher definierter elementarer programmlokaler Typ oder ein im ABAP Dictionary definiertes Datenelement. Beim Bezug auf ein Datenelement aus dem Dictionary wird dieses in einen elementaren ABAP Typ konvertiert. Beim LIKE-Bezug kann <obj> ein vorher deklariertes Datenobjekt mit elementarem Datentyp sein.

104

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Programmlokale Datentypen

Ohne TYPE- oder LIKE-Zusatz wird implizit der eingebaute Typ C verwendet. Falls <type> einer der generischen elementaren eingebauten ABAP-Typen fixer Lnge (C, N, P, X) ist, sollte mit der Option <length> die Feldlnge festgelegt werden. Ohne die Angabe von <length> wird die Feldlnge auf den entsprechenden Initialwert der Tabelle unter Eingebaute ABAP-Typen [Seite 101] gesetzt. Falls <type> gleich P ist, kann mit der Option DECIMALS die Anzahl der Dezimalstellen festgelegt werden. Ohne die Angabe von DECIMALS wird die Anzahl der Dezimalstellen auf Null gesetzt. Die implizite Anweisung

TYPES <t>.
Definiert also ein Characterfeld <t> der Lnge 1. Sie ist eine Kurzform der expliziten Anweisung

TYPES <t>(1) TYPE C.


Es sollte aber immer die explizite Anweisung verwendet werden. Insbesondere ist die Kurzform im Umfeld von ABAP Objects, also innerhalb von Klassen, verboten. Elementare programmlokale Datentypen knnen Programme transparenter und lesbarer machen. Wenn man einen programmlokalen Datentyp zur Typisierung mehrerer Datenobjekten verwendet hat, lt sich der Datentyp all dieser Datenobjekte auf einmal ndern, indem man die Definition des Datentyps in der TYPES-Anweisung ndert. Oder wenn eine bestimmte Menge von Datentypen regelmig in verschiedenen Programmen benutzt werden soll, die Datentypen aber nicht systemweit im ABAP Dictionary abgelegt werden sollen, kann man sich ein IncludeProgramm [Seite 465] fr die Typdefinition anlegen und in die Programme einbetten.

TYPES: number TYPE i, length TYPE p DECIMALS 2, code(3) TYPE c. ...


In diesem Beispiel wird ein Datentyp mit dem Namen NUMBER definiert. Er ist bis auf den Namen identisch mit dem eingebauten ABAP-Typ I und dient somit nur zur Erhhung der Lesbarkeit des Programms. Es wird ein Datentyp LENGTH definiert, der auf dem eingebauten generischen ABAP-Typ P basiert. LENGTH wird mit einer gegebenen Zahl von Dezimalstellen definiert. Wre es zum Beispiel erforderlich die Genauigkeit von Lngenangaben zu ndern, mte man lediglich die TYPES-Anweisung des Programms ndern. Es wird ein dritter Datentyp CODE definiert. CODE basiert auf dem eingebauten generischen ABAP-Typ C. Die Feldlnge wird hier mit 3 Bytes festgelegt.

DATA counts TYPE i. TYPES: company TYPE spfli-carrid, no_flights LIKE counts.
Dieses Beispiel zeigt, wie mit dem Zusatz TYPE auf die Spalte CARRID der Datenbanktabelle SPFLI verwiesen wird. Der Zusatz LIKE verweist auf ein bereits vorhandenes Datenobjekt.

April 2001

105

ABAP Programmierung (BC-ABA) Programmlokale Datentypen

SAP AG

Referenztypen
Referenztypen sind programmlokal und im ABAP Dictionary definierbar. Die Syntax fr die Definition von Referenztypen ist:

TYPES <t> TYPE REF TO ...


Hier steht hinter dem TYPE-Zusatz kein Verweis auf einen anderen Datentyp, sondern ein sogenannter Typkonstruktor.

Mit dem Typkonstruktor

REF TO DATA
definiert die TYPES-Anweisung eine Referenz <t> auf ein Datenobjekt. Felder des Datentyps <t> knnen Referenzen (Zeiger) auf Datenobjekte also auf Instanzen von Datentypen enthalten (siehe auch Datenreferenzen [Seite 232]).

Mit dem Typkonstruktor

REF TO <class>|<interface>
definiert die TYPES-Anweisung eine Referenz <t> auf die Klasse <class> oder das Interface <interface>. Felder des Datentyps <t> knnen Referenzen (Zeiger) auf Instanzen der Klasse <class> oder ihrer Unterklassen bzw. von Klassen, die das Interface <interface> implementieren, enthalten (siehe auch Behandlung von Objekten [Seite 1410]).

Komplexe Typen
Ein komplexer programmlokaler Datentyp setzt sich immer aus obigen elementaren Datentypen oder Referenztypen zusammen. Die TYPES-Anweisung ist in diesem Fall ein Konstruktionsvorschrift fr den komplexen Datentyp. Beim TYPE- oder LIKE-Bezug auf einen bekannten komplexen Typ:

TYPES <t> [TYPE <type>|LIKE <obj>].


wird der neue komplexe Typ nach Vorlage des bekannten Typs konstruiert. Beim Bezug auf die komplexen Dictionary-Typen Struktur oder Tabellentyp, die sich aus elementaren Datenelementen des Dictionarys zusammensetzen, wird der Aufbau aus dem Dictionary bernommen und die Datenelemente werden in elementare ABAP-Typen konvertiert. Die TYPES-Anweisung ermglicht es auch neue komplexe Datentypen ohne Bezug auf bekannte Strukturen und Tabellen zu definieren.

Strukturtypen
Fr die Konstruktion eines neuen programmlokalen Strukturtyps verwendet man mehrere TYPES-Anweisungen wie im folgenden Kettensatz:

TYPES: BEGIN OF <structure>, .............. <ti> ..., .............. END OF <structure>.


Dieser Kettensatz fat zwischen den Anweisungen

TYPES BEGIN OF <structure>. und TYPES END OF <structure>.

106

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Programmlokale Datentypen

die in den Anweisungen

TYPES <ti>... .
definierten Datentypen <ti> zu einem Strukturtyp zusammen. Die einzelnen Komponenten <ti> knnen elementare Typen, Referenztypen oder durch Bezug auf bekannte komplexe Typen selber komplex sein. Die Anweisungsblcke TYPES BEGIN OF - TYPES END OF sind auch schachtelbar, um nichtflache Strukturtypen zu konstruieren. Die einzelnen Komponenten eines Strukturtyps werden im Programm mit einem Bindestrich zwischen Strukturname und Komponentenname benannt: <structure>-<ti>.

TYPES: spfli_type TYPE spfli, surname(20) TYPE c, BEGIN OF address, name TYPE surname, street(30) TYPE c, city TYPE spfli_type-cityfrom, END OF address, town TYPE address-city.
Dieses Beispiel zeigt die programmlokalen Definitionen zweier Strukturtypen SPFLI_TYPE und ADDRESS. Die Struktur des Datentyps SPFLI_TYPE wird von der Datenbanktabelle SPFLI aus dem ABAP Dictionary bernommen. Die einzelnen Komponenten von SPFLI_TYPE spiegeln die Spalten von SPFLI wieder. Die einzelnen Datentypen der Komponenten sind die ABAP-Entsprechungen der Datentypen der Spalten im ABAP Dictionary. Der Strukturtyp ADDRESS wird neu definiert. Die Komponente ADDRESS-NAME bernimmt den Datentyp vom vorher definierten Typ SURNAME, die Komponente ADDRESS-STREET wird neu definiert, die Komponente ADDRESS-CITY bernimmt den Datentyp der Spalte CITYFROM des Strukturtyps SPFLI_TYPE.

TYPES: BEGIN OF struct1, col1 TYPE i, BEGIN OF struct2, col1 TYPE i, col2 TYPE i, END OF struct2, END OF struct1. TYPES mytype TYPE struct1-struct2-col2.
Das Beispiel zeigt, wie ein geschachtelter Strukturtyp STRUCT1 mit einer komplexen Komponente STRUCT2 durch Schachtelung der Anweisungsblcke TYPES BEGIN OF - TYPES END OF konstruiert werden kann und wie die inneren Komponenten angesprochen werden.

* Programmlokale Typen, * die auf eingebaute ABAP-Typen verweisen:

April 2001

107

ABAP Programmierung (BC-ABA) Programmlokale Datentypen

SAP AG

TYPES: surname(20) street(30) zip_code(10) city(30) phone(20) date

TYPE TYPE TYPE TYPE TYPE LIKE

c, c, n, c, n, sy-datum.

* Programmlokale Struktur, * die auf obige Typen verweist: TYPES: BEGIN of address, name TYPE surname, code TYPE zip_code, town TYPE city, str TYPE street, END OF address. * Programmlokale geschachtelte Struktur, * die auf obige Typen verweist: TYPES: BEGIN of phone_list, adr TYPE address, tel TYPE phone, END OF phone_list.
Dieses Beispiel zeigt, wie man aus einfachen Typdefinitionen komplexe Datentypen aufbauen kannn. Nachdem eine Menge von elementaren Datentypen mit eingebauten ABAP-Typen angelegt wurde, wird ein Strukturtyp ADDRESS mit den vorher definierten Datentypen definiert. Schlielich wird ein geschachtelter Strukturtyp PHONE_LIST angelegt, dessen erste Komponente den Typ ADDRESS hat.

Tabellentypen
Programmlokale Tabellen werden auch interne Tabellen genannt. Die Syntax fr die Konstruktion eines neuen internen Tabellentyps ist:

TYPES <t> TYPE|LIKE <tabkind> OF <linetype> [WITH <key>].


Wie bei Referenzen steht hier hinter dem TYPE-Zusatz kein Verweis auf einen anderen Datentyp, sondern ein Typkonstruktor. Mit dem Typkonstruktor

<tabkind> OF <linetype> [WITH <key>]


wird ein interner Tabellentyp der Zugriffsart <tabkind>, dem Zeilentyp <linetype> und dem Schlssel <key> definiert. Der Zeilentyp <linetype> ist ein beliebiger bekannter Datentyp. Die Angaben zum Schlssel sind optional. Interne Tabellen knnen also generisch sein. Fr ausfhrliche Informationen zur Definition interner Tabellen siehe Interne Tabellen [Seite 265].

108

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Datentypen im ABAP Dictionary

Datentypen im ABAP Dictionary


Im ABAP Dictionary knnen programmbergreifende Datentypen definiert werden. Auf diese Datentypen kann in jedem ABAP-Programm des R/3-Systems mit dem TYPE-Zusatz entsprechender ABAP-Anweisungen Bezug genommen werden. Die Definition der Dictionary-Datentypen erfolgt mit dem Werkzeug Dictionary [Extern] der ABAP Workbench. Dort sind folgende Eingabefelder von Bedeutung fr Datentypen:

Weitere Dictionary-Objekte Dictionary: Einstieg Hilfsmittel Weitere Dictionary-Objekte Dictionary-Objekt Datenbanktabelle View Typ ... anlegen Datentyp Datenelement Struktur Tabellentyp Domne Anzeigen ndern Anlegen Typgruppe

Metabeschreibungen

Datentypen
Technische Eigenschaften

Auf dem Einstiegsbild sind drei Gruppen zu unterscheiden:

Datenbanktabellen und Views


Eine der wichtigsten Aufgaben des ABAP Dictionarys [Extern] ist die Verwaltung von Datenbanktabellen in der zentralen Datenbank des R/3-Systems. Hierfr werden im Dictionary Metabeschreibungen von Datenbanktabellen angelegt und daraus physische Datenbanktabellen auf der Datenbank erzeugt. Views sind logische Sichten auf eine oder mehrere Tabellen. Bei der Beschreibung einer Datenbanktabelle, werden die Tabellenzeilen aus Einzelfeldern bzw. Spalten zusammengesetzt. Jeder Spalte mu dabei ein elementarer Datentyp zugewiesen werden. Die elementaren Datentypen des Dictionarys sind die Datenelemente. hnlich wie

April 2001

109

ABAP Programmierung (BC-ABA) Datentypen im ABAP Dictionary

SAP AG

Datenobjekte in ABAP-Programmen, haben Datenbanktabellen und Views somit Datentypen als Attribute. Eine Zeile einer Datenbanktabelle bzw. Views hat immer den Datentyp einer flachen Struktur, der sich aus einzelnen Datenelementen zusammensetzt. In ABAP-Programmen kann mit dem TYPE-Zusatz auf den Datentyp einer Datenbanktabelle oder eines Views Bezug genommen werden. Dabei kann entweder auf die gesamte Struktur oder auf deren Komponenten zugegriffen werden:

... TYPE <dbtab> ...


bezieht sich auf den komplexen Datentyp der Struktur,

... TYPE <dbtab>-<ci> ...


bezieht sich auf den elementaren Datentyp der Komponente <ci>. Wenn ein komplexer Datentyp <t> mit

TYPES <t> TYPE <dbtab>.


als Struktur definiert wird, erben die Komponenten des Datentyps <t> die Namen der Komponenten der Datenbanktabelle bzw. Views und sind im Programm ber <t>-<ci> ansprechbar. Aus Kompatibilittsgrnden mit vorhergehenden Releases kann in allen Programmen auer innerhalb von Klassen auch mit dem LIKE-Zusatz auf Datenbanktabellen bzw. Views Bezug genommen werden. Dies kommt daher, da das Dictionary zwar nur reine Metabeschreibungen bzw. Datentypen enthlt, da in frheren Releases aber mehr die physische Prsenz der Datenbanktabellen als Objekte auf der Datenbank im Vordergrund stand. Die Definition programmlokaler Datentypen mit Bezug auf Datenbanktabellen bzw. Views ist ein Grundpfeiler der Bearbeitung von Daten aus Datenbanktabellen in ABAP. Datenobjekte mit solchen Datentypen dienen als typgerechte Arbeitsbereiche fr Daten, die aus Datenbanktabellen in ABAP-Programme eingelesen werden und umgekehrt. ABAP Open SQL untersttzt dabei die gesamte Bandbreite vom Einlesen einzelner Felder bis zur bernahme gesamter Datenbanktabellen oder Views in interne Tabellen.

TYPES: city type spfli-cityfrom, spfli_type TYPE STANDARD TABLE OF spfli WITH DEFAULT KEY. DATA: wa_city TYPE city, wa_spfli TYPE spfli_type. ... SELECT SINGLE cityfrom FROM spfli INTO wa_city WHERE carrid = 'LH' AND connid = '400'. ... SELECT * FROM spfli INTO TABLE wa_spfli. ...
In diesem Beispiel werden ein elementarer Datentyp CITY mit Bezug auf ein einzelnes Feld der Datenbanktabelle SPFLI und eine interne Tabelle SPFLI_TYPE, deren Zeilentyp der Struktur der Datenbanktabelle entspricht, definiert. Mit der Open

110

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Datentypen im ABAP Dictionary

SQL-Anweisung SELECT werden Daten in entsprechend deklarierte Datenobjekte eingelesen.

Datentypen
Dies sind die eigentlichen Datentypen im ABAP Dictionary. Sie ermglichen die programmbergreifende Definition der elementaren Typen, Referenztypen und komplexen Typen des ABAP-Typkonzepts. Die Datentypen von Datenbanktabellen sind eine Teilmenge aller mglichen Typen, nmlich flache Strukturen. Programmbergreifende Objekttypen (Klassen und Interfaces) werden nicht im ABAP Dictionary, sondern in der Klassenbibliothek verwaltet und mit dem Werkzeug Class Builder erstellt. Ein detaillierte Beschreibung der Datentypen und ihrer Definition im Dictionary findet sich unter Typen [Extern] in der Dokumentation zum ABAP Dictionary. Im folgenden wird nur kurz auf die einzelnen Typen eingegangen und wie aus ABAP-Programmen auf sie verwiesen wird.

Datenelemente
Die Datenelemente des Dictionarys beschreiben Einzelfelder. Sie sind die kleinsten nichtzerlegbaren Einheiten der unten aufgefhrten komplexen Typen und sie dienen der Typisierung von Spalten in Datenbanktabellen. Datenelemente sind entweder elementare Typen oder Referenztypen.
Elementare Typen

Elementare Typen sind Teil des zweistufigen Domnenkonzepts fr Einzelfelder im Dictionary. Der elementare Typ trgt semantische Eigenschaften wie Texte, Wertetabellen und Dokumentation und hat einen Datentyp. Der Datentyp kann auf zwei verschiedene Mglichkeiten festgelegt werden:
-

Direkte Zuweisung eines Dictionary-Typs. Elementaren Typen kann ein eingebauter Typ des ABAP Dictionarys und die Anzahl der Stellen zugewiesen werden. Das ABAP Dictionary kennt wesentlich mehr eingebaute Typen als die Programmiersprache ABAP. Auerdem bedeutet die Anzahl der Stellen hier nicht die Feldlnge in Bytes, sondern die Anzahl der gltigen Positionen ohne Aufbereitungszeichen. Der Unterschied zwischen den Datentypen rhrt daher, da die eingebauten Datentypen des Dictionarys mit den externen Datentypen der von R/3 untersttzten Datenbanktabellen vertrglich sein mssen. Beim Bezug von Datentypen auf Datentypen des Dictionarys in ABAP-Programmen, werden die eingebauten Dictionary-Typen wie folgt in eingebaute ABAP-Typen konvertiert:
Dictionary Typ Bedeutung Zulssige Stellen n ABAP Typ

DEC INT1 INT2 INT4 CURR CUKY QUAN

Rechen-/Betragsfeld 1-Byte-Integer 2-Byte-Integer 4-Byte-Integer Whrungsfeld Whrungsschlssel Menge

1-31, in Tabellen 1-17 3 5 10 1-17 5 1-17

P((n+1)/2) Nur intern Nur intern I P((n+1)/2) C(5) P((n+1)/2)

April 2001

111

ABAP Programmierung (BC-ABA) Datentypen im ABAP Dictionary

SAP AG

UNIT PREC FLTP NUMC CHAR LCHR STRING RAWSTRING DATS ACCP TIMS RAW LRAW CLNT LANG

Einheit Genauigkeit Gleitpunktzahl Numerischer Text Character Long Character variable lange Zeichenfolge variable lange Bytefolge Datum Buchungsperiode JJJJMM Zeit HHMMSS Bytefolge Lange Bytefolge Mandant Sprache

2-3 2 16 1-255 1-255 256-max 1-max 1-max 8 6 6 1-255 256-max 3 intern 1, extern 2

C(n) X(2) F(8) N(n) C(n) C(n) STRING XSTRING D N(6) T X(n) X(n) C(3) C(1)

(Bei LCHR und LRAW ist max der Wert eines vorangehenden INT2-Felds, bei LANG bedeutet intern im Dictionary und extern Darstellung auf der Benutzerschnittstelle).
-

Zuweisung einer Domne. Die technischen Eigenschaften werden von einer Domne bernommen. Domnen sind eigenstndige Repository-Objekte des Dictionary. Sie knnen die technischen Eigenschaften von Datenelementen tragen. Eine Domne kann von beliebig vielen Datenelementen verwendet werden. Beim Anlegen einer Domne mssen ein Dictionary Datentyp (siehe Tabelle oben) und die Anzahl der Stellen angegeben werden.

Referenztypen

Referenztypen beschreiben Einzelfelder, die Referenzen auf globale Klassen und Interfaces der ABAP Klassenbibliothek enthalten knnen. In ABAP-Programmen kann mit dem TYPE-Zusatz direkt auf ein Datenelement verwiesen werden. Dabei werden die eingebauten Dictionary-Datentypen der Domne in die entsprechenden eingebauten ABAP-Typen konvertiert. Wenn ein programmlokaler Datentyp mit Bezug auf ein Datenelement definiert wird:

TYPES <t> TYPE <data element>.


werden die semantischen Eigenschaften des Datenelements ebenfalls bernommen und sind beispielsweise bei der Darstellung eines Datenobjekts vom Typ <t> auf einem Bildschirm nutzbar. Da alle Datentypen im Dictionary auf Datenelementen beruhen, enthalten auch alle Datentypen die entsprechenden semantischen Eigenschaften.

TYPES company TYPE s_carr_id.

112

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Datentypen im ABAP Dictionary

DATA wa_company TYPE company. wa_company = 'UA '. WRITE: 'Company:', wa_company.
In diesem Beispiel wird ein programmlokaler Typ COMPANY mit Bezug auf das Datenelement S_CARR_ID definiert. Das Datenelement ist mit der gleichnamigen Domne S_CARR_ID verknpft. Diese Domne definiert die technischen Eigenschaften als Datentyp CHAR der Lnge 3. Der programmlokale Datentyp COMPANY hat daher den eingebauten ABAP-Typ C(3). Weiterhin bernimmt COMPANY die semantischen Eigenschaften des Datenelements. Im obigen Beispiel wird ein Datenobjekt WA_COMPANY mit diesem Typ deklariert und auf einer Liste ausgegeben. Wenn der Benutzer auf dem Ausgabefeld die F1-Hilfe whlt, erscheint der im ABAP Dictionary hinterlegte Hilfetext in einem Dialogfenster.

Liste

Company: UA Hilfe Kurzbezeichnung der Fluggesellschaft Kurzbezeichnung der Fluggesellschaft Das Feld beinhaltet die ID der Fluggesellschaft Das Feld beinhaltet die ID der Fluggesellschaft

Strukturen
Strukturen sind Folgen von beliebigen anderen Datentypen des ABAP Dictionarys, also von Datenelementen, Strukturen, Tabellentypen oder Datenbanktabellen. Beim Anlegen einer Struktur im Dictionary mu jeder Komponente ein Name und ein Datentyp gegeben werden. In ABAP-Programmen kann mit dem TYPE-Zusatz direkt auf eine Struktur verwiesen werden. Wenn ein programmlokaler Datentyp mit Bezug auf eine Struktur im Dictionary definiert wird:

TYPES <t> TYPE <structure>.


wird die Konstruktionsvorschrift der Struktur in eine programmlokale Struktur (Feldleiste) <t> umgesetzt und die eingebauten Dictionary-Datentypen aus den Domnen der in der Struktur enthaltenen Datenelemente werden in die entsprechenden eingebauten ABAP-Typen konvertiert. Die semantischen Eigenschaften der Datenelemente werden fr die entsprechenden Komponenten der programmlokalen Struktur bernommen. Die Komponenten der programmlokalen Struktur <t> erben die Namen der Struktur aus dem Dictionary.

April 2001

113

ABAP Programmierung (BC-ABA) Datentypen im ABAP Dictionary

SAP AG

Aus Kompatibilittsgrnden mit vorhergehenden Releases kann in ABAP-Programmen (aber nicht in Klassen) auch mit dem LIKE-Zusatz auf Strukturen im Dictionary verwiesen werden.

Die Struktur STRUCT sei im Dictionary wie folgt definiert:


Feldname Typname Kurzbeschreibung

COL1 COL2 COL3

CHAR01 CHAR08 CHAR10

Characterfeld der Lnge 1 Characterfeld der Lnge 8 Characterfeld der Lnge 10

Die Typen CHAR01 bis CHAR10 sind Datenelemente mit entsprechenden Domnen. In ABAP kann auf die Struktur verwiesen werden:

TYPES struct_type TYPE struct. DATA wa TYPE struct_type. wa-col1 = '1'. wa-col2 = '12345678'. wa-col3 = '1234567890'.
Es wird eine programmlokale Struktur STRUCT_TYPE und ein entsprechendes Datenobjekt WA angelegt. Die einzelnen Komponenten sind ber ihren ursprnglichen Namen ansprechbar.

Tabellentypen
Tabellentypen sind im Dictionary abgelegte Konstruktionsvorschriften fr interne Tabellen. Beim Anlegen eines Tabellentyps im Dictionary wird der Zeilentyp, die Zugriffsart und der Schlssel festgelegt. Der Zeilentyp ein beliebiger Datentyp des Dictionarys, also ein Datenelement, eine Struktur, ein Tabellentyp oder der Typ einer Datenbanktabelle sein. Weiterhin knnen als Zeilentyp wie in einer Domne auch direkt eingebaute Dictionary-Typen angegeben werden. In ABAP-Programmen kann mit dem TYPE-Zusatz direkt auf einen Tabellentyp verwiesen werden. Wenn ein programmlokaler Datentyp mit Bezug auf einen Tabellentyp im Dictionary definiert wird:

TYPES <t> TYPE <table>.


wird die Konstruktionsvorschrift des Tabellentyps in eine interne Tabelle <t> umgesetzt und die eingebauten Dictionary-Datentypen aus den Domnen der in dem Tabellentyp enthaltenen Datenelemente werden in die entsprechenden eingebauten ABAP-Typen konvertiert. Die semantischen Eigenschaften der Datenelemente werden fr die entsprechenden Komponenten in den Zeilen der internen Tabelle bernommen.

Der Tabellentyp STRUCT_TABLE sei im Dictionary mit dem Zeilentyp STRUCT des obigen Beispiels definiert worden. In ABAP kann auf den Tabellentyp verwiesen werden:

TYPES table_type TYPE struct_table.

114

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Datentypen im ABAP Dictionary

DATA: table_wa TYPE table_type, line_wa LIKE LINE OF table_wa. ... LOOP AT table_wa INTO line_wa. ... WRITE: line_wa-col1, line_wa-col1, line_wa-col1. ... ENDLOOP.
Es wird eine interne Tabelle TABLE_TYPE definiert. Mit diesem Typ werden Datenobjekte TABLE_WA und daraus folgend LINE_WA deklariert. LINE_WA entspricht dem Zeilentyp des Tabellentyps im Dictionary, ist also kompatibel zur Struktur STRUCT.

Typgruppen
Vor Release 4.5A gab es im Dictionary keine eigenstndigen Datentypen, auf die in ABAPProgrammen mit dem TYPE-Zusatz verwiesen werden konnte. Einen Bezug zwischen programmlokalen Datentypen und Dictionary-Datentypen gab es bis dahin nur fr flache Strukturen. Dem programmlokalen Datentyp Feldleiste entsprachen im Dictionary die Struktur von Datenbanktabellen und eigenstndige Strukturen. Aus ABAP-Programmen konnte man nur mit dem LIKE-Zusatz auf Datenbanktabellen und Strukturen des Dictionary verweisen. Dabei war auch der Verweis auf einzelne Komponenten der Dictionary-Typen mglich. Komplexe programmlokale Datentypen wie interne Tabellen oder tiefe Strukturen hatten bis dahin keine Entsprechung im Dictionary. Als Zwischenlsung standen seit Release 3.0 auf der IncludeTechnik basierenden Typgruppen (englisch Type Pools) zur Verfgung, um beliebige mit TYPES definierte Datentypen programmbergreifend im Dictionary ablegen zu knnen. Die Definition einer Typgruppe ist ein Stck ABAP-Code, das im ABAP-Editor gepflegt wird. Die erste Anweisung fr die Typgruppe <pool> ist immer:

TYPE-POOL <pool>.
Danach folgt die Definition von Datentypen mit der Anweisung TYPES, wie unter Programmlokale Datentypen [Seite 104] beschrieben. Weiterhin knnen programmbergreifende Konstanten mit der Anweisung CONSTANTS deklariert werden. Alle Namen dieser Datentypen und Konstanten mssen mit dem Namen der Typgruppe und einem Unterstrich beginnen: <pool>_ In einem ABAP-Programm mssen Typgruppen vor ihrer Verwendung mit folgender Anweisung bekanntgemacht werden:

TYPE-POOLS <pool>.
Bei Verwendung dieser Anweisung knnen alle Datentypen und Konstanten, die in der Typgruppe <pool> definiert sind, im Programm verwendet werden. Es knnen mehrere Typgruppen in einem Programm verwendet werden.

Die Typgruppe HKTST sei wie folgt im ABAP-Dictionary angelegt:

TYPE-POOL hktst. TYPES: BEGIN OF hktst_typ1, col1(10) TYPE c,

April 2001

115

ABAP Programmierung (BC-ABA) Datentypen im ABAP Dictionary

SAP AG

col2 TYPE i, END OF hktst_typ1. TYPES hktst_typ2 TYPE p DECIMALS 2. CONSTANTS hktst_eleven TYPE i VALUE 11.
In dieser Typgruppe sind zwei Datentypen HKTST_TYP1 und HKTST_TYP2 sowie eine Konstante HKTST_ELEVEN mit dem Wert 11 definiert. Jedes ABAP-Programm kann diese Definition ber die Anweisung TYPE-POOLS verwenden:

TYPE-POOLS hktst. DATA: dat1 TYPE hktst_typ1, dat2 TYPE hktst_typ2 VALUE '1.23'. WRITE: dat2, / hktst_eleven.
Die Ausgabe ist:
1,23 11

Die in der Typgruppe definierten Datentypen werden zur Deklaration von Datenobjekten mit der Anweisung DATA verwendet und der Wert der Konstanten ist, wie die Ausgabe zeigt, im Programm bekannt.

116

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Der TYPE-Zusatz

Der TYPE-Zusatz
Der TYPE-Zusatz wird in verschiedenen ABAP-Anweisungen zur Definition von Datentypen und zur Typisierung von Schnittstellenparametern oder von Feldsymbolen verwendet. Je nach Syntax und Kontext kann der TYPE-Zusatz dabei eine andere Bedeutung haben:

Bezug auf bekannte Datentypen


Mit dem Zusatz

TYPE <type>
kann in den unten aufgefhrten ABAP-Anweisungen auf alle an dieser Stelle sichtbaren Datentypen <type> verwiesen werden. Dabei ist der Ausdruck <type> entweder der Name eines Datentyps oder der Ausdruck

LINE OF <table-type>
In diesem Fall bezieht sich der TYPE-Zusatz sinngem auf den Zeilentyp eines an dieser Stelle sichtbaren Tabellentyps <table-type>.

ABAP-Anweisungen mit TYPE-Bezug

Definition von programmlokalen Typen mit

TYPES <t> TYPE <type>.


Der neue Datentyp <t> entspricht vollstndig dem bekannten Typ <type>.

Deklaration von Datenobjekten mit

DATA <f> TYPE <type>. CLASS-DATA <f> TYPE <type>. CONSTANTS <f> TYPE <type>. STATICS <f> TYPE <type>. PARAMETERS <f> TYPE <type>.
Das Datenobjekt <f> erhlt einen Datentyp, der vollstndig dem bekannten Typ <type> entspricht.

Dynamische Erzeugung von Datenobjekten mit

CREATE DATA <dref> TYPE <type>.


Typisierung von Formalparametern in Unterprogrammen mit

FORM <sub> ... USING|CHANGING <p> TYPE <type> ...


Die technischen Eigenschaften des Formalparameters <p> sind vollstndig durch die Eigenschaften des bekannten Typs <type> festgelegt. Es drfen nur Aktualparameter des gleichen Typs bergeben werden.

Typisierung von Formalparametern in Methoden mit

METHODS <meth> ... IMPORTING|EXPORTING|CHANGING <p> TYPE <type> ...

April 2001

117

ABAP Programmierung (BC-ABA) Der TYPE-Zusatz

SAP AG

Die technischen Eigenschaften des Formalparameters <p> sind vollstndig durch die Eigenschaften des bekannten Typs <type> festgelegt. Es drfen nur Aktualparameter des gleichen Typs bergeben werden.

Typisierung von Feldsymbolen

FIELD-SYMBOLS <fs> TYPE <type>.


Die technischen Eigenschaften des Feldsymbols <FS> sind vollstndig durch die Eigenschaften des bekannten Typs <type> festgelegt. Es drfen nur Datenobjekte des gleichen Typs zugewiesen werden.

Sichtbarkeit von Datentypen


Beim Bezug auf bekannte Datentypen mit dem TYPE-Zusatz spielt die Sichtbarkeit der Datentypen eine Rolle.

Die eingebauten ABAP-Typen (C, D, F, I, N, P, T, X) sind immer sichtbar. Es knnen keine gleichnamigen programmlokalen Typen oder Typen im ABAP Dictionary angelegt werden. Bei der Sichtbarkeit von programmlokalen Datentypen ist zwischen lokalen Datentypen in Prozeduren und globalen Datentypen zu unterscheiden. In Prozeduren definierte Datentypen verschatten gleichnamige Datentypen, die im globalen Deklarationsteil definiert werden. Alle programmlokalen Datentypen verschatten wiederum gleichnamige Datentypen im ABAP Dictionary. Dies gilt auch fr Datentypen aus Typgruppen. Bei der Sichtbarkeit von Datentypen im ABAP Dictionary ist zur Zeit noch zwischen eigenstndigen Datentypen und Datentypen in Typgruppen zu unterscheiden. Datentypen in Typgruppen verschatten gleichnamige eigenstndige Datentypen. Dies sollte jedoch eine Ausnahmesituation sein. Alle Datentypen des Dictionarys sollten in einem Namensraum liegen. Beim Anlegen eines eigenstndigen Datentyps gibt das System eine Warnung aus, falls der Name mit dem Namen einer Typgruppe gefolgt von einem Unterstrich beginnt. Umgekehrt knnen keine Typgruppen angelegt werden, wenn es schon einen eigenstndigen Datentyp mit dem gleichen Namen gefolgt von einem Unterstrich gibt.

Die Abbildung veranschaulicht die Sichtbarkeit von programmlokalen und Dictionary-Datentypen:

118

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Der TYPE-Zusatz

Sichtbarkeit von Datentypen

TYP1 TYP1 TYP2 TYP2 Prozedur ABAP-Rahmenprogramm ABAP Dictionary


Das System sucht von innen nach auen. Wenn im Programm TYP1 in einem TYPE-Zusatz angegeben ist, wird sowohl in der Prozedur als auch im Rahmenprogramm der Typ aus dem Dictionary verwendet. Wird TYP2 in der Prozedur angegeben, wir der lokale Typ der Prozedur verwendet. Wird TYP2 im Rahmenprogramm angegeben, wird der Typ des Rahmenprogramms verwendet. TYP2 aus dem Dictionary ist unsichtbar. Wird TYP3 angegeben, wird sowohl in der Prozedur als auch im Rahmenprogramm der Typ des Rahmenprogramms verwendet. TYP3 aus dem Dictionary ist unsichtbar.

TYP2 TYP2 TYP3 TYP3

TYP2 TYP2 TYP3 TYP3

Konstruktion neuer Datentypen


Mit dem Zusatz TYPE knnen in den ABAP-Anweisungen TYPES, DATA, CONSTANTS und STATICS neue Datentypen konstruiert werden. In der Anweisung TYPES sind dies eigenstndige programmlokale Datentypen. In den anderen Anweisungen sind es Attribute von neuen Datenobjekten. Fr die Konstruktion neuer Datentypen kann der TYPE-Zusatz mit folgenden Typ-Konstruktoren verwendet werden:

Konstruktion von Referenzen

REF TO <class>|<interface>
Konstruktion von Strukturen

BEGIN OF <struct>. ... END OF <struct>.

Konstruktion von Tabellen

<tabkind> OF <linetype> [WITH <key>]


Solche Datentypen sind nur whrend der Laufzeit eines ABAP Programms vorhanden.

April 2001

119

ABAP Programmierung (BC-ABA) Der TYPE-Zusatz

SAP AG

Bezug auf generische Typen bei der Typisierung


Fr die Typisierung von Schnittstellenparametern und Feldsymbolen ist ein Satz vordefinierter generischer Typen in die Syntax eingebaut worden, die nur in den Anweisungen FORM, METHODS und FIELD-SYMBOLS hinter TYPE verwendet werden knnen.
Generische Typen fr die Typisierung

ANY ANY TABLE INDEX TABLE TABLE STANDARD TABLE SORTED TABLE HASHED TABLE

Vollstndig generischer Typ. Generischer Typ fr alle Tabellen Generischer Typ fr Tabellen mit linearem Index. Generische Typen fr unsortierte Tabellen mit linearem Index. Generischer Typ fr sortierte Tabellen mit linearem Index. Generischer Typ fr Tabellen mit Hash-Verwaltung.

Diese Typen knnen nicht bei der Definition von programmlokalen Datentypen oder von Datenobjekten verwendet werden. Sie ermglichen ausschlielich die berprfung des Datentyps von Feldern, die an Prozeduren bergeben oder Feldsymbolen zugewiesen werden.

120

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Der LIKE-Zusatz

Der LIKE-Zusatz
Der LIKE-Zusatz wird hnlich wie der TYPE-Zusatz in verschiedenen ABAP-Anweisungen zur Definition von Datentypen und zur Typisierung von Schnittstellenparametern oder von Feldsymbolen verwendet. Mit dem Zusatz LIKE <obj> kann in den gleichen ABAP-Anweisungen wie beim TYPE-Zusatz [Seite 117] auf alle an dieser Stelle sichtbaren Datenobjekte <obj> verwiesen werden. Dabei ist der Ausdruck <obj> entweder der Name eines Datenobjekte oder der Ausdruck LINE OF <table-object> In diesem Fall bezieht sich der LIKE-Zusatz sinngem auf den Zeilentyp eines an dieser Stelle sichtbaren Tabellenobjekts <table-object>. LIKE zieht sozusagen die technischen Eigenschaften (Attribute) eines Datenobjekts ab und verwendet sie zur Typisierung anderer Objekte bzw. Typen.

ABAP-Anweisungen mit LIKE-Bezug

Definition von programmlokalen Typen mit TYPES <t> LIKE <obj>. Der neue Datentyp <t> bernimmt vollstndig die technischen Eigenschaften des Datenobjekts <obj>.

Deklaration von Datenobjekten mit DATA <f> LIKE <obj>. CLASS-DATA <f> LIKE <obj>. CONSTANTS <f> LIKE <obj>. STATICS <f> LIKE <obj>. PARAMETERS <f> LIKE <obj>. Das Datenobjekt <f> bernimmt alle technischen Eigenschaften des Datenobjekts <obj>.

Dynamische Erzeugung von Datenobjekten mit CREATE DATA <dref> LIKE <obj>. Typisierung von Formalparametern in Unterprogrammen mit FORM <sub> ... USING|CHANGING <p> LIKE <obj> ... Die technischen Eigenschaften des Formalparameters <p> sind vollstndig durch die Eigenschaften des bekannten Datenobjekts <obj> festgelegt. Es drfen nur Aktualparameter mit diesen Eigenschaften bergeben werden.

Typisierung von Formalparametern in Methoden mit METHODS <meth> ... IMPORTING|EXPORTING|CHANGING <p> LIKE <obj> ... Die technischen Eigenschaften des Formalparameters <p> sind vollstndig durch die Eigenschaften des bekannten Typs <type> festgelegt. Es drfen nur Aktualparameter des gleichen Typs bergeben werden.

April 2001

121

ABAP Programmierung (BC-ABA) Der LIKE-Zusatz

SAP AG

Typisierung von Feldsymbolen FIELD-SYMBOLS <fs> LIKE <obj>. Die technischen Eigenschaften des Feldsymbols <FS> sind vollstndig durch die Eigenschaften des bekannten Datenobjekts <obj> festgelegt. Es drfen nur Datenobjekte dieser Eigenschaften zugewiesen werden.

Sichtbarkeit von Datenobjekten


Als Faustregel kann gelten, da man sich mit LIKE auf alle mit DATA (oder hnlichen Anweisungen) deklarierten Datenobjekte beziehen kann, die im aktuellen Kontext sichtbar sind. Dabei mu nur die Deklaration des Datenobjekts bekannt sein. Es ist vllig unerheblich, ob das Datenobjekt whrend dem LIKE-Bezug schon physisch im Speicher existiert oder nicht.

Prinzipiell sind die programmlokale Datenobjekte des gleichen Programms sichtbar. Dabei ist wie bei programmlokalen Datentypen zwischen lokalen Datenobjekten in Prozeduren und globalen Datenobjekten zu unterscheiden. In Prozeduren definierte Datenobjekte verschatten gleichnamige Datenobjekte, die im globalen Deklarationsteil definiert werden. Weiterhin kann man sich auch auf die Datenobjekte anderer sichtbarer ABAPProgramme beziehen. Dies sind z.B. die sichtbaren Attribute von globalen Klassen in Class-Pools. Wenn eine globale Klasse <cl_global> beispielsweise ein ffentliches Instanzattribut oder statisches Attribut <attr> enthlt, kann man sich in einem beliebigen ABAP-Programm wie folgt darauf beziehen:

DATA <ref> TYPE REF TO <cl_global>. DATA: f1 LIKE <cl_global>=><attr>, f2 LIKE <ref>-><attr>.
Es kann also ber den Klassennamen auf die Eigenschaften von Instanzattributen zugegriffen werden und eine Referenzvariable kann fr den gleichen Zweck verwendet werden, ohne da zuvor ein Objekt zu erzeugt wird. Die Eigenschaften der Attribute einer Klasse gehren sind also instanzunabhngig und gehren zu den statischen Eigenschaften einer Klasse.

Aus Kompatibilittsgrnden mit vorhergehenden Releases, kann man sich mit dem LIKEZusatz auch auf die Datentypen von Datenbanktabellen und von flachen Strukturen im ABAP Dictionary beziehen. Der LIKE-Zusatz sucht erst programmlokal nach einem Datenobjekt <obj> und dann im ABAP Dictionary nach einer gleichnamigen Datenbanktabelle oder flachen Struktur. Dieser Typbezug auf das ABAP Dictionary ist in den Klassen von ABAP Objects nicht mehr mglich. Der LIKE-Zusatz sollte auch in anderen ABAP-Programmen nur noch fr den Bezug auf Datenobjekte eingesetzt werden. Fr den Bezug auf Datentypen sollte statt LIKE der TYPE-Zusatz verwendet werden.

122

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Datenobjekte

Datenobjekte
Datenobjekte enthalten die Daten, mit denen ABAP-Programme zur Laufzeit arbeiten knnen. Datenobjekte sind nicht persistent, sondern leben maximal solange wie die Laufzeit eines Programms. Persistent abgespeicherte Daten, wie z.B. Daten aus Datenbanktabellen oder aus sequentiellen Dateien mssen vor ihrer Verarbeitung immer erst in Datenobjekte gelesen werden. Umgekehrt mu der Inhalt von Datenobjekten persistent abgespeichert werden, wenn er ber die Laufzeit eines Programms bestehen bleiben soll. Wir unterscheiden folgende Arten von Datenobjekten:

Literale
Literale [Seite 124] werden nicht durch deklarative Anweisungen erzeugt, sondern sind schon im Programmtext vorhanden. Sie haben wie alle Datenobjekte feste technische Eigenschaften (Feldlnge, Anzahl der Nachkommastellen, Datentyp) aber keinen Namen. Sie heien deshalb auch unbenannte Datenobjekte.

Benannte Datenobjekte
Diese Datenobjekte werden statisch oder dynamisch zur Laufzeit eines Programms deklariert. Ihre technischen Eigenschaften Feldlnge, Anzahl der Nachkommastellen und der Datentyp sind zu jedem Zeitpunkt ihrer Lebensdauer festgelegt. -Solche Datenobjekte haben einen Namen, ber den sie das ABAP-Programm ansprechen kann. Sie heien deshalb auch benannte Datenobjekte. Es gibt folgende benannten Datenobjekte: Textsymbole [Seite 126] sind Zeiger auf Texte im Textpool des ABAP-Programms. Beim Programmstart werden zugehrige Datenobjekte in Abhngigkeit von den im Textpool abgelegten Texten generiert und ber den Namen des Textsymbols angesprochen. Variablen [Seite 128] sind Datenobjekte, deren Inhalt von Variablen durch ABAP-Anweisungen nderbar ist. Variablen werden mit den Anweisungen DATA, CLASS-DATA, STATICS, PARAMETERS, SELECT-OPTIONS und RANGES deklariert. Konstanten [Seite 134] sind Datenobjekte, deren Inhalt nicht nderbar ist. Konstanten werden mit der Anweisung CONSTANTS deklariert. Schnittstellen-Arbeitsbereiche [Seite 135] sind spezielle Variablen, die als programmbergreifende Schnittstelle zwischen Programmen und Dynpros und zwischen Programmen und logischen Datenbanken dienen knnen. Schnittstellen-Arbeitsbereiche werden mit den Anweisungen TABLES und NODES deklariert.

Vordefinierte Datenobjekte
Vordefinierte Datenobjekte [Seite 137] mssen nicht explizit deklariert werden, sondern sind zur Programmlaufzeit immer automatisch vorhanden.

Dynamische Datenobjekte
Dynamische Datenobjekte [Seite 234]werden nicht statisch im Deklarationsteil deklariert, sondern ber Datenreferenzen dynamisch erzeugt. Sie haben keinen Namen.

April 2001

123

ABAP Programmierung (BC-ABA) Literale

SAP AG

Literale
Literale sind unbenannte Datenobjekte, die im Quelltext eines Programms angelegt werden und durch ihren Wert vollstndig bestimmt sind. Der Wert von Literalen ist unvernderbar. Wir unterscheiden Zahlenliterale und Textliterale.

Zahlenliterale
Ein Zahlenliteral ist eine Folge von Ziffern im Programmtext, die ein Vorzeichen enthalten kann. Zahlenliterale knnen alle Zahlen darstellen, deren Wert im Wertebereich des eingebauten ABAP-Typs P mit einer Feldlnge von 16 liegt, also Zahlen mit maximal 31 Ziffern zuzglich 31 31 Vorzeichen. Zahlenliterale, deren Wert zwischen -2 +1 und 2 -1 liegt, haben den eingebauten ABAP-Typ I. Alle brigen Zahlenliterale haben den Typ P ohne Nachkommastellen. Zahlenliterale mit maximal 15 Stellen zuzglich Vorzeichen haben dabei eine Feldlnge von 8 Bytes, die brigen eine Feldlnge von 16 Bytes.

Beispiele fr Zahlenliterale:

123 -93 +456


Zahlenliterale in Anweisungen:

DATA number TYPE i VALUE -1234. WRITE 6789. MOVE 100 TO number.
Um einen nichtganzzahligen Wert oder eine lngere Zahl zu reprsentieren, mu ein Textliteral (Datentyp C) verwendet werden. Ebenso mu ein Textliteral des Formats

'[<mantissa>][E][<exponent>]'
fr Gleitpunktzahlen verwendet werden. Bei Verwendung solcher Textliterale in ABAPAnweisung findet eine Typkonvertierung [Seite 192] in den entsprechenden numerischen Datentyp statt.

Beispiele fr Textliterale, die in numerische Typen konvertiert werden knnen:

'12345678901234567890' '+0.58498' '-8473.67' '-12.34567' '-765E-04' '1234E5' '+12E+23' '+12.3E-4' '1E160'

124

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Literale

Textliterale
Ein Textliteral ist eine Folge von alphanumerischen Zeichen im Programmtext, die in Hochkommata eingeschlossen sind. Textliterale haben immer den eingebauten ABAP-Typ C. Die Feldlnge wird durch die Anzahl der Zeichen festgelegt.

Beispiele fr Textliterale

'Anton Schmitt' '69190 Walldorf'


Textliterale knnen bis zu 255 Zeichen lang sein. Ein Textliteral ist immer mindestens ein Zeichen lang (Die Angabe von '' ist gleichbedeutend zu ' '). Um Textliterale im ABAP Editor einzugeben, die lnger als eine Editorzeile sind, erlaubt es die ABAP-Syntax [Seite 86], mehrere Textliterale mit dem Zeichen & zu einem Textliteral zu verknpfen. Enthlt ein Textliteral ein Hochkomma, mu dieses Hochkomma doppelt eingegeben werden, um dem System mitzuteilen, da es zum Textliteral gehrt und nicht das Ende des Literals darstellt.

WRITE: / 'Das ist John''s Fahrrad'.


Diese Anweisung erzeugt folgende Ausgabe:
Das ist John's Fahrrad

April 2001

125

ABAP Programmierung (BC-ABA) Textsymbole

SAP AG

Textsymbole
Textsymbole sind benannte Datenobjekte, die beim Programmstart aus Texten im Textpool des ABAP-Programms generiert werden. Der Datentyp ist immer der eingebaute ABAP-Typ C und die Feldlnge richtet sich nach der Lnge des Texts im Textpool. Textsymbole sind neben Programmtitel, Listenberschriften und Selektionstexten Teil der Textelemente eines ABAP-Programms. Textelemente ermglichen das Anlegen und Pflegen von mehrsprachigen Programmen. Alle Texte, die das Programm z.B. an Bildschirmbilder sendet knnen als Textelemente in Textpools abgelegt werden. Fr verschiedene Sprachen knnen jeweils eigene Textpools angelegt werden. Um Texte zu ndern oder zu bersetzen, mu dann nicht der Programmtext gendert werden, sondern die entsprechenden Textelemente. Die Textelemente eines ABAP-Programms werden im ABAP Editor der ABAP Workbench verwaltet (siehe Textelementpflege [Extern]). Textsymbole haben im Textpool eine dreistellige Kennung, einen Text als Inhalt, eine belegte Lnge und eine maximale Lnge.

Beispiel fr Textsymbole eines ABAP-Programms


Kennung Inhalt Belegte Lnge Maximale Lnge

010 030 AAA TEXT-<idt>

Text Symbol 010 Text Symbol 030 Text Symbol AAA

15 15 15

132 100 15

Im Programm werden Textsymbole mit folgenden Namen angesprochen: Dieses Datenobjekt enthlt den Text des Textsymbols der Kennung <idt> fr die jeweilige Anmeldesprache und hat eine Feldlnge, die der maximalen Lnge des Textsymbols entspricht. Die unbelegten Stellen sind mit Leerzeichen aufgefllt. Textsymbole knnen an allen Stellen angesprochen werden, an der auch eine Variable stehen kann. Falls das Textsymbol <idt> fr die Anmeldesprache nicht im Textpool vorhanden ist, spricht der Name TEXT-<idt> das vordefinierte Datenobjekt SPACE an. Man kann Textsymbole auch mit folgender Syntax ansprechen: ... '<textliteral>'(<idt>) ... Ist das Textsymbol <idt> fr die Anmeldesprache im Textpool vorhanden, ist diese Benennung gleichwertig zu TEXT-<idt>. Ansonsten wird das Literal '<textliteral>' als Inhalt des Textsymbols verwendet. Auch diese Ansprache ist nur mglich, wenn an der Stelle auch eine Variable stehen knnte. Durch Vorwrtsnavigation (Doppelklick auf Textliterale) kann im ABAP-Editor zu jedem Textliteral ein Textsymbol angelegt werden und das Textliteral durch die Ansprache des Textsymbols ersetzt werden. Textsymbole sollten berall dort in Programmen verwendet werden, wo Texte in Abhngigkeit von der Anmeldesprache bentigt werden, wie zum Beispiel bei der Ausgabe auf Listen mit der WRITE-Anweisung. Vorsicht ist geboten, wenn Programmlogik in Abhngigkeit von Feldlngen erstellt wird, z.B. bei der Listenaufbereitung. Die Feldlnge von Textsymbolen kann in unterschiedlichen

126

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Textsymbole

Anmeldesprachen verschieden sein. Die maximale Feldlnge des Feldsymbols sollte dann schon in der Originalsprache so vorgewhlt werden, da gengend Platz fr die bersetzung in andere Sprachen zur Verfgung steht. Beispielsweise bentigt das deutsche Wort 'Feld' schon fnf Stellen fr das englische 'Field'.

Das Beispiel zeigt die Verwendung von Textsymbolen in WRITE-Anweisungen:

SET BLANK LINES ON. WRITE: / / / / text-010, text-aaa, text-020, 'Default Text 030'(030), 'Default Text 040'(040).

Falls die Textsymbole der obigen Tabelle zu diesem Programm gehren sieht die Ausgabe so aus:

Es gibt keine Textsymbole der Kennungen 020 und 040. Im Falle des Textsymbols 020 gibt die WRITE-Anweisung ein Leerzeichen auf die Liste aus. Dieses wird hier nur angezeigt, da die Unterdrckung von Leerzeilen aufgehoben wurde (siehe Leerzeilen erzeugen [Seite 860]). Im Fall von Textsymbol 040 wird das im Programmtext angegebene Literal ausgegeben.

April 2001

127

ABAP Programmierung (BC-ABA) Variablen

SAP AG

Variablen
Variablen sind benannte Datenobjekte, die statisch mit deklarativen Anweisungen oder dynamisch whrend der Programmlaufzeit erzeugt werden. Variablen dienen dazu, nderbare Daten unter einem bestimmten Namen im Arbeitsspeicher eines Programms zu halten. Folgende Anweisungen dienen der statischen Deklaration von Variablen:

DATA deklariert Variablen, deren Lebensdauer an den Kontext der Deklaration gebunden ist. STATICS deklariert Variablen statischer Gltigkeit in Prozeduren. CLASS-DATA deklariert statische Variablen in Klassen. PARAMETERS deklariert elementare Datenobjekte, die mit Eingabefeldern auf einem Selektionsbild verbunden sind. SELECT-OPTIONS deklariert interne Tabellen, die mit Eingabefeldern auf einem Selektionsbild verbunden sind. RANGES deklariert interne Tabellen der gleichen Struktur wie SELECT-OPTIONS ohne Verbindung zu einem Selektionsbild.

DATA und STATICS werden in diesem Abschnitt erklrt. Fr nhere Informationen zu CLASSDATA, siehe Klassen [Seite 1403], und zu PARAMETERS, SELECT-OPTIONS und RANGES, siehe Selektionsbilder [Seite 720]. Eine dynamische Deklaration von Variablen erfolgt beim Hinzufgen von Zeichen oder Bytes zu Strings oder von Zeilen zu internen Tabellen [Seite 265]. Bei Strings liegt nach ihrer statischen Deklaration nur der Typ fest. Bei internen Tabellen sind es die Attribute Zeilentyp, Zugriffsart und Schlssel. Die eigentlichen Datenobjekte, nmlich die Zeichen- und Bytefolgen bzw. die Zeilen von internen Tabellen, werden dynamisch zur Laufzeit erzeugt. Auch beim Aufruf von Prozeduren [Seite 467] knnen Datenobjekte dynamisch erzeugt werden. Diese Datenobjekte sind die Formalparameter der Schnittstellendefinition, die ihre technischen Eigenschaften erst zur Laufzeit von bergebenen Aktualparametern bernehmen.

Die Anweisung DATA


Die Anweisung DATA dient der Deklaration von Variablen eines ABAP-Programms oder von Instanzattributen in Klassen. Innerhalb eines Programms oder einer Klasse knnen mit DATA in Prozeduren [Seite 467] nochmals lokale Variablen definiert werden. Fr die Sichtbarkeit von Variablen gilt hierbei Sinngem das gleiche, wie fr die Sichtbarkeit von Datentypen unter Der TYPE-Zusatz [Seite 117]. Lokale Variablen in Prozeduren verschatten gleichnamige Variablen im Rahmenprogramm bzw. der Klasse. Die Syntax der DATA-Anweisung ist hnlich zur TYPES-Anweisung:

DATA <f> ... [TYPE <type>|LIKE <obj>]... [VALUE <val>].


Der Name der Variablen <f> kann bis zu 30 Zeichen lang sein. Es knnen alle Zeichen verwendet werden, bis auf die Ausnahmen +., : () und der Name darf nicht aus Ziffern alleine bestehen. Die Namen der vordefinierten Datenobjekte [Seite 137] knnen nicht verwendet werden. Es sollten keine Namen verwendet werden, die mit einem Schlsselwort oder einem Zusatz von ABAP-Anweisungen bereinstimmen. Es sollten

128

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Variablen

Namen verwendet werden, die die Bedeutung der Variablen verstndlich machen, ohne da zustzliche Kommentare erforderlich werden. keine Bindestriche verwendet werden, da diese Strukturen vorbehalten sind. zur Gliederung zusammengesetzter Name der Unterstrich verwendet werden. alle Sonderzeichen vermieden werden. als erstes Zeichen stets ein Buchstaben verwendet werden.

Bei der statischen Deklaration einer Variablen werden ihre technischen Eigenschaften, also Lnge, Anzahl der Dezimalstellen und Datentyp vollstndig festgelegt. Hierbei unterscheiden wir folgende Mglichkeiten.

Bezug auf bekannte technische Eigenschaften


Um eine Variable anzulegen, die ihre gesamten technischen Eigenschaften von einem bereits vorhandenen Datentyp oder Datenobjekt bernimmt, verwendet man die DATA-Anweisung wie folgt:

DATA <f> [TYPE <type>|LIKE <obj>]...


Bei Verwendung des TYPE-Zusatzes [Seite 117], ist <type> ein beliebiger Datentyp, dessen technischen Eigenschaften vollstndig spezifiziert sind. Dies kann sein ein:

nichtgenerischer eingebauter ABAP-Typ [Seite 101] (D, F, I, T, STRING, XSTRING). beliebiger bereits vorhandener programmlokaler Datentyp [Seite 104]. beliebiger Datentyp aus dem ABAP Dictionary [Seite 109].

Bei Verwendung des LIKE-Zusatzes, ist <obj> ein bereits deklariertes Datenobjekt. Dies kann auch ein vordefiniertes Datenobjekt [Seite 137] sein. Die Variable <f> erhlt die gleichen technischen Eigenschaften, wie das Datenobjekt <obj>. Weiterhin kann man sich mit LIKE auf eine Zeile einer bereits als Datenobjekt deklarierten internen Tabelle beziehen:

DATA <f> LIKE LINE OF <itab>.


Aus Kompatibilittsgrnden zu vorhergehenden Releases, kann <obj> auch eine Datenbanktabelle, ein View, eine Struktur oder eine ihrer Komponenten aus dem ABAP Dictionary sein. Die Datentypen [Seite 95], auf die sich bezogen wird, knnen elementare Typen, Referenztypen oder komplexe Typen (Strukturen, Tabellen) sein. Bei elementaren Typen sind die Variablen ein einzelnes Feld im Speicherbereich. Bei den Datentypen fixer Lnge (D, F, I, T) liegt der belegte Speicherbereich bereits bei der Deklaration fest. Bei den Datentypen variabler Lnge (STRING und XSTRING) werden bei der Deklaration nur Verwaltungseintrge vorgenommen und die Lnge der Datenobjekte wird zur Laufzeit dynamisch verwaltet. Bei Strukturen sind die Variablen eine Folge von Variablen, die selbst wieder komplex sein knnen. Die einzelnen Komponenten bernehmen ihre Namen <ci> dabei vom Typ <type> bzw. vom Objekt <obj> und knnen ber <f>-<ci> angesprochen werden. Bei Tabellen werden im Speicherbereich Verwaltungseintrge fr interne Tabellen vorgenommen, die zur Laufzeit dynamisch gefllt werden knnen.

TYPES: BEGIN OF struct, number_1 TYPE i, number_2 TYPE p DECIMALS 2, END OF struct.

April 2001

129

ABAP Programmierung (BC-ABA) Variablen

SAP AG

DATA:

wa_struct number date time text company

TYPE LIKE LIKE TYPE TYPE TYPE

struct, wa_struct-number_2, sy-datum, t, string, s_carr_id.

Es werden Variablen mit Bezug auf den programmlokalen Typ STRUCT, auf eine Komponente eines bereits vorhandenen Datenobjekts WA_STRUCT, auf das eingebaute Datenobjekt SY-DATUM, auf die eingebauten ABAP-Typen T und STRING und auf das Datenelement S_CARR_ID aus dem ABAP Dictionary deklariert.

Bezug auf Datentypen mit generischen Eigenschaften


Wenn man sich in der DATA-Anweisung auf einen der generischen eingebauten ABAP-Typen fixer Lnge (C, N, P, X) bezieht, mssen die noch offenen technischen Eigenschaften in der DATA-Anweisung spezifiziert werden. Die DATA-Anweisung hat dabei die gleiche Syntax wie die TYPES-Anweisung;

DATA <f>[(<length>)] TYPE <type> [DECIMALS <d>]...


Mit der Option <length> wird die Feldlnge festgelegt. Ohne die Angabe von <length> wird die Feldlnge auf den entsprechenden Initialwert der Tabelle unter Eingebaute ABAP-Typen [Seite 101] gesetzt. Falls <type> gleich P ist, wird mit der Option DECIMALS die Anzahl der Dezimalstellen <d> festgelegt. Ohne die Angabe von DECIMALS wird die Anzahl der Dezimalstellen auf Null gesetzt. Ohne TYPE- oder LIKE-Zusatz wird implizit der eingebaute generische Typ C verwendet. Die implizite Anweisung

DATA <f>.
definiert also eine Charactervariable <f> der Lnge 1. Sie ist eine Kurzform der expliziten Anweisung

DATA <f>(1) TYPE C.


Bei der Angabe von Dezimalstellen fr gepackte Zahlen sind maximal sind 14 Stellen <d> nach dem Dezimalpunkt mglich. Um die Dezimalstellen zu verwenden, mu das Programmattribut Festpunktarithmetik gesetzt sein, sonst werden die Varaiblen wie ganze Zahlen behandelt. Bei Zuweisungen an gepackte Zahlen werden berflssige Ziffern gerundet. Bis auf generische Standard-Tabellen [Seite 275], deren Schlssel nicht definiert ist, kann man sich in der DATA-Anweisung zur Zeit nicht auf weitere generische Datentypen beziehen.

DATA: text1, text2(2), text3(3) TYPE c, pack TYPE P DECIMALS 2 VALUE '1.225'.
Es werden drei Charactervariablen der Feldlngen ein Byte, zwei Byte und drei Byte sowie eine Variable fr gepackte Zahlen der Feldlnge acht Byte mit zwei Dezimalstellen deklariert. Wenn das Programmattribut Festpunktarithmetik gesetzt ist, ist der Wert von PACK 1,23.

130

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Variablen

Erzeugung von Variablen mit gebundenen Datentypen


Bisher wurde gezeigt, wie Variablen unter Bezug auf vorhandene Datentypen deklariert wurden. Es ist aber auch mglich in der DATA-Anweisung die gleichen Typkonstruktoren wie in der TYPES-Anweisung zu verwenden, um der Variablen whrend der Deklaration einen Datentyp zuzuweisen. Dieser Datentyp besteht dann nicht eigenstndig, sondern nur als Attribut eines Datenobjekts. Der Datentyp ist an das Datenobjekt gebunden. Man kann nicht mit dem TYPEsondern nur mit dem LIKE-Zusatz auf ihn verweisen.
Referenzen

Die Syntax fr die direkte Deklaration einer Referenzvariablen entspricht der Definition eines Referenztyps mit der TYPES-Anweisung:

DATA <f> TYPE REF TO ...


Hier steht hinter dem TYPE-Zusatz kein Verweis auf einen anderen Datentyp, sondern ein sogenannter Typkonstruktor.

Mit dem Typkonstruktor

REF TO DATA
definiert die DATA-Anweisung ein Feld <f> mit dem Datentyp Referenz auf ein Datenobjekt. Die Referenzvariable <f> kann Referenzen (Zeiger) auf Datenobjekte also auf Instanzen von Datentypen enthalten (siehe auch Datenreferenzen [Seite 232]).

Mit dem Typkonstruktor

REF TO <class>|<interface>
definiert die DATA-Anweisung ein Feld <f> mit dem Datentyp Referenz auf ein Objekt aus ABAP Objects. Die Referenzvariable <f> kann Referenzen (Zeiger) auf Instanzen der Klasse <class> oder ihrer Unterklassen bzw. von Klassen, die das Interface <interface> implementieren, enthalten. (siehe auch Behandlung von Objekten [Seite 1410]).
Strukturen

Die Syntax fr die direkte Deklaration einer Variablen als Struktur entspricht der Definition eines Strukturtyps mit der TYPES-Anweisung:

DATA: BEGIN OF <structure>, .............. <fi>..., .............. END OF <structure>.


Dieser Kettensatz fat zwischen den Anweisungen

DATA BEGIN OF <structure>. und DATA END OF <structure>.


die in den Anweisungen

DATA <fi>....
definierten Variablen <fi> zu einer Struktur zusammen. Die Anweisungsblcke DATA BEGIN OF DATA END OF sind wie bei der TYPES-Anweisung schachtelbar. Die einzelnen Komponenten <fi> knnen elementare Felder, Referenzvariablen oder durch Bezug auf bekannte komplexe Typen selber komplex sein. Da I- oder F-Felder im Arbeitspeicher bndig ausgerichtet sind

April 2001

131

ABAP Programmierung (BC-ABA) Variablen

SAP AG

(siehe Ausrichtung von Datenobjekten [Seite 204]), kann das System bei Bedarf leere Fllfelder zwischen den Komponenten einfgen. Die einzelnen Variablen einer Struktur werden im Programm mit einem Bindestrich zwischen Strukturname und Komponentenname benannt: <structure>-<fi>.

DATA: BEGIN OF address, name(20) TYPE street(20) TYPE number TYPE postcode(5) TYPE city(20) TYPE END OF address.

c, c, p, n, c,

Dieses Beispiel definiert eine Struktur namens ADDRESS. Die Komponenten knnen durch ADDRESS-NAME, ADDRESS-STREET usw. angesprochen werden.
Interne Tabellen

Die Syntax fr die direkte Deklaration einer internen Tabelle als Datentyp einer Variablen entspricht der Definition einer Tabelle mit der TYPES-Anweisung:

DATA <f> TYPE|LIKE <tabkind> OF <linetype> WITH <key>.


Hier steht hinter dem TYPE-Zusatz kein Verweis auf einen anderen Datentyp, sondern der Typkonstruktor:

<tabkind> OF <linetype> WITH <key>.


Die Variable <f> wird als interne Tabelle der Zugriffsart <tabkind>, dem Zeilentyp <linetype> und dem Schlssel <key> deklariert. Der Zeilentyp <linetype> ist ein beliebiger bekannter Datentyp. Fr ausfhrliche Informationen zur Definition interner Tabellen siehe Interne Tabellen [Seite 265].

Startwert angeben
Bei der Deklaration einer Variablen von elementarem Datentyp fixer Lnge fllt die Anweisung DATA das erzeugte Datenobjekt automatisch mit dem datentypspezifischen Initialwert der Tabelle unter Eingebaute ABAP-Typen [Seite 101]. Der Startwert einer elementaren Variablen fixer Lnge kann (auch innerhalb der Deklaration von Strukturen) mit dem Zusatz VALUE der DATA-Anweisung gefllt werden:

DATA <f>..... VALUE <val>.


Der Startwert der Variablen <f> wird auf <val> gesetzt, wobei <val> folgendermaen angegeben werden kann:

als Literal (siehe Literale [Seite 124]). als bereits deklarierte Konstante (siehe Konstanten [Seite 134]) als expliziter Zusatz IS INITIAL

Im VALUE-Zusatz knnen keine anderen Variablen und keine Textsymbole [Seite 126] angesprochen werden. Bei elementaren Datenobjekten variabler Lnge (STRING, XSTRING), internen Tabellen und Referenzvariablen kann kein Startwert angegeben werden.

132

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Variablen

Beispiele zur Angabe von Startwerten:

DATA: counter TYPE p VALUE 1, date TYPE d VALUE '19980601', flag TYPE n VALUE IS INITIAL.
Nach dieser Datendeklaration enthlt z.B. die Zeichenkette FLAG ihren typspezifischen Initialwert '0'.

Statische Variablen in Prozeduren


Variablen, die mit der Anweisung DATA deklariert werden, leben solange wie ihr Kontext. Variablen in einem ABAP-Rahmenprogramm leben also die gesamte Laufzeit des Programms und lokale Variablen in Prozeduren [Seite 467] leben nur whrend dem Aufruf der Prozedur. Um den Wert lokaler Variablen ber die Laufzeit der Prozedur hinaus zu bewahren, kann man in der Prozedur Variablen mit der Anweisung STATICS deklarieren. Die Anweisung STATICS deklariert Variablen im Kontext des Rahmenprogramms der Prozedur, die aber nur innerhalb der Prozedur sichtbar sind. Beim ersten Aufruf eines Unterprogramms oder eines Funktionsbausteins wird immer das entsprechende Rahmenprogramm in den internen Modus des Aufrufers geladen und nach Ablauf der Prozedur nicht wieder gelscht. Deshalb bleiben mit STATICS deklarierte Variablen und ihre Werte ber die Laufzeit einer Prozedur hinaus erhalten und knnen bei erneutem Aufruf der Prozedur wieder verwendet werden (siehe Beispiel unter Lokale Daten in Unterprogrammen [Seite 473]). In Methoden spielen mit STATICS definierte Variablen die Rollen von statischen Attributen, die nur in der entsprechenden Methode sichtbar sind, dies aber in allen Instanzen einer Klasse (siehe Klassen [Seite 1403]). Die Syntax der Anweisung STATICS ist identisch zur Syntax der Anweisung DATA.

April 2001

133

ABAP Programmierung (BC-ABA) Konstanten

SAP AG

Konstanten
Konstanten sind benannte Datenobjekte, die statisch mit einer deklarativen Anweisung erzeugt werden. Konstanten dienen dazu, nichtnderbare Daten unter einem bestimmten Namen im Arbeitsspeicher eines Programms zu halten. Der Wert einer Konstanten kann zur Laufzeit des Programms nicht mehr gendert werden. Beim Versuch eine Konstante zu ndern kommt es zu einem Syntax- oder Laufzeitfehler. Konstanten werden mit der Anweisung CONSTANTS deklariert. Innerhalb eines Programms knnen in Prozeduren [Seite 467] mit CONSTANTS nochmals lokale Konstanten definiert werden. Fr die Sichtbarkeit von Konstanten gilt hierbei Sinngem das gleiche, wie fr die Sichtbarkeit von Datentypen unter Der TYPE-Zusatz [Seite 117]. Lokale Konstanten in Prozeduren verschatten gleichnamige Variablen im Rahmenprogramm. Konstanten leben solange wir ihr Kontext. Die Syntax der Anweisung CONSTANTS entspricht vollstndig der Syntax der Anweisung DATA mit folgenden Ausnahmen:

Der VALUE-Zusatz ist bei Constants zwingend erforderlich. Der hinter VALUE angegebene Startwert kann whrend der Programmausfhrung nicht mehr gendert werden. Konstanten knnen nicht fr Strings, Referenzen und interne Tabellen bzw. Strukturen, die interne Tabellen enthalten, definiert werden.

Elementare Konstanten:

CONSTANTS: pi TYPE P DECIMALS 10 VALUE '3.1415926536'. ref_c1 TYPE REF TO C1 VALUE IS INITIAL.
Die letzte Zeile verdeutlicht den Sinn des Arguments IS INITIAL beim VALUEZusatz. Da der VALUE-Zusatz in der CONSTANTS-Anweisung zwingend erforderlich ist, kann nur mit IS INITIAL einer Konstanten explizit ihr typspezifischer Initialwert zugewiesen werden. Komplexe Konstanten:

CONSTANTS: BEGIN OF myaddress, name(20) TYPE c street(20) TYPE c number TYPE p postcode(5) TYPE n city(20) TYPE c END OF myaddress.

VALUE 'Fred Flintstone', VALUE 'Cave Avenue', VALUE 11, VALUE 98765, VALUE 'Bedrock',

Dies ist die Deklaration einer konstanten Struktur MYADDRESS. Die Komponenten knnen mit MYADDRESS-NAME, MYADDRESS-STREET usw. angesprochen, jedoch nicht mehr gendert werden.

134

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Schnittstellen-Arbeitsbereiche

Schnittstellen-Arbeitsbereiche
Schnittstellen-Arbeitsbereiche sind spezielle benannte Datenobjekte, die der bergabe von Daten zwischen

Dynpros und ABAP-Programmen und zwischen logischen Datenbanken und ABAP-Programmen ABAP-Programmen und externen Unterprogrammen

dienen. Schnittstellen-Arbeitsbereiche werden in einem gemeinsamen Datenbereich der Programme angelegt, zwischen denen Daten bergeben werden sollen. Auf diese Arbeitsbereich greifen alle beteiligten Programme und auch alle aufgerufenen Prozeduren gemeinsam zu. Unter Globale Daten des Rahmenprogramms [Seite 471] wird gezeigt, wie man gemeinsame Arbeitsbereiche vor nderungen in Prozeduren schtzen kann.

Schnittstellen zu Dynpros
Ein verbreiteter Typ von Schnittstellen-Arbeitsbereichen sind Tabellenarbeitsbereiche, die mit

TABLES <dbtab>.
Angelegt werden. Diese Anweisung legt eine Struktur (Feldleiste) mit dem gleichen Datentyp und dem gleichen Namen wie eine Datenbanktabelle, ein View oder eine Struktur aus dem ABAP-Dictionary an. Vor Release 4.0 mute eine Datenbanktabelle <dbtab> mit der Anweisung TABLES <dbtab> einem ABAP-Programm bekannt gemacht werden, bevor mit Open SQL-Anweisungen auf die Datenbanktabelle zugegriffen werden konnte. Diese Restriktion gilt fr Open SQL-Anweisungen nicht mehr. Heute ist die TABLES-Anweisung noch notwendig, wenn auf einem Dynpro Ein- oder Ausgabefelder mit Bezug auf Datenbanktabellen, Views oder Strukturen aus dem ABAPDictionary angelegt werden (Funktion Holen aus Dictionary im Full Screen Editor des Werkzeuges Screen Painter [Extern] der ABAP Workbench). Das ABAP-Programm bernimmt zum Zeitpunkt PAI die Eingabedaten in die entsprechenden Komponenten des Tabellenarbeitsbereichs, bzw. sendet deren Inhalt zum Zeitpunkt PBO an die Ausgabefelder.

April 2001

135

ABAP Programmierung (BC-ABA) Schnittstellen-Arbeitsbereiche

SAP AG

Fluggesellschaft Flugnummer Holen aus Dictionary Holen aus Dictionary (Screen Painter) (Screen Painter)

Dynpro

Datenbergabe zu PAI Datenbergabe zu PAI

... TABLES SPFLI. ... CALL SCREEN 100. ... MOVE SPFLI-CARRID TO ... ... ABAP-Programm

Bezug Bezug

SPFLI

ABAP Dictionary

Schnittstellen zu logischen Datenbanken


Logische Datenbanken sind spezielle ABAP-Programme, die Daten fr Anwendungsprogramme besorgen. Wenn eine logische Datenbank mit einem ausfhrbaren Programm vom Typ 1 verknpft ist, bergibt sie die Daten in Schnittstellen-Arbeitsbereichen, die mit der Anweisung

NODES <node>.
deklariert werden. Diese Anweisung legt eine Variable <node> mit Bezug auf einen gleichnamigen Datentyp aus dem ABAP Dictionary an. Wenn ein Knoten der logischen Datenbank sich auf den gleichen Datentyp bezieht, dient die Variable als Schnittstelle zwischen logischer Datenbank und ausfhrbaren Programm. Wenn ein Knoten einer logischen Datenbank sich auf eine Datenbanktabelle, einen View oder eine flache Struktur des ABAP Dictionaries bezieht, kann statt NODES auch TABLES verwendet werden. Mehr zu logischen Datenbanken findet sich unter Logische Datenbanken [Seite 1257].

Schnittstellen zu externen Unterprogrammen


Es besteht die Mglichkeit, gleichartige Variablen aus verschiedenen Programmen in einem gemeinsamen Datenbereich abzulegen. Hierzu dient der Zusatz COMMON PART [Seite 498] der DATA-Anweisung. Ein solcher gemeinsamer Datenbereich kann als Schnittstelle zu extern aufgerufenen Unterprogrammen dienen. Die mit TABLES und NODES angelegten SchnittstellenArbeitsbereiche wirken ebenfalls als gemeinsamer Datenbereich zu externen Unterprogrammen [Seite 516].

136

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Vordefinierte Datenobjekte

Vordefinierte Datenobjekte
Zur Laufzeit eines ABAP-Programms stehen folgende Datenobjekten automatisch zur Verfgung und mssen nicht deklariert werden:

SPACE
Das Datenobjekt SPACE ist eine Konstante vom Typ C. Es ist ein Byte lang und enthlt ein Leerzeichen. SPACE kann als Konstante nicht gendert werden.

Systemfelder der Struktur SY


SY ist eine Struktur des Datentyps SYST aus dem ABAP Dictionary. Die einzelnen Komponenten der Struktur SY werden als Systemfelder bezeichnet. Die Systemfelder enthalten Werte, die ber den aktuellen Zustand des Systems unterrichten, und werden von der ABAP-Laufzeitumgebung automatisch aktualisiert. Beispiele fr Systemfelder sind:

SY-SUBRC Rckgabewert fr ABAP-Anweisungen (null, wenn eine Anweisung erfolgreich war) SY-UNAME Benutzername SY-REPID aktuelles ABAP-Programm SY-TCODE aktuelle Transaktion SY-INDEX aktueller Schleifendurchlauf

Systemfelder sind Variablen und knnen im Programm gendert werden. Dies wird jedoch nur empfohlen, wenn eine entsprechende Dokumentation es ausdrcklich vorsieht, wie z.B. bei der nderung von SY-LSIND bei der Navigation zwischen Verzweigungslisten. Ansonsten sollten Systemfelder als Konstanten behandelt und nur lesend bearbeitet werden, da ansonsten wichtige Informationen fr die weitere Programmausfhrung verloren gehen knnten. Eine vollstndige Liste aller Systemfelder mit Hinweisen zum Gebrauch findet sich unter: ABAP-Systemfelder [Seite 1556]

April 2001

137

ABAP Programmierung (BC-ABA) Kompatibilitt

SAP AG

Kompatibilitt
Wir bezeichnen Datentypen bzw. Datenobjekte als kompatibel, wenn sie in allen technischen Eigenschaften, also Feldlnge, Anzahl der Dezimalstellen und Typ, vollstndig bereinstimmen. Der Begriff kompatibel darf nicht mit dem Begriff konvertibel verwechselt werden. Beim Arbeiten mit Datenobjekten werden hufig Zuweisungen zwischen Datenobjekten verschiedener technischer Eigenschaften vorgenommen. Dabei mssen die Datentypen ineinander konvertiert werden. Die Voraussetzung fr die Konvertierung nichtkompatibler Datentypen ist die Existenz entsprechender Konvertierungsregeln [Seite 192]. Nur Zuweisungen zwischen kompatiblen Datenobjekten sind ohne Konvertierung mglich. Der hier definierte Begriff der Kompatibilitt zwischen Datentypen bezieht sich immer auf vollstndig spezifizierte Datentypen, denn jedes Datenobjekt ist zur Laufzeit vollstndig spezifiziert. Diese Kompatibilitt ist symmetrisch. Im Zusammenhang mit der Typisierung von Schnittstellenparametern bei Prozeduren und von Feldsymbolen wird ein etwas anderer, unsymmetrischer, Kompatibilittsbegriff verwendet, da hier generische Typen mit vollspezifizierten Datentypen verglichen werden. Konsequenzen der Definition fr Kompatibilitt fr die einzelnen Datentypen:

Elementare Datentypen
Elementare Datentypen sind kompatibel mit anderen elementaren Datentypen, wenn sie in bezug auf elementaren ABAP-Typ, Feldlnge und Anzahl der Dezimalstellen identisch sind. Elementare Datentypen sind nicht kompatibel zu Referenzen oder zu aggregierten Typen.

Referenzen
Referenzen sind kompatibel zu anderen Referenzen, wenn ihre Konstruktionsvorschriften (der Typkonstruktor REF TO <class>|<interface>) bereinstimmt. Referenzen sind nicht kompatibel zu elementaren Datentypen oder zu aggregierten Typen.

Aggregierte Datentypen
Aggregierte Datentypen sind kompatibel zu anderen aggregierten Datentypen, wenn ihre Konstruktionsvorschriften bereinstimmen. Aggregierte Datentypen sind nicht kompatibel zu elementaren Datentypen oder zu Referenzen.
Strukturen

Strukturen sind kompatibel zu anderen Strukturen, wenn ihre Konstruktion identisch und ihre Komponenten kompatibel sind. Die Vorschrift, wie kompatible Strukturen aus elementaren Feldern aufgebaut sind, um aus Unterstrukturen die Gesamtstruktur zu bilden, mu identisch und die elementaren Komponenten mssen paarweise kompatibel sein. Wenn sich zwei Strukturen aus der gleichen Folge von elementaren Feldern zusammensetzen, diese Felder jedoch unterschiedlich zu Unterstrukturen kombiniert sind, dann sind die Strukturen nicht kompatibel. Strukturen sind nicht kompatibel zu internen Tabellen.

138

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Kompatibilitt

Interne Tabellen

Interne Tabellen sind kompatibel zu anderen internen Tabellen, wenn ihre Zeilentypen kompatibel sind und sie in allen brigen Attributen bereinstimmen. Die Kompatibilitt von internen Tabellen hngt nicht von der Anzahl der Zeilen ab. Interne Tabellen sind nicht kompatibel zu Strukturen.

April 2001

139

ABAP Programmierung (BC-ABA) Attribute von Datenobjekten bestimmen

SAP AG

Attribute von Datenobjekten bestimmen


Es kann vorkommen, da man zur Laufzeit eines Programms Attribute eines Datenobjekts bentigt, die nicht statisch bekannt sind. Beispielsweise will man in einem Unterprogramm den Typ eines generisch bergebenen Schnittstellenparameters erkennen. Hierzu verwendet man die Anweisungen:

DESCRIBE FIELD <f> [LENGTH <l>] [TYPE <t> [COMPONENTS <n>]] [OUTPUT-LENGTH <o>] [DECIMALS <d>] [EDIT MASK <m>] [HELP-ID <h>].
Die Attribute des Datenobjekts <f>, die durch die Zustze der Anweisung benannt sind, werden in die entsprechenden Variablen geschrieben. Es knnen beliebig viele Zustze auf einmal verwendet werden.

DESCRIBE FIELD DISTANCE BETWEEN <f1> AND <f2> INTO <d>.


Der Abstand der Datenobjekte <f1> und <f2> wird bestimmt. Im folgenden die Zustze im Einzelnen:

Feldlnge bestimmen
Die Feldlnge eines Datenobjekts wird mit dem Zusatz LENGTH bestimmt:

DESCRIBE FIELD <f> LENGTH <l>.


Die Anweisung schreibt die Lnge des Felds <f> in die Variable <l>.

DATA: text(8) TYPE c, len TYPE i. DESCRIBE FIELD text LENGTH len.
Feld LEN enthlt den Wert 8.

Datentyp bestimmen
Der Datentyp eines Datenobjekts wird mit dem Zusatz TYPE bestimmt:

DESCRIBE FIELD <f> TYPE <t>.


Die Anweisung schreibt den Datentyp des Felds <f> in die Variable <t>. Auer den eingebauten ABAP-Typen [Seite 101] C, D, F, I, N , P, T und X, kann die Anweisung folgende Werte zurckgeben:
s fr 2-Byte Ganzzahlen mit Vorzeichen b fr 1-Byte Ganzzahlen ohne Vorzeichen r fr Referenzen h fr interne Tabellen

Diese Werte sind interne Typbezeichner. Datenobjekte mit den internen Typen s und b knnen durch Verweise auf entsprechende elementare Typen im ABAP Dictionary deklariert worden

140

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Attribute von Datenobjekten bestimmen

sein. Datenobjekte mit dem Typ h sind aggregiert. Datenobjekte mit dem internen Typ r sind Referenzvariablen in ABAP Objects. Wenn <f> eine Struktur ist, gibt die Anweisung auch den Wert C zurck. Um mehr ber Strukturen zu erfahren, mu man zustzlich die Option COMPONENTS verwenden:

DESCRIBE FIELD <f> TYPE <t> COMPONENTS <n>.


Diese Anweisung schreibt statt C folgende interne Typbezeichner in die Variable <t>:
u fr Strukturen ohne interne Tabelle als Komponente v fr Strukturen mit mindestens einer internen Tabelle als Komponente oder Unterkomponente

Die Zahl der direkten Komponenten der Struktur wird als Integerzahl in die Variable <n> geschrieben.

TABLES spfli. DATA: numtext(8) TYPE n, typ(1) TYPE c. DESCRIBE FIELD numtext TYPE typ. WRITE typ. DESCRIBE FIELD spfli-fltime TYPE typ. WRITE typ.
Dieses Beispiel erzeugt folgende Ausgabe:
N T

Das Feld TYP enthlt zuerst den Wert N und dann den Wert T.

TYPES: surname(20) street(30) zip_code(10) city(30) phone(20) date

TYPE TYPE TYPE TYPE TYPE LIKE

c, c, n, c, n, sy-datum.

TYPES: BEGIN OF address, NAME TYPE surname, CODE TYPE zip_code, TOWN TYPE city, STR TYPE street, END OF address. TYPES: BEGIN OF phone_list, adr TYPE address, tel TYPE phone, END OF phone_list. DATA pl TYPE phone-list. DATA: typ(1) TYPE c, n TYPE i.

April 2001

141

ABAP Programmierung (BC-ABA) Attribute von Datenobjekten bestimmen

SAP AG

DESCRIBE FIELD pl TYPE typ COMPONENTS n.


Hier enthlt das Feld TYP den Wert u und N den Wert 2, weil PL eine Struktur mit zwei direkten Komponenten (ADR und TEL) ohne interne Tabellen ist.

Ausgabelnge bestimmen
Die Ausgabelnge eines Datenobjekts wird mit dem Zusatz OUTPUT-LENGTH bestimmt:

DESCRIBE FIELD <f> OUTPUT-LENGTH <o>.


Die Anweisung schreibt die Ausgabelnge des Felds <f> in die Variable <o>. Die Ausgabelnge eines Felds entspricht der Anzahl der Stellen, die der Inhalt des Felds nach einer Ausgabe mit der Anweisung WRITE [Seite 831] auf einer Liste belegt.

DATA: float TYPE f, out TYPE i, len TYPE i. DESCRIBE FIELD float LENGTH len OUTPUT-LENGTH out.
Hier enthlt das Feld LEN den Wert 8 und das Feld OUT den Wert 22.

Dezimalstellen bestimmen
Die Anzahl der Dezimalstellen eines Datenobjekts wird mit dem Zusatz DECIMALS bestimmt:

DESCRIBE FIELD <f> DECIMALS <d>.


Die Anweisung schreibt die Anzahl der Dezimalstellen des Felds <f> in die Variable <d>.

DATA: pack TYPE p DECIMALS 2, dec(1) TYPE c. DESCRIBE FIELD pack DECIMALS dec.
Hier enthlt das Feld DEC den Wert 2.

Konvertierungsroutine bestimmen
Eine eventuell im ABAP Dictionary definierte Konvertierungsroutine wird mit dem Zusatz EDIT MASK bestimmt:

DESCRIBE FIELD <f> EDIT MASK <m>.


Falls das Feld <f> durch Bezug auf einen Datentyp aus dem ABAP Dictionary deklariert wurde und fr diesen Typ eine Konvertierungsroutine <conv> existiert, schreibt die Anweisung diese in der Form '==<conv>' in die Variable <m>. Eine Konvertierungsroutine [Extern] kann im ABAP Dictionary in der Domne eines Datenelements angegeben werden. Konvertierungsroutinen sind mit jeweils zwei Funktionsbausteinen verknpft, die es erlauben die Darstellung eines Werts im ABAP Dictionary in interne Darstellung im Programm zu verwandeln und umgekehrt. Die Variable <m> kann direkt als Aufbereitungsschablone in einer WRITE-Anweisung verwendet werden.

142

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Attribute von Datenobjekten bestimmen

DATA: fltime TYPE s_fltime, m(7) TYPE c. DESCRIBE FIELD fltime EDIT MASK m. fltime = sy-uzeit. WRITE: / fltime, / sy-uzeit, / sy-uzeit USING EDIT MASK m.
Die Domne S_DURA des Datenelements S_FLTIME im ABAP Dictionary ist mit der Konvertierungsroutine SDURA verknpft. Das Feld M enthlt den Wert ==SDURA. Die Ausgabe sieht z.B. so aus:
604:55 10:04:55 604:55

Die Konvertierungsroutine SDURA rechnet Stunden in Minuten um. Das Feld FLTIME wird intern in der konvertierten Form behandelt. Das Feld SY-UZEIT kann in der konvertierten Form auf die Ausgabeliste geschrieben werden.

Kennung fr Hilfetext bestimmen


Die Kennung eines eventuell im ABAP Dictionary definierten Hilfetexts (F1-Hilfe) wird mit dem Zusatz HELP-ID bestimmt:

DESCRIBE FIELD <f> HELP-ID <h>.


Falls das Feld <f> durch Bezug auf einen Datentyp aus dem ABAP Dictionary deklariert wurde schreibt die Anweisung die Kennung des Hilfetexts in die Variable <h>. Die Kennung kann z.B. in einem geeigneten Funktionsbaustein verwendet werden, um programmgesteuert den Hilfetext anzuzeigen.

DATA: company TYPE s_carr_id, h(20) TYPE c, tlink TYPE TABLE OF tline. DESCRIBE FIELD company HELP-ID h. CALL FUNCTION 'HELP_OBJECT_SHOW' EXPORTING dokclass doklangu dokname TABLES links EXCEPTIONS object_not_found sapscript_error others

= 'DE' = sy-langu = h = tlink = 1 = 2 = 3.

April 2001

143

ABAP Programmierung (BC-ABA) Attribute von Datenobjekten bestimmen

SAP AG

IF sy-subrc <> 0. ... ENDIF.


Hier enthlt das Feld H einfach den Namen des Datenelements S_CARR_ID. Der Funktionsbaustein HELP_OBJECT_SHOW zeigt die Dokumentation des Datenelements in einem Dialogfenster an.

Abstand zweier Felder bestimmen


Der Abstand zweier Felder im Speicher wird durch folgende Anweisung bestimmt:

DESCRIBE FIELD DISTANCE BETWEEN <f1> AND <f2> INTO <d>.


Die Anweisung schreibt die Anzahl der Bytes zwischen den Datenobjekte <f1> und <f2> in die Variable <d>, wobei die Lnge des Felds, das im Speicher vor dem anderen Feld liegt, immer mitgezhlt wird. Eventuelle Ausrichtungen werden bercksichtigt.

DATA: BEGIN OF test, col1(3) TYPE C, col2(2) TYPE C, col3 TYPE i, END OF test, dist TYPE i. DESCRIBE DISTANCE BETWEEN test-col3 AND test-col1 INTO dist.
Hier enthlt das Feld DIST den Wert 8. Dies sind die Lngen 3 und 2 der Komponenten COL1 und COL2 sowie eine Alignment-Lcke von 3 zwischen COL2 und COL3.

144

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Beispiele zu Datentypen und Objekten

Beispiele zu Datentypen und Objekten


Hier finden sich einige Beispiele zu elementaren und aggregierten Datentypen und Datenobjekten, wie sie oft in ABAP-Programmen verwendet werden.

Dieses Beispiel zeigt die Deklaration von elementaren Datenobjekten mit Bezug auf die eingebauten ABAP-Typen.

PROGRAM demo_elementary_data_objects. DATA text1(20) TYPE c. DATA text2 TYPE string. DATA number TYPE i. text1 = 'The number'. number = 100. text2 = 'is an integer.'. WRITE: text1, number, text2.
Das Programm erzeugt folgende Bildschirmausgabe:
The number 100 is an integer.

Es werden die Datenobjekte TEXT1, TEXT2 und NUMBER mit der Anweisung DATA deklariert. Die technischen Eigenschaften werden mit Bezug auf die eingebauten ABAP-Typen C, STRING und I festgelegt. Den benannten Datenobjekten werden Werte aus unbenannten Literalen zugewiesen. Der Inhalt der benannten Datenobjekte wird auf die Ausgabeliste geschrieben.

Dieses Beispiel zeigt die Deklaration programmlokaler elementarer Datentypen.

REPORT demo_types_statement. TYPES mytext(10) TYPE c. TYPES myamount TYPE p DECIMALS 2. DATA text DATA amount TYPE mytext. TYPE myamount.

text = ' 4 / 3 = '. amount = 4 / 3 . WRITE: text, amount.


Das Programm erzeugt die folgende Bildschirmausgabe:
4 / 3 = 1.33

Es werden programmlokale Datentypen MYTEXT und MYAMOUNT mit der Anweisung TYPES definiert. Die technischen Eigenschaften werden mit Bezug auf eingebaut ABAP-Typen definiert. Dann werden die Datenobjekte TEXT und AMOUNT mit der Anweisung DATA deklariert. Ihre Datentypen werden mit Bezug auf MYTEXT und MYAMOUNT festgelegt. Den Datenobjekten werden Werte zugeordnet, und der Inhalt der Datenobjekte wird auf die Ausgabeliste geschrieben.

April 2001

145

ABAP Programmierung (BC-ABA) Beispiele zu Datentypen und Objekten

SAP AG

Dieses Beispiel zeigt, wie Strukturen deklariert werden knnen.

REPORT demo_structure. TYPES: BEGIN OF name, title(5) TYPE c, first_name(10) TYPE c, last_name(10) TYPE c, END OF name. TYPES: BEGIN OF mylist, client TYPE name, number TYPE i, END OF mylist. DATA list TYPE mylist. list-client-title = 'Lord'. list-client-first_name = 'Howard'. list-client-last_name = 'Mac Duff'. list-number = 1. WRITE WRITE WRITE WRITE WRITE list-client-title. list-client-first_name. list-client-last_name. / 'Number'. list-number.
Mac Duff 1

Das Programm erzeugt die folgende Bildschirmausgabe


Lord Howard Number

Es werden die programmlokalen Datentypen NAME und MYLIST mit der Anweisung TYPES als Strukturen definiert. Die Struktur NAME enthlt die drei Komponenten TITLE, FIRST_NAME und LAST_NAME mit Bezug auf den eingebauten ABAP-Typ C. Die Struktur MYLIST enthlt die beiden Komponenten CLIENT und NUMBER. CLIENT ist eine Unterstruktur, da sie sich auf die Struktur NAME bezieht. NUMBER ist elementar mit dem eingebauten Typ I. Ein Datenobjekt LIST wird mit Bezug auf den Datentyp MYLIST deklariert. Den Komponenten werden Werte zugewiesen, und ihre Inhalte werden auf die Ausgabeliste geschrieben.

Dieses Beispielprogramm zeigt die Definition einer internen Tabelle.

PROGRAM demo_internal_table. TYPES: BEGIN OF mytext, number TYPE i, name(10) TYPE c, END OF mytext. TYPES mytab TYPE STANDARD TABLE OF mytext WITH DEFAULT KEY. DATA text TYPE mytext. DATA itab TYPE mytab.

146

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Beispiele zu Datentypen und Objekten

text-number = 1. text-name = 'John'. APPEND text TO itab. text-number = 2. text-name = 'Paul'. APPEND text TO itab. text-number = 3. text-name = 'Ringo'. APPEND text TO itab. text-number = 4. text-name = 'George'. APPEND text TO itab. LOOP AT itab INTO text. WRITE: / text-number,text-name. ENDLOOP.
Dieses Programm erzeugt die folgende Bildschirmausgabe:
1 2 3 4 John Paul Ringo George

In diesem Beispiel wird ein Datentyp MYTEXT als Struktur definiert. Dann wird ein Datentyp MYTAB als interne Tabelle mit dem Zeilentyp MYTEXT definiert. Die Datenobjekte TEXT und ITAB werden mit Bezug auf die programmlokalen Datentypen MYTEXT und MYTAB deklariert. Die Zeilen der internen Tabelle ITAB werden dynamisch mit APPEND erzeugt. ber die Struktur TEXT wird der Inhalt der Tabelle ITAB auf die Ausgabeliste geschrieben. Siehe auch Interne Tabellen [Seite 265].

April 2001

147

ABAP Programmierung (BC-ABA) Daten verarbeiten

SAP AG

Daten verarbeiten
Dieser Abschnitt beschreibt die Grundlagen des Umgangs mit Datenobjekten in ABAP. Folgende Themen werden behandelt:
Wertzuweisungen [Seite 149] Numerische Operationen [Seite 156] Verarbeitung von Zeichenketten [Seite 167] Einzelbitverarbeitung in Hexadezimalfeldern [Seite 184] Typkonvertierungen [Seite 192] Bearbeitung von Teilfeldern [Seite 205]

148

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Wertzuweisungen

Wertzuweisungen
Dieser Abschnitt beschreibt die grundlegenden ABAP-Anweisungen zum ndern des Feldinhalts von Variablen. Beim Start eines ABAP-Programms haben Variablen einen Startwert, der z.B. in der DATA-Anweisung explizit festgelegt werden kann. Neben vielfltigen Mglichkeiten den Inhalt von Variablen ber Benutzerschnittstellen und Open SQL zu fllen, sind Wertzuweisungen von programmlokalen Datenobjekten zu Variablen die wichtigste Methode Feldinhalte zu ndern. Dabei spielt die Anweisung MOVE, die gleichbedeutend zum Zuweisungsoperator (=) ist, die Hauptrolle. Die meisten anderen Wertzuweisungen werden intern auf die Semantik der Anweisung MOVE zurckgefhrt. Dies spielt insbesondere in Hinblick auf Typkonvertierungen ein Rolle. Eine weitere Anweisung zur Wertbergabe an Variablen, die hauptschlich beim Fllen von Characterfeldern eine Bedeutung hat, ist WRITE TO. Schlielich erlaubt es die Anweisung CLEAR, Datenobjekte auf ihren typgerechten Initialwert zurckzusetzen. Werte mit MOVE zuweisen [Seite 150] Werte mit WRITE TO zuweisen [Seite 153] Werte auf Initialwerte setzen [Seite 155]

April 2001

149

ABAP Programmierung (BC-ABA) Werte mit MOVE zuweisen

SAP AG

Werte mit MOVE zuweisen


Um den Wert eines beliebigen Datenobjekts <f1> einer Variablen <f2> zuzuweisen, verwendet man die Anweisung:

MOVE <f1> TO <f2>.


oder die vllig gleichbedeutende Anweisung

<f2> = <f1>.
Der Inhalt von <f1> bleibt unverndert. <f1> mu also keine Variable, sondern kann z.B. auch ein Literal, ein Textsymbol oder eine Konstante sein. Dezimalstellen mssen unabhngig vom Benutzerstammsatz immer mit einem Punkt (.) angegeben werden. Mehrfachzuweisungen

<f4> = <f3> = <f2> = <f1>.


sind mglich. ABAP verarbeitet sie wie folgt von rechts nach links:

MOVE <f1> TO <f2>. MOVE <f2> TO <f3>. MOVE <f3> TO <f4>.


In der MOVE-Anweisung (bzw. mit dem Zuweisungsoperator) knnen die Namen von Quell- und Zielfelder nicht dynamisch als Inhalte anderer Felder angegeben werden. Falls dies erforderlich ist, mssen Feldsymbole [Seite 209] verwendet werden. Bezglich der Datentypen von <f1> und <f2> sind folgende drei Flle zu unterscheiden: 1. Die Datenobjekte <f1> und <f2> vollstndig kompatibel [Seite 138], d.h. sie stimmen in allen technischen Eigenschaften (Datentyp, Feldlnge, Anzahl der Dezimalstellen) berein. Der Inhalt des Quellfelds <f1> wird ohne weitere Manipulation Byte fr Byte in das Zielfeld <f2> bertragen. In diesem Fall hat die MOVE-Anweisung die beste Performance. 2. Die Datenobjekte <f1> und <f2> sind nicht kompatibel. Hierfr gengt es z.B. schon, da sie zwar vom gleichen Typ aber von unterschiedlicher Lnge sind. Der Inhalt des Quellfelds <f1> wird so konvertiert, da er zum Datentyp von <f2> passt und dann erst bertragen. Dies setzt eine Konvertierungsregel [Seite 192] zwischen den Datentypen von <f1> und <f2> voraus. Je nach Aufwendigkeit der Konvertierung sinkt die Performance der MOVE-Anweisung. 3. Die Datenobjekte <f1> und <f2> sind weder kompatibel noch konvertibel. Es ist keine Zuweisung mglich. Falls dies statisch erkannt werden kann, kommt es zu einem Syntax-, ansonsten zu einem Laufzeitfehler. Quellfelder und Zielfelder knnen also verschiedene Datentypen haben. Im Gegensatz zu anderen Programmiersprachen, wo die Zuweisung zwischen verschiedenen Datentypen oft auf eine geringe Anzahl mglicher Kombinationen beschrnkt ist, bietet ABAP eine Vielzahl automatischer Typkonvertierungen. Beispielsweise kann der Inhalt eines Quellfeldes mit einem elementaren Datentyp einem Zielfeld mit einem beliebigen anderen elementaren Datentyp zugewiesen werden, mit der einzigen Ausnahme, da keine Zuweisungen zwischen Feldern der eingebauten ABAP-Typen D und T mglich sind. ABAP untersttzt sogar die Zuweisung zwischen Strukturen und elementaren Datenobjekten und zwischen unterschiedlichen Strukturen.

150

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Werte mit MOVE zuweisen

DATA: t(10) TYPE c, number TYPE p DECIMALS 2, count TYPE i. t = 1111. MOVE '5.75' TO number. count = number.
Nach diesen Zuweisungen haben die Felder T, NUMBER, und COUNT die Werte '1111 ', 5,75 und 6. Bei der Zuweisung des Zahlenliterals 1111 an T wird die Zahl in ein Characterfeld der Lnge 10 konvertiert. Bei der Zuweisung von NUMBER zu COUNT wird die Dezimalzahl in eine ganze Zahl gerundet (Voraussetzung: das Programmattribut Festpunktarithmetik ist gesetzt).

Werte zwischen Komponenten von Strukturen zuweisen


Um Werte zwischen Strukturen komponentenweise zuzuweisen, verwendet man die Anweisung

MOVE-CORRESPONDING <struct1> TO <struct2>.


Diese Anweisung weist den Inhalt von Komponenten der Struktur <struct1> den namensgleichen Komponenten der Struktut <struct2> zu. Das System lst obige Anweisung in jeweils eine MOVE-Anweisung pro Namenspaar auf:

MOVE STRUCT1-<ci> TO STRUCT2-<ci>.


Alle erforderlichen Typkonvertierungen werden einzeln vorgenommen. Dieses Verfahren unterscheidet sich von der Wertzuweisung fr komplette Strukturen mit der MOVE-Anweisung. In diesem Fall gelten die Konvertierungsregeln fr Strukturen [Seite 201].

DATA: BEGIN OF address, firstname(20) TYPE c VALUE 'Fred', surname(20) TYPE c VALUE 'Flintstone', initials(4) TYPE c VALUE 'FF', street(20) TYPE c VALUE 'Cave Avenue', number TYPE i VALUE '11', postcode(5) TYPE n VALUE '98765', city(20) TYPE c VALUE 'Bedrock', END OF address. DATA: BEGIN OF name, surname(20) TYPE c, firstname(20) TYPE c, initials(4) TYPE c, title(10) TYPE c VALUE 'Mister', END OF name. MOVE-CORRESPONDING address TO name.
In diesem Beispiel werden die Werte fr NAME-SURNAME, NAME-FIRSTNAME und NAME-INITIALS auf 'Flintstone','Fred' und 'FF' gesetzt. NAME-TITLE behlt jeweils den Wert 'Mister'.

April 2001

151

ABAP Programmierung (BC-ABA) Werte mit MOVE zuweisen

SAP AG

Address
FIRSTNAME FIRSTNAME SURNAME SURNAME INITIALS INITIALS STREET STREET NUMBER NUMBER POSTCODE POSTCODE CITY CITY Fred Fred Flintstone Flintstone FF FF Cave Avenue Cave Avenue 11 11 98765 98765 Bedrock Bedrock

Name
SURNAME SURNAME FIRSTNAME FIRSTNAME INITIALS INITIALS TITLE TITLE Flintstone Flintstone Fred Fred FF FF Mister Mister

152

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Werte mit WRITE TO zuweisen

Werte mit WRITE TO zuweisen


Neben der Anweisung MOVE, die den Wert des Quellfelds bei einer Wertzuweisung in den Datentyp des Zielfelds konvertiert, gibt es die Anweisung WRITE TO, die den Inhalt des Quellfelds prinzipiell in ein Feld vom Typ C konvertiert.

WRITE <f1> TO <f2> [<option>].


Diese Anweisung konvertiert [Seite 192] den Inhalt eines beliebigen Datenobjekts <f1> nach Typ C und bertrgt die resultierende Zeichenkette in eine Variable <f2>. Der Datentyp von <f1> mu in ein Characterfeld konvertierbar sein, ansonsten tritt ein Syntax- oder Laufzeitfehler auf. Der Inhalt von <f1> bleibt unverndert. Die Variable <f2> wird unabhngig von ihrem tatschlichen Typ immer als Characterfeld interpretiert. Es findet keine typgerechte Umsetzung statt. Es hat deshalb keinen Sinn, ein Zielfeld mit einem numerischen Datentyp (F, I, P) zu verwenden. Falls statisch erkennbar, gibt die Syntaxprfung in solchen Fllen eine Warnung aus. Achtung, es ist mglich, da aus solch einer Warnung in zuknftigen Releases ein echter Syntax-, bzw. Laufzeitfehler wird. Die Anweisung WRITE TO bercksichtigt die Vorgaben im Benutzerstammsatz, die beispielsweise angeben, ob das Dezimalzeichen ein Punkt (.) oder Komma (,) sein soll. Weiterhin knnen auer UNDER und NO-GAP smtliche Aufbereitungsoptionen der Anweisung WRITE [Seite 831] genutzt werden.

DATA: number TYPE f VALUE '4.3', text(10) TYPE c, float TYPE f, pack TYPE p DECIMALS 1. WRITE number. WRITE number TO text EXPONENT 2. WRITE / text. WRITE number TO float. WRITE / float. WRITE number TO pack. WRITE / pack. MOVE number TO pack. WRITE / pack.
Beim Syntaxcheck wird gewarnt, da PACK und FLOAT zeichenartige Felder (Typ C, D, N, T, X) sein sollten. Die Ausgabeliste zeigt:
4.30000000000000E+00 0.043E+02 1.50454551753894E-153 20342<33452;30,3 4.3

Die erste Ausgabezeile zeigt den Inhalt des Felds NUMBER im Standardausgabeformat fr Felder des Typs F. Die zweite Ausgabezeile zeigt die

April 2001

153

ABAP Programmierung (BC-ABA) Werte mit WRITE TO zuweisen

SAP AG

Zeichenkette, die dadurch entstanden ist, da das Feld NUMBER mit der Aufbereitungsoption EXPONENT 2 in ein Feld des Typs C mit der Lnge 10 geschrieben wurde. Die dritte und vierte Zeile zeigen, da es nicht sinnvoll ist, Zielfelder zu benutzen, die einen numerischen Datentyp haben. Die fnfte Zeile zeigt, da die MOVE-Anweisung anders funktioniert als die Anweisung WRITE TO: Das Feld des Typs F wurde richtig nach Typ P konvertiert [Seite 192].

Dynamische Angabe des Quellfelds


In der Anweisung WRITE TO kann der Name Quellfelds dynamisch als Inhalt eines anderen Felds angegeben werden. Dazu wird der Namen des Felds, das den Namen des Quellfeldes enthlt, in Klammern angegeben:

WRITE (<f>) TO <g>.


Das System weist den Wert des Felds, dessen Name in <f> steht, <g> zu. Um Zielfelder dynamisch anzugeben, mssen Feldsymbole [Seite 209] verwendet werden.

DATA: name(10) TYPE c VALUE 'SOURCE', source(10) TYPE c VALUE 'Antony', target(10) TYPE c.... WRITE (name) TO target. WRITE target.
Dieses Beispiel erzeugt die Ausgabe Antony Die folgende Abbildung zeigt den Zusammenhang zwischen Feldnamen und Feldinhalten:

Feldname
NAME SOURCE TARGET

Inhalt
SOURCE SOURCE ANTONY ANTONY WRITE (NAME) TO TARGET. WRITE (NAME) TO TARGET. ANTONY ANTONY

154

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Werte auf Initialwerte setzen

Werte auf Initialwerte setzen


Um den Wert einer beliebigen Variablen <f> auf den typgerechten Initialwert zu setzen, verwendet man die Anweisung:

CLEAR <f>.
Es ist zwischen folgenden Datentypen zu unterscheiden:

elementare ABAP-Typen Die CLEAR-Anweisung setzt die Werte von elementaren Variablen auf die Initialwerte, die in der Tabelle unter Eingebaute ABAP-Typen [Seite 101] aufgefhrt sind und nicht auf den Startwert, der ber den VALUE-Parameter der Anweisung DATA gesetzt wurde.

Referenzen Die CLEAR-Anweisung setzt den Inhalt einer Referenzvariablen auf ihren Initialwert, bei dem die Referenz auf kein Objekt zeigt.

Strukturen Die Anweisung CLEAR setzt die elementaren Komponenten einer Struktur auf ihre typgerechten Initialwerte zurck.

interne Tabellen Die Anweisung CLEAR lscht smtliche Zeilen einer internen Tabelle (siehe auch Interne Tabellen initialisieren [Seite 282]).

Konstanten knnen natrlich nicht mit der Anweisung CLEAR zurckgesetzt werden.

REPORT demo_data_clear. DATA number TYPE i VALUE '10'. WRITE number. CLEAR number. WRITE / number.
Ausgabe: 10 0 Die Anweisung CLEAR setzt den Inhalt des Feldes NUMBER von 10 auf den Initialwert 0 zurck.

April 2001

155

ABAP Programmierung (BC-ABA) Numerische Operationen

SAP AG

Numerische Operationen
Um numerische Operationen durchzufhren, d.h. den Ergebniswert eines mathematischen Ausdrucks einer Variablen zuzuweisen, verwendet man die Anweisung COMPUTE oder den Zuweisungsoperator (=):

COMPUTE <n> = <expression>.


Die Verwendung des Schlsselwortes COMPUTE ist optional, d.h., die Anweisung kann auch so geschrieben werden:

<n> = <expression>.
Das Ergebnis des in <expression> angegebenen mathematischen Ausdrucks wird dem Ergebnisfeld <n> zugewiesen. ABAP fhrt die numerische Operation mit einer Rechengenauigkeit durch, die genau einem der numerischen Datentypen I, P oder F entspricht. Die Rechengenauigkeit richtet sich nach dem hierarchisch hchsten Operand der numerischen Operation. Als Operanden zhlen hierbei auch das Ergebnisfeld <n> und Gleitpunktfunktionen [Seite 161] (Typ F). Die Reihenfolge der Hierarchiestufen ist von unten nach oben I P F. ABAP konvertiert [Seite 192] alle Zahlen einer numerischen Operation vor der Ausfhrung der Operation in den hchsten vorkommenden Datentyp und fhrt dann die Operation mit den konvertierten Zahlen aus. Nach der Ausfhrung der Operation wird das Ergebnis wie bei der MOVE-Anweisung [Seite 150] an das Ergebnisfeld zugewiesen, d.h. gegebenenfalls in den Datentyp des Ergebnisfelds zurckkonvertiert. Die Reihenfolge der Typkonvertierungen ist in ABAP also anders als in anderen Programmiersprachen blich. Insbesondere kann man ber den Datentyp des Ergebnisfelds Einflu auf die Rechengenauigkeit der gesamten Operation nehmen. In mathematischen Ausdrcken ist es erlaubt, einzelne Operationen beliebig zu kombinieren und Klammern zu setzen. Die Reihenfolge der Auswertung eines mathematischen Ausdrucks ist: 1. Klammerausdrcke 2. Funktionen 3. ** (Potenzieren) 4. *, / , MOD, DIV (Multiplikation, Division) 5. +, - (Addition, Subtraktion) Die fr <expression> einsetzbaren mathematischen Ausdrcke sind im folgenden beschrieben: Arithmetische Operationen durchfhren [Seite 157] Mathematische Funktionen [Seite 161] Kaufmnnisches Rechnen [Seite 164] Datums- und Zeitberechnungen [Seite 165]

156

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Arithmetische Berechnungen

Arithmetische Berechnungen
Arithmetische Berechnungen beruhen auf arithmetischen Operatoren und speziellen ABAPAnweisungen.

Grundrechenarten
ABAP untersttzt die vier Grundrechenarten sowie die Potenzrechnung. Es knnen folgende arithmetische Operatoren in einem mathematischen Ausdruck verwendet werden:
Operator Bedeutung

+
* /

Addition Subtraktion Multiplikation Division Ganzzahldivision Rest von Ganzzahldivision Potenzieren

DIV MOD
**

Anstelle von arithmetischen Ausdrcken mit Operatoren knnen auch die Schlsselwrter ADD, SUBTRACT, MULTIPLY und DIVIDE fr die Grundrechenarten benutzt werden. Die folgende Tabelle zeigt die alternativen Anweisungen fr die Grundrechenarten in ABAP:
Operation Anweisung mit math. Ausdruck Anweisung mit Schlsselwort

Addition Subtraktion Multiplikation Division Rest Potenzieren

<p> = <n> + <m>. <p> = <m> - <n>. <p> = <m> * <n>. <p> = <m> / <n>.

ADD <n> TO <m>. SUBTRACT <n> FROM <m>. MULTIPLY <m> BY <n>. DIVIDE <m> BY <n>.

Ganzzahldivision <p> = <m> DIV <n>. ---

<p> = <m> MOD <n>. --<p> = <m> ** <n>. ---

In den Anweisungen mit Schlsselwrtern werden die Ergebnisse der Operationen dem Feld <m> zugewiesen. Die Operanden <m>, <n>, <p> knnen beliebige numerische Felder sein. Wenn die Felder nicht denselben Datentyp haben, konvertiert das System vor der Operation alle Felder in den hierarchisch hchsten vorkommenden Datentyp. Bei der Verwendung von arithmetischen Ausdrcken ist zu beachten, da die Operatoren +, -, *, ** und / sowie die ffnenden und schlieenden Klammern in ABAP Wrter sind, denen Leerzeichen voran- und nachgestellt werden mssen.

April 2001

157

ABAP Programmierung (BC-ABA) Arithmetische Berechnungen

SAP AG

Bei Divisionen darf der Divisor nicht Null sein, wenn der Dividend nicht Null ist. Fr Ganzzahldivision verwendet man die Operatoren DIV oder MOD anstelle von /. DIV berechnet den ganzzahligen Quotienten, MOD berechnet den Rest. Bei der Kombination von arithmetischen Ausdrcken, werden Berechnungen fr gleichrangige Operatoren von links nach rechts durchgefhrt, mit einer Ausnahme: Das Potenzieren wird von rechts nach links durchgefhrt. Deshalb ist <n> ** <m> ** <p> gleich <n> ** ( <m> ** <p> ) und nicht gleich ( <n> ** <m> ) ** <p>

DATA: counter TYPE i. COMPUTE counter = counter + 1. counter = counter + 1. ADD 1 TO counter.
In diesem Beispiel fhren die drei Anweisungen dieselbe Rechenoperation durch, d.h., sie addieren 1 zum Inhalt des Feldes COUNTER und weisen das Ergebnis dem Feld COUNTER zu.

DATA: pack TYPE p DECIMALS 4, n TYPE f VALUE '+5.2', m TYPE f VALUE '+1.1'. pack = n / m. WRITE pack. pack = n DIV m. WRITE / pack. pack = n MOD m. WRITE / pack.
Ausgabe: 4.7273 4.0000 0.8000 Dieses Beispiel zeigt die verschiedenen Divisionsarten.

Arithmetische Berechnungen mit Strukturen


Entsprechend der komponentenweisen bertragung von Werten zwischen Strukturen mit MOVECORRESPONDING [Seite 150] knnen mit folgenden Schlsselwrtern komponentenweise arithmetische Operationen mit Strukturen durchgefhrt werden:

ADD-CORRESPONDING SUBTRACT-CORRESPONDING MULTIPLY-CORRESPONDING DIVIDE-CORRESPONDING

158

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Arithmetische Berechnungen

ABAP fhrt die entsprechenden Rechenoperationen fr alle gleichnamigen Komponenten zweier Strukturen durch. Jedoch sind diese Operationen natrlich nur dann sinnvoll, wenn alle betroffenen Komponenten einen numerischen Datentyp haben.

DATA: BEGIN OF rate, usa TYPE f VALUE '0.6667', frg TYPE f VALUE '1.0', aut TYPE f VALUE '7.0', END OF rate. DATA: BEGIN OF money, usa TYPE i VALUE 100, frg TYPE i VALUE 200, aut TYPE i VALUE 300, END OF money. MULTIPLY-CORRESPONDING money BY rate. WRITE / money-usa. WRITE / money-frg. WRITE / money-aut.
Ausgabe: 67 200 2,100 In diesem Beispiel wird MONEY-USA mit RATE-USA multipliziert usw.

Folgen von Feldern addieren


Die ADD-Anweisung hat einige Varianten fr die Addition von Folgen von Feldern im Speicher, zum Beispiel: Addieren einer Folge von Feldern und Zuweisung des Ergebnisses an ein anderes Feld:

ADD <n1> THEN <n2> UNTIL <nz> GIVING <m>.


Wenn <n1>, <n2>, ... , <nz> eine Folge von Feldern mit gleichem Abstand zueinander sowie demselben Typ und derselben Lnge im Speicher ist, werden diese Felder addiert. Das Ergebnis wird <m>zugewiesen. Addieren einer Folge von Feldern und Addieren des Ergebnisses zum Inhalt eines anderen Feldes:

ADD <n1> THEN <n2> UNTIL <nz> TO <m>.


Diese Anweisung funktioniert genauso wie die vorhergehende mit einem Unterschied: Die Summe der Felder wird zum alten Inhalt von <m> addiert. Informationen zu weiteren hnlichen Varianten finden sich in der Schlsselwortdokumentation der ADD-Anweisung.

April 2001

159

ABAP Programmierung (BC-ABA) Arithmetische Berechnungen

SAP AG

DATA: BEGIN OF series, n1 TYPE i VALUE n2 TYPE i VALUE n3 TYPE i VALUE n4 TYPE i VALUE n5 TYPE i VALUE n6 TYPE i VALUE END OF series. DATA sum TYPE i.

10, 20, 30, 40, 50, 60,

ADD series-n1 THEN series-n2 UNTIL series-n5 GIVING sum. WRITE sum. ADD series-n2 THEN series-n3 UNTIL series-n6 TO sum. WRITE / sum.
Ausgabe 150 350 In diesem Beispiel wird der Inhalt der Komponenten N1 bis N5 addiert und dem Feld SUM zugewiesen. Dann wird der Inhalt der Komponenten N2 bis N6 summiert und zum Wert in SUM addiert.

160

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Mathematische Funktionen

Mathematische Funktionen
Als mathematischer Ausdruck oder als Teil davon knnen eine Reihe eingebauter ABAPFunktionen verwendet werden:

[COMPUTE] <n> = <func>( <m> ).


Die Leerzeichen zwischen den Klammern und dem Argument <m> sind dabei zwingend. Das Ergebnis des Aufrufs der Funktion <func> mit dem Argument <m> wird dem Ergebnisfeld <n> zugewiesen.

Funktionen fr alle numerischen Datentypen


Die folgenden eingebauten Funktionen funktionieren mit allen drei numerischen Datentypen (F, I, P) als Argument.
Funktionen fr alle numerischen Datentypen Funktion Ergebnis

ABS SIGN

Absolutwert des Arguments Vorzeichen des Arguments: -1 1 X>0 X<0 SIGN( X) = 0 falls X = 0

CEIL FLOOR TRUNC FRAC

Kleinster ganzzahliger Wert, nicht kleiner als das Argument Grter ganzzahliger Wert, nicht grer als das Argument Ganzzahliger Teil des Arguments Dezimalteil des Arguments

Das Argument dieser Funktionen mu nicht notwendigerweise einen numerischen Datentyp haben. Wenn ein anderer Typ gewhlt wird, wird er in einen numerischen Typ konvertiert. Aus Performancegrnden sollte jedoch mglichst immer der richtige Typ verwendet werden. Die Funktionen selbst haben keinen eigenen Typ und ndern die Rechengenauigkeit einer numerischen Operation also nicht.

DATA n TYPE p DECIMALS 2. DATA m TYPE p DECIMALS 2 VALUE '-5.55'. n n n n n n = = = = = = abs( m ). sign( m ). ceil( m ). floor( m ). trunc( m ). frac( m ).
5.55 1.00-

WRITE: WRITE: WRITE: WRITE: WRITE: WRITE:

/ / / / /

'ABS: ', 'SIGN: ', 'CEIL: ', 'FLOOR:', 'TRUNC:', 'FRAC: ',

n. n. n. n. n. n.

Ausgabe: ABS: SIGN:

April 2001

161

ABAP Programmierung (BC-ABA) Mathematische Funktionen

SAP AG

CEIL: FLOOR: TRUNC: FRAC:

5.006.005.000.55-

DATA: t1(10) TYPE c, t2(10) TYPE c VALUE '-100'. t1 = ABS( t2 ). WRITE t1.
Ergebnis: 100 Zwei Konvertierungen werden durchgefhrt. Zunchst wird der Inhalt des Feldes T2 (Typ C) nach Typ P konvertiert. Das System verarbeitet dann die Funktion ABS mit dem Resultat dieser Konversion. Whrend der Zuweisung zum Feld T1 (Typ C) wird das Ergebnis der Funktion wieder nach Typ C konvertiert.

Funktionen fr Gleitpunktzahlen
Die folgenden eingebauten Funktionen arbeiten mit dem Gleitpunktzahlen (Datentyp F) als Argument.
Gleitpunktfunktionen Funktion Bedeutung

ACOS, ASIN, ATAN; COS, SIN, TAN Trigonometrische Funktionen COSH, SINH, TANH EXP LOG LOG10 SQRT Hyperbolische Funktionen Exponentialfunktion zur Basis e (e=2.7182818285). Natrlicher Logarithmus zur Basis e Logarithmus zur Basis 10 Quadratwurzel

Fr alle Funktionen gelten die blichen mathematischen Einschrnkungen (z.B. Quadratwurzel nur fr positive Zahlen). Andernfalls kommt es zu einem Laufzeitfehler. Das Argument dieser Funktionen mu nicht notwendigerweise der Gleitpunktdatentyp sein. Wenn Sie einen anderen Typ whlen, wird er wie in beschrieben in den Typ F konvertiert [Seite 192]. Die Funktionen selbst haben den Datentyp F und ndern gegebenenfalls die Rechengenauigkeit einer numerischen Operation.

DATA: result TYPE f, pi(10) TYPE c VALUE '3.14159265'. result = cos( pi ).

162

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Mathematische Funktionen

WRITE result.
Das Ergebnis ist -1.00000000000000E+00. Bevor die Berechnung durchgefhrt wird, wird das Characterfeld PI automatisch in ein Feld des Typs F konvertiert.

April 2001

163

ABAP Programmierung (BC-ABA) Kaufmnnisches Rechnen

SAP AG

Kaufmnnisches Rechnen
Fr das kaufmnnische Rechnen verwendet man gepackte Zahlen. Bei Berechnungen mit gepackten Zahlen spielt das Programmattribut [Seite 79] Festpunktarithmetik eine Rolle. Wenn das Programmattribut nicht gesetzt ist, werden Felder des Typs P im ABAP-Programm als Ganzzahlen ohne Dezimalstellen interpretiert. Die Dezimalstellen, die z.B. durch den Parameter DECIMALS der TYPES- oder DATA-Anweisung festgelegt werden, wirken sich lediglich auf die Formatierung der Ausgabe auf eine Liste mit der WRITE-Anweisung aus.

DATA: pack TYPE p DECIMALS 2. pack = '12345'. WRITE pack.


Ohne das Programmattribut Festpunktarithmetik ist die Listenausgabe:
123,45

Mit dem Programmattribut Festpunktarithmetik ist die Listenausgabe:


123.45,00

Wenn das Programmattribut Festpunktarithmetik gesetzt ist, werden die Dezimalstellen auch in arithmetischen Operationen bercksichtigt. Rechenoperationen mit gepackten Zahlen erfolgen dann in ABAP genauso wie das Rechnen mit Taschenrechnern (kaufmnnisches Rechnen). Bei Zwischenergebnissen rechnet ABAP mit bis zu 31 Dezimalstellen (vor und nach dem Dezimalpunkt) Es wird deshalb empfohlen fr Berechnungen immer das Programmattribut Festpunktarithmetik bei Verwendung von Feldern des Typs P zu verwenden.

REPORT demo_data_packed_numbers . DATA: pack TYPE p DECIMALS 0. pack = 1 / 3 * 3. WRITE pack.


Ohne das Programmattribut Festpunktarithmetik ist das Ergebnis 0, da die Berechnung mit der Genauigkeit fr ganze Zahlen durchgefhrt wird und das Ergebnis der Division deshalb intern auf 0 gerundet wird. Mit dem Programmattribut Festpunktarithmetik ist das Ergebnis 1, da das Ergebnis der Division intern als 0.333333333333333333333333333333 mit einem Genauigkeitsbereich von 31 Ziffern gespeichert wird.

164

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Datums- und Zeitberechnungen

Datums- und Zeitberechnungen


Der Datentyp von Datums- und Zeitfeldern ist nicht numerisch sondern zeichenartig. Es knnen trotzdem numerische Operationen mit Datums- und Zeitfeldern durchgefhrt werden, da eine automatische Typkonvertierung [Seite 192] stattfindet. Bei Berechnungen mit Datums- und Zeitfeldern, kann auch die Adressierung von Teilfeldern [Seite 205] hilfreich sein.

Beispiel fr Datumsberechnung

DATA: ultimo TYPE d. ultimo = sy-datum. ultimo+6(2) = '01'. ultimo = ultimo - 1. " = erster Tag dieses Monats " = letzter Tag dieses Monats

In diesem Beispiel wird der letzte Tag des Vormonats dem Datumsfeld ULTIMO zugewiesen: 1. ULTIMO wird mit dem aktuellen Datum gefllt. 2. Mit einer Offset-Angabe wird der Tag auf den ersten Tag des laufenden Monats gendert. 3. Von ULTIMO wird 1 subtrahiert. Damit wird der Inhalt von ULTIMO auf den letzten Tag des Vormonats gendert. Vor Durchfhrung der Subtraktion konvertiert das System ULTIMO in die Anzahl der Tage seit 01.01.0001 und konvertiert dann das Ergebnis in ein Datum zurck.

Beispiel fr Zeitberechnung

DATA: diff TYPE i, seconds TYPE i, hours TYPE i. DATA: t1 TYPE t VALUE '200000', t2 TYPE t VALUE '020000'. diff = t2 - t1. seconds = diff MOD 86400. hours = seconds / 3600.
Die Anzahl der Stunden zwischen 02:00:00 und 20:00:00 wird errechnet. 1. Zunchst wird die Differenz zwischen den Zeitfeldern errechnet. Sie betrgt 64800, da T1 intern nach 72000 konvertiert wird und T2 nach 7200. 2. Dann wird diese negative Differenz mit der Operation MOD in die Gesamtzahl der Sekunden konvertiert. Eine positive Differenz bliebe dabei unverndert. 3. Schlielich wird die Anzahl der Stunden errechnet, indem die Anzahl der Sekunden durch 3600 geteilt wird. Die letzten drei Zeilen knnen auch durch eine Zeile ersetzt werden:

April 2001

165

ABAP Programmierung (BC-ABA) Datums- und Zeitberechnungen

SAP AG

HOURS = ( ( T2 - T1) MOD 86400) / 3600.

Invertiertes Datum
In manchen Fllen, z.B. bei der absteigenden Sortierung von Daten, ist es sinnvoll, ein Datum vom Typ D mit dem Schlsselwort CONVERT in ein invertiertes Datum umzusetzen:

CONVERT DATE <d1> INTO INVERTED-DATE <d2>.


Danach kann das invertierte Datum wieder in ein Datum zurck-konvertiert werden:

CONVERT INVERTED-DATE <d1> INTO DATE <d2>.


Diese Anweisungen konvertieren das Feld <d1> von den Formaten DATE oder INVERTEDDATE nach INVERTED-DATE bzw. DATE und weisen es dem Feld <d2> zu. Fr die Konvertierung bildet ABAP das Neunerkomplement.

DATA: odate TYPE d VALUE '19955011', idate LIKE odate. DATA field(8) TYPE c. WRITE / field. WRITE / field. WRITE / field. field = odate. field = idate. field = odate.
Listenausgabe:
19955011 80049488 19955011

CONVERT date odate INTO INVERTED-DATE idate. CONVERT INVERTED-DATE idate INTO DATE odate.

166

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Verarbeitung von Zeichenketten

Verarbeitung von Zeichenketten


ABAP enthlt eine Reihe von Anweisungen fr die Verarbeitung von Zeichenketten der Typen C, D, N und T. Das System fhrt bei diesen Operationen mit Zeichenketten keine Typkonvertierung durch. In Verbindung mit den in folgenden Abschnitten beschriebenen Anweisungen behandelt das System alle Operanden unabhngig von ihrem tatschlichen Typ als Felder des Typs C. Felder vom Typ D, N oder T sind intern wie Felder vom Typ C realisiert. Deshalb sind die Anweisungen fr alle Felder mit zeichenartigen Typen sinnvoll. Feldinhalte verschieben [Seite 168] Feldinhalte ersetzen [Seite 171] Gro-/Kleinschreibung oder Zeichen umsetzen [Seite 173] Konvertierung in ein sortierbares Format [Seite 174] Zeichenketten berlagern [Seite 175] Zeichenketten suchen [Seite 176] Feldinhalte verdichten [Seite 180] Lnge einer Zeichenkette ermitteln [Seite 179] Zeichenfolgen verketten [Seite 181] Zeichenketten zerlegen [Seite 182] Weiterhin gibt es eine Variante der MOVE-Anweisung, die nur mit Zeichenketten funktioniert: Teile von Zeichenketten zuweisen [Seite 183]

April 2001

167

ABAP Programmierung (BC-ABA) Feldinhalte verschieben

SAP AG

Feldinhalte verschieben
Um den Inhalt eines Felds zu verschieben, verwendet man die folgenden Varianten der Anweisung SHIFT. Mit SHIFT werden Feldinhalte zeichenweise verschoben.
Verschieben einer Zeichenkette um eine bestimmte Anzahl von Stellen

SHIFT <c> [BY <n> PLACES] [<mode>].


Feld <c> wird um <n> Stellen verschoben. Wenn der Zusatz BY <n> PLACES weggelassen wird, wird <n> als eins interpretiert. Wenn <n> 0 oder negativ ist, bleibt <c> unverndert. Wenn <n> die Lnge von <c> berschreitet, wird <c> mit Leerzeichen aufgefllt. <n> kann variabel sein. Mit verschiedenen Optionen <mode> kann das Feld <c> wie folgt verschoben werden:

<mode> ist LEFT:


Verschiebt den Feldinhalt um <n> Stellen nach links und ergnzt rechts <n> Leerstellen (Standardeinstellung).

<mode> ist RIGHT:


Verschiebt den Feldinhalt um <n> Stellen nach rechts und ergnzt links <n> Leerstellen.

<mode> ist CIRCULAR:


Bewirkt eine zyklische Verschiebung des Feldinhalts (verschiebt den Feldinhalt <n> Stellen nach links und verschiebt die <n> linken Stellen nach rechts.

DATA: t(10) TYPE c VALUE 'abcdefghij', string LIKE t. string = t. WRITE string. SHIFT string. WRITE / string. string = t. SHIFT string BY 3 PLACES LEFT. WRITE / string. string = t. SHIFT string BY 3 PLACES RIGHT. WRITE / string. string = t. SHIFT string BY 3 PLACES CIRCULAR. WRITE / string.
Listenausgabe:
abcdefghij bcdefghij defghij abcdefg defghijabc

168

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Feldinhalte verschieben

Verschieben des Feldinhaltes bis zu einer bestimmten Zeichenkette

SHIFT <c> UP TO <str> <mode>.


Die Anweisung durchsucht den Feldinhalt <c>, bis die Zeichenkette <str> gefunden wird und verschiebt <c>, bis <str> sich am Rand des Feldes befindet. Die Optionen (<mode>) sind dieselben wie oben. <str> kann eine Variable sein. Wenn <str> in <c> nicht gefunden wird, wird SY-SUBRC auf 4 gesetzt und <c> wird nicht verschoben. Andernfalls wird SY-SUBRC auf 0 gesetzt.

DATA: t(10) TYPE c VALUE 'abcdefghij', string LIKE t, str(2) TYPE c VALUE 'ef'. string = t. WRITE string. SHIFT string UP TO str. WRITE / string. STRING = t. SHIFT string UP TO str LEFT. WRITE / string. STRING = t. SHIFT string UP TO str RIGHT. WRITE / string. string = t. SHIFT string UP TO str CIRCULAR. WRITE / string.
Listenausgabe:
abcdefghij efghij efghij abcdef efghijabcd Verschieben einer Zeichenkette abhngig von dem ersten oder letzten Zeichen

SHIFT <c> LEFT

DELETING LEADING

<str>.

SHIFT <c> RIGHT DELETING TRAILING <str>.


Feld <c> wird nach links oder rechts verschoben, solange das linke bzw. rechte Zeichen in <str> enthalten ist. Die rechte bzw. linke Seite wird mit Leerzeichen aufgefllt. <str> kann eine Variable sein.

DATA: t(14) TYPE c VALUE ' string LIKE t, str(6) VALUE 'ghijkl'.

abcdefghij',

April 2001

169

ABAP Programmierung (BC-ABA) Feldinhalte verschieben

SAP AG

string = t. WRITE string. SHIFT string LEFT DELETING LEADING SPACE. WRITE / string. string = t. SHIFT string RIGHT DELETING TRAILING str. WRITE / string.
Listenausgabe:
abcdefghij abcdefghij abcdef

170

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Feldinhalte ersetzen

Feldinhalte ersetzen
Mit der Anweisung REPLACE werden Zeichenketten in Feldern durch andere Zeichenketten ersetzt.

REPLACE <str1> WITH <str2> INTO <c> [LENGTH <l>].


Die Anweisung sucht im Feld <c> nach dem ersten Vorkommen der ersten <l> Positionen des Suchmusters <str1>. Ist keine Lnge angegeben, so wird das Suchmuster <str1> in seiner vollen Lnge gesucht. Dann ersetzt die Anweisung das erste Vorkommen von <str1> im Feld <c> durch die Zeichenkette <str2>. Wenn eine Lnge <l> angegeben wurde, wird nur der entsprechende Teil des Suchmusters ersetzt. Wenn der Rckgabewert des Systemfeldes SY-SUBRC 0 ist, so bedeutet das, da <str1> in <c> gefunden und durch <str2> ersetzt wurde. Ein anderer Rckgabewert zeigt an, da nichts ersetzt wurde. <str1>, <str2> und <len> knnen Variablen sein.

DATA: t(10) TYPE c VALUE 'abcdefghij', string LIKE t, str1(4) TYPE c VALUE 'cdef', str2(4) TYPE c VALUE 'klmn', str3(2) TYPE c VALUE 'kl', str4(6) TYPE c VALUE 'klmnop', len TYPE i VALUE 2. string = t. WRITE string. REPLACE str1 WITH str2 INTO string. WRITE / string. string = t. REPLACE str1 WITH str2 INTO string LENGTH len. WRITE / string. string = t. REPLACE str1 WITH str3 INTO string. WRITE / string. string = t. REPLACE str1 WITH str4 INTO string. WRITE / string.
Ausgabe:
abcdefghij abklmnghij abklmnefgh abklghij abklmnopgh

April 2001

171

ABAP Programmierung (BC-ABA) Feldinhalte ersetzen

SAP AG

Das Feld STRING wird in der letzten Zeile rechts abgeschnitten wird. Das Suchmuster 'cdef' (Lnge 4) wird durch 'klmnop' (Lnge 6) ersetzt. Dann wird der Rest des Feldes STRING bis zum Ende aufgefllt.

172

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Gro-/Kleinschreibung oder Zeichen umsetzen

Gro-/Kleinschreibung oder Zeichen umsetzen


Die Anweisung TRANSLATE setzt die Gro-/Kleinschreibung von Buchstaben um oder arbeitet mit Substitutionsregeln zum Umsetzen von Zeichen.
Gro-/Kleinschreibung umsetzen

TRANSLATE <c> TO UPPER CASE. TRANSLATE <c> TO LOWER CASE.


Diese Anweisungen setzen alle Kleinbuchstaben im Feld <c> in Grobuchstaben um oder umgekehrt.
Zeichen umsetzen

TRANSLATE <c> USING <r>.


Diese Anweisung ersetzt alle Zeichen in Feld <c> gem in der Feld <r> gespeicherten Substitutionsregel. <r> enthlt Buchstabenpaare, wobei der erste Buchstabe jedes Paars durch den zweiten ersetzt wird. <r> kann eine Variable sein. Weitere Varianten der TRANSLATE-Anweisung mit komplexeren Substitutionsregeln finden sich in der Schlsselwortdokumentation.

DATA: t(10) TYPE c VALUE 'AbCdEfGhIj', string LIKE t, rule(20) TYPE c VALUE 'AxbXCydYEzfZ'. string = t. WRITE string. TRANSLATE string TO UPPER CASE. WRITE / string. string = t. TRANSLATE string TO LOWER CASE. WRITE / string. string = t. TRANSLATE string USING rule. WRITE / string.
Listenausgabe:
AbCdEfGhIj ABCDEFGHIJ abcdefghij xXyYzZGhIj

April 2001

173

ABAP Programmierung (BC-ABA) Konvertierung in ein sortierbares Format

SAP AG

Konvertierung in ein sortierbares Format


Die Anweisung CONVERT TEXT konvertiert Zeichenketten in ein alphabetisch sortierbares Format:

CONVERT TEXT <c> INTO SORTABLE CODE <sc>.


Diese Anweisung schreibt eine Zeichenkette <c> in ein sortierbares Zielfeld <sc>. Das Feld <c> mu vom Typ C und das Feld <sc> vom Typ X und mindestens 16 mal so gro wie <c> sein. Das Feld <sc> kann als alphabetischer Sortierschlssel fr <c> dienen kann. Solche Sortierungen werden auf internen Tabellen [Seite 265] und Extraktdatenbestnden [Seite 347] durchgefhrt. Bei der Sortierung unkonvertierter Zeichenketten, erstellt ABAP eine Reihenfolge, die der plattformspezifischen internen Kodierung der einzelnen Zeichen entspricht. Die Konvertierung CONVERT TEXT erstellt Zielfelder so, da die Reihenfolge der zugehrigen Zeichenketten nach der Sortierung der Zielfelder alphabetisch ist, also zum Beispiel im deutschen: 'Miller, Moller, Mller, Muller' statt 'Miller, Moller, Muller, Mller'. Nach welcher Methode konvertiert wird hngt von der Textumgebung des laufenden ABAPProgramms ab. Die Textumgebung ist im Benutzerstammsatz festgelegt, sie kann aber auch ausnahmsweise vom Programm aus gesetzt werden:

SET LOCALE LANGUAGE <lg> [COUNTRY <cy>] [MODIFIER <m>].


Diese Anweisung setzt die Textumgebung gem der Sprache <lg>. Durch den Zusatz COUNTRY kann zustzlich zur Sprache das Land spezifiziert werden, falls es fr eine Sprache lnderspezifische Unterschied gibt. Durch den Zusatz MODIFIER kann eine weitere Kennung angegeben werden, falls es in einem Land Unterschiede in der Sprache gibt, wie z.B. unterschiedliche Sortierungen in Wrter- und Telefonbchern. Die Felder <lg>, <cy> und <m> mssen vom Typ C sein und in der Lnge den Schlsselfeldern der Tabelle TCP0C entsprechen. Die Tabelle TCP0C ist eine Tabelle, in der die Textumgebung plattformabhngig gepflegt wird. Das System setzt bei der Anweisung SET LOCALE die Textumgebung entsprechend den Eintragungen in TCP0C, wobei der Tabellenschlssel mit Ausnahme der Plattformkennung in der SET-Anweisung bergeben wird. Die Plattformkennung wird implizit bergeben. Falls <lg> gleich SPACE ist, setzt die Anweisung die Textumgebung gem Benutzerstammsatz. Falls in der Tabelle kein Eintrag zum angegebenen Schlssel vorhanden ist, bricht das System die Verarbeitung mit einem Laufzeitfehler ab. Die Textumgebung beeinflut alle zeichensatzabhngigen Operationen in ABAP. Mehr Informationen zu diesem Thema findet man in der Schlsselwortdokumentation zu CONVERT TEXT und zu SET LOCALE LANGUAGE. Ein Beispiel zur alphabetischen Sortierung findet man unter Interne Tabellen sortieren [Seite 286].

174

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Zeichenketten berlagern

Zeichenketten berlagern
Die Anweisung OVERLAY berlagert eine Zeichenkette mit einer anderen:

OVERLAY <c1> WITH <c2> [ONLY <str>].


Es werden alle Stellen in Feld <c1>, die Buchstaben enthalten, die in <str> vorkommen, mit dem Inhalt von <c2> berlagert. <c2> bleibt unverndert. Wenn ONLY <str> weggelassen wird, werden alle Stellen von <c1> berschrieben, die Leerstellen enthalten. Wenn mindestens ein Zeichen in <c1> ersetzt wurde, wird SY-SUBRC auf 0 gesetzt. In allen anderen Fllen wird SY-SUBRC auf 4 gesetzt. Wenn <c1> lnger ist als <c2>, wird es nur in der Lnge von <c2> berlagert.

DATA: t(10) TYPE c VALUE 'a c e g i ', string LIKE t, over(10) TYPE c VALUE 'ABCDEFGHIJ', str(2) TYPE c VALUE 'ai'. string = t. WRITE string. WRITE / over. OVERLAY string WITH over. WRITE / string. string = t. OVERLAY string WITH over ONLY str. WRITE / string.
Listenausgabe:
a c e g i ABCDEFGHIJ aBcDeFgHiJ A c e g I

April 2001

175

ABAP Programmierung (BC-ABA) Zeichenketten suchen

SAP AG

Zeichenketten suchen
Die Anweisung SEARCH durchsucht eine Zeichenkette nach einem bestimmten Muster:

SEARCH <c> FOR <str> <options>.


Das Feld <c> wird nach der Zeichenkette in <str> durchsucht. Falls die Suche erfolgreich ist, ist der Rckgabewert 0, und SY-FDPOS wird auf den Offset der Zeichenkette im Feld <c> gesetzt. Anderenfalls wird SY-SUBRC auf 4 gesetzt. Der Suchstring <str> kann folgende Form haben:
<str> Funktion

<muster> <muster> (eine beliebige Zeichenfolge) wird gesucht. Leerzeichen am Ende werden ignoriert. .<muster>. <muster> wird gesucht. Leerzeichen am Ende werden nicht ignoriert. *<muster> Ein Wort wird gesucht, das mit <muster> endet. <muster>* Ein Wort wird gesucht, das mit <muster> beginnt. Als Trennzeichen zwischen Wrtern gelten Leerzeichen, Kommata, Punkte, Semikola, Doppelpunkte, Fragezeichen, Ausrufezeichen, Klammern, Schrgstriche, Plus - und Gleichheitszeichen. Die verschiedenen Optionen <options> der Anweisung SEARCH FOR sind:

ABBREVIATED Feld <c> wird nach einem Wort durchsucht, das die Zeichenfolge in <str> enthlt. Die Zeichen knnen durch andere Zeichen getrennt sein. Das erste Zeichen des Wortes und im String <str> mssen identisch sein.

STARTING AT <n1> Das Feld <c> wird ab Position <n1> nach <str> durchsucht. Das Ergebnis SY-FDPOS bezieht sich auf den Offset zu <n1>, nicht auf den Anfang des Feldes.

ENDING AT <n2> Feld <c> wird bis Position <n2> nach <str> durchsucht. AND MARK Wenn der Suchstring gefunden wird, werden alle Zeichen des Suchstrings (und alle dazwischen liegenden Zeichen bei Verwendung von ABBREVIATED) in Grobuchstaben umgesetzt.

DATA string(30) TYPE c VALUE 'This is a little sentence.'. WRITE: / 'Searched', 'SY-SUBRC ', 'SY-FDPOS'. ULINE /1(26). SEARCH string FOR 'X'. WRITE: / 'X', sy-subrc UNDER 'SY-SUBRC', sy-fdpos UNDER 'SY-FDPOS'

176

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Zeichenketten suchen

SEARCH string FOR 'itt '. WRITE: / 'itt ', sy-subrc UNDER 'SY-SUBRC', sy-fdpos UNDER 'SY-FDPOS' SEARCH string FOR '.e .'. WRITE: / '.e .', sy-subrc UNDER 'SY-SUBRC', sy-fdpos UNDER 'SY-FDPOS'. SEARCH string FOR '*e'. WRITE: / '*e ', sy-subrc UNDER 'SY-SUBRC', sy-fdpos UNDER 'SY-FDPOS'. SEARCH string FOR 's*'. WRITE: / 's* ', sy-subrc UNDER 'SY-SUBRC', sy-fdpos UNDER 'SY-FDPOS'.
Listenausgabe:
SEARCHED SY-SUBRC SY-FDPOS X itt .e . *e s* 4 0 0 0 0 0 11 15 10 17

DATA: TYPE c (30) TYPE c VALUE 'This is a fast first example.', pos TYPE i, off TYPE i. WRITE / string. SEARCH string FOR 'ft' ABBREVIATED. WRITE: / 'SY-FDPOS:', sy-fdpos. pos = sy-fdpos + 2. SEARCH string FOR 'ft' ABBREVIATED STARTING AT pos AND MARK. WRITE / string. WRITE: / 'SY-FDPOS:', sy-fdpos. off = pos + sy-fdpos -1. WRITE: / 'Off:', off.
Listenausgabe:
This is a fast first example. SY-FDPOS: SY-FDPOS: Off: 10 4 15 This is a fast FIRST example.

Es ist hier zu beachten, da zum Offset SY-FDPOS 2 addiert werden mu und die Suche an dieser Position POS begonnen werden mu, um nach Auffinden des

April 2001

177

ABAP Programmierung (BC-ABA) Zeichenketten suchen

SAP AG

Wortes 'fast' das zweite Wort zu finden, das 'ft' enthlt. Andernfalls wrde das Wort 'fast' erneut gefunden. Der Offset von 'first' bezogen auf den Anfang des Feldes STRING wird aufgrund von POS und SY-FDPOS errechnet.

178

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Lnge einer Zeichenkette ermitteln

Lnge einer Zeichenkette ermitteln


Die eingebaute Funktion STRLEN ermittelt die Lnge einer Zeichenkette bis zum letzten Nichtleerzeichen:

[COMPUTE] <n> = STRLEN( <c> ).


STRLEN verarbeitet einen beliebigen Operanden <c> als Character-Datentyp unabhngig vom tatschlichen Typ. Konvertierungen finden nicht statt. Das Schlsselwort COMPUTE ist wie bei den mathematischen Funktionen [Seite 161] optional.

DATA: int TYPE i, word1(20) TYPE c VALUE '12345'. word2(20) TYPE c. word3(20) TYPE c VALUE ' 4 int = strlen( word1 ). WRITE int. int = strlen( word2 ). WRITE / int. int = strlen( word3 ). WRITE / int.
Die Ergebnisse sind 5, 0 bzw. 4.

'.

April 2001

179

ABAP Programmierung (BC-ABA) Feldinhalte verdichten

SAP AG

Feldinhalte verdichten
Die Anweisung CONDENSE lscht berflssige Leerzeichen in Zeichenketten:

CONDENSE <c> [NO-GAPS].


Es werden fhrende Leerzeichen im Feld <c> entfernt und andere Leerzeichenfolgen durch genau ein Leerzeichen ersetzt. Das Ergebnis ist eine linksbndige Folge von Wrtern, die durch Leerzeichen voneinander getrennt sind. Der Zusatz NO-GAPS bewirkt, da alle Leerzeichen entfernt werden.

DATA: string(25) TYPE c VALUE ' one len TYPE I. len = strlen( string ). WRITE: string, '!'. WRITE: / 'Length: ', len. CONDENSE string. len = strlen( string ). WRITE: string, '!'. WRITE: / 'Length: ', len. CONDENSE string NO-GAPS. len = strlen( string ). WRITE: string, '!'. WRITE: / 'Length: ', len.
Listenausgabe:
one two three 25 ! ! 15 18 four ! Length: Length: onetwothreefour Length:

two

three

four',

one two three four

Es ist zu beachten, da die Gesamtlnge des Feldes STRING unverndert bleibt (Ausrufezeichen!) und die entfernten Leerzeichen rechts wieder eingesetzt werden.

180

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Zeichenfolgen verketten

Zeichenfolgen verketten
Die Anweisung CONCATENATE verkettet getrennte Zeichenfolgen zu einer Zeichenfolge:

CONCATENATE <c1> ... <cn> INTO <c> [SEPARATED BY <s>].


Die Felder <c1> bis <cn> werden verkettet und <c> zugewiesen. Leerzeichen am Ende der einzelnen Zeichenfolgen werden bei dieser Operation ignoriert. Mit dem Zusatz SEPARATED BY <s> kann eine Zeichenkette <s> angegeben werden, die in ihrer Lnge zwischen die einzelnen Felder eingefgt wird. Wenn das Ergebnis in <c> pat, wird SY-SUBRC auf 0 gesetzt. Falls das Ergebnis abgeschnitten wird, wird SY-SUBRC auf 4 gesetzt.

DATA: c1(10) c2(3) c3(5) c4(10) c5(30) sep(3)

TYPE TYPE TYPE TYPE TYPE TYPE

c VALUE 'Sum', c VALUE 'mer', c VALUE 'holi ', c VALUE 'day', c, c VALUE ' - '.

CONCATENATE c1 c2 c3 c4 INTO c5. WRITE c5. CONCATENATE c1 c2 c3 c4 INTO c5 SEPARATED BY sep. WRITE / c5.
Listenausgabe:
Summerholiday Sum - mer - holi - day

In C1 bis C5 werden die Leerzeichen am Ende ignoriert, whrend sie in der Trennzeichenfolge SEP erhalten bleiben.

April 2001

181

ABAP Programmierung (BC-ABA) Zeichenketten zerlegen

SAP AG

Zeichenketten zerlegen
Die Anweisung SPLIT zerlegt eine Zeichenkette in zwei oder mehrere Zeichenketten:

SPLIT <c> AT <del> INTO <c1> ... <cn>.


Das Feld <c> wird nach den Trennzeichen <del> durchsucht. Die Teile vor und nach den Trennzeichen werden in die Zielfelder <c1> ... <cn> gestellt. Um alle Teile in verschiedene Zielfelder stellen zu knnen, bentigt man eine ausreichende Anzahl von Zielfeldern. Anderenfalls wird das letzte Zielfeld mit dem Rest des Feldes <c> gefllt und enthlt auch noch Trennzeichen. Wenn alle Zielfelder so lang sind, das kein Teil abgeschnitten werden mu, wird SY-SUBRC auf 0 gesetzt, sonst auf 4.

DATA: string(60) TYPE c, p1(20) TYPE c VALUE p2(20) TYPE c VALUE p3(20) TYPE c VALUE p4(20) TYPE c VALUE del(3) TYPE c VALUE WRITE string.

'++++++++++++++++++++', '++++++++++++++++++++', '++++++++++++++++++++', '++++++++++++++++++++', '***'.

string = ' Part 1 *** Part 2 *** Part 3 *** Part 4 *** Part 5'.

SPLIT string AT del INTO p1 p2 p3 p4. WRITE WRITE WRITE WRITE / / / / p1. p2. p3. p4.

Ausgabe:
Part 1 *** Part 2 *** Part 3 *** Part 4 *** Part 5 Part 1 Part 2 Part 3 Part 4 *** Part 5

Der Inhalt der Felder P1 ...P4 wird vollstndig berschrieben und die Felder werden am Ende mit Leerzeichen aufgefllt. Eine Zeichenkette kann auch in die Zeilen einer internen Tabelle zerlegt werden:

SPLIT <c> AT <del> INTO TABLE <itab>.


Die Anweisung fgt fr jeden Teil der Zeichenkette der Tabelle <itab> eine neue Tabellenzeile hinzu.

182

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Zeichenketten zerlegen

Teile von Zeichenketten zuweisen


Die folgende Variante der MOVE-Anweisung funktioniert nur bei Feldern des Typs C:

MOVE <c1> TO <c2> PERCENTAGE <p> [RIGHT].


Der Prozentsatz <p> des Feldes <c1> wird von der linken Seite links- oder rechtsbndig (falls mit der Option RIGHT angegeben) nach <c2> kopiert. Der Wert von <p> kann eine Zahl zwischen 0 und 100 sein. Die von <f1> zu kopierende Lnge wird auf die nchste Ganzzahl auf- oder abgerundet. Wenn eines der Argumente der Anweisung nicht den Typ C hat, wird der Parameter PERCENTAGE ignoriert.

DATA c1(10) TYPE c VALUE 'ABCDEFGHIJ', c2(10) TYPE c. MOVE c1 TO c2 PERCENTAGE 40. WRITE c2. MOVE c1 TO c2 PERCENTAGE 40 RIGHT. WRITE / c2.
Listenausgabe:
ABCD ABCD

April 2001

183

ABAP Programmierung (BC-ABA) Einzelbitverarbeitung in Hexadezimalfeldern

SAP AG

Einzelbitverarbeitung in Hexadezimalfeldern
In Hexadezimalfeldern vom Typ X knnen einzelne Bits verarbeitet werden. ABAP interpretiert den Inhalt von Hexadezimalfeldern byteweise. Ein Hexadezimalfeld der Lnge n besteht aus n Bytes und hat in ABAP eine Darstellungslnge von 2n. Der dezimale Wertebereich 0 bis 225 eines Bytes wird in der hexadezimalen Darstellung durch die Zeichen '00' bis 'FF' ausgedrckt.

181 181

...

Dezimaler Wert in Bytefolge

10110101 10110101

Binrdarstellung eine Bytes

B5 B5

Hexadezimaldarstellung

Die Abbildung zeigt, wie ein Byte einer Bytefolge mit dem dezimalen Wert 181 hexadezimal dargestellt wird. Die ersten vier Bit haben den dezimalen Wert 11, die zweiten vier Bit haben den dezimalen Wert 5. Daraus folgt die Hexadezimaldarstellung des Bytes zu 'B5', entsprechend 1116+5=181. ABAP hat Anweisungen, mit der einzelne Bits eines Felds vom Typ X gesetzt und gelesen werden knnen und erlaubt Bitoperationen zwischen Feldern vom Typ X. In logischen Ausdrcken gibt es weiterhin spezielle Operatoren fr Vergleiche von Bitfolgen [Seite 247]. Die Verarbeitung von Bitfolgen ermglicht die effiziente Verarbeitung komplexer Bedingungen und Mengenoperationen. Bits setzen und lesen [Seite 185] Bitoperationen [Seite 187] Mengenoperationen mit Bitfolgen [Seite 189]

184

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Bits setzen und lesen

Bits setzen und lesen


In Hexadezimalfeldfern vom Typ X knnen einzelne Bits gesetzt und ausgelesen werden.

Bits setzen
Zum Setzen eines einzelnen Bits verwendet man die Anweisung SET BIT <n> OF <f> [TO <b>]. Diese Anweisung setzt das Bit an der Stelle <n> des Felds <f> auf 1 bzw. auf den Wert des Felds <b>. Das Feld <n> mu als positive ganze Zahl interpretierbar sein. Das Feld <f> mu den Datentyp X haben. Das Feld <b> mu den Inhalt 0 oder 1 haben. Falls das Bit gesetzt werden kann, wird SY-SUBRC auf Null gesetzt. Falls der Inhalt von <n> grer als die Lnge von <f> ist, ist SY-SUBRC ungleich Null. Bei ungltigen Werten von <n> und <b> treten Laufzeitfehler auf.

DATA hex(3) TYPE x. SET BIT: 09 10 11 12 13 14 15 16 WRITE hex.


Die Bits des zweiten Bytes im dreistelligen Hexadezimalfeld HEX werden auf '10110101' gesetzt und die Listenausgabe ist wie folgt:
00B500

OF OF OF OF OF OF OF OF

hex hex hex hex hex hex hex hex

TO TO TO TO TO TO TO TO

1, 0, 1, 1, 0, 1, 0, 1.

Der dezimale Wert des zweiten Bytes ist 181.

Bits lesen
Zum Lesen eines einzelnen Bits verwendet man die Anweisung GET BIT <n> OF <f> INTO <b>. Diese Anweisung liest das Bit an der Stelle <n> des Felds <f> in das Feld <b>. Das Feld <n> mu als positive ganze Zahl interpretierbar sein. Das Feld <f> mu den Datentyp X haben. Falls das Bit gelesen werden kann, wird SY-SUBRC auf Null gesetzt. Falls der Inhalt von <n> grer als die Lnge von <f> ist, ist SY-SUBRC ungleich Null und <b> wird auf Null gesetzt. Bei ungltigen Werten von <n> tritt ein Laufzeitfehler auf.

DATA: hex(1) TYPE x VALUE 'B5', b(1) TYPE n. DO 8 TIMES. GET BIT sy-index OF hex INTO b.

April 2001

185

ABAP Programmierung (BC-ABA) Bits setzen und lesen

SAP AG

WRITE b NO-GAP. ENDDO.


Hier werden die acht Bits des einstelligen Hexadezimalfelds HEX vom Wert 'B5' ausgelesen und wie folgt ausgegeben:
10110101

186

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Bitoperationen

Bitoperationen
Bitoperationen werden hnlich wie numerische Operationen [Seite 156] ausgefhrt. Entweder mit der Anweisung: COMPUTE <x> = <bitexp>. oder ohne das optionale Schlsselwort COMPUTE mit der Anweisung: <x> = <bitexp>. Hierbei ist <bitexp> einer der folgenden Bitausdrcke:
Bitausdruck Bedeutung

BIT-NOT <y> <y> BIT-AND <z> <y> BIT-XOR <z> <y> BIT-OR <z>

Negation Und Exklusiv-Oder Oder

Die Operanden <y> und <z> werden bitweise mit obigen Bitoperatoren verknpft und das Ergebnis in das Ergebnisfeld <x> gestellt. Sowohl Ergebnisfeld <x> als auch die Operanden <y> und <z> mssen vom Typ X sein. Bei unterschiedlichen Feldlngen, werden alle Operanden auf die Feldlnge des Ergebnisfelds <x> konvertiert [Seite 194]. Fr die bitweise Verknpfung gelten folgende Regeln fr die einzelnen Bitoperatoren: <y> 0 0 1 1 <z> 0 1 0 1 BIT-NOT <y> 1 1 0 0 <y> BIT-AND <z> 0 0 0 1 <y> BIT-XOR <z> 0 1 1 0 <y> BIT-XOR <z> 0 1 1 1

Bitausdrcke sind wie mathematische Ausdrcke durch Klammern schachtelbar.

DATA: hex1(1) TYPE x VALUE 'B5', hex2(1) TYPE x VALUE '5B', hex3(1) TYPE x. hex3 = BIT-NOT ( hex1 BIT-XOR hex2 ). WRITE hex3.
Die Listenausgabe ist:
11

Die Bitoperation verluft wie in folgender Abbildung gezeigt:

April 2001

187

ABAP Programmierung (BC-ABA) Bitoperationen

SAP AG

HEX1

B5 B5 EE EE 1 1 1 1 HEX3

HEX2 Hexadezimal

5B 5B

BIT-XOR HEX1 10110101 10110101

BIT-NOT

11101110 11101110 HEX2 Binr 01011011 01011011

0 0 0 1 0 0 0 1 HEX3 00010001

188

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Mengenoperationen mit Bitfolgen

Mengenoperationen mit Bitfolgen


Ausgehend von einer Grundmenge von m Elementen, lt sich jede Teilmenge der Grundmenge als Bitfolge von m Bits darstellen. Wenn das n-te Element der Grundmenge in einer Teilmenge vorhanden ist, wird das Bit an der Stelle n auf Eins ansonsten auf Null gesetzt. Die Grundmenge selbst enthlt also nur Einsen. In ABAP kann man eine Menge von m Elementen durch ein Feld des Datentyps X darstellen, dessen Lnge mindestens m/8 sein mu. Mit der Anweisung SET BIT kann man ein Element der Grundmenge in die Menge aufnehmen. Mit der Anweisung GET BIT kann man berprfen, welche Elemente der Grundmenge in der Menge enthalten sind. Folgende Mengenoperationen lassen sich durch Bitoperationen durchfhren:
Mengenoperation Bitoperation

Durchschnitt Vereinigung Symmetrische Differenz

BIT-AND BIT-OR BIT-XOR

Mit dem Operator O beim Vergleich zwischen Bitfolgen [Seite 247] lt sich weiterhin feststellen, ob eine Menge Obermenge einer anderen Menge ist.

REPORT demo_data_bit. DATA: frankfurt(4) frisco(4) intersect(4) union(4) bit TYPE TYPE TYPE TYPE TYPE x, x, x, x, i.

DATA: carrid TYPE spfli-carrid, carrier LIKE SORTED TABLE OF carrid WITH UNIQUE KEY table_line. DATA wa TYPE spfli. SELECT carrid FROM scarr INTO TABLE carrier. SELECT carrid cityfrom FROM spfli INTO CORRESPONDING FIELDS OF wa. WRITE: / wa-carrid, wa-cityfrom. READ TABLE carrier FROM wa-carrid TRANSPORTING NO FIELDS. CASE wa-cityfrom. WHEN 'FRANKFURT'. SET BIT sy-tabix OF frankfurt. WHEN 'SAN FRANCISCO'. SET BIT sy-tabix OF frisco. ENDCASE. ENDSELECT. intersect = frankfurt BIT-AND frisco. union = frankfurt BIT-OR frisco.

April 2001

189

ABAP Programmierung (BC-ABA) Mengenoperationen mit Bitfolgen

SAP AG

SKIP. WRITE 'Airlines flying from Frankfurt and San Francisco:'. DO 32 TIMES. GET BIT sy-index OF intersect INTO bit. IF bit = 1. READ TABLE carrier INDEX sy-index INTO carrid. WRITE carrid. ENDIF. ENDDO. SKIP. WRITE 'Airlines flying from Frankfurt or San Francisco:'. DO 32 TIMES. GET BIT sy-index OF union INTO bit. IF bit = 1. READ TABLE carrier INDEX sy-index INTO carrid. WRITE carrid. ENDIF. ENDDO.
Die Ausgabeliste sieht z.B. so aus:

Das Programm arbeitet mit vier Hexadezimalfeldern der Lnge 4, nmlich FRANKFURT, FRISCO, INTERSECT und UNION. Diese Felder knnen Mengen mit maximal 32 Elementen darstellen. Die Grundmenge soll hier die Menge aller

190

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Mengenoperationen mit Bitfolgen

mglichen Fluggesellschaften aus der Datenbanktabelle SCARR sein. Jedes Bit der entsprechenden Bitfolgen soll eine Fluggesellschaft reprsentieren. Zur Indizierung der Fluggesellschaften wird die interne Indextabelle CARRIER angelegt und mit den Krzeln der Fluggesellschaften aus SCARR gefllt. Die Identifizierung einer Fluggesellschaft erfolgt ber den internen Index der Tabelle CARRIER. In der SELECT-Schleife ber die Datenbanktabelle SPFLI wird je nach Abflugort entweder im Feld FRANKFURT oder FRISCO das Bit an der Position gesetzt, da der Zeilennummer der Fluggesellschaft in der Tabelle CARRIER entspricht. Die Zeilennummer SY-TABIX wird hierzu mit einer READ-Anweisung, bei der keine sonstigen Felder transportiert werden, festgestellt. Durch die Bitoperationen BIT-AND und BIT-OR werden Schnitt- und Vereinigungsmenge aus FRANKFURT und FRISCO gebildet. In zwei DO-Schleifen werden die Bits von INTERSECT und UNION einzeln gelesen und ausgewertet. Dabei werden zu jeder gesetzten Position die Krzel der Fluggesellschaften mit einer READ-Anweisung aus der Tabelle CARRIER geholt.

April 2001

191

ABAP Programmierung (BC-ABA) Typkonvertierungen

SAP AG

Typkonvertierungen
Die Voraussetzung fr jede Wertzuweisung von einem Datenobjekt zu einer Variable ist, da die beteiligten Datentypen entweder kompatibel [Seite 138] sind, d.h. sie stimmen in allen technischen Eigenschaften (Datentyp, Feldlnge, Anzahl der Dezimalstellen) berein, oder da der Datentyp des Quellfelds in den Datentyp des Zielfelds konvertierbar ist. In ABAP sind zwei nicht kompatible Datentypen ineinander konvertierbar, wenn eine entsprechende Konvertierungsregel definiert ist. Keine Konvertierungsregel ist fr kompatible Datentypen erforderlich.

Kompatible Felder Kopie Kopie

MOVE MOVE

Konvertierbare Felder

MOVE MOVE

Konvertierungsregel Konvertierungsregel

Bei jeder MOVE-Anweisung wird bei kompatiblen Datenobjekten der Inhalt des Quellfelds byteweise in das Zielfeld kopiert. Bei nichtkompatiblen Datenobjekten wird der Inhalt des Quellfelds in den Datentyp des Zielobjekts konvertiert. Die Typkonvertierung ist zeitaufwendiger als eine Kopie. Bei allen anderen ABAP-Operationen, die Wertzuweisungen zwischen Datenobjekten vornehmen (z.B. arithmetische Operationen oder das Fllen interner Tabellen) behandelt das System alle erforderlichen Typkonvertierungen wie bei der MOVE-Anweisung. Falls die Datentypen zweier Felder nicht konvertierbar sind und es wird versucht, den Inhalt des einen Feldes dem anderen zuzuweisen, kommt es zu einem Syntax- oder Laufzeitfehler. Die folgenden Abschnitte enthalten die Konvertierungsregeln zwischen nicht kompatiblen Datentypen in ABAP: Konvertierungsregeln fr elementare Datentypen [Seite 194] Konvertierungsregeln fr Referenzen [Seite 200] Konvertierungsregeln fr Strukturen [Seite 201] Konvertierungsregeln fr interne Tabellen [Seite 203]

192

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Typkonvertierungen

Bei einigen ABAP-Anweisungen, die Daten zwischen verschiedenen Objekten bergeben, spielt auch die Ausrichtung der Datenobjekte eine Rolle. Ausrichtung von Datenobjekten [Seite 204]

April 2001

193

ABAP Programmierung (BC-ABA) Konvertierungsregeln fr elementare Datentypen

SAP AG

Konvertierungsregeln fr elementare Datentypen


ABAP enthlt zehn eingebaute ABAP-Typen. Insgesamt gibt es 100 mgliche Typkonstellationen zwischen diesen elementaren Datentypen. ABAP untersttzt die automatische Typkonvertierung und Lngenanpassung fr alle diese Typen mit Ausnahme der Typen D (Datum) und T (Zeit), die nicht ineinander konvertierbar sind. Die folgenden Konvertierungstabellen definieren die Regeln fr die Konvertierung bei Zuweisungen zwischen elementaren Datentypen fr alle mglichen Kombinationen von Quellund Zielfeldern. C D F I N P STRING T X XSTRING

Quelltyp Characterfeld
Konvertierungstabelle fr Quelltyp C Ziel Konvertierung

Das Zielfeld wird linksbndig gefllt. Wenn das Feld zu lang ist, wird es von rechts mit Leerzeichen aufgefllt. Wenn es zu kurz ist, wird der Inhalt rechts abgeschnitten. Das Characterfeld sollte ein 8-stelliges Datum im Format JJJJMMTT enthalten. Der Inhalt des Quellfelds sollte eine zulssige Darstellung eines Feldes des Typs F sein wie in Literale beschrieben. Nur die Ziffern im Quellfeld werden bertragen. Sie werden nach rechts zusammengeschoben und links mit Nullen aufgefllt. Das Quellfeld mu die Darstellung einer Dezimalzahl enthalten, also eine Folge von Ziffern mit optionalem Vorzeichen, die hchstens einen Dezimalpunkt enthlt. Im Quellfeld drfen auch Leerzeichen stehen. Wenn das Zielfeld zu kurz ist, kann es zu einem berlauf und damit zu einem Abbruch kommen.

D F N I, P

STRING Der belegte Inhalt des Quellfelds wird bertragen. Dabei werden alle rechtsstehenden Leerzeichen abgeschnitten. T X Das Characterfeld mu eine sechsstellige Zahl in der Form HHMMSS enthalten. Da das Characterfeld eine hexadezimale Zeichenkette enthalten sollte, sind nur die Zeichen 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F erlaubt. Diese Zeichenkette wird als Hexadezimalzahl gepackt, linksbndig bertragen und rechts mit Nullen aufgefllt oder abgeschnitten.

XSTRING Wie bei Zielfeldern vom Typ X, wobei aber das Auffllen mit Nullen entfllt.

Quelltyp Datum
Konvertierungstabelle fr Quelltyp D Ziel Konvertierung

194

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Konvertierungsregeln fr elementare Datentypen

C D F N I, P

Das Datum wird linksbndig ohne Konvertierung bertragen. bertragung ohne Konvertierung. Das Datum wird in eine gepackte Zahl konvertiert. Die gepackte Zahl wird anschlieend in eine Gleitpunktzahl konvertiert (s. entsprechende Tabellen). Das Datum wird in ein Characterfeld konvertiert. Das Characterfeld wird anschlieend in ein numerisches Textfeld konvertiert (s. entsprechende Tabellen). Das Datum wird in die Anzahl der Tage seit 01.01.0001 konvertiert.

STRING Das Datum wird in ein Characterfeld konvertiert und das Characterfeld wird dann in eine Zeichenfolge konvertiert. T X Nicht untersttzt. Fhrt zu einer Fehlermeldung whrend des Syntaxchecks oder zu einem Laufzeitfehler. Das Datum wird in die Anzahl der Tage seit dem 01.01.0001 in hexadezimaler Darstellung konvertiert.

XSTRING Wie bei Zielfeldern vom Typ X, wobei aber nur die signifikanten Bytes bernommen werden.

Quelltyp Gleitpunktzahl
Konvertierungstabelle fr Quelltyp F Ziel Konvertierung

Die Gleitpunktzahl wird in der Form <Mantisse>E<Exponent> aufbereitet und in das Characterfeld bertragen. Der Wert der Mantisse liegt zwischen 1 und 10, es sei denn, die Zahl ist Null. Der Exponent hat immer ein Vorzeichen. Ist das Zielfeld zu kurz, so wird die Mantisse gerundet. Die Lnge des Characterfeldes sollte mindestens 6 Bytes sein. Das Quellfeld wird in eine gepackte Zahl konvertiert. Dann wird die gepackte Zahl in ein Datumsfeld konvertiert (s. entsprechende Tabellen). bertragung ohne Konvertierung. Das Quellfeld wird in eine gepackte Zahl konvertiert. Dann wird die gepackte Zahl in ein numerisches Textfeld konvertiert (s. entsprechende Tabellen). Die Gleitpunktzahl wird in in einen ganzzahligen Wert oder Festpunktwert konvertiert und bei Bedarf gerundet.

D F N I, P

STRING Wie bei Zielfeld C, wobei fr die Mantisse aber immer die maximale Anzahl von Stellen (Genauigkeit) verwendet wird. Durch unterschiedliche Vorzeichen oder Exponenten knnen sich aber dennoch unterschiedliche Stringlngen ergeben. T X Das Quellfeld wird in eine gepackte Zahl konvertiert. Dann wird die gepackte Zahl in ein Zeitfeld konvertiert (s. entsprechende Tabellen). Das Quellfeld wird in eine gepackte Zahl konvertiert. Dann wird die gepackte Zahl in eine hexadezimale Zahl konvertiert (s. entsprechende Tabellen).

XSTRING Wie Zielfeld X, wobei aber keine fhrenden Null-Bytes bernommen werden.

April 2001

195

ABAP Programmierung (BC-ABA) Konvertierungsregeln fr elementare Datentypen

SAP AG

Quelltyp Integer
Typ I wird immer wie Typ P ohne Dezimalstellen behandelt. Wenn Typ P erwhnt wird, gilt also die gleiche Behandlung fr Felder des Typs I.

Quelltyp Numerischer Text


Konvertierungstabelle fr Quelltyp N Ziel Konvertierung

C D F N I, P

Das numerische Feld wird wie ein Characterfeld behandelt. Fhrende Nullen bleiben erhalten. Das numerische Feld wird in ein Characterfeld konvertiert. Dann wird das Characterfeld in ein Datumsfeld konvertiert (s. entsprechende Tabellen). Das numerische Feld wird in eine gepackte Zahl konvertiert. Dann wird die gepackte Zahl in eine Gleitpunktzahl konvertiert (s. entsprechende Tabellen). Das numerische Feld wird rechtsbndig bertragen, mit Nullen aufgefllt oder links abgeschnitten. Das numerische Feld wird als Zahl interpretiert und rechtsbndig mit positivem Vorzeichen bertragen. Ist das Zielfeld zu kurz, kann es zu einem Abbruch kommen.

STRING Wie Zielfeld C. Die Lnge der Zeichenfolge entspricht der Lnge des numerischen Texts. T X Das numerische Feld wird in ein Characterfeld konvertiert. Dann wird das Characterfeld in ein Zeitfeld konvertiert (s. entsprechende Tabellen). Das numerische Feld wird in eine gepackte Zahl konvertiert. Dann wird die gepackte Zahl in eine hexadezimale Zahl konvertiert (s. entsprechende Tabellen).

XSTRING Wie Zielfeld X, wobei aber keine fhrenden Null-Bytes bernommen werden.

Quelltyp Gepackte Zahl


Wenn das Programmattribut Festpunktarithmetik fr ein Programm gesetzt ist, rundet das System Felder des Typs P entsprechend der Anzahl der Dezimalstellen oder fllt sie mit Nullen auf.
Konvertierungstabelle fr Quelltyp P Ziel Konvertierung

196

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Konvertierungsregeln fr elementare Datentypen

Das gepackte Feld wird rechtsbndig in das Characterfeld bertragen, bei Bedarf mit einem Dezimalpunkt. Die letzte Stelle ist fr das Vorzeichen reserviert. Fhrende Nullen erscheinen als Leerzeichen. Ist das Zielfeld zu kurz, wird das Vorzeichen fr positive Zahlen weggelassen. Falls das nicht ausreicht, wird das Feld links abgeschnitten. Das wird durch einen Stern (*) angezeigt. Wenn die fhrenden Nullen im Characterfeld erscheinen sollen, verwenden Sie die Anweisung UNPACK anstelle von MOVE. Der gepackte Feldwert wird als die Anzahl von Tagen seit 01.01.0001 betrachtet und wird in ein Datum des Formats JJJJMMTT konvertiert. Das gepackte Feld wird als Gleitpunktzahl betrachtet und bertragen. Das gepackte Feld wird ggf. gerundet, entpackt und rechtsbndig bertragen. Das Vorzeichen wird weggelassen. Falls erforderlich, wird das Zielfeld mit links mit Nullen aufgefllt. Das gepackte Feld wird rechtsbndig bertragen. Ist das Zielfeld zu kurz, kommt es zu einem berlauf. Der gepackte Feldwert wird als die Anzahl der Sekunden seit Mitternacht betrachtet und wird in eine Zeit im Format HHMMSS konvertiert. Das gepackte Feld wird ggf. gerundet und dann in eine Hexadezimalzahl konvertiert. Negative Zahlen werden durch das Zweierkomplement dargestellt. Ist das Zielfeld zu kurz, wird die Zahl links abgeschnitten.

D F N

I, P

STRING Wie Zielfeld C, wobei aber keine fhrenden Leerzeichen erzeugt werden. T X

XSTRING Wie Zielfeld X, wobei aber keine fhrenden Null-Bytes erzeugt werden.

Quelltyp Zeichenfolge
Konvertierungstabelle fr Quelltyp STRING Ziel Konvertierung

Das Zielfeld wird linksbndig gefllt. Wenn das Zielfeld lnger als die Zeichenfolge ist, wird es von rechts mit Leerzeichen aufgefllt. Wenn es zu kurz ist, wird der Inhalt rechts abgeschnitten. Die Zeichenfolge sollte ein 8-stelliges Datum im Format JJJJMMTT enthalten. Der Inhalt der Zeichenfolge sollte eine zulssige Darstellung eines Feldes des Typs F sein wie in Literale beschrieben. Nur die Ziffern in der Zeichenolge werden bertragen. Sie werden nach rechts zusammengeschoben und links mit Nullen aufgefllt. Ist das Zielfeld zu kurz, wird links abgeschnitten. Die Zeichenfolge mu die Darstellung einer Dezimalzahl enthalten, also eine Folge von Ziffern mit optionalem Vorzeichen, die hchstens einen Dezimalpunkt enthlt. Im Quellfeld drfen auch Leerzeichen stehen. Wenn das Zielfeld zu kurz ist, kann es zu einem berlauf und damit zu einem Abbruch kommen.

D F N

I, P

STRING Die Quellzeichenfolge wird unkonvertiert in die Zielzeichenfolge bertragen.

April 2001

197

ABAP Programmierung (BC-ABA) Konvertierungsregeln fr elementare Datentypen

SAP AG

T X

Die Zeichenfolge mu eine sechsstellige Zahl in der Form HHMMSS enthalten. Das Quellfeld sollte eine hexadezimale Zeichenfolge sein, dien nur die Zeichen 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F enthlt. Diese Zeichenfolge wird als Hexadezimalzahl gepackt, linksbndig bertragen und rechts mit Nullen aufgefllt oder abgeschnitten.

XSTRING Wie Zielfeld X, wobei das Auffllen mit Nullen entfllt.

Quelltyp Zeit
Konvertierungstabelle fr Quelltyp T Ziel Konvertierung

C D F N I, P

Der Inhalt wird linksbndig ohne Konvertierung bertragen. Nicht untersttzt. Fhrt zu einer Fehlermeldung beim Syntaxcheck oder einem Laufzeitfehler. Die Zeit wird in eine gepackte Zahl konvertiert. Dann wird die gepackte Zahl in eine Gleitpunktzahl konvertiert (s. entsprechende Tabellen). Das Datum wird in ein Characterfeld konvertiert. Dann wird das Characterfeld in ein numerisches Textfeld konvertiert (s. entsprechende Tabellen). Das Datum wird in die Anzahl der Sekunden seit Mitternacht konvertiert.

STRING Die Zeit wird in ein Characterfeld konvertiert und das Characterfeld wird dann in eine Zeichenfolge konvertiert. T X bertragung ohne Konvertierung. Das Datum wird in die Anzahl der Sekunden seit Mitternacht in hexadezimaler Darstellung konvertiert.

XSTRING Wie bei Zielfeldern vom Typ X, wobei aber nur die signifikanten Bytes bernommen werden.

Quelltyp Hexadezimalfeld
Konvertierungstabelle fr Quelltyp X Ziel Konvertierung

C D F N

Der Wert im hexadezimalen Feld wird in eine hexadezimale Zeichenkette konvertiert, linksbndig ins Zielfeld bertragen und mit "0" aufgefllt. Der Wert des Quellfeldes wird als die Anzahl von Tagen seit 01.01.0001 betrachtet und wird in ein Datum des Formats YYYYMMDD konvertiert. Das Quellfeld wird in eine gepackte Zahl konvertiert. Dann wird die gepackte Zahl in eine Gleitpunktzahl konvertiert (s. entsprechende Tabellen). Das Quellfeld wird in eine gepackte Zahl konvertiert. Dann wird die gepackte Zahl in ein numerisches Textfeld konvertiert (s. entsprechende Tabellen).

198

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Konvertierungsregeln fr elementare Datentypen

I, P

Der Wert des Quellfeldes wird als hexadezimale Zahl betrachtet. Er wird in eine gepackte Dezimalzahl konvertiert und dann rechtsbndig in das Zielfeld bertragen. Wenn das hexadezimale Feld lnger ist als 4 Bytes, werden nur die letzten 4 Bytes konvertiert. Ist es zu kurz, kann es zu einem Laufzeitfehler kommen.

STRING Wie Zielfeld C, wobei das Auffllen mit Nullen entfllt. Die Lnge der Zeichenfolge entspricht der doppelten Lnge des Hexadezimalfelds. T X Der Wert des Quellfeldes wird als die Anzahl der Sekunden seit Mitternacht betrachtet und wird in eine Zeit im Format HHMMSS konvertiert. Der Wert wird linksbndig bertragen und rechts mit X'00' aufgefllt, falls erforderlich.

XSTRING Das Hexadezimalfeld wird in seiner vollen Lnge bertragen. Rechtsstehende Nullen werden nicht abgeschnitten.

Quelltyp Bytefolge
Konvertierungstabelle fr Quelltyp XSTRING Ziel Konvertierung

C D F N

Der Wert in der Bytefolge wird in eine hexadezimale Zeichenkette konvertiert, linksbndig ins Zielfeld bertragen und mit "0" aufgefllt. Der Wert der Bytefolge wird als die Anzahl von Tagen seit 01.01.0001 betrachtet und wird in ein Datum des Formats YYYYMMDD konvertiert. Der Inhalt der Bytefolge wird in eine gepackte Zahl konvertiert. Dann wird die gepackte Zahl in eine Gleitpunktzahl konvertiert (s. entsprechende Tabellen). Der Inhalt der Byterfolge wird in eine gepackte Zahl konvertiert. Dann wird die gepackte Zahl in ein numerisches Textfeld konvertiert (s. entsprechende Tabellen). Der Inhalt der Bytefolge wird als hexadezimale Zahl betrachtet. Er wird in eine gepackte Dezimalzahl konvertiert und dann rechtsbndig in das Zielfeld bertragen. Wenn die Byterfolge lnger ist als 4 Bytes, werden nur die letzten 4 Bytes konvertiert. Ist die Bytefolge zu kurz, kann es zu einem Laufzeitfehler kommen.

I, P

STRING Wie Zielfeld C, wobei das Auffllen mit Nullen entfllt. Die Lnge der Zeichenfolge entspricht der doppelten Lnge der Bytefolge. T X Der Wert der Bytefolge wird als die Anzahl der Sekunden seit Mitternacht betrachtet und wird in eine Zeit im Format HHMMSS konvertiert. Die Bytefolge wird linksbndig bertragen und rechts mit X'00' aufgefllt, falls erforderlich.

XSTRING Die Quellbytefolge wird unkonvertiert in die Zielbytefolge bertragen.

April 2001

199

ABAP Programmierung (BC-ABA) Konvertierungsregeln fr Referenzen

SAP AG

Konvertierungsregeln fr Referenzen
ABAP kennt zur Zeit Klassen- und Interfacereferenzvariablen in ABAP Objects [Seite 1392]. Beide enthalten Zeiger auf Objekte. Fr folgende Kombinationen knnen Zuweisungen vorgenommen werden:

Bei der Zuweisung zwischen nichtkompatiblen Klassenreferenzen mu die Klasse des Zielfelds die vordefinierte leere Klasse OBJECT sein. Bei der Zuweisung einer Klassenreferenz an eine Interfacereferenz mu die Klasse des Quellfelds das Interface des Zielfelds implementieren. Bei der Zuweisung zwischen nichtkompatiblen Interfacereferenzen mu das Interface des Zielfelds das Interface des Quellfelds als Komponente enthalten. Bei der Zuweisung einer Interfacereferenz an eine Klassenreferenz mu die Klasse des Quellfelds die vordefinierte leere Klasse OBJECT sein.

200

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Konvertierungsregeln fr Strukturen

Konvertierungsregeln fr Strukturen
ABAP enthlt eine Regel fr die Konvertierung von Strukturen, die keine internen Tabellen und keine Strings als Komponenten enthalten. Es gibt keine Konvertierungsregeln fr Strukturen, die interne Tabellen oder Strings beinhalten. Zuweisungen zwischen solchen Strukturen sind nur mglich, wenn sie kompatibel sind. Fr konvertierbare Strukturen gibt es folgende Kombinationen

Konvertierung von Strukturen in nichtkompatible Strukturen Konvertierung von elementaren Feldern an Strukturen Konvertierung von Strukturen an elementare Felder

In jedem dieser Flle konvertiert das System zunchst alle beteiligten Strukturen in Felder vom Typ C und fhrt dann die Konvertierung zwischen den zwei verbleibenden elementaren Feldern durch. Die Lngen der Felder vom Typ C ist die Summe der Lngen der Komponenten. Diese Regel gilt bei allen Operationen mit Feldleisten, die keine internen Tabellen beinhalten. Ist eine Struktur ausgerichtet [Seite 204], werden auch die Fllfelder zur Lnge des Characterfeldes hinzugezhlt.

Eine nichtausgerichtete Struktur ohne Fllfelder:


C8 C 25 P 16 C 10 P8 D8

C 75

Wird eine lngere Struktur in eine krzere konvertiert, werden die berflssigen Teile weggelassen. Wird eine krzere Struktur in eine lngere konvertiert, werden die Komponenten am Ende nicht typspezifisch initialisiert, sondern mit Leerzeichen aufgefllt. Zuweisungen zwischen nichtkompatiblen Stukturen knnen sinnvoll sein, wenn zum Beispiel der Wert einer lngeren Struktur an eine krzere Struktur zugewiesen wird und die Konstruktion beider Strukturen ber die Lnge der krzeren Struktur gleich ist. Dagegen knnen numerische Komponenten von Strukturen, die durch nichtkompatible Zuweisungen gefllt wurden, sinnlose oder sogar illegale Werte enthalten, die zu einem Laufzeitfehler fhren.

REPORT demo_data_conversion_structure. DATA: BEGIN OF fs1, int TYPE pack TYPE text(10) TYPE float TYPE date TYPE END OF fs1. i VALUE 5, p DECIMALS 2 VALUE '2.26', c VALUE 'Fine Text', f VALUE '1.234e+05', d VALUE '19950916',

April 2001

201

ABAP Programmierung (BC-ABA) Konvertierungsregeln fr Strukturen

SAP AG

DATA: BEGIN OF fs2, int TYPE i VALUE 3, pack TYPE p DECIMALS 2 VALUE '72.34', text(5) TYPE c VALUE 'Hello', END OF fs2. WRITE: / fs1-int, fs1-pack, fs1-text, fs1-float, fs1-date. WRITE: / fs2-int, fs2-pack, fs2-text. MOVE fs1 TO fs2. WRITE: / fs2-int, fs2-pack, fs2-text.
Listenausgabe:
5 09161995 3 5 72.34 Hello 2.26 Fine 2.26 Fine Text 1.234000000000000E+05

In diesem Beispiel sind zwei verschiedene Strukturen definiert, FS1 und FS2. Die beiden ersten Komponenten haben den gleichen Datentyp. Nach Zuweisung von FS1 nach FS2 ist nur das Ergebnis fr die ersten zwei Komponenten so, als seien sie komponentenweise bertragen worden. FS2-TEXT wird mit den ersten fnf Stellen von FS1-TEXT gefllt. Alle brigen Stellen von FS1 werden nicht bertragen.

202

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Konvertierungsregeln fr interne Tabellen

Konvertierungsregeln fr interne Tabellen


Interne Tabellen knnen nur in andere interne Tabellen konvertiert werden. Es ist nicht mglich, interne Tabellen in Feldleisten oder elementare Felder zu konvertieren und umgekehrt. Interne Tabellen sind konvertierbar, wenn ihre Zeilentypen konvertierbar sind. Die Konvertierbarkeit von internen Tabellen hngt nicht von der Anzahl der Zeilen ab. Konsequenzen aus der Konvertierungsregel fr interne Tabellen:

Interne Tabellen, die interne Tabellen als Zeilentypen haben, sind konvertierbar, falls die internen Tabellen konvertierbar sind, die den Zeilentyp bestimmen. Interne Tabellen mit Zeilentypen, bei denen es sich um Strukturen mit internen Tabellen als Komponenten handelt, sind nach den Konvertierungsregeln fr Strukturen [Seite 201] nur dann konvertierbar, wenn die Strukturen kompatibel sind.

April 2001

203

ABAP Programmierung (BC-ABA) Ausrichtung von Datenobjekten

SAP AG

Ausrichtung von Datenobjekten


Elementare Felder der Typen I und F belegen spezielle plattformspezifische Adressen im Speicher belegen. So mu die Adresse eines Feldes des Typs I durch 4 teilbar sein, die Adresse eines Feldes des Typs F zum Beispiel durch 8. Deshalb nennt man Felder vom Typ I oder F ausgerichtet. Falls Strukturen Komponenten der Typen I oder F enthalten, sind sie ebenfalls ausgerichtet und knnen Fllfelder vor diesen Komponenten enthalten (Alignment). In der Regel richtet das System Felder und Strukturen automatisch bei deren Deklaration aus. Die Ausrichtung mu jedoch in den folgenden Fllen beachtet werden:

wenn elementare Felder oder Strukturen als Aktualparameter an Prozeduren [Seite 467] bergeben werden, bei denen der zugehrige Formalparameter nicht entsprechend typisiert ist. bei der Deklaration von Feldsymbolen [Seite 211] wenn bei der Verwendung von OPEN SQL-Anweisungen Arbeitsbereiche benutzt werden, die nicht denselben Typ haben wie die Datenbanktabelle im ABAP Dictionary [Seite 109]. Bei der Bearbeitung von Teilfeldern [Seite 205] in Strukturen.

204

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Bearbeitung von Teilfeldern

Bearbeitung von Teilfeldern


In allen Anweisungen, in denen deklarierte Felder mit nichtnumerischen elementaren ABAPTypen (C, D, N, T, X) oder Strukturen ohne interne Tabellen als Komponenten auftreten, knnen ber folgende Syntax Teilfelder adressiert werden:

<f>[+<o>][(<l>)]
Durch die optionalen Angaben eines Offsets +<o> und eine Lnge (<l>) direkt hinter dem Feldnamen <f>, wird der Teil des Felds, der auf Position <o>+1 beginnt und die Lnge <l> hat, als eigenes Datenobjekt angesprochen. In allen Anweisungen knnen Offset <o> und Lnge <l> statisch als Zahlenliterale ohne Vorzeichen oder dynamisch ber Variable angegeben werden. Datentyp und Lnge der Teilfelder bestimmen sich wie folgt:
Ursprngliches Feld Datentyp Teilfeld Datentyp Lnge

C D N T X Struktur

C N N N X C

<l> <l> <l> <l> <l> <l>

Falls die Lnge <l> nicht angegeben wird, wird das Teilfeld zwischen <o> und dem Feldende adressiert. Falls die angegebene Kombination von Offset und Lnge zu ungltigen Teilfeldern fhrt, da die ursprngliche Feldlnge berschritten wird, kommt es zu einem Syntax-, bzw. Laufzeitfehler. Die Teilfeldadressierung ist nicht bei Literalen und Textsymbolen mglich. Besondere Vorsicht ist bei der Teilfeldadressierung in Strukturen geboten. Diese knnen wegen der Ausrichtung der Komponenten vom Typ I und F plattformabhngige Fllfelder enthalten, die bei der Zhlung zu bercksichtigen sind. Weiterhin ist eine Umstellung der internen Darstellung von zeichenartigen Typen auf UNICODE vorgesehen, wodurch ein Zeichen in einem UNICODER/3 System zwei oder vier Bytes statt wie bisher ein Byte belegt. Whrend bei rein zeichenartigen Feldern (Typ C, D, N, T) oder bei einem rein hexadezimalen Feld (Typ X) die Teilfeldadressierung weiterhin funktionieren wird, kann es in Strukturen, insbesondere wenn numerische, zeichenartige und hexadezimale Komponenten gemischt vorkommen, inkompatible nderungen geben. Die Teilfeldadressierung von Strukturen wird deshalb nicht empfohlen, insbesondere wenn die Komponenten gemischte Typen haben.

DATA time TYPE t VALUE '172545'. WRITE WRITE CLEAR WRITE


172545

time. / time+2(2). time+2(4). / time.

Ausgabe:

April 2001

205

ABAP Programmierung (BC-ABA) Bearbeitung von Teilfeldern

SAP AG

25 170000 Zunchst werden die Minuten durch Angabe eines Offsets in der WRITE-Anweisung ausgewhlt. Dann werden Minuten und Sekunden durch Angabe eines Offset in der CLEAR-Anweisung auf ihre Initialwerte gesetzt.

Teilfelder in der Anweisung MOVE


Im Fall der MOVE-Anweisung sieht die Syntax fr die Adressierung von Teilfeldern so aus:

MOVE <f1>[+<o1>][(<l1>)] TO <f2>[+<o2>][(<l2>)].


Bzw. fr den Zuweisungsoperator:

<f2>[+<o2>][(<l2>)] = <f1>[+<o1>][(<l1>)].
Der Wert des Teilfelds von Feld <f1>, das auf Position <o1>+1 beginnt und die Lnge <l1> hat wird Feld <f2> zugewiesen, wo es das Teilfeld berschreibt, das auf Position <o2>+1 beginnt und die Lnge <l2> hat. Es wird empfohlen Werte mit Offset- und Lngenangaben nur zwischen zeichenartigen elementaren Feldern zuzuweisen. Bei Strukturen knnen Teilfeldzuweisungen leicht zu unsinnigen Ergebnissen fhren.

DATA: f1(8) TYPE c VALUE 'ABCDEFGH', f2(20) TYPE c VALUE '12345678901234567890'. f2+6(5) = f1+3(5).
In diesem Beispiel funktioniert der Zuweisungsoperator wie folgt:

ABCDEFGH DEFGH DEFGH ABCDEFGH

DEFGH 123456DEFGH 234567890 DEFGH 123456DEFGH 234567890

DATA: f1(8) TYPE c VALUE 'ABCDEFGH', f2(8). TYPE c. DATA: o TYPE i VALUE 2, l TYPE i VALUE 4. MOVE f1 TO f2. WRITE f2. MOVE f1+o(l) TO f2. WRITE / f2. MOVE f1 TO f2+o(l). WRITE / f2. CLEAR f2. MOVE f1 TO f2+o(l). WRITE / f2. MOVE f1+o(l) TO f2+o(l). WRITE / f2.

206

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Bearbeitung von Teilfeldern

Listenausgabe dieses Beispiels:

ABCDEFGH CDEF CDABCD ABCD CDEF


Zunchst wird der Inhalt von F1 ohne Offset-Angaben F2 zugewiesen. Dann geschieht dasselbe mit Offset- und Lngenangaben fr F1. Die nchsten drei MOVE-Anweisungen berschreiben den Inhalt von F2 mit Offset 2. Beachten Sie, da F2 entsprechend der Konvertierungsregel [Seite 194] fr Quelltyp C rechts mit Leerstellen aufgefllt wird.

Teilfelder in der Anweisung WRITE TO


Im Fall der WRITE TO-Anweisung sieht die Syntax fr die Adressierung von Teilfeldern so aus:

WRITE <f1>[+<o1>][(<l1>)] TO <f2>[+<o2>][(<l2>)].


Der Wert des Teilfelds von Feld <f1>, das auf Position <o1>+1 beginnt und die Lnge <l1> hat, wird in ein Characterfeld konvertiert und dann Feld <f2> zugewiesen, wo es das Teilfeld berschreibt, das auf Position <o2>+1 beginnt und die Lnge <l2> hat.

DATA: string(20) TYPE c, number(8) TYPE c VALUE '123456', offset TYPE i VALUE 8, length TYPE i VALUE 12. WRITE number(6) TO string+offset(length) LEFT-JUSTIFIED. WRITE: / string. CLEAR string. WRITE number(6) TO string+offset(length) CENTERED. WRITE: / string. CLEAR string. WRITE number TO string+offset(length) RIGHT-JUSTIFIED. WRITE: / string. CLEAR string.
Die Ausgabe dieses Beispiels ist:
123456 123456 123456

Die ersten sechs Stellen des Felds NUMBER werden linksbndig, zentriert und rechtsbndig in die letzten 12 Stellen des Felds STRING geschrieben.

April 2001

207

ABAP Programmierung (BC-ABA) Feldsymbole und Datenreferenzen

SAP AG

Feldsymbole und Datenreferenzen


Feldsymbole und Datenreferenzen dienen dem dynamischen Zugriff auf Datenobjekte in ABAPProgrammen. Whrend der statische Zugriff auf ein Datenobjekt immer ber den Namen des Datenobjekts mglich ist, erlauben Feldsymbole und Datenreferenzen den Zugriff auf und die bergabe von Datenobjekten, deren Name und Eigenschaften erst zur Laufzeit bekannt sind. Feldsymbole sind als symbolische Namen fr Datenobjekte zu verstehen. Das Arbeiten mit Feldsymbolen erfolgt unter einer Wertesemantik. D.h. beim Zugriff auf Feldsymbolen wird der Inhalt des zugeordneten Datenobjekts adressiert und nicht der Inhalt des Feldsymbols selbst. Datenreferenzen sind Zeiger auf Datenobjekte. Das Arbeiten mit Datenreferenzen erfolgt unter einer Referenzsemantik. Datenreferenzen sind der Inhalt von Datenreferenzvariablen und beim Zugriff auf Referenzvariablen wird die Datenreferenz selbst adressiert. Um auf den Inhalt des Datenobjekts zuzugreifen, auf das eine Datenreferenz zeigt, mu diese dereferenziert werden. Feldsymbole [Seite 209] Datenreferenzen [Seite 232]

208

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Feldsymbole

Feldsymbole
Feldsymbole sind Platzhalter bzw. symbolische Namen fr bestehende Felder. Ein Feldsymbol reserviert keinen physischen Platz fr ein Feld, sondern zeigt auf ein Datenobjekt. Feldsymbole knnen auf beliebige Datenobjekte zeigen. Das Datenobjekt, auf das ein Feldsymbol zeigt wird ihm nach seiner Deklaration zur Laufzeit des Programms zugewiesen. Wenn man in einem Programm ein Feldsymbol anspricht, adressiert man immer das Feld, welches dem Feldsymbol zugewiesen ist. Nach einer erfolgreicher Zuweisung macht es keinen Unterschied, ob das Feldsymbol oder das Feld selbst adressiert wird. Einem Feldsymbol mu immer ein Feld zugewiesen werden, bevor es im Programm adressiert werden kann. Feldsymbole sind vergleichbar mit dereferenzierten Zeigern in der Programmiersprache C (d. h. Zeiger auf die der Inhaltsoperator * angewendet wird). Eine echte Entsprechung zu Zeigern, d. h. Variable, die eine Speicheradresse (Referenz) enthalten und auch ohne den Inhaltsoperator benutzt werden knnen, sind Datenreferenzen [Seite 232]. Alle Operationen, die mit Feldsymbolen programmiert werden, werden mit den zugewiesenen Feldern ausgefhrt. Eine MOVE-Anweisung zwischen zwei Feldsymbolen weist beispielsweise dem Feld, das dem einen Zielfeldsymbol zugewiesen ist, den Inhalt des Felds zu, das dem anderen Quellfeldsymbol zugewiesen ist. Die Feldsymbole selbst zeigen nach der MOVEAnweisung auf die gleichen Felder, wie vor der MOVE-Anweisung. Feldsymbole knnen entweder ohne oder mit Typangaben angelegt werden. Ohne Typangaben bernimmt das Feldsymbol alle technischen Eigenschaften des zugewiesenen Felde. Mit Typangaben wird whrend der Zuweisung eines Felds berprft, ob das zugewiesene Feld zum Typ des Feldsymbols pat. Feldsymbole ermglichen eine groe Flexibilitt bei der Adressierung von Datenobjekten:

Man kann Feldsymbole anderen Feldsymbolen zuweisen und dabei auch Teilfelder ansprechen. Die Zuweisung von Feldern zu Feldsymbolen kann ber die Feldgrenzen hinaus erfolgen. Dadurch knnen regelmige Folgen von Feldern im Speicher effektiv adressiert werden. Man kann erzwingen, da ein Feldsymbol andere technische Eigenschaften als das zugewiesene Feld hat (Casting).

Aufgrund dieser Flexibilitt knnen mit Feldsymbolen einige Operationen elegant ausgefhrt werden. Auf der anderen Seite ist die Handhabung von Feldsymbolen auch fehleranfllig. Da Feldsymbolen die Felder erst zur Laufzeit zugewiesen werden, sind bei Operationen mit Feldsymbolen Syntax- und Sicherheitsprfungen nur eingeschrnkt mglich. Als Folge daraus knnen Laufzeitfehler oder falsche Datenzuweisungen auftreten. Whrend Laufzeitfehler auf ein offensichtliches Problem hindeuten, sind falsche Datenzuweisungen kritischer, weil sie womglich nur sehr schwer feststellbar sind. Von daher sollten Feldsymbole nur in solchen Fllen eingesetzt werden, in denen die gewnschte Operation nicht mit anderen ABAP-Anweisungen zu lsen ist. Bei der Verarbeitung einer Zeichenkette soll beispielsweise ein Teilfeld der Kette verarbeitet werden, wobei die Offset und Lnge vom Inhalt abhngt. Man knnte hier Feldsymbole verwenden. Die Anweisung MOVE (eventuell in Verbindung mit einigen Hilfsvariablen) ist aber weit sicherer als der Gebrauch von Feldsymbolen, da kein Speicherbereich auerhalb der Feldgrenzen adressiert werden kann. Der Vorteil von Feldsymbolen kann dagegen in einigen Fllen eine bessere Antwortzeit sein.

April 2001

209

ABAP Programmierung (BC-ABA) Feldsymbole

SAP AG

Feldsymbole deklarieren [Seite 211] Zuweisung von Datenobjekten an Feldsymbole [Seite 216]

210

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Feldsymbole deklarieren

Feldsymbole deklarieren
Ein Feldsymbol wird mit der Anweisung

FIELD-SYMBOLS <FS> [<type>|STRUCTURE <s> DEFAULT <wa>].


deklariert. Bei Feldsymbolen sind spitze Klammern Teil der Syntax. Sie identifizieren Feldsymbole im Programmtext. Ohne weiteren Zusatz knnen dem Feldsymbol <FS> Datenobjekte von beliebigem Datentyp zugewiesen werden. Bei der Zuweisung bernimmt das Feldsymbol die Attribute des Datenobjekts. Der Datentyp des zugewiesenen Datenobjekts wird zum aktuellen Datentyp des Feldsymbols. Es ist zu beachten, da die Zuweisung von Referenzvariablen und komplexen Datenobjekten zu untypisierten Feldsymbolen zwar mglich ist, da ein solches Feldsymbol statisch aber einzig und allein als Zeiger auf das Feld im Speicher dienen kann und nicht die komplexen Typeigenschaften von Referenzen und komplexen Datenobjekten kennt, da es diese erst zur Laufzeit bernimmt. Solche Felder sind ber den Namen des Feldsymbols nur im Ganzen ansprechbar, z.B. in einer MOVE-Anweisung. Spezifische Anweisungen wie z.B. CREATE OBJECT <FS> oder LOOP AT <FS> sind nicht mglich.

Feldsymbole typisieren
Der Zusatz <type> ermglicht die Typisierung von Feldsymbolen. Bei der Zuweisung eines Datenobjekts an ein Feldsymbol wird berprft, ob der Typ des zugewiesenen Datenobjekts vertrglich mit der Typisierung des Feldsymbols ist. Bei Unvertrglichkeit reagiert das System mit einem Syntax- oder Laufzeitfehler. Falls jedoch ein Casting von Datenobjekten mit Feldsymbolen [Seite 224] durchgefhrt werden soll, mu dies in der ASSIGN-Anweisung explizit angegeben werden. Dann wird die Typisierung des Feldsymbols fr die Sicht auf das zugewiesene Datenobjekt verwendet. Die Typisierung von Feldsymbolen folgt der gleichen Semantik wie die Typisierung von Formalparametern in Prozeduren [Seite 467]. Fr <type> kann entweder TYPE <t> oder LIKE <f> geschrieben werden. Die Typangabe kann generisch oder vollstndig sein. Bei generischer Typangabe wird das Feldsymbol gar nicht oder nur teilweise typisiert und bernimmt die restlichen Attribute bei der Zuweisung vom entsprechenden Datenobjekt. Bei vollstndiger Typangabe werden alle technischen Eigenschaften eines Feldsymbols schon bei seiner Deklaration festgelegt. Es knnen dann nur Datenobjekte von exakt dem gleichen Datentyp zugewiesen werden. Feldsymbole sollten immer typisiert werden. Falls ein Feldsymbol generisch sein mu, sollte dies mit einer entsprechenden generischen Typangabe deutlich gemacht werden.

Generische Typangaben
Folgende Typisierungen erlauben Freiheiten bei der Zuweisung von Datenobjekten. Das Datenobjekt mu nur die spezifizierten Teileigenschaften des Feldsymbols haben.
Typisierung Prfung fr die Aktualparameter

keine Typangabe TYPE ANY

Es werden alle Typen von Datenobjekten akzeptiert. Das Feldsymbol bernimmt alle Attribute des Datenobjekts.

April 2001

211

ABAP Programmierung (BC-ABA) Feldsymbole deklarieren

SAP AG

TYPE C, N, P oder X

Es werden nur Datenobjekte vom Typ C, N, P bzw. X akzeptiert. Das Feldsymbol bernimmt Feldlnge und DECIMALS-Angabe (fr Typ P) des Datenobjekts. Es wird geprft, ob das Datenobjekt eine interne Standardtabelle ist. Diese Typisierung ist eine Kurzform von TYPE STANDARD TABLE (siehe unten). Es wird geprft, ob das Datenobjekt eine interne Tabelle ist. Alle Eigenschaften der internen Tabelle (Zeilentyp, Tabellenart, Schlssel) werden vom Feldsymbol bernommen. Das System prft, ob das Datenobjekt eine interne Index-Tabelle (also eine Standard- oder sortierte Tabelle aber keine HashTabelle) ist. Die Eigenschaften der internen Tabelle (Zeilentyp, Tabellenart, Schlssel) werden vom Feldsymbol bernommen.

TYPE TABLE

TYPE ANY TABLE

TYPE INDEX TABLE

TYPE STANDARD TABLE Das System prft, ob das Datenobjekt eine interne StandardTabelle ist. Die restlichen Eigenschaften der internen Tabelle (Zeilentyp, Schlssel) werden vom Feldsymbol bernommen. TYPE SORTED TABLE Das System prft, ob das Datenobjekt eine sortierte interne Tabelle ist. Die restlichen Eigenschaften der internen Tabelle (Zeilentyp, Schlssel) werden Feldsymbol bernommen. Das System prft, ob das Datenobjekt eine interne HASH-Tabelle ist. Die restlichen Eigenschaften der internen Tabelle (Zeilentyp, Schlssel) werden vom Feldsymbol bernommen.

TYPE HASHED TABLE

Bei der generischen Typisierung ist zu beachten, da die bei der Zuweisung vom Datenobjekt bernommenen Eigenschaften nicht statisch im Programm bekannt sind. Sie knnen hchstens dynamisch angesprochen werden.

TYPES: BEGIN OF line, col1 TYPE c, col2 TYPE c, END OF line. DATA: wa TYPE line, itab TYPE HASHED TABLE OF line WITH UNIQUE KEY col1, key(4) TYPE c VALUE 'col1'. FIELD-SYMBOLS <fs> TYPE ANY TABLE. ASSIGN itab TO <fs>. READ TABLE <fs> WITH TABLE KEY (key) = 'X' INTO wa.
Nach der generischen Zuweisung der internen Tabelle ITAB an das Feldsymbol <FS> wird der Tabellenschlssel des Feldsymbols dynamisch adressiert. Eine statische Adressierung

READ TABLE <fs> WITH TABLE KEY col1 = 'X' INTO wa.
ist syntaktisch nicht mglich, da das Feldsymbol erst zur Laufzeit den Schlssel der Tabelle ITAB bernimmt. Im Programm ist durch die Typisierung ANY TABLE lediglich bekannt, da <FS> eine Tabelle ist. Mit der Typisierung ANY oder ohne

212

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Feldsymbole deklarieren

Typisierung, wre syntaktisch nicht einmal die tabellenspezifische Anweisung READ TABLE <FS> mglich. Bei der generischen bernahme von strukturierten Typen, also Strukturen oder Tabellen mit strukturiertem Zeilentyp, sind die einzelnen Komponenten im Programm weder statisch noch dynamisch direkt ansprechbar. Hier mu mit weiteren Feldsymbolen und der Mglichkeit Strukturen komponentenweise zuzuweisen [Seite 223] gearbeitet werden.

Vollstndige Typangabe
Bei folgenden Typisierungen werden die technischen Eigenschaften des Feldsymbols vollstndig bestimmt und die technischen Eigenschaften des zugewiesenen Datenobjekts mssen mit den Eigenschaften des Feldsymbols bereinstimmen.
Typisierung Technische Eigenschaften des Formalparameters

TYPE D, F, I oder T TYPE <type>

Das Feldsymbol hat die technischen Eigenschaften dieser vollstndig vordefinierten elementaren Typen. Das Feldsymbol hat den Typ <type>. Dieser ist ein durch TYPES definierter programmlokaler Datentyp oder ein Datentyp aus dem ABAP Dictionary.

TYPE REF TO <cif>|DATA Das Feldsymbol ist eine Referenzvariable fr die Klasse bzw. das Interface <cif> oder ein Datenobjekt. TYPE LINE OF <itab> Das Feldsymbol hat den gleichen Typ wie eine Zeile einer ber TYPES oder im ABAP Dictionary deklarierten internen Tabelle <itab>. Das Feldsymbol hat den gleichen Typ wie eine programminternes Datenobjekt <f> oder eine Struktur bzw. eine Datenbanktabelle aus dem ABAP Dictionary.

LIKE <f>

Bei vollstndig typisierten Feldsymbolen kann statisch auf smtliche Eigenschaften des Feldsymbols zugegriffen werden, da sie im Programmtext bekannt sind. Feldsymbole, die vollstndig als Referenzen oder aggregierte Datenobjekte typisiert werden, knnen nach der Zuweisung eines passenden Datenobjekts wie das Datenobjekt selbst verwendet werden. Es kann also beispielsweise auf die Komponenten von Strukturen zugegriffen, eine Schleife ber interne Tabellen ausgefhrt oder ein Objekt mit einem Referenzfeldsymbol erzeugt werden.

REPORT demo_field_symbols_type . DATA: BEGIN OF line, col1(1) TYPE c, col2(1) TYPE c VALUE 'X', END OF line. FIELD-SYMBOLS <fs> LIKE line. ASSIGN line TO <fs>. MOVE <fs>-col2 TO <fs>-col1.
Das Feldsymbol <FS> ist vollstndig als Struktur typisiert und seine Komponenten knnen im Programm angesprochen werden.

April 2001

213

ABAP Programmierung (BC-ABA) Feldsymbole deklarieren

SAP AG

Struktur aufprgen
Der Zusatz STRUCTURE prgt dem Feldsymbol eine strukturierte Sicht auf zugewiesene Datenobjekte auf:

FIELD-SYMBOLS <FS> STRUCTURE <s> DEFAULT <f>.


Die Struktur <s> ist entweder ein strukturiertes programmlokales Datenobjekt oder eine flache Struktur aus dem ABAP Dictionary. <f> ist ein Datenobjekt, da dem Feldsymbol als Startfeld zugewiesen werden mu, spter aber ber die Anweisung ASSIGN gendert werden kann. Bei der Zuweisung eines Datenobjekts wird lediglich geprft, ob das zugewiesene Datenobjekt mindestens die Lnge der Struktur hat. Das Feldsymbol ist komponentenweise ansprechbar und hat smtliche technische Eigenschaften der Struktur <s>. Falls <s> Komponenten vom Typ I oder F enthlt, ist die Ausrichtung [Seite 204] solcher Felder zu beachten. Bei der Zuweisung eines Datenobjekt zu einem Feldsymbol mit aufgeprgter Struktur sollte auch das Datenobjekt entsprechend ausgerichtet sein, da es ansonsten zu einem Laufzeitfehler kommen kann. Es empfiehlt sich, nur solche Datenobjekte strukturierten Feldsymbolen zuzuweisen, die zumindest ber die Lnge der Struktur wie das Feldsymbol strukturiert sind. Der Zusatz STRUCTURE ist obsolet und sollte nicht mehr verwendet werden. Mit dem STRUCTURE-Zusatz definierte Feldsymbole sind eine Mischung aus typisierten Feldsymbolen und einem Hilfsmittel fr das Casting auf programmlokale bzw. im ABAP Dictionary definierte Datentypen. Zur Typisierung von Feldsymbolen dient aber der TYPE-Zusatz der Anweisung FIELD-SYMBOLS, und fr das Casting kann der CASTING-Zusatz der Anweisung ASSIGN verwendet werden.

Beispiel mit obsoletem STRUCTURE-Zusatz:

DATA: wa(10) VALUE '0123456789'. DATA: BEGIN OF line1, col1(3), col2(2), col3(5), END OF line1. DATA: BEGIN OF line2, col1(2), col2 LIKE sy-datum, END OF line2. FIELD-SYMBOLS: <f1> STRUCTURE line1 DEFAULT wa, <f2> STRUCTURE line2 DEFAULT wa. WRITE: / <f1>-col1, <f1>-col2, <f1>-col3, / <f2>-col1, <f2>-col2.
Korrektes Beispiel mit TYPE und CASTING:

DATA: wa(10) VALUE '0123456789'. DATA: BEGIN OF line1, col1(3), col2(2),

214

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Feldsymbole deklarieren

col3(5), END OF line1. DATA: BEGIN OF line2, COL1(2), COL2 LIKE sy-datum, END OF line2. FIELD-SYMBOLS: <f1> LIKE line1. ASSIGN wa TO <f1> CASTING. FIELD-SYMBOLS: <f2> LIKE line2. ASSIGN wa TO <f2> CASTING. WRITE: / <f1>-col1, <F1>-col2, <F1>-col3, / <f2>-col1, <F2>-col2.
Die Listenausgabe ist in beiden Fllen:
012 34 56789 01 2345/67/89

Es werden zwei Feldsymbole deklariert, denen unterschiedliche Strukturen aufgeprgt sind. Beiden Feldsymbolen wird die Zeichenkette WA zugewiesen. Die Ausgabe zeigt, da die Feldsymbole die Zeichenkette komponentenweise und gem dem Typ der Komponenten interpretieren.

April 2001

215

ABAP Programmierung (BC-ABA) Zuweisung von Datenobjekten an Feldsymbole

SAP AG

Zuweisung von Datenobjekten an Feldsymbole


Bevor mit einem Feldsymbol gearbeitet werden kann, mu ihm ein Datenobjekt zugewiesen werden. Bei Feldsymbolen mit aufgeprgter Struktur erfolgt die erste Zuweisung bereits bei der Deklaration. Untypisierte Feldsymbole zeigen nach Programmstart initial auf das vordefinierte Datenobjekt [Seite 137] SPACE vom Typ C und der Lnge 1. Typisierte Feldsymbole zeigen nach Programmstart auf kein Feld. Zur Laufzeit knnen an beliebiger Stelle eines Programms Zuweisungen von Datenobjekten an alle Feldsymbole erfolgen. Whrend dem Ablauf eines Programms knnen nacheinander verschiedene Datenobjekte demselben Feldsymbol zugewiesen werden. Die Anweisung zur Zuweisung eines Datenobjekts an ein Feldsymbol ist ASSIGN. Diese Anweisung hat verschiedene Varianten und Parameter. Grundformen der ASSIGN-Anweisung [Seite 217] Strukturen komponentenweise zuweisen [Seite 223] Casting von Datenobjekten [Seite 224] Datenbereiche fr Feldsymbole [Seite 230] Weiterhin knnen Feldsymbolen einzelne Zeilen von internen Tabellen zugewiesen werden. Mehr dazu unter Interne Tabellen bearbeiten [Seite 278]. Mit der Anweisung

UNASSIGN <FS>.
kann man zur Laufzeit explizit dafr sorgen, da einem Feldsymbol <FS> kein Datenobjekt zugewiesen ist. Jede Verwendung eines Feldsymbols ohne zugewiesenes Datenobjekt fhrt zu einem Laufzeitfehler. Ein spezieller logischer Ausdruck erlaubt es, die Zuweisung zu einem Feldsymbol zu berprfen [Seite 252].

216

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Grundformen der ASSIGN-Anweisung

Grundformen der ASSIGN-Anweisung


Folgende Grundformen sind unterscheidbar:

Statisches ASSIGN
Wenn der Namen des Datenobjekts, das einem Feldsymbol zugewiesen werden soll, schon bei der Programmerstellung bekannt ist, verwendet man die statische ASSIGN-Anweisung:

ASSIGN <f> TO <FS>.


Bei der Zuweisung wird geprft, ob die technischen Eigenschaften des Datenobjekts <f> mit der Typisierung des Feldsymbols <FS> bereinstimmen. Das Feldsymbol bernimmt die generischen Attribute, die nicht durch eine Typisierung festgelegt wurden von <f> und zeigt nach der Zuweisung auf dieses Feld im Speicher.

REPORT demo_field_symbols_stat_assign . FIELD-SYMBOLS: <f1> TYPE ANY, <f2> TYPE i. DATA: text(20) TYPE c VALUE 'Hello, how are you?', num TYPE i VALUE 5, BEGIN OF line1, col1 TYPE f VALUE '1.1e+10', col2 TYPE i VALUE '1234', END OF line1, line2 LIKE line1. ASSIGN text TO ASSIGN num TO DESCRIBE FIELD WRITE: / <f1>, <f1>. <f2>. <f1> LENGTH <f2>. 'has length', num.

ASSIGN line1 TO <f1>. ASSIGN line2-col2 TO <f2>. MOVE <f1> TO line2. ASSIGN 'LINE2-COL2 =' TO <f1>. WRITE: / <f1>, <f2>.
Die Listenausgabe ist:
Hello, how are you? LINE-COL2 = has length 20 1,234

Es werden zwei Feldsymbole <F1> und <F2> deklariert. <F2> knnen nur Felder vom Typ I zugewiesen werden, da es entsprechend typisiert ist. Im Verlauf des Programms zeigen <F1> und <F2> auf verschiedene Felder.

Statisches ASSIGN mit Offset-Angaben


Beim statischen ASSIGN knnen einem Feldsymbol Teilfelder [Seite 205] durch positive Offsetund Lngenangaben zugewiesen werden:

ASSIGN <f>[+<o>][(<l>)] TO <FS>.

April 2001

217

ABAP Programmierung (BC-ABA) Grundformen der ASSIGN-Anweisung

SAP AG

Bei der Zuweisung von Teilfeldern an Feldsymbole gelten folgende Besonderheiten:

das System prft nicht, ob das Teilfeld innerhalb des Felds <f> liegt. Sowohl Offset <o> als auch Lnge <l> knnen grer als die Lnge von <f> sein. Es knnen Speicherbereiche auerhalb der Grenzen von <f> angesprochen werden, jedoch nicht auerhalb der Datenbereiche fr Feldsymbole [Seite 230]. Falls keine Lnge <l> angegeben wird, wird automatisch die Lnge des Felds <f> eingesetzt. Ist dann <o> grer als Null, zeigt <FS> immer auf einen Bereich auerhalb der Grenzen von <f>. Ist <o> kleiner als die Lnge von <f>, kann ein Stern (*) fr <l> angegeben werden, um zu verhindern, da <FS> ber die Grenze von <f> hinaus zeigt.

REPORT demo_field_symbols_stat_as_off . FIELD-SYMBOLS <fs> TYPE ANY. DATA: BEGIN OF line, string1(10) VALUE '0123456789', string2(10) VALUE 'abcdefghij', END OF line. WRITE / line-string1+5. ASSIGN line-string1+5 TO <fs>. WRITE / <fs>. ASSIGN line-string1+5(*) TO <fs>. WRITE / <fs>.
Die Listenausgabe ist:
56789 56789abcde 56789

Das Beispiel zeigt den Unterschied zwischen einer Offset-Angabe in einer WRITEAnweisung und in einer ASSIGN-Anweisung. Bei WRITE wird die Ausgabe am Rand von LINE-STRING1 abgeschnitten. Eine Offset-Angabe von grer als 9 wrde zu einem Fehler bei der Syntaxprfung fhren. In der ersten ASSIGN-Anweisung wird der Speicherbereich der Lnge 10, der mit Offset 5 in LINE-STRING1 beginnt, dem Feldsymbol <FS> zugewiesen. Dies ergibt eine sinnvolle Ausgabe, da der Speicherbereich hinter LINE-STRING1 zu LINE_STRING2 gehrt. In der zweiten ASSIGN-Anweisung wird die Zuweisung von Speicher hinter LINE-STRING1 durch die Angabe der Lnge * verhindert.

REPORT demo_field_symbols_stat_as_of2 . FIELD-SYMBOLS <fs> TYPE ANY. DATA: BEGIN OF a TYPE c TYPE e TYPE line, c VALUE '1', b TYPE c VALUE '2', c VALUE '3', d TYPE c VALUE '4', c VALUE '5', f TYPE c VALUE '6',

218

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Grundformen der ASSIGN-Anweisung

g END off len

TYPE c VALUE '7', h TYPE c VALUE '8', OF line, TYPE i, TYPE i VALUE 2.

DO 2 TIMES. off = sy-index * 3. ASSIGN line-a+off(len) TO <fs>. <fs> = 'XX'. ENDDO. DO 8 TIMES. off = sy-index - 1. ASSIGN line-a+off(1) TO <fs>. WRITE <fs>. ENDDO.
Die Listenausgabe ist:
1 2 3 X X 6 X X

Das Beispiel zeigt wie Feldsymbole Zugriff auf und Manipulation von regelmigen Strukturen erleichtern knnen. Es ist aber zu beachten, da diese flexible Methode um Speicherinhalte ber Feldgrenzen hinweg anzusprechen und zu manipulieren, auch Gefahren birgt und zu Laufzeitfehlern fhren kann.

Dynamisches ASSIGN
Wenn der Namen des Datenobjekts, das einem Feldsymbol zugewiesen werden soll, erst zur Laufzeit bekannt ist, kann man die dynamische ASSIGN-Anweisung verwenden:

ASSIGN (<f>) TO <FS>.


Die Anweisung weist das Datenobjekt, dessen Name in Feld <f> steht, dem Feldsymbol <FS> zu. Beim dynamischen ASSIGN ist keine Angabe von Teilfeldern mglich. Zur Laufzeit wird in der folgenden Reihenfolge nach dem angegebenen Datenobjekt gesucht: 1. Erfolgt die Zuweisung in einer Prozedur [Seite 467], wird zuerst unter den lokalen Daten der Prozedur gesucht. 2. Erfolgt die Zuweisung auerhalb einer Prozedur oder das Feld wird dort nicht gefunden, wird unter den globalen Daten des Programms gesucht. 3. Wird das Feld unter den globalen Daten nicht gefunden, wird unter den im Hauptprogramm der aktuellen Programmgruppe mit TABLES deklarierten Tabellenarbeitsbereichen [Seite 135]. Eine Programmgruppe besteht aus einem Hauptprogramm und allen Programmen, die durch Programmaufrufe in den internen Modus dieses Programms geladen werden. Ist die Suche erfolgreich und ein Feld kann dem Feldsymbol zugewiesen werden, wird SYSUBRC auf 0 gesetzt. Ansonsten bekommt SY-SUBRC den Wert 4 und das Feldsymbol bleibt unverndert. Aus Sicherheitsgrnden sollte SY-SUBRC nach einem dynamischen ASSIGN immer geprft werden, um zu verhindern, da das Feldsymbol auf ungewollte Bereiche zeigt. Obige Suche nach Feldern geht zu Lasten der Antwortzeit. Das dynamische ASSIGN sollte nur wenn unbedingt erforderlich verwendet werden. Wenn bereits bei der Programmerstellung bekannt ist, da ein Tabellenarbeitsbereich [Seite 135] zugewiesen werden soll, kann auch folgende Variante des dynamischen ASSIGN verwendet werden:

April 2001

219

ABAP Programmierung (BC-ABA) Grundformen der ASSIGN-Anweisung

SAP AG

ASSIGN TABLE FIELD (<f>) TO <FS>.


Das zuzuweisende Datenobjekt wird dann ausschlielich unter den Tabellenarbeitsbereichen, die mit TABLES im Hauptprogramm der aktuellen Programmgruppe deklariert wurden, gesucht. Da Im Umfeld von ABAP Objects keine Tabellenarbeitsbereiche verwendet werden, ist dieser Zusatz dort verboten.

Wir betrachten drei Programme, ein Hauptprogramm:

REPORT demo_field_symbols_dynami_as_1. TABLES sbook. sbook-fldate = sy-datum. PERFORM form1 IN PROGRAM demo_form1.
Zwei weitere Programme:

REPORT demo_form1. FORM form1. PERFORM form2 IN PROGRAM demo_form2. ENDFORM.


und

REPORT demo_form2. FORM form2. DATA name(20) TYPE c VALUE 'SBOOK-FLDATE'. FIELD-SYMBOLS <fs> TYPE ANY. ASSIGN (name) TO <fs>. IF sy-subrc EQ 0. WRITE / <fs>. ENDIF. ENDFORM.
Die Listenausgabe ist in etwa:
02.06.1998

Die Programmgruppe im internen Modus besteht aus DEMO, MYFORMS1 und MYFORMS2. Das Feldsymbol <FS> ist in MYFORMS2 definiert. Nach der dynamischen ASSIGN-Anweisung zeigt es auf die Komponente FLDATE des Tabellenarbeitsbereichs SBOOK, der im Hauptprogramm DEMO deklariert ist.

REPORT demo_field_symbols_dynami_as_2 . TABLES sbook. DATA: name1(20) TYPE c VALUE 'SBOOK-FLDATE', name2(20) TYPE c VALUE 'NAME1'. FIELD-SYMBOLS <fs> TYPE ANY. ASSIGN TABLE FIELD (name1) TO <fs>. WRITE: / 'SY-SUBRC:', sy-subrc. ASSIGN TABLE FIELD (name2) TO <fs>. WRITE: / 'SY-SUBRC:', sy-subrc.

220

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Feldsymbole zuweisen

Die Listenausgabe ist:


SY-SUBRC: SY-SUBRC: 0 4

In der ersten ASSIGN-Anweisung wird die Komponente FLDATE des Tabellenarbeitsbereichs SBOOK gefunden und SY-SUBRC wird auf 0 gesetzt. In der zweiten ASSIGN-Anweisung wird das Feld NAME1 nicht gefunden, weil es mit DATA und nicht mit TABLES deklariert wurde. SY-SUBRC wird deshalb auf 4 gesetzt.

Feldsymbole zuweisen
Anstatt die Namen von Datenobjekten zu verwenden, knnen in allen Varianten von ASSIGN auch Feldsymbole anderen Feldsymbolen zugewiesen werden:

ASSIGN <FS1>[+<o>][(<l>)] TO <FS2>.


beim statischen ASSIGN und:

ASSIGN [TABLE FIELD] (<f>) TO <FS2>.


beim dynamischen ASSIGN, wobei dann das Feld <f> den Namen eines Feldsymbols <FS1> enthlt. <FS1> und <FS2> knnen auch identisch sein.

REPORT demo_field_symbols_dynami_as_3 . DATA: BEGIN OF s, a TYPE c VALUE b TYPE c VALUE c TYPE c VALUE d TYPE c VALUE e TYPE c VALUE f TYPE c VALUE g TYPE c VALUE h TYPE c VALUE END OF s. DATA off TYPE i. FIELD-SYMBOLS <fs> TYPE ANY. ASSIGN s-a TO <fs>. DO 4 TIMES. off = sy-index - 1. ASSIGN <fs>+off(1) TO <fs>. WRITE <fs>. ENDDO.
Die Listenausgabe ist:
1 2 4 7

'1', '2', '3', '4', '5', '6', '7', '8',

Es wird eine Struktur S mit acht Komponenten S-A bis S-H deklariert und mit Zeichen 1 bis 8 gefllt. Die Zeichen sind im Speicher regelmig abgelegt. Die Komponente S-A wird initial dem Feldsymbol <FS> zugewiesen. Die Anweisungen in der DO-Schleife [Seite 259] haben folgende Wirkung:

April 2001

221

ABAP Programmierung (BC-ABA) Feldsymbole zuweisen

SAP AG

Schleifendurchlauf 1: <FS> zeigt auf S-A, OFF ist null, S-A wird <FS> zugewiesen Schleifendurchlauf 2: <FS> zeigt auf S-A, OFF ist eins, S-B wird <FS> zugewiesen Schleifendurchlauf 3: <FS> zeigt auf S-B, OFF ist zwei, S-D wird <FS> zugewiesen Schleifendurchlauf 4: <FS> zeigt auf S-D, OFF ist drei, S-G wird <FS> zugewiesen

222

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Strukturen komponentenweise zuweisen

Strukturen komponentenweise zuweisen


Wenn ein Datenobjekt <s> strukturiert ist, kann mit

ASSIGN COMPONENT <comp> OF STRUCTURE <s> TO <FS>.


eine Komponente <comp> dem Feldsymbol <FS> zugewiesen werden. Die Komponente <comp> kann entweder als Literal oder als Variable angegeben werden. Ist <comp> vom Typ C oder eine Struktur, die keine internen Tabellen als Komponenten hat, wird es als Namen der Komponente interpretiert. Hat <comp> irgendeinen anderen elementaren Datentyp, wird es in Typ I konvertiert und gibt die Nummer der Komponente an. Bei einer erfolgreichen Zuweisung erhlt SY-SUBRC den Wert 0 , ansonsten 4. Diese Anweisung ist sehr wichtig fr die dynamische Adressierung von Komponenten in strukturierten Datenobjekten. Wenn ein strukturiertes Datenobjekt generisch oder ber Casting [Seite 224] an ein Feldsymbol oder an die Parameterschnittstelle [Seite 477] einer Prozedur bergeben wird, kann im Programm weder statisch noch dynamisch ber ihre Namen auf die Komponenten zugegriffen werden. Statt dessen mu obige Anweisung verwendet werden, die einen indirekten Zugriff sowohl ber den Namen als auch ber eine Nummer erlaubt.

REPORT demo_field_symbols_assign_comp . DATA: BEGIN OF line, col1 TYPE i VALUE '11', col2 TYPE i VALUE '22', col3 TYPE i VALUE '33', END OF line. DATA comp(5) TYPE c VALUE 'COL3'. FIELD-SYMBOLS: <f1> TYPE ANY, <f2> TYPE ANY, <f3> TYPE ANY. ASSIGN line TO <f1>. ASSIGN comp TO <f2>. DO 3 TIMES. ASSIGN COMPONENT sy-index OF STRUCTURE <f1> TO <f3>. WRITE <f3>. ENDDO. ASSIGN COMPONENT <f2> OF STRUCTURE <f1> TO <f3>. WRITE / <f3>.
Die Listenausgabe ist:
11 33 22 33

Das Feldsymbol <F1> zeigt auf die Struktur LINE, <F2> zeigt auf das Feld COMP. In der DO-Schleife [Seite 259] werden die Komponenten von LINE durch ihre Nummern adressiert nacheinander <F3> zugewiesen. Nach der Schleife wird die Komponente COL3 ber ihren Namen <F3> zugewiesen. Es ist zu beachten, da die Zuweisung ASSIGN COMPONENT die einzige Mglichkeit ist, die Komponenten von <F1> zu adressieren. Die Angaben <F1>-COL1 etc. sind syntaktisch nicht mglich.

April 2001

223

ABAP Programmierung (BC-ABA) Casting von Datenobjekten

SAP AG

Casting von Datenobjekten


Bei der Zuweisung von Datenobjekten an Feldsymbole kann ein Cast auf beliebige Datentypen durchgefhrt werden. Das bedeutet, da ein beliebiger Speicherbereich unter der Annahme eines bestimmten Typs betrachtet werden kann. Somit kann symbolisch und ohne die Zuhilfenahme von Offset-/Lngenangaben auf Teilfelder zugegriffen werden. Ein Cast erfolgt mit dem Zusatz CASTING der ASSIGN-Anweisung. Der Zusatz CASTING erlaubt es, Feldsymbolen Datenobjekte zuzuweisen, deren Typ nicht zur Typisierung des Feldsymbols kompatibel ist. Wir unterscheiden einen CAST mit impliziter und einen CAST mit expliziter Typangabe.

Cast mit impliziter Typangabe


Falls das Feldsymbol entweder vollstndig oder mit einem der generischen eingebauten ABAPTypen C, N, P oder X typisiert ist, kann folgende ASSIGN-Anweisung verwendet werden:

ASSIGN ... TO <FS> CASTING.


Bei Zugriff auf das Feldsymbol, wird der Inhalt des zugewiesenen Datenobjekts so interpretiert, als ob er den Typ des Feldsymbols htte. Lnge und Ausrichtung des Datenobjekts mssen zum Typ des Feldsymbols vertrglich sein, ansonsten kommt es zu einem Laufzeitfehler. Falls im Datentyp des zugewiesenen Datenobjekts oder des Feldsymbols Strings, Referenztypen oder interne Tabellen auftreten, mssen diese Komponenten in Typ und Position exakt bereinstimmen. Ansonsten kommt es ebenfalls zu einem Laufzeitfehler.

REPORT demo_field_symbols_casting. TYPES: BEGIN OF t_date, year(4) TYPE n, month(2) TYPE n, day(2) TYPE n, END OF t_date. FIELD-SYMBOLS <fs> TYPE t_date. ASSIGN sy-datum TO <fs> CASTING. WRITE / sy-datum. SKIP. WRITE: / <fs>-year , / <fs>-month, / <fs>-day.
Die Listenausgabe ist in etwa:
1999/05/19 1999 05 19

In diesem Beispiel wird ein Feldsymbol <fs> vollstndig mit dem programmlokalen Typ t_date typisiert. Durch den Zusatz CASTING der ASSIGN-Anweisung kann das Feld SY-UCOMM wie eine Struktur behandelt werden. Ohne den CASTING-Zusatz wre die Zuweisung nicht mglich, da SY-DATUM nicht vertrglich zum Typ des Feldsymbols ist.

224

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Casting von Datenobjekten

Cast mit expliziter Typangabe


Falls das Feldsymbol nicht vollstndig sondern generisch typisiert ist, kann folgende ASSIGNAnweisung verwendet werden:

ASSIGN ... TO <FS> CASTING TYPE <type>|LIKE <obj> [DECIMALS <d>].


Bei Zugriff auf das Feldsymbol, wird der Inhalt des zugewiesenen Datenobjekts so interpretiert, als ob er den angegebenen Typ htte. Nach TYPE kann auch ein in runden Klammern eingeschlossener Name eines Datenobjekts angegeben werden. Dann bezeichnet der Inhalt des Datenobjekts den Datentyp zur Laufzeit. Es drfen keine Typen angegeben werden, mit denen ein explizites Casting von Datenobjekten nicht sinnvoll ist wie z.B ein Cast einer Standard-Tabelle auf eine sortierte Tabelle oder ein Cast einer Objektreferenz auf eine Datenreferenz. Hinter TYPE drfen also keine Tabellenarten wie z.B. SORTED TABLE oder Referenztypen mit REF TO angegeben werden. Falls im angegebenen Datentyp implizit Strings, Referenztypen oder interne Tabellen auftreten, mssen diese Komponenten bezglich Typ und Position genauso im zugewiesenen Datenobjekt auftreten. Ansonsten kommt es zu einem Syntax- bzw. Laufzeitfehler. Der durch TYPE oder LIKE angegebene Datentyp mu mit der generischen Typisierung des Feldsymbols vertrglich sein. Er kann die generische Typisierung belassen oder spezialisieren, kann aber eine bereits bekannte technische Eigenschaft des Feldsymbols nicht rckgngig machen. Beispielsweise kann bei einem Feldsymbol vom vollstndig generischen Typ ANY ein beliebiger erlaubter, auch generischer Typ angegeben werden. Bei einem Feldsymbol der generischen Typen C, N, P oder X kann nur noch die Lnge bzw. die Anzahl der Dezimalstellen festgelegt werden. Bei einem vollstndig typisierten Feldsymbol kann ohnehin keine weitere Spezialisierung vorgenommen werden und die explizite Typangabe ist deshalb verboten. Dies wird falls mglich statisch ansonsten zur Laufzeit berprft. Der Zusatz DECIMALS ist dann sinnvoll, wenn der Inhalt des zugewiesenen Datenobjekts als gepackte Zahl interpretiert werden kann. Das Feldsymbol erhlt dann <d> Dezimalstellen. DECIMALS kann nur dann verwendet werden, wenn kein Typangabe gemacht wird oder wenn hinter TYPE der Typ P angegeben ist. Ohne Typangabe wird implizit der Typ P verwendet. Die Zustze LIKE und DECIMALS drfen nicht zusammen verwendet werden.

REPORT demo_field_symbols_casting_typ. TYPES: BEGIN OF t_date, year(4) TYPE n, month(2) TYPE n, day(2) TYPE n, END OF t_date. FIELD-SYMBOLS: <fs> TYPE ANY, <f> TYPE n. ASSIGN sy-datum TO <fs> CASTING TYPE t_date. WRITE / sy-datum. SKIP. DO. ASSIGN COMPONENT sy-index OF STRUCTURE <fs> TO <f>. IF sy-subrc <> 0. EXIT.

April 2001

225

ABAP Programmierung (BC-ABA) Casting von Datenobjekten

SAP AG

ENDIF. WRITE / <f>. ENDDO.


Die Listenausgabe ist in etwa:
1999/05/19 1999 05 19

In diesem Beispiel ist das Feldsymbol <fs> vollstndig generisch. Durch den Zusatz CASTING der ASSIGN-Anweisung wird fr das Feld SY-UCOMM ein Cast auf den programmlokalen Typ t_date durchgefhrt. Das Feldsymbol <fs> kann jetzt zwar wie eine Struktur behandelt werden, kennt aber keine Komponenten. Deshalb mu es komponentenweise an ein weiteres Feldsymbol <f> zugewiesen werden.

Obsolete ASSIGN-Varianten
Folgende Zustze der ASSIGN-Anweisung sollten nicht mehr verwendet werden. Sie werden durch obigen CASTING-Zusatz abgelst

Cast mit eingebauten Datentypen


Um den Datentyp eines Feldsymbols unabhngig vom zugewiesenen Datenobjekt festzulegen, konnte man vor der Einfhrung des CASTING-Zusatzes den Zusatz TYPE direkt in der Anweisung ASSIGN verwenden:

ASSIGN ... TO <FS> TYPE <t>.


Fr <t> knnen aber nur die eingebauten elementaren ABAP-Typen fixer Lnge (C, D, F, I, N, P, T, X), sowie 's' fr 2-Byte Ganzzahlen mit Vorzeichen und 'b' fr 1-Byte Ganzzahlen ohne Vorzeichen als Literal oder Variable angegeben werden. Der CASTING-Zusatz untersttzt im Gegensatz zum TYPE-Zusatz beliebige Datentypen. Fr den direkten TYPE-Zusatz sind zwei Flle zu unterscheiden:

Typisierte Feldsymbole Die Verwendung des TYPE-Zusatzes bei einem typisierten Feldsymbol ist sinnvoll, wenn der Datentyp des zuzuweisenden Datenobjekts nicht vertrglich zur Typisierung des Feldsymbols ist, die entsprechende Fehlermeldung aber umgangen werden soll. In diesem Fall mssen der angegebene Typ <t> und die Typisierung des Feldsymbols vertrglich sein. Das Feldsymbol behlt dann seinen Datentyp unabhngig vom zugewiesenen Datenobjekt. Dieser Fall wird durch den Cast mit impliziter Typangabe abgedeckt.

Untypisierte Feldsymbole Mit dem TYPE-Zusatz bernimmt ein untypisiertes Feldsymbol <FS> nicht den Datentyp und die Ausgabelnge des zugewiesenen Datenobjekts, sondern den in <t> angegebenen Datentyp. Wird das Feldsymbol nach einer Zuweisung mit TYPE-Zusatz im Programm verwendet, wird der Inhalt des Datenobjekts wird wie bei einem Feld des Typs <t> interpretiert. Dieser Fall wird durch den Cast mit expliziter Typangabe abgedeckt.

226

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Casting von Datenobjekten

Laufzeitfehler treten auf, wenn, der angegebene Datentyp unbekannt ist, die Lnge des angegebenen Datentyps nicht zum Typ des zugewiesenen Feldes pat und eine Unvertrglichkeit mit der Ausrichtung [Seite 204] auftritt

Beispiel mit obsoletem TYPE-Zusatz:

DATA txt(8) VALUE '19980606'. DATA mytype(1) VALUE 'X'. FIELD-SYMBOLS <fs>. ASSIGN txt TO <fs>. WRITE / <fs>. ASSIGN txt TO <fs> TYPE 'D'. WRITE / <fs>. ASSIGN TXT TO <FS> TYPE MYTYPE. WRITE / <fs>.
Beispiel mit CASTING-Zusatz:

DATA txt(8) VALUE '19980606'. DATA mytype(1) VALUE 'X'. FIELD-SYMBOLS <fs>. ASSIGN txt TO <fs>. WRITE / <fs>. ASSIGN txt TO <fs> CASTING TYPE d. WRITE / <fs>. ASSIGN txt TO <fs> CASTING TYPE (mytype). WRITE / <fs>.
Die Listenausgabe ist in beiden Fllen in etwa:
19980606 06061998 3139393830363036

In diesen Beispielen wird die Zeichenkette TXT dreimal dem Feldsymbol<FS> zugewiesen: zuerst ohne Casting, dann mit Casting des Typs auf D und X. Das Format der zweiten Ausgabezeile hngt von den Angaben im Benutzerstammsatz ab. Die Zahlen in der letzten Ausgabezeile stehen paarweise fr den hexadezimalen Code der Zeichen in TXT und hngen von der Zeichendarstellung der Plattform (hier ASCII) ab.

Cast der Dezimalstellen


Um bei der Zuweisung einer gepackten Zahl vom Typ P die Anzahl der Dezimalstellen des Feldsymbols festzulegen, man vor der Einfhrung des CASTING-Zusatzes den Zusatz DECIMALS direkt in der Anweisung ASSIGN verwenden:

April 2001

227

ABAP Programmierung (BC-ABA) Casting von Datenobjekten Syntax

SAP AG

ASSIGN ... TO <FS> DECIMALS <d>.


Der DECIMALS-Zusatz kann mit allen Varianten der Anweisung ASSIGN eingesetzt werden, bei denen das zugewiesene Datenobjekt den Typ P hat. Die Verwendung des DECIMALS-Zusatzes fhrt im allgemeinen zu unterschiedlichen numerischen Werten fr das Feldsymbol und das zugewiesene Feld. Die Anzahl der Dezimalstellen <d> kann als Literal oder Variable angegeben werden. Ein Laufzeitfehler tritt auf, wenn <d> nicht zwischen 0 und 14 liegt oder das zugewiesene Feld nicht vom Typ P ist.

Beispiel mit obsoletem DECIMALS-Zusatz:

DATA: pack1 TYPE p DECIMALS 2 VALUE '400', pack2 TYPE p DECIMALS 2, pack3 TYPE p DECIMALS 2. FIELD-SYMBOLS: <f1> TYPE ANY , <f2> TYPE ANY. WRITE: / 'PACK1', pack1. ASSIGN pack1 TO <f1> DECIMALS 1. WRITE: / '<F1> ', <f1>. pack2 = <f1>. WRITE: / 'PACK2', pack2. ASSIGN pack2 TO <f2> DECIMALS 4. WRITE: / '<F2> ', <f2>. pack3 = <f1> + <f2>. WRITE: / 'PACK3', pack3. <f2> = '1234.56789'. WRITE: / '<F2> ', <f2>. WRITE: / 'PACK2', pack2.
Beispiel mit CASTING-Zusatz:

DATA: pack1 TYPE p DECIMALS 2 VALUE '400', pack2 TYPE p DECIMALS 2, pack3 TYPE p DECIMALS 2. FIELD-SYMBOLS: <f1> TYPE ANY , <f2> TYPE ANY. WRITE: / 'PACK1', pack1. ASSIGN pack1 TO <f1> CASTING TYPE p DECIMALS 1. WRITE: / '<F1> ', <f1>. pack2 = <f1>. WRITE: / 'PACK2', pack2. ASSIGN pack2 TO <f2> CASTING TYPE p DECIMALS 4. WRITE: / '<F2> ', <f2>. pack3 = <f1> + <f2>. WRITE: / 'PACK3', pack3.

228

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Casting von Datenobjekten

<f2> = '1234.56789'. WRITE: / '<F2> ', <f2>. WRITE: / 'PACK2', pack2.


Die Listenausgabe ist in beiden Fllen:
PACK1 <F1> PACK2 <F2> PACK3 <F2> PACK2 400,00 4.000,0 4,000,00 40,0000 4.040,00 1.234,5679 123.456,79

Die drei Felder vom Typ P haben alle zwei Dezimalstellen. Die Feldsymbole <f1> und <f2> erhalten eine bzw. vier Dezimalstellen. Die numerischen Werte sind verschieden fr die Feldsymbole und die zugewiesenen Felder.

April 2001

229

ABAP Programmierung (BC-ABA) Datenbereiche fr Feldsymbole

SAP AG

Datenbereiche fr Feldsymbole
Feldsymbolen knnen Datenobjekte nur aus den Datenbereichen des ABAP-Programms zugewiesen werden. Whrend der Zuweisungen von Datenobjekten an Feldsymbole werden zur Laufzeit Prfungen durchgefhrt, um bei fehlerhaften Adrezuweisungen auerhalb der Datenbereiche unkontrollierte Datenverluste zu verhindern. Die Datenbereiche eines ABAP-Programms sind:

Der Tabellenspeicherbereich fr interne Tabellen. Die Gre dieses Datenbereichs hngt von der Zahl der Tabellenzeilen ab, die nicht statisch ist, sondern zur Laufzeit dynamisch festgelegt wird. Der DATA-Speicherbereich fr andere Datenobjekte. Die Gre dieses Datenbereichs wird whrend der Datendeklaration festgelegt.

Feldsymbole knnen nicht auf Inhalte auerhalb dieser Bereiche zeigen. Wird bei einer Zuweisung von Datenobjekten ein derartiger Versuch Laufzeit registriert, kommt es zu einem Laufzeitfehler. Bestimmte Systeminformationen, z.B. Kontrollblcke interner Tabellen, sind ebenfalls im DATASpeicherbereich abgelegt, so da trotz Laufzeitprfungen einige dieser Felder unbeabsichtigt berschrieben und dadurch Folgefehler verursacht werden knnen (z.B. Zerstrung von Tabellen-Headern).

REPORT demo_field_symbols_assign_err. DATA: text1(10) TYPE c, text2(10) TYPE c, text3(5) TYPE c. FIELD-SYMBOLS <fs> TYPE ANY. DO 100 TIMES. ASSIGN text1+sy-index(1) TO <fs>. ENDDO. "Runtime-Error!

Nach dem Starten von DEMO kommt es zu einem Laufzeitfehler. Der Beginn der Abbruchmeldung ist:

ABAP Laufzeitfehler ASSIGN_OFFSET+LENGTH_TOOLARGE aufgetreten am 1998/06/02 um 23:32:09 Fehler in ASSIGN: Speicherschutzfehler ...

Der DATA-Speicherbereich hat eine Breite von mindestens 25 Byte (es knnen Vergrerungen um einige Byte durch Ausrichtung der Datenbereiche im Speicher auftreten). In einem der Schleifendurchlufe wird die Zuweisung einer Adresse

230

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Datenbereiche fr Feldsymbole

auerhalb dieses Bereichs versucht. Die Abbruchmeldung zeigt weiter unten auch den Inhalt des Felds SY-INDEX, der von Fall zu Fall etwas unterschiedlich sein kann. Bis mindestens zum 24. Schleifendurchlauf tritt kein Fehler auf. Ersetzt man in der ASSIGN-Anweisung TEXT1 durch TEXT2, tritt der Fehler zehn Schleifendurchlufe frher auf.

April 2001

231

ABAP Programmierung (BC-ABA) Datenreferenzen

SAP AG

Datenreferenzen
Datenreferenzen sind Zeiger auf beliebige Datenobjekte. Sie kommen in ABAP als Inhalt von Datenreferenzvariablen vor. Datenreferenzen knnen zur dynamischen Erzeugung von Datenobjekten verwendet werden und es knnen Referenzen auf bestehende Datenobjekte beschafft werden. Eine Datenreferenz kann nur durch eine spezielle Zuweisung an ein Feldsymbole [Seite 209] dereferenziert werden. Referenzvariable [Seite 233] Datenobjekte dynamisch erzeugen [Seite 234] Referenzen auf Datenobjekte beschaffen [Seite 235] Datenreferenzen dereferenzieren [Seite 236] Beispiel zu Datenreferenzen [Seite 237]

232

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Referenzvariable

Referenzvariable
Referenzvariablen enthalten Referenzen. Der eigentliche Inhalt einer Referenzvariable, also der Wert einer Referenz, ist in einem ABAP-Programm nicht sichtbar. In ABAP treten Referenzen entweder als Datenreferenzen oder als Objektreferenzen [Seite 1410] auf. Entsprechend unterscheiden wir zwischen Datenreferenzvariablen und Objektreferenzvariablen. Der Datentyp einer Datenreferenzvariablen wird angelegt mit: TYPES <t_dref> TYPE REF TO DATA. Eine Datenreferenzvariable wird angelegt entweder mit Bezug auf obigen Datentyp oder mit: DATA <dref> TYPE REF TO DATA. Referenzvariable werden in ABAP wie andere Datenobjekte mit elementarem Datentyp behandelt. Das bedeutet, da eine Referenzvariable nicht nur als Einzelfeld, sondern auch als kleinste unteilbare Einheit komplexer Datenobjekte wie Strukturen oder interne Tabellen definiert werden kann. Nach ihrer Deklaration ist eine Referenzvariable initial, d.h. sie enthlt einen leeren Zeiger, bzw. zeigt auf kein Objekt. Eine Dereferenzierung [Seite 236] einer initialen Referenzvariablen ist nicht mglich. Damit eine Datenreferenzvariable eine Referenz enthlt, die auf ein Datenobjekt zeigt, mu

mit ihr ein Datenobjekt dynamisch erzeugt [Seite 234] werden. mit ihr eine Referenz auf ein Datenobjekt beschafft [Seite 235] werden. ihr eine bestehende Datenreferenz aus einer anderen Datenreferenzvariable zugewiesen werden.

Die Zuweisung von Referenzen zwischen Datenreferenzvariablen erfolgt mit der MOVEAnweisung bzw. dem Zuweisungsoperator (=) aber auch beim Fllen interner Tabellen oder bei der bergabe an Schnittstellenparameter von Prozeduren. Bei einer solchen Zuweisung mssen die beteiligten Operanden als Datenreferenzvariable typisiert sein. Zuweisungen an Objektreferenzvariable oder andere Variable sind nicht mglich. Nach der Zuweisung zeigt die Referenz in der Zielvariable auf das gleiche Datenobjekt wie die Referenz in der Quellvariable.

April 2001

233

ABAP Programmierung (BC-ABA) Datenobjekte dynamisch erzeugen

SAP AG

Datenobjekte dynamisch erzeugen


Alle Datenobjekte, die im Deklarationsteil eines Programms mit den entsprechenden Anweisungen wie DATA etc. deklariert werden, werden statisch erzeugt und sind beim Programmstart bereits vorhanden. Um ein Datenobjekt dynamisch whrend der Programmausfhrung zu erzeugen bentigt man eine Datenreferenzvariable und die Anweisung: CREATE DATA <dref> TYPE <type>|LIKE <obj>. Diese Anweisung erzeugt ein Datenobjekt im internen Modus des aktuellen ABAP-Programms und die Datenreferenz in der Datenreferenzvariablen <dref> zeigt nach Ausfhrung der Anweisung auf dieses Objekt. Das dynamisch erzeugte Datenobjekt hat keinen eigenen Namen und ist nur ber Datenreferenzvariable adressierbar. Um auf den Inhalt des Datenobjekts zugreifen zu knnen, mu die Datenreferenz dereferenziert [Seite 236] werden. Mit dem TYPE- [Seite 117] oder dem LIKE-Zusatz [Seite 121] mu der Datentyp des Datenobjekts angegeben werden. Im Unterschied zur Verwendung des TYPE-Zusatzes in sonstigen ABAP-Anweisungen kann bei CREATE DATA der Datentyp dynamisch als Inhalt eines Felds angegeben werden: CREATE DATA <dref> TYPE (<name>). Hierbei ist <name> der Name eines Felds, das die Bezeichnung des gewnschten Datentyps enthlt.

234

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Referenzen auf Datenobjekte beschaffen

Referenzen auf Datenobjekte beschaffen


Mit folgender Anweisungen knnen Datenreferenzen auf bestehende Datenobjekte in Referenzvariable gestellt werden: GET REFERENCE OF <obj> INTO <dref>. Dabei ist <obj> entweder ein statisch deklariertes Datenobjekt oder ein Feldsymbol, das auf ein beliebiges Datenobjekt, also auch auf ein dynamisch erzeugtes, zeigt. Falls ein Feldsymbol angegeben wird, dem noch kein Datenobjekt zugewiesen wurde, erfolgt ein Laufzeitfehler. Wenn eine Referenz auf ein lokales Feld in einer Prozedur [Seite 467] in eine globale Referenzvariable gestellt wird, wird diese nach Verlassen der Prozedur ungltig. Eine Dereferenzierung [Seite 236] dieser Referenzvariablen ist dann nicht mglich.

April 2001

235

ABAP Programmierung (BC-ABA) Datenreferenzen dereferenzieren

SAP AG

Datenreferenzen dereferenzieren
Um auf den Inhalt eines Datenobjekts zugreifen zu knnen, auf das eine Datenreferenz zeigt, mu diese wie folgt dereferenziert werden. ASSIGN <dref>->* TO <FS> [CASTING ...]. Diese Anweisung weist dem Feldsymbol [Seite 209] <FS> das Datenobjekt zu, auf das die Datenreferenz in der Referenzvariablen <dref> zeigt. Bei erfolgreicher Zuweisung wird SYSUBRC auf Null gesetzt. Falls das Feldsymbol vollstndig generisch ist, bernimmt es den Datentyp des Datenobjekts. Bei teilweiser oder vollstndiger Typisierung des Feldsymbols wird die Vertrglichkeit der Datentypen berprft. Das Casting [Seite 224] des zugewiesenen Datenobjekts ist ebenfalls mglich. Falls die Datenreferenz in <dref> initial oder ungltig ist, ist keine Dereferenzierung mglich. Dann wird das Feldsymbol nicht gendert und SY-SUBRC auf vier gesetzt. Bei dynamisch erzeugten Datenobjekten ist die Dereferenzierung die einzige Mglichkeit, um auf den Inhalt zuzugreifen.

236

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Beispiel zu Datenreferenzen

Beispiel zu Datenreferenzen
REPORT demo_data_reference. TYPES: BEGIN OF t_struct, col1 TYPE i, col2 TYPE i, END OF t_struct. DATA: dref1 TYPE REF TO data, dref2 TYPE REF TO data. FIELD-SYMBOLS: <fs1> TYPE t_struct, <fs2> TYPE i. CREATE DATA dref1 TYPE t_struct. ASSIGN dref1->* TO <fs1>. <fs1>-col1 = 1. <fs1>-col2 = 2. dref2 = dref1. ASSIGN dref2->* TO <fs2> CASTING. WRITE / <fs2>. GET REFERENCE OF <fs1>-col2 INTO dref2. ASSIGN dref2->* TO <fs2>. WRITE / <fs2>.
Die Listenausgabe ist:
1 2

In diesem Beispiel werden zwei Datenreferenzvariable dref1 und dref2 deklariert. Mit dref1 wird ein strukturiertes dynamisches Datenobjekt erzeugt. Diesem werden nach der Dereferenzierung mit dem Feldsymbol <fs1> Werte zugewiesen. Nach der Zuweisung von dref1 an dref2 zeigt auch dref2 auf das strukturierte Datenobjekt. Bei der Dereferenzierung von dref2 wird ein Cast auf den elementaren Typ i des Feldsymbols <fs2> durchgefhrt. Dadurch wird seine erste Komponente dem Feldsymbol zugewiesen. Dann wird mit GET REFERENCE eine Referenz auf die zweite Komponente des strukturierten Datenobjekts in dref2 gestellt und ohne Casting dereferenziert.

April 2001

237

ABAP Programmierung (BC-ABA) Logische Ausdrcke

SAP AG

Logische Ausdrcke
Bei der Programmierung von Anwendungsprogrammen kommt es hufig vor, da Bedingungen formuliert werden mssen. Bedingungen dienen meistens der Programmablaufsteuerung [Seite 254] oder dem bedingten Verlassen von Verarbeitungsblcken. Bedingungen werden durch logische Ausdrcke formuliert. Ein logischer Ausdruck ist entweder wahr oder falsch.

Vergleiche zwischen Datenobjekten


Logische Ausdrcke knnen als Vergleiche zwischen Datenobjekten formuliert werden:

.... <f1> <operator> <f2> ...


Je nachdem von welchem Datentyp die Operanden <f1> und <f2> sind, knnen verschiedene logische Operatoren verwendet werden: Vergleiche zwischen verschiedenen Datentypen [Seite 239] Vergleiche zwischen Zeichenketten [Seite 243] Vergleiche zwischen Bitfolgen [Seite 247]

Weitere logische Ausdrcke


Neben Vergleichen zwischen Datenobjekten knnen logische Ausdrcke formuliert werden, die prfen, ob Datenobjekte bestimmte Anforderungen erfllen: Intervallzugehrigkeit prfen [Seite 249] Initialwert prfen [Seite 250] Selektionskriterien prfen [Seite 251] Zuweisung zu einem Feldsymbol berprfen [Seite 252]

Logische Ausdrcke verknpfen


Mehrere logische Ausdrcke lassen sich zu einer Bedingung verknpfen: Mehrere logische Ausdrcke verknpfen [Seite 253]

238

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Vergleiche zwischen verschiedenen Datentypen

Vergleiche zwischen verschiedenen Datentypen


Mit folgenden logischen Operatoren knnen zwei Datenobjekte mit verschiedenen Datentypen verglichen werden:
<operator> Bedeutung

EQ = NE <> >< LT < LE <= GT > GE >=

gleich gleich ungleich ungleich ungleich kleiner kleiner kleiner gleich kleiner gleich grer grer grer gleich grer gleich

Die Operanden mssen kompatibel oder ineinander konvertierbar sein.

Vergleich von elementaren Datentypen


Datenobjekte deren Datentyp einer der acht eingebauten ABAP-Typen [Seite 101] ist, werden wie folgt verglichen: Beim Vergleich kompatibler Operanden wird keine Konvertierung durchgefhrt Der Vergleich luft wie folgt ab: Numerische Felder (Typ I, F, P) und numerische Textfelder (Typ N) werden gem ihrem Zahlenwert verglichen. Bei den brigen Feldern (C, D, T, X) findet der Vergleich von links nach rechts statt. Das erste verschiedene Zeichen von links entscheidet, welcher Operand grer ist. Textfelder (Typ C) werden bezglich des zugrundeliegenden Zeichencodes verglichen. Bei Datumsfeldern (Typ D) ist die jngere Datumsangabe grer als die ltere. Bei Zeitfeldern (Typ T) ist die sptere Zeitangabe grer als die frhere. Hexadezimalfelder (Typ X) werden bezglich der Bytewerte verglichen. Beim Vergleich inkompatibler Operanden, die zwar unterschiedliche Lnge, aber gleichen Datentyp haben, luft der Vergleich wie folgt ab: Gepackte Zahlen (Typ P) werden ohne Konvertierung gem ihrem Zahlenwert verglichen. Bei den brigen Typen (C, N, X), die unterschiedliche Lngen haben knnen, wird der krzere Operand vor dem Vergleich auf die Lnge des lngeren Operands konvertiert und wie folgt aufgefllt: Zeichenketten (Typ C) werden von rechts mit Leerzeichen aufgefllt, numerische Texte (Typ N) von links mit Nullen, Hexadezimalfelder von rechts mit hexadezimal Null.

April 2001

239

ABAP Programmierung (BC-ABA) Vergleiche zwischen verschiedenen Datentypen

SAP AG

DATA: hex1(3) TYPE x VALUE '34B7A1', hex2(1) TYPE x VALUE 'F0'. IF hex2 > hex1. ... ENDIF.
Der logische Ausdruck in der IF-Anweisung ist wahr, da das erste Byte von HEX2 grer als das erste Byte von HEX1 ist. Beim Vergleich inkompatibler Datenobjekte deren Datentyp unterschiedlich ist, wird vor der Ausfhrung des Vergleichs eine Typkonvertierung [Seite 192] nach folgenden hierarchischen Regeln durchgefhrt: 1. Ist einer der Operanden eine Gleitpunktzahl (Typ F), konvertiert das System die anderen Operanden ebenfalls in Typ F. 2. Ist einer der Operanden ein gepacktes Feld (Typ P), konvertiert das System die anderen Operanden ebenfalls in Typ P. 3. Ist einer der Operanden ein Datumsfeld (Typ D) oder ein Zeitfeld (Typ T), konvertiert das System die anderen Operanden ebenfalls in den Typ D oder T. Vergleiche zwischen Datums- und Zeitfeldern werden nicht untersttzt und fhren zum Programmabbruch. 4. Ist einer der Operanden ein Characterfeld (Typ C) und der andere Operand ein Hexadezimalfeld (Typ X), konvertiert das System den Operanden vom Typ X in den Typ C. 5. Ist einer der Operanden ein Characterfeld (Typ C) und der andere ein numerisches Feld (Typ N), konvertiert das System beide Operanden in den Typ P.

DATA: num(4) TYPE n VALUE '1234', text(5) TYPE c VALUE '567.8'. IF num > text. ... ENDIF.
Der logische Ausdruck in der IF-Anweisung ist wahr, da nach der Konvertierung in gepackte Zahlen der Wert von NUM grer als der Wert von TEXT ist. Wenn NUM vom Typ C wre, wre der logische Ausdruck dagegen falsch, da dann nicht in gepackte Zahlen konvertiert wird.

Vergleich von Referenzen


Beim Vergleich kompatibler oder konvertibler Referenzvariablen in ABAP Objects [Seite 1392] sind nur die Operatoren fr 'gleich' (EQ, =) und 'ungleich' (NE, <>, ><) sinnvoll. Der Vergleich mit 'gleich' ist wahr, wenn beide Referenzvariablen Referenzen auf das gleiche Objekt enthalten, und falsch, falls sie Referenzen auf unterschiedliche Objekte enthalten. Fr 'ungleich' gilt das entsprechend umgekehrt.

240

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Vergleiche zwischen verschiedenen Datentypen

INTERFACE i1. ... ENDINTERFACE. CLASS c1 DEFINITION. PUBLIC SECTION. INTERFACES i1. ... ENDCLASS. DATA: r1 TYPE REF TO i1, r2 TYPE REF TO c1. CREATE OBJECT r2. r1 = r2. IF r1 = r2. ... ENDIF.
Der logische Ausdruck in der IF-Anweisung ist wahr, da beide Referenzen auf das gleiche Objekt zeigen.

Vergleich von Strukturen


Kompatible Strukturen werden in ihre elementaren Bestandteile aufgelst und diese werden verglichen. Zwei Strukturen sind gleich, wenn alle elementaren Bestandteile gleich sind. Bei ungleichen Strukturen entscheidet das erste ungleiche Element, welche Struktur grer oder kleiner ist.

DATA: BEGIN OF struct1, col1 TYPE i VALUE 1, col2 TYPE p DECIMALS 2 VALUE '56.78', END OF struct1. DATA: BEGIN OF struct2, comp1 TYPE i VALUE 10, comp2 TYPE p DECIMALS 2 VALUE '12.34', END OF struct2. IF struct1 < struct2. ... ENDIF.
Der logische Ausdruck in der IF-Anweisung ist wahr, da der Wert der ersten Komponente von STRUCT1 kleiner als der Wert der zweiten Komponente ist. Beim Vergleich inkompatibler Strukturen oder beim Vergleich zwischen Strukturen und elementaren Feldern, werden die beteiligten Strukturen vor dem Vergleich in Felder vom Typ C konvertiert [Seite 201] und dann wie elementare Felder behandelt.

April 2001

241

ABAP Programmierung (BC-ABA) Vergleiche zwischen verschiedenen Datentypen

SAP AG

DATA: BEGIN OF struct, col1(5) TYPE c VALUE '12345', col2(5) TYPE n VALUE '12345', END OF struct. DATA text(10) TYPE c VALUE '1234512345'. IF struct = text. ... ENDIF.
Der logische Ausdruck in der IF-Anweisung ist wahr, da die Struktur STRUCT nach der Konvertierung in ein Feld vom Typ C den gleichen Inhalt wie das Feld TEXT hat.

Vergleich von internen Tabellen


Siehe Interne Tabellen vergleichen [Seite 284].

242

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Vergleiche zwischen Zeichenketten

Vergleiche zwischen Zeichenketten


hnlich wie es spezielle Anweisungen fr die Verarbeitung von Zeichenketten [Seite 167] gibt, knnen spezielle Vergleiche mit Zeichenketten der Typen C, D, N und T durchgefhrt werden. Folgende Operatoren vergleichen Zeichenketten:
<operator> Bedeutung

CO CN CA NA CS NS CP NP

enthlt nur enthlt nicht nur enthlt irgendein enthlt kein enthlt Zeichenkette enthlt Zeichenkette nicht enthlt Muster enthlt Muster nicht

Bei diesen Vergleichen werden keine Konvertierungen durchgefhrt, sondern die Zeichen der Zeichenketten interpretiert. Die Operatoren haben folgende Funktionen:
CO (Contains Only)

Der logische Ausdruck

<f1> CO <f2>
ist erfllt, wenn <f1> nur Zeichen aus <f2> enthlt. Der Vergleich bercksichtigt Gro/Kleinschreibung. Nachfolgende Leerzeichen werden nicht ignoriert. Ist der Vergleich wahr, enthlt das Systemfeld SY-FDPOS die Lnge von <f1>. Ist er falsch, enthlt SY-FDPOS den Offset des ersten Zeichens von <f1>, das nicht in <f2> enthalten ist.
CN (Contains Not only)

Der logische Ausdruck

<f1> CN <f2>
ist erfllt, wenn <f1> nicht nur Zeichen aus <f2> enthlt. Der Vergleich bercksichtigt Gro/Kleinschreibung. Nachfolgende Leerzeichen werden nicht ignoriert. Ist der Vergleich wahr, enthlt SY-FDPOS den Offset des ersten Zeichens von <f1>, das nicht in <f2> enthalten ist. Ist der Vergleich falsch, enthlt das Systemfeld SY-FDPOS die Lnge von <f1>.
CA (Contains Any)

Der logische Ausdruck

<f1> CA <f2>
ist erfllt, wenn <f1> mindestens ein Zeichen aus <f2> enthlt. Der Vergleich bercksichtigt Gro-/Kleinschreibung. Ist der Vergleich wahr, enthlt SY-FDPOS den Offset des ersten Zeichens von <f1>, das auch in <f2> enthalten ist. Ist er falsch, enthlt SY-FDPOS die Lnge von <f1>.

April 2001

243

ABAP Programmierung (BC-ABA) Vergleiche zwischen Zeichenketten NA (contains Not Any)

SAP AG

Der logische Ausdruck

<f1> NA <f2>
ist erfllt, wenn <f1> kein Zeichen aus <f2> enthlt. Der Vergleich bercksichtigt Gro/Kleinschreibung. Ist der Vergleich wahr, enthlt das Systemfeld SY-FDPOS die Lnge von <f1>. Ist er falsch, enthlt SY-FDPOS den Offset des ersten Zeichens von <f1> das in <f2> entalten ist.
CS (Contains String)

Der logische Ausdruck

<f1> CS <f2>
ist erfllt, wenn <f1>, die Zeichenkette <f2> enthlt. Nachfolgende Leerzeichen werden ignoriert und der Vergleich bercksichtigt keine Gro-/Kleinschreibung. Ist der Vergleich wahr, enthlt SY-FDPOS den Offset von <f2> in <f1>. Ist er falsch, enthlt das Systemfeld SY-FDPOS die Lnge von <f1>.
NS (contains No String)

Der logische Ausdruck

<f1> NS <f2>
ist erfllt, wenn <f1> die Zeichenkette <f2> nicht enthlt. Nachfolgende Leerzeichen werden ignoriert und der Vergleich bercksichtigt keine Gro-/Kleinschreibung. Ist der Vergleich wahr, enthlt das Systemfeld SY-FDPOS die Lnge von <f1>. Ist er falsch, enthlt SY-FDPOS den Offset von <f2> in <f1>.
CP (Contains Pattern)

Der logische Ausdruck

<f1> CP <f2>
ist erfllt, wenn <f1> das Muster <f2> enthlt. Ist <f2> vom Typ C, knnen Sie folgende Maskenzeichen innerhalb von <f2> verwenden:

fr eine beliebige Zeichenkette: * fr ein beliebiges Zeichen: +

Nachfolgende Leerzeichen werden ignoriert und der Vergleich bercksichtigt keine Gro/Kleinschreibung. Ist der Vergleich wahr, enthlt SY-FDPOS den Offset von <f2> in <f1>. Ist er falsch, enthlt das Systemfeld SY-FDPOS die Lnge von <f1>. Um anzuzeigen, da ein Zeichen innerhalb von <f2> exakt verglichen werden soll, kann man das Fluchtsymbol # setzen. Mit Hilfe des Fluchtsymbols # kann man folgende Zeichen suchen:

Zeichen in Gro- und Kleinschreibung das Maskenzeichen * (Eingabe: #*) das Maskenzeichen + (Eingabe: #+) das Fluchtsymbol selbst (Eingabe: ##) Leerzeichen am Stringende (Eingabe: #___)

244

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Vergleiche zwischen Zeichenketten

NP (contains No Pattern)

Der logische Ausdruck

<f1> NP <f2>
ist erfllt, wenn <f1> das Muster <f2> nicht enthlt. Innerhalb von <f2> knnen die gleichen Maskenzeichen und Fluchtsymbol verwendet werden wie beim Operator CP. Nachfolgende Leerzeichen werden ignoriert und der Vergleich bercksichtigt keine Gro/Kleinschreibung. Ist der Vergleich wahr, enthlt das Systemfeld SY-FDPOS die Lnge von <f1>. Ist er falsch, enthlt SY-FDPOS den Offset von <f2> in <f1>.

DATA: f1(5) TYPE c VALUE <f1>, f2(5) TYPE c VALUE <f2>. IF f1 <operator> f2. WRITE: / 'Vergleich wahr, SY-FDPOS=', sy-fdpos. ELSE. WRITE: / 'Vergleich falsch, SY-FDPOS=', sy-fdpos. ENDIF.
Die folgende Tabelle enthlt eine bersicht darber, welche Ergebnisse man bei der Ausfhrung dieses Programms erhlt, je nachdem welche Operatoren und Werte der Felder F1 und F2 verwendet werden.
<f1> <operator> <f2> Ergebnis SY-FDPOS

'BD 'BD

' '

CO CO CN CN CA CA NA NA CS CS NS NS CP CP NP NP

'ABCD ' 'ABCDE' 'ABCD ' 'ABCD ' 'Bd 'bD 'AB 'AB 'bC 'ce 'bC 'ce ' ' ' ' ' ' ' '

wahr
falsch

5 2 3 5 1 5 0 5 1 5 1 5 1 5 1 5

'ABC12' 'ABABC' 'ABcde' 'ABcde' 'ABAB ' 'ababa' 'ABcde' 'ABcde' 'ABcde' 'ABcde' 'ABcde' 'ABcde' 'ABcde' 'ABcde'

wahr
falsch

wahr
falsch falsch

wahr wahr
falsch falsch

wahr wahr
falsch falsch

'*b*' '*#b*' '*b*' '*#b*'

wahr

April 2001

245

ABAP Programmierung (BC-ABA) Vergleiche zwischen Zeichenketten

SAP AG

246

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Vergleiche zwischen Bitfolgen

Vergleiche zwischen Bitfolgen


Mit den folgenden drei Operatoren lt sich die Bitfolge, die der erste Operand im Speicher darstellt mit der Bitfolge des zweiten Operanden vergleichen:
<operator> Bedeutung

O Z M

Bits sind 1 Bits sind 0 Bits sind 0 und 1

Der zweite Operand mu vom Typ X sein. Der Vergleich findet ber die Lnge des zweiten Operanden statt. Der erste Operand wird nicht nach Typ X konvertiert. Die Operatoren erfllen folgende Funktionen:
O (Bits sind One)

Der logische Ausdruck

<f> O <hex>
ist erfllt, wenn die in <hex> mit 1 gefllten Bitpositionen auch in <f> mit 1 gefllt sind. In Bezug zu Mengenoperationen mit Bitfolgen [Seite 189] ist dieser Vergleich gleichbedeutend zur Abfrage, ob die durch <f> dargestellte Menge eine Obermenge der durch <hex> dargestellten Menge ist.
Z (Bits sind Zero)

Der logische Ausdruck

<f> Z <hex>
ist erfllt, wenn die in <hex> mit 1 gefllten Bitpositionen auch in <f> mit 0 gefllt sind.
M (Bits sind Mixed)

Der logische Ausdruck

<f> M <hex>
ist erfllt, wenn mindestens eine der in <hex> mit 1 gefllten Bitpositionen in <f> mit 1 und mindestens eine mit 0 gefllt ist.

REPORT demo_log_expr_bits . DATA: text(1) TYPE c VALUE 'C', hex(1) TYPE x, i TYPE i. hex = 0. DO 256 TIMES. i = hex.

April 2001

247

ABAP Programmierung (BC-ABA) Vergleiche zwischen Bitfolgen

SAP AG

IF text O hex. WRITE: / hex, i. ENDIF. hex = hex + 1. ENDDO.


Die Listenausgabe sieht folgendermaen aus:
00 01 02 03 40 41 42 43 0 1 2 3 64 65 66 67

In diesem Beispiel wird die Bitfolge des Zeichens 'C' mit allen hexadezimalen Zahlen HEX zwischen '00' und 'FF' (255 im Dezimalsystem) mit Hilfe des Operators O verglichen. Der Dezimalwert von HEX wird mit Hilfe der automatischen Typkonvertierung whrend der Zuweisung von HEX zu I ermittelt. Ist der Vergleich wahr, erscheinen die hexadezimale Zahl und ihr Dezimalwert auf dem Bildschirm. Die folgende Tabelle zeigt die Bitfolgen dieser Zahlen.
Hexadezimal Dezimal Bitfolgen

00 01 02 03 40 41 42 43

0 1 2 3 64 65 66 67

00000000 00000001 00000010 00000011 01000000 01000001 01000010 01000011

Die Bitfolge des Zeichens 'C' ist bei der hier verwendeten Plattform durch seinen ASCII-Code 67 festgelegt. Es erscheinen genau die Zeichen in der Listenausgabe, bei denen die gleiche Bitposition mit 1 gefllt ist, wie in der Bitfolge von 'C'. Die Bitfolge 01000011 ist die Obermenge dieser Bitfolgen.

248

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Intervallzugehrigkeit prfen

Intervallzugehrigkeit prfen
Folgender logischer Ausdruck berprft, ob der Wert eines Felds innerhalb eines bestimmten Intervalls liegt:

.... <f1> BETWEEN <f2> AND <f3> .....


Dieser Ausdruck ist wahr, wenn der Wert von <f1> im Intervall zwischen den Werten von <f2> und <f3> liegt. Er ist eine Kurzform folgender Verknpfung:

IF <f1> GE <f2> AND <f1> LE <f3>.


Die Operanden knnen verschiedene Datentypen haben und werden gegebenenfalls wie bei Vergleichen zwischen verschiedenen Datentypen [Seite 239] konvertiert.

DATA: number TYPE I, flag(1) TYPE c. ... number = ... ... IF number BETWEEN 3 AND 7. flag = 'X'. ELSE. flag = ' '. ENDIF.
In diesem Beispiel wird der Inhalt des Felds FLAG auf X gesetzt, wenn der Wert von NUMBER zwischen 3 und 7 liegt.

April 2001

249

ABAP Programmierung (BC-ABA) Initialwert prfen

SAP AG

Initialwert prfen
Folgender logischer Ausdruck berprft, ob ein Feld seinen Initialwert hat:

.... <f> IS INITIAL .....


Der Ausdruck ist wahr, wenn das Feld <f> seinen typgerechten Initialwert enthlt. Im allgemeinen enthlt jedes Feld, ob Einzelfeld oder aggregiertes Feld, seinen Initialwert nach Durchfhrung der Anweisung CLEAR <f> [Seite 155].

REPORT demo_log_expr_is_initial . DATA flag(1) TYPE c VALUE 'X'. IF flag IS INITIAL. WRITE / 'Flag is initial'. ELSE. WRITE / 'Flag is not initial'. ENDIF. CLEAR flag. IF flag IS INITIAL. WRITE / 'Flag is initial'. ELSE. WRITE / 'Flag is not initial'. ENDIF.
Die Listenausgabe sieht folgendermaen aus:
Flag is not initial Flag is initial.

In diesem Beispiel enthlt das Zeichenfeld FLAG nach der Deklarierung durch die Anweisung DATA nicht seinen Initialwert, weil es mit Hilfe des Parameters VALUE auf den Startwert X gesetzt wurde. Nach der Anweisung CLEAR enthlt es den Initialwert.

250

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Selektionskriterien prfen

Selektionskriterien prfen
Folgender logischer Ausdruck berprft, ob der Inhalt eines Feldes die Selektionskriterien in einer Selektionstabelle erfllt:

... <f> IN <seltab> ....


Frausfhrliche Informationen zu Selektionstkriterien und ihre Anwendung siehe Selektionsbilder [Seite 720].

REPORT demo_log_expr_in_seltab . DATA wa TYPE spfli. SELECT-OPTIONS s_carrid FOR wa-carrid. IF 'LH' IN s_carrid. WRITE 'LH was selected'. ENDIF.
Der logische Ausdruck in der IF-Anweisung ist wahr, wenn der Benutzer auf dem Selektionsbild eine Datenselektion vornimmt, die den Wert 'LH' enthlt.

April 2001

251

ABAP Programmierung (BC-ABA) Zuweisung zu einem Feldsymbol berprfen

SAP AG

Zuweisung zu einem Feldsymbol berprfen


Folgender logischer Ausdruck berprft, ob einem Feldsymbol ein Feld zugewiesen ist: ... <FS> IS ASSIGNED ... Der Ausdruck ist wahr, wenn dem Feldsymbol [Seite 209] <FS> entweder explizit oder implizit ein Feld zugewiesen wurde. Der Ausdruck ist falsch, wenn dem Feldsymbol <FS> weder explizit noch implizit ein Feld zugewiesen wurde. Direkt nach der Definition eines Feldsymbols verhlt sich der Ausdruck wie folgt:

Bei untypisierten Feldsymbolen ist er wahr, da diese auf SPACE zeigen. Bei typisierten Feldsymbolen ist er falsch, da diese auf kein Feld zeigen. Bei Feldsymbolen mit aufgeprgter Struktur ist er wahr, da die Feldzuweisung bereits bei der Deklaration erfolgt. Direkt nach der Deklaration eines typisierten Feldsymbols Nach der Anweisung UNASSIGN <FS>. Wenn ein lokales Feld, auf das <FS> gezeigt hat nicht mehr exisistiert. Wenn <FS> auf einen globalen Parameter einer Schnittstelle eines Funktionsbausteins zeigt, der gerade nicht aktiv ist.

Falsch kann der Ausdruck in folgenden Fllen sein:


REPORT demo_log_expr_is_assigned . FIELD-SYMBOLS <fs> TYPE ANY. DATA text(10) TYPE c VALUE 'Assigned!'. ASSIGN text TO <fs>. IF <fs> IS ASSIGNED. WRITE <fs>. ENDIF.
Die Listenausgabe ist
Assigned!

da der logische Ausdruck in der IF-Anweisung wahr ist.

252

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Mehrere logische Ausdrcke verknpfen

Mehrere logische Ausdrcke verknpfen


Um mehrere logische Ausdrcke zu einem logischen Ausdruck zu verknpfen, verwendet man die logischen Verknpfungsoperatoren AND oder OR:

Um mehrere logische Ausdrcke zu einem Ausdruck zu verknpfen, der nur dann erfllt ist, wenn alle darin zusammengefaten Ausdrcke erfllt sind, verknpft man die Ausdrcke mit AND. Um mehrere logische Ausdrcke zu einem Ausdruck zu verknpfen, der erfllt ist, wenn mindestens einer der zusammengefaten Ausdrcke erfllt ist, verknpft man die Ausdrcke mit OR.

Durch das Voranstellen des Operators NOT kann das Ergebnis eines logischen Ausdrucks umgekehrt werden. NOT hat Prioritt vor AND und AND hat Prioritt vor OR. Es knnen jedoch beliebige Kombinationen von Klammerausdrcken verwendet werden, um die Verarbeitungsfolge festzulegen. Wie in mathematischen Ausdrcken interpretiert ABAP jede Klammer als ein einzelnes Wort. Daher mu vor und nach jeder Klammer mindestens ein Leerzeichen stehen. ABAP arbeitet logische Ausdrcke von links nach rechts ab. Wird erkannte, da einer der Teilausdrcke erfllt oder nicht erfllt ist, werden keine weiteren Vergleiche oder Prfungen fr diesen Teilausdruck durchgefhrt. Die Performance kann also dadurch verbessert werden, indem logische Ausdrcke so angeordnet werden, da Vergleiche, die hufig falsch ausfallen, am Anfang einer AND-Reihe stehen und aufwendige Vergleiche, wie z.B. die Suche nach Zeichenfolgen, am Ende der Verknpfung.

REPORT demo_log_expr_connected . DATA: f TYPE f VALUE '100.00', n(3) TYPE n VALUE '123', c(3) TYPE c VALUE '456'. WRITE 'The following logical expression is true:'. IF ( c LT n ) AND ( n GT f ). WRITE: / '(',c,'lt',n,') AND (',n,'gt',f,')'. ELSE. WRITE: / '(',c,'ge',n,') OR (',n,'le',f,')'. ENDIF.
Die Listenausgabe ist:
The following logical expression is true: ( 456 ge 123 ) OR ( 123 le 1.000000000000000E+02 )

Der logische Ausdruck in der IF-Anweisung ist falsch und der invertierte Ausdruck wird ausgegeben.

April 2001

253

ABAP Programmierung (BC-ABA) Programmablaufsteuerung

SAP AG

Programmablaufsteuerung
Um unterschiedliche Programmteile in Abhngigkeit von Bedingungen auszufhren oder wiederkehrende Anweisungsfolgen als Schleifen miteinander zu verbinden, verwendet man Standardschlsselwrter wie z.B. IF, CASE, DO und WHILE zur Ablaufsteuerung eines Programms. Bei der Ablaufsteuerung von ABAP-Programmen ist der Aufbau von ABAP-Programmen [Seite 47] aus nicht-schachtelbaren Verarbeitungsblcken [Seite 53] zu beachten. In diesem Abschnitt beschreiben wir die Ablaufsteuerung innerhalb der Verarbeitungsblcke. Die hier beschriebenen Schlsselwrter lassen keine Verzweigungen ber die Grenzen von Verarbeitungsblcken hinweg zu. Man kann deshalb auch von der internen Steuerung eines ABAP-Programms sprechen im Unterschied zur externen Steuerung, die z.B. durch Ereignisse der ABAPLaufzeitumgebung erfolgt. Um den internen Ablauf eines Verarbeitungsblocks zu steuern, kann man gem den Prinzipien des strukturierten Programmierens den Verarbeitungsblock durch Kontrollstrukturen in einzelne, logisch zusammenhngende Anweisungsblcke unterteilen, wobei jeder Anweisungsblocke eine Teilaufgabe lst.

254

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Programmablaufsteuerung

ABAP-Laufzeitumgebung

IF IF Anweisungsblock ENDIF. ENDIF. CASE CASE WHEN WHEN Anweisungsblock WHEN WHEN Anweisungsblock ENDCASE. ENDCASE. DO DO Anweisungsblock ENDDO. ENDDO. Verarbeitungsblock ABAP-Programm
Im Gegensatz zu Verarbeitungsblcken sind Kontrollstrukturen schachtelbar. Bedingte Verzweigungen [Seite 256] Schleifen [Seite 259]

April 2001

255

ABAP Programmierung (BC-ABA) Bedingte Verzweigungen

SAP AG

Bedingte Verzweigungen
Bedingte Verzweigungen fhren Anweisungsblcke in Abhngigkeit vom Ergebnis eines oder mehrerer logischer Ausdrcke aus. ABAP enthlt zwei Kontrollstrukturen fr bedingte Verzweigungen.

Die IF-Kontrollstruktur
Die IF-Kontrollstruktur wird durch die IF-Anweisung eingeleitet. Diese Anweisung verzweigt den Programmablauf, in Abhngigkeit von einer Bedingung, an einen Anweisungsblock. Der Anweisungsblock wird durch die IF-Anweisung begonnen und durch eine ENDIF-Anweisung oder eine optionale ELSEIF- oder ELSE-Anweisung beendet.

IF <bedingung1>. <anweisungsblock> ELSEIF <bedingung2> <anweisungsblock>. ELSEIF <bedingung3>. <anweisungsblock> ..... ELSE. <anweisungsblock> ENDIF.
Fr die Bedingungen in den IF- und ELSEIF-Anweisungen knnen beliebige logische Logische Ausdrcke [Seite 238] verwendet werden. Wenn die erste Bedingung erfllt ist, werden alle Anweisungen bis zum Ende des ersten Anweisungsblocks abgearbeitet und der Programmablauf nach der ENDIF-Anweisung wieder aufgenommen. Ist die erste Bedingung nicht erfllt, wird zur nchste ELSEIF-Anweisung verzweigt und diese wie eine IF-Anweisung ausgefhrt. Mit ELSE beginnt ein Anweisungsblock, der abgearbeitet wird, wenn keine der IF- oder ELSEIF-Bedingungen erfllt ist. Das Ende des letzten Anweisungsblocks mu mit ENDIF gekennzeichnet werden. IF-Kontrollstrukturen knnen geschachtelt werden. Die Anweisungsblcke mssen jedoch innerhalb des aktuellen Verarbeitungsblock beendet werden. Das bedeutet, da ein IF - ENDIFBlock beispielsweise kein Ereignisschlsselwort enthalten darf.

REPORT demo_flow_control_if . DATA: text1(30) text2(30) text3(30) string(5) TYPE TYPE TYPE TYPE c c c c VALUE VALUE VALUE VALUE 'This is the first text', 'This is the second text', 'This is the third text', 'eco'.

IF text1 CS string. WRITE / 'Condition 1 is fulfilled'. ELSEIF text2 CS string. WRITE / 'Condition 2 is fulfilled'. ELSEIF text3 CS string. WRITE / 'Condition 3 is fulfilled'. ELSE.

256

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Bedingte Verzweigungen

WRITE / 'No condition is fulfilled'. ENDIF.


Die Listenausgabe ist:
Condition 2 is fulfilled.

In diesem Beispiel ist der zweite logische Ausdruck TEXT2 CS STRING wahr, weil der String 'eco' in TEXT2 enthalten ist.

Die CASE-Kontrollstruktur
Die CASE-Kontrollstruktur wird durch die CASE-Anweisung eingeleitet. Die CASEKontrollsstruktur erlaubt die Verzweigung zu verschiedenen Anweisungblcken in Abhngigkeit vom Inhalt eines Datenobjekts:

CASE <f>. WHEN <f11> [OR <f12> OR ...]. <anweisungsblock> WHEN <f21>.[OR <f22> OR ...] <anweisungsblock> WHEN <f31> [OR <f32> OR ...]. <anweisungsblock> WHEN ... ...... WHEN OTHERS. <anweisungsblock> ENDCASE.
Der Anweisungsblock nach einer WHEN-Anweisung wird ausgefhrt, wenn der Inhalt von <f> gleich dem Inhalt von einem der Felder <fij> ist. Danach wird derProgrammablauf hinter ENDCASE wieder aufgenommen. Der Anweisungsblock nach der optionalen Anweisung WHEN OTHERS wird durchgehrt, wenn der Inhalt von <f> mit dem Inhalt von keinem der Felder <fij> bereinstimmt. Der letze Anweisungsblock der Kontrollstruktur mu mit ENDCASE abgeschlossen werden. Die CASE-Kontrollstruktur ist die Kurzform folgender IF-Kontrollstruktur:

IF <f> = <f11> OR <f> = <f12> OR <f> = ... <anweisungsblock> ELSEIF <f> = <f21> OR <f> = <f22> OR <f> =... <anweisungsblock> ELSEIF <f> = <f31> OR <f> = <f32> OR <f> =... <anweisungsblock> ELSEIF <f> = ... ... ELSE. <anweisungsblock> ENDIF.
CASE-Kontrollstrukturen knnen geschachtelt und mit IF-Kontrollstrukturen kombiniert werden. Sie mssen jedoch innerhalb des aktuellen Verarbeitungsblocks durch ENDCASE beendet werden.

REPORT demo_flow_control_case .

April 2001

257

ABAP Programmierung (BC-ABA) Bedingte Verzweigungen

SAP AG

DATA: text1 text2 text3 string

TYPE TYPE TYPE TYPE

c c c c

VALUE VALUE VALUE VALUE

'X', 'Y', 'Z', 'A'.

CASE string. WHEN text1 OR text2. WRITE: / 'String is', text1, 'OR', text2. WHEN text3. WRITE: / 'String is', text3. WHEN OTHERS. WRITE: / 'String is not', text1, text2, text3. ENDCASE.
Die Listenausgabe ist:
String is not X Y Z

In diesem Beispiel wird der letzte Anweisungsblock nach WHEN OTHERS verarbeitet, weil der Inhalt von STRING , 'A', nicht mit 'X', 'Y' oder 'Z' bereinstimmt.

258

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Schleifen

Schleifen
In Schleifen wird ein Anweisungsblock mehrmals hintereinander verarbeitet. In ABAP knnen vier verschiedene Schleifen programmiert werden:

Nicht bedingte Schleifen mit der Anweisung DO. Bedingte Schleifen mit der Anweisung WHILE. Schleifen ber interne Tabellen und Extraktdatenbestnde mit der Anweisung LOOP. Schleifen ber Datenbestnde aus Datenbanktabellen mit der Anweisung SELECT.

DO- und WHILE-Schleifen werden in diesem Abschnitt vorgestellt. SELECT ist eine Open SQL [Seite 1129]-Anweisung und wird dort beschrieben. Die Anweisung LOOP wird bei Internen Tabellen [Seite 265] und Extraktdatenbestnden [Seite 347] behandelt.

Nicht bedingte Schleifen


Um einen Anweisungsblock ohne Bedingung mehrmals zu verarbeiten, verwendet man folgende Kontrollstruktur:

DO [<n> TIMES] [VARYING <f> FROM <f1> NEXT <f2>]. <anweisungsblock> ENDDO.
Ohne Zustze wird die Verarbeitung des Anweisungsblocks innerhalb der Anweisungen DO und ENDDO solange wiederholt, bis eine Abbruchanweisung wie EXIT oder STOP erreicht wird (siehe unten). Das Systemfeld SY-INDEX enthlt whrend eines Schleifendurchlaufs die Anzahl der bisherigen Schleifendurchlufe inklusive dem aktuellen Durchlauf. Der Zusatz TIMES schrnkt die Anzahl der Schleifendurchlufe auf <n> ein. <n> kann ein Literal oder eine Variable sein. Ist <n> Null oder eine negative Zahl, wird die Schleife nicht durchlaufen. Falls die Option TIMES nicht verwendet wird, ist darauf zu achten, da mindestens eine Abbruchanweisung wie EXIT oder STOP im Anweisungsblock erreicht wird, um Endlosschleifen zu vermeiden. Der Zusatz VARYING weist einer Variablen <f> bei jedem Schleifendurchlauf einen neuen Wert zu. Der Zusatz VARYING kann in einer DO-Anweisung mehrfach verwendet werden. <f1> und <f2> sind die ersten beiden Felder einer Folge von Feldern, die den gleichen Abstand im Speicher haben und vom selben Typ und derselben Lnge sind. Im ersten Schleifendurchgang erhlt <f> den Wert <f1>, im zweiten Durchgang erhlt <f> den Wert <f2>, etc. Wenn der Wert des Felds <f> innerhalb der DO-Schleife gendert wird, wird auch der Wert des aktuellen Felds <fi> entsprechend gendert. Es ist darauf zu achten, da nicht mehr Schleifen durchlaufen werden, als Felder in der Feldfolge vorhanden sind, da dies sonst einen Laufzeitfehler verursacht. DO-Schleifen knnen beliebig geschachtelt oder mit anderen Schleifen kombiniert werden.

Beispiel fr eine einfache DO-Schleife.

DO. WRITE sy-index. IF sy-index = 3.

April 2001

259

ABAP Programmierung (BC-ABA) Schleifen

SAP AG

EXIT. ENDIF. ENDDO.


Die Listenausgabe ist:
1 2 3

Die Schleife wird dreimal durchlaufen. Die Schleifenverarbeitung wird im dritten Durchlauf mit der EXIT-Anweisung beendet.

Beispiel fr zwei geschachtelte Schleifen mit dem Zusatz TIMES.

DO 2 TIMES. WRITE sy-index. SKIP. DO 3 TIMES. WRITE sy-index. ENDDO. SKIP. ENDDO.
Die Listenausgabe ist:
1 1 2 1 2 2 3 3

Die uere Schleife wird zweimal durchlaufen. Fr jeden Durchlauf der ueren Schleife luft die innere Schleife dreimal ab. Das Systemfeld SY-INDEX gibt die Zahl der Schleifendurchlufe fr jede Schleife gesondert zurck.

Beispiel fr den VARYING-Zusatz in DO-Schleifen:

DATA: BEGIN OF text, word1(4) TYPE word2(4) TYPE word3(4) TYPE word4(4) TYPE END OF text.

c c c c

VALUE VALUE VALUE VALUE

'This', 'is', 'a', 'loop',

DATA: string1(4) TYPE c, string2(4) TYPE c. DO 4 TIMES VARYING string1 FROM text-word1 NEXT text-word2. WRITE string1. IF string1 = 'is'. string1 = 'was'. ENDIF. ENDDO. SKIP. DO 2 TIMES VARYING string1 FROM text-word1 NEXT text-word3 VARYING string2 FROM text-word2 NEXT text-word4.

260

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Schleifen

WRITE: string1, string2. ENDDO..


Die Listenausgabe ist:
This is This was a a loop loop

Die Struktur TEXT enthlt vier Felder mit gleichem Abstand im Speicher. Beim Durchlauf der ersten DO-Schleife werden die Komponenten der Struktur nacheinander STRING1 zugewiesen. Wenn STRING1 'is' enthlt, wird der Inhalt auf 'was' gendert. Dabei wird TEXT-WORD2 ebenfalls in 'was' gendert. Bei jedem Durchlauf der zweiten DO-Schleife werden die Komponenten der Struktur an STRING1 und STRING2 bergeben.

Bedingte Schleifen
Um einen Anweisungsblock mehrmals zu verarbeiten solange eine Bedingung erfllt ist, verwendet man folgende Kontrollstruktur:

WHILE <bedingung> [VARY <f> FROM <f1> NEXT <f2>]. <anweisungsblock> ENDWHILE.
Fr <bedingung> kann ein beliebiger logischer Ausdruck [Seite 238] verwendet werden. Die Verarbeitung des Anweisungsblocks innerhalb der Anweisungen WHILE und ENDWHILE wird wiederholt, solange die Bedingung erfllt ist oder bis eine Abbruchanweisung wie EXIT oder STOP erreicht wird. Das Systemfeld SY-INDEX enthlt whrend eines Schleifendurchlaufs die Anzahl der bisherigen Schleifendurchlufe inklusive dem aktuellen Durchlauf. Der Zusatz VARY hat die gleiche Funktion wie die Option VARYING der DO-Anweisung (siehe oben). Um Endlosschleifen zu vermeiden mu darauf geachtet werden, da die Bedingung einer WHILE-Anweisung irgendwann nicht mehr erfllt sein sollte oder da im Anweisungsblock eine Abbruchanweisung wie EXIT oder STOP erreicht wird. WHILE-Schleifen knnen beliebig geschachtelt oder mit anderen Schleifen kombiniert werden.

REPORT demo_flow_control_while . DATA: length TYPE i VALUE 0, strl TYPE i VALUE 0, string(30) TYPE c VALUE 'Test String'. strl = strlen( string ). WHILE string NE space. WRITE string(1). length = sy-index. SHIFT string. ENDWHILE. WRITE: / 'STRLEN: ', strl. WRITE: / 'Length of string:', length.
Die Ausgabe sieht folgendermaen aus:

April 2001

261

ABAP Programmierung (BC-ABA) Schleifen T e s t S t r i n g STRLEN: Length of String: 11 11

SAP AG

In diesem Beispiel wird eine WHILE-Schleife dazu verwenden, die Lnge einer Zeichenkette zu bestimmen. Hierzu wird die Zeichenkette bei jedem Schleifendurchlauf eine Stelle weiter nach links gerckt, solange bis sie nur noch Leerzeichen enthlt. Anhand dieses Beispiels soll lediglich die Verwendung der WHILE-Anweisung demonstriert werden. Die Stringlnge kann natrlich mit Hilfe der eingebauten Funktion STRLEN leichter und performanter bestimmt werden.

Schleifen abbrechen
Um eine Schleife vorzeitig abzubrechen, verwendet man Abbruchanweisungen. Bei den Abbruchanweisungen mssen wir solche Anweisungen unterscheiden, die lokal fr die Schleife wirken und solche, die den gesamten Verarbeitungsblock abbrechen, in dem die Schleife programmiert ist. Zu letzteren gehren die Anweisungen STOP und REJECT. Diese werden unter Ereignisblcke verlassen [Seite 1055] nher beschrieben. Abbruchanweisungen, die lokal fr ein Schleife wirken sind CONTINUE, CHECK und EXIT. CONTINUE ist nur in einer Schleife einsetzbar. CHECK und EXIT sind kontextsensitiv. Innerhalb einer Schleife wirken sie nur auf die Ausfhrung der Schleife. Auerhalb einer Schleife bewirken sie den Abbruch des gesamten Verarbeitungsblocks (Unterprogramm, Dialogmodul, Ereignisblock etc.). Die Abbruchanweisungen CONTINUE, CHECK und EXIT funktionieren in allen vier Schleifen, die in ABAP mglich sind (DO, WHILE, LOOP und SELECT).

Schleifendurchlauf ohne Bedingung abbrechen


Um einen Schleifendurchlauf unmittelbar und ohne Bedingung abzubrechen, verwendet man im Anweisungsblock der Schleife die Anweisung

CONTINUE.
Nach dieser Anweisung werden die brigen Anweisungen des aktuellen Anweisungsblocks bersprungen und der nchste Schleifendurchlauf wird ausgefhrt.

DO 4 TIMES. IF sy-index = 2. CONTINUE. ENDIF. WRITE sy-index. ENDDO.


Die Listenausgabe ist:
1 3 4

Der zweite Schleifendurchlauf wird beendet, ohne da die WRITE-Anweisung verarbeitet wird.

Schleifendurchlauf unter einer Bedingung abbrechen


Um einen Schleifendurchlauf unter einer Bedingung abzubrechen, verwendet man im Anweisungsblock der Schleife die Anweisung

262

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Schleifen

CHECK <bedingung>.
Wenn die Bedingung nicht erfllt wird, werden die brigen Anweisungen des aktuellen Anweisungsblocks bersprungen und der nchste Schleifendurchlauf wird ausgefhrt. Fr <bedingung> kann ein beliebiger logischer Ausdruck [Seite 238] verwendet werden.

DO 4 TIMES. CHECK sy-index BETWEEN 2 and 3. WRITE sy-index. ENDDO.


Die Listenausgabe ist:
2 3

Der erste und vierte Schleifendurchlauf werden beendet, ohne da die WRITEAnweisung verarbeitet wird, weil SY-INDEX nicht zwischen 2 und 3 liegt.

Schleife vollstndig beenden


Um eine Schleife vollstndig und ohne Bedingung abzubrechen, verwendet man im Anweisungsblock der Schleife die Anweisung

EXIT.
Nach dieser Anweisung wird die Schleife vollstndig beendet un der Programmablauf nach der schlieenden Anweisung (ENDDO, ENDWHILE, ENDLOOP ENDSELECT) wieder aufgenommen. Bei geschachtelten Schleifen wird nur die aktuelle Schleife abgebrochen.

DO 4 TIMES. IF sy-index = 3. EXIT. ENDIF. WRITE sy-index. ENDDO.


Die Listenausgabe ist:
1 2

Im dritten Schleifendurchlauf wird die Schleife vor Ausfhrung der WRITEAnweisung vollstndig abgebrochen.

April 2001

263

ABAP Programmierung (BC-ABA) Bearbeitung groer Datenmengen

SAP AG

Bearbeitung groer Datenmengen


Zur Verarbeitung groer Datenmengen vernderlicher Gre enthlt ABAP interne Tabellen und Extrakte. Interne Tabellen sind dynamische sequentielle Datenbestnde, bei denen alle Zeilen die gleiche Struktur und einen Schlssel haben. Interne Tabellen sind Elemente des ABAP-Typkonzepts. Der Zugriff auf einzelne Zeilen ber Index oder Schlssel ist mglich. Extrakte sind dynamische sequentielle Datenbestnde, bei denen einzelne Zeilen unterschiedliche Strukturen haben knnen. Jedes ABAP-Programm kann zur Zeit nur einen einzigen Extraktdatenbestand verwalten. Der Zugriff auf einzelne Zeilen ber Index oder Schlssel ist nicht mglich. Extrakte werden immer in einer Schleife verarbeitet. Interne Tabellen [Seite 265] Extrakte [Seite 347] Der folgende Abschnitt enthlt einige Beispiele zur Bearbeitung groer Datenmengen bei der Datenaufbereitung fr eine Liste. Daten aufbereiten [Seite 366]

264

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Interne Tabellen

Interne Tabellen
Interne Tabellen sind ein Mittel, um dynamische Datenmengen im Arbeitsspeicher von ABAP abzuspeichern. Dabei werden die Daten zeilenweise im Speicher abgelegt, wobei jede Zeile die gleiche Struktur hat. Interne Tabellen bieten in ABAP die Funktionalitt von Arrays und entlasten als dynamische Datenobjekte den Programmierer vom Aufwand der programmgesteuerten dynamischen Speicherverwaltung. Interne Tabellen werden immer dann verwendet, wenn Datenmengen einer festen Struktur programmintern verarbeitet werden. Ein wichtiges Einsatzgebiet ist z.B. die programminterne Speicherung und Aufbereitung von Inhalten aus Datenbanktabellen. Weiterhin sind interne Tabellen ein wichtiges Mittel um komplexe Datenstrukturen in einem ABAP-Programm zu implementieren. Wie alle Elemente des ABAP-Typkonzepts liegen interne Tabellen in zwei Ausprgungen vor, nmlich als Datentypen [Seite 95] und als Datenobjekte [Seite 123]. Ein Datentyp ist entweder die abstrakte Beschreibung einer internen Tabelle im Programm oder im ABAP Dictionary und dient zum Anlegen von konkreten Datenobjekten, oder das Attribut einer bereits als Datenobjekt vorliegenden internen Tabelle.

Interne Tabellen als Datentypen


Interne Tabellen sind neben Strukturen einer der beiden aggregierten Datentypen in ABAP. Der Datentyp einer internen Tabelle wird vollstndig spezifiziert durch Zeilentyp, Schlssel und Tabellenart.

Zeilentyp
Der Zeilentyp einer internen Tabelle kann ein beliebiger Datentyp sein. Im Normalfall ist der Datentyp einer internen Tabelle eine Struktur. Die Komponenten der Struktur bilden dann die Spalten der internen Tabelle. Der Zeilentyp kann aber auch elementar oder selbst eine interne Tabelle sein.

Schlssel
Der Schlssel dient der Identifikation von Tabellenzeilen. Es gibt zwei mgliche Schlssel fr interne Tabellen, nmlich den Standardschlssel und einen benutzerdefinierten Schlssel. Der Schlssel kann als eindeutig (UNIQUE) oder nicht eindeutig (NON-UNIQUE) festgelegt werden. Bei eindeutigen Schlsseln gibt es keine mehrfachen Eintrge in internen Tabellen. Die Eindeutigkeit richtet sich nach der Zugriffsart (siehe unten). Bei Tabellen mit strukturiertem Zeilentyp ist der Standardschlsssel aus allen zeichenartigen Spalten der internen Tabelle aufgebaut. Bei Tabellen mit elementaren Zeilentyp bildet die gesamte Zeile den Standardschlssel. Bei Tabellen, deren Zeilentyp wieder ein interne Tabelle ist, ist der Standardschlssel jedoch leer. Bei Tabellen mit unstrukturiertem Zeilentyp besteht der Standardschlsssel aus der gesamten Zeile. Falls der Zeilentyp aber wieder eine Tabelle ist, wird ein leerer Schlssel definiert. Der benutzerdefinierte Schlssel kann aus beliebigen Spalten der internen Tabelle aufgebaut werden, die selber keine interne Tabellen sind noch enthalten. Referenzen sind als Tabellenschlssel zugelassen. Interne Tabellen mit benutzerdefiniertem Schlssel werden auch als Key-Tabellen bezeichnet. Bei der Definition des Schlssels ist die Reihenfolge der Schlsselfelder signifikant. Dies ist wichtig, wenn beispielsweise nach den Schlssel sortiert wird.

April 2001

265

ABAP Programmierung (BC-ABA) Interne Tabellen

SAP AG

Tabellenart
Die Tabellenart definiert, wie ABAP auf einzelne Tabellenzeilen zugreift. Interne Tabellen knnen ber die Tabellenart in drei Typen eingeteilt werden: Bei Standard-Tabellen wird intern ein linearer Index gepflegt. Die internen Tabellenindizes werden ab einer bestimmten Gre als Baum verwaltet, wodurch Indexmanipulationskosten nicht linear, sondern nur logarithmisch mit der Zeilenzahl wachsen. Der Zugriff kann ber den Tabellenindex oder den Schlssel erfolgen. Beim Schlsselzugriff hngt die Antwortzeit linear von der Anzahl der Tabelleneintrge ab. Der Schlssel einer Standard-Tabelle ist immer nichteindeutig. Bei der Definition einer Standardtabelle kann kein eindeutiger Schlssel definiert werden. Dadurch kann das zeilenweise Fllen einer Standard-Tabelle sehr schnell durchgefhrt werden, da nicht bei jeder Zeile nach bereits vorhandenen Eintrgen gesucht werden mu.
Sortierte Tabellen werden immer nach dem Schlssel sortiert abgespeichert. Auch bei ihnen wird intern ein Index gepflegt. Der Zugriff kann ber den Tabellenindex oder den Schlssel erfolgen. Beim Schlsselzugriff hngt die Antwortzeit logarithmisch von der Anzahl der Tabelleneintrge ab, da der Zugriff ber eine binre Suche erfolgt. Der Schlssel von sortierten Tabellen kann eindeutig oder nicht-eindeutig sein. Bei der Tabellendefinition mu die Eindeutigkeit des Schlssels als UNIQUE oder NON-UNIQUE festgelegt werden. StandardTabellen und sortierte Tabellen werden zusammenfassend auch als Index-Tabellen bezeichnet.

Bei Hash-Tabellen wird intern kein Index gepflegt. Der Zugriff auf Hash-Tabellen ist nur ber Schlsselangabe mglich. Dabei ist die Antwortzeit konstant und hngt nicht von der Anzahl der Tabelleneintrge ab, da der Zugriff ber einen Hash-Algorithmus erfolgt. Der Schlssel von Hash-Tabellen mu zur Zeit eindeutig sein. Bei der Tabellendefinition mu die Eindeutigkeit des Schlssels als UNIQUE angegeben werden.

Generische interne Tabellen


Im Gegensatz zu anderen programmlokalen Datentypen mu der Datentyp einer internen Tabelle nicht vollstndig zu spezifiziert werden sondern kann generisch aufgebaut sein. D.h. beim Anlegen eines Datentyps fr eine interne Tabelle knnen entweder nur der Schlssel oder der Zeilentyp und der Schlssel unspezifiziert bleiben. Generische interne Tabellen knnen zur Zeit nur zur Typisierung von Feldsymbolen [Seite 209] und Schnittstellenparametern von Prozeduren [Seite 467] verwendet werden, aber nicht bei der Deklaration von Datenobjekten.

Interne Tabellen als dynamische Datenobjekte


Datenobjekte, die mit dem Datentyp einer internen Tabelle oder direkt als interne Tabelle deklariert werden, sind betreffs Zeilentyp, Schlssel und Zugriffsart immer vollstndig spezifiziert. Die Anzahl der Zeilen ist jedoch beliebig. Interne Tabellen sind somit dynamische Datenobjekte, die beliebig viele Zeilen eines festen Typs enthalten knnen. Die Anzahl der Zeilen einer internen Tabelle wird natrlich durch die Kapazittsschranken konkreter Systeminstallationen beschrnkt. Theoretisch erreichbar ist eine Speicherbelegung von 2 Gigabyte pro interner Tabelle inklusive interner Verwaltung. Realistisch sind z.Zt. Speicherbelegungen von bis zu 500 Megabyte. Bei Hash-Tabellen ist die maximale Zeilenzahl zustzlich auf 2 Millionen Eintrge festgelegt. Die Zeilentypen von internen Tabellen sind beliebige Datentypen und knnen somit elementar, strukturiert oder selbst interne Tabellen sein. Die einzelnen Zeilen einer internen Tabelle werden als Tabellenzeilen oder Tabelleneintrge bezeichnet. Die einzelnen Komponenten einer strukturierten Zeile bezeichnet man auch als Spalten der internen Tabelle.

266

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Interne Tabellen

Auswahl eines Tabellentyps


Welcher Tabellentyp (insbesondere welche Zugriffsart) im Einzelfall einzusetzen ist, richtet sich danach, wie die oben angegebenen typischen Operationen auf einzelnen Tabelleneintrgen am hufigsten auf der Tabelle angewendet werden.

Standard-Tabellen
Dieser Tabellentyp eignet sich immer dann, wenn die einzelnen Eintrge ber den Index angesprochen werden. Der Indexzugriff ist der schnellstmgliche Zugriff auf Tabelleneintrge. Das Fllen einer Standard-Tabelle sollte ber das Anhngen von Zeilen (APPEND) und das Lesen, Modifizieren, Lschen mit einer Indexangabe (Option INDEX der entsprechenden ABAPBefehle) erfolgen. Der Aufwand fr Schlsselzugriffe auf Standard-Tabellen steigt linear mit der Anzahl der Tabelleneintrge. Falls Schlsselzugriffe notwendig sind, eignen sich StandardTabellen besonders dann, wenn das Fllen der Tabelle von der brigen Verarbeitung entkoppelt werden kann. Beispielsweise kann eine Standard-Tabelle erst ber Anhngen gefllt und dann sortiert werden. Verwendet man danach Schlsselzugriffe mit der Option fr binre Suche (BINARY), so hngt der Aufwand nur noch logarithmisch von der Anzahl der Tabelleneintrge ab.

Sortierte Tabellen
Dieser Tabellentyp eignet sich immer dann, wenn die Tabelle schon beim Aufbau sortiert vorliegen mu. Das Fllen der Tabelle erfolgt dann durch Einfgen (INSERT) gem der durch den Tabellenschlssel definierten Sortierreihenfolge. Nichtpassende Tabelleneintrge werden dabei schon beim Aufbau erkannt. Bei Schlsselzugriffen hngt der Aufwand logarithmisch von der Anzahl der Tabelleneintrge ab, da die binre Suche automatisch durchgefhrt wird. Sortierte Tabellen eignen sich insbesondere auch fr teilsequentielle Verarbeitungen in einer LOOP-Schleife, wenn Anfangsstcke des Tabellenschlssels in der WHERE-Bedingung angegeben werden.

Hash-Tabellen
Dieser Tabellentyp eignet sich immer dann, wenn Schlsselzugriffe die zentrale Operation auf Tabelleneintrge darstellen. Bei Hash-Tabellen sind keine Indexzugriffe mglich. Dafr ist bei Schlsselzugriffen der Aufwand pro Zugriff immer konstant und unabhngig von der Anzahl der Tabelleneintrge. Wie bei Datenbanktabellen ist der Schlssel von Hash-Tabellen immer eindeutig. Hash-Tabellen eignen sich also fr groe Datenmengen und auch um datenbankhnliche interne Tabellen aufzubauen und entsprechend zu verwenden. Interne Tabellen anlegen [Seite 268] Interne Tabellen bearbeiten [Seite 278]

April 2001

267

ABAP Programmierung (BC-ABA) Interne Tabellen anlegen

SAP AG

Interne Tabellen anlegen


Wie die anderen Elemente des ABAP-Typkonzepts [Seite 94], knnen interne Tabellen zuerst als abstrakter Datentyp im Programm oder ABAP Dictionary und dann darauf basierend als Datenobjekt definiert werden oder sie werden direkt als vollstndig spezifiziertes Datenobjekt deklariert. Beim Anlegen von internen Tabellen als Datenobjekte ist zu beachten, da damit nur ein zur internen Tabelle gehrige Verwaltungseintrag namens Tabellen-Header statisch vereinbart wird. Die Gre von Tabellen-Headern bei initialen Tabellen betrgt zur Zeit 8 Byte. Dies ist zu beachten, wenn interne Tabellen als Komponenten komplexer Datenobjekte vorkommen. Auch leere Tabellen knnen als Komponenten von Tabellen zu relativ hohen Speicherplatzbedarf fhren. Die Gre des gesamten bentigten Speicherplatzes einer internen Tabelle wird wie bei Datenobjekten vom Typ STRING oder XSTRING nicht bei der Deklaration festgelegt. Die eigentlichen Tabellenzeilen werden zur Laufzeit durch operationale FllAnweisungen dynamisch erzeugt oder durch Lsch-Anweisungen wieder entfernt. Interne Tabellentypen [Seite 269] Interne Tabellenobjekte [Seite 273]

268

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Interne Tabellentypen

Interne Tabellentypen
In diesem Abschnitt wird auf die Definition programmlokaler interner Tabellen eingegangen. Interne Tabellen knnen aber auch programmbergreifend als Datentypen im ABAP Dictionary [Seite 109] angelegt werden. Wie alle programmlokalen Datentypen [Seite 104] werden auch interne Tabellen mit der Anweisung TYPES definiert. Wenn nicht mit dem TYPE- [Seite 117] oder LIKE-Zusatz auf bekannte Tabellentypen Bezug genommen wird, dient die TYPES-Anweisung der Konstruktion einer programmlokalen, neuen internen Tabelle:

TYPES <t> TYPE|LIKE <tabkind> OF <linetype> [WITH <key>] [INITIAL SIZE <n>].
Hinter TYPE bzw. LIKE steht hier kein Verweis auf einen bekannten Datentyp, sondern der Typkonstruktor:

<tabkind> OF <linetype> [WITH <key>]


Der Typkonstruktor definiert Tabellenart <tabkind>, Zeilentyp <linetype> und Schlssel <key> der internen Tabelle <t>. Optional kann mit dem Zusatz INITIAL SIZE der initiale Hauptspeicherbedarf beeinflut werden.

Tabellenart
Fr die Tabellenart <tabkind> knnen folgende Angaben gemacht werden:

Hierarchie der Tabellenarten Generische Tabellenarten ANY TABLE ANY TABLE INDEX TABLE INDEX TABLE HASHED TABLE HASHED TABLE STANDARD TABLE SORTED TABLE STANDARD TABLE SORTED TABLE Voll spezifizierte Tabellenarten

Generische Tabellenarten
INDEX TABLE
fr das Anlegen eines generischen Tabellentyps mit Index-Zugriffen

ANY TABLE

April 2001

269

ABAP Programmierung (BC-ABA) Interne Tabellentypen

SAP AG

fr das Anlegen eines beliebigen generischen Tabellentyps Datentypen, die mit den generischen Tabellenarten definiert werden, knnen zur Zeit nur zur Typisierung von Feldsymbolen [Seite 209] und von Schnittstellenparametern in Prozeduren [Seite 467] verwendet werden. Der generische Typ INDEX TABLE fat Standard-Tabellen und sortierte Tabellen zusammen, auf denen Index-Zugriffe erlaubt sind. An solcherart typisierte Feldsymbole oder Schnittstellenparameter knnen keine Hash-Tabellen bergeben werden. Der generische Typ ANY TABLE fat alle Tabellenarten zusammen. An solcherart typisierte Feldsymbole oder Schnittstellenparameter knnen alle Tabellen bergeben werden. Auf solchen Feldsymbolen oder Parametern sind dann aber auch nur Operationen erlaubt, die fr alle Tabellenarten mglich sind, also keine Index-Zugriffe.

Vollstndig spezifizierte Tabellenarten


STANDARD TABLE oder kurz TABLE
fr das Anlegen einer Standard-Tabelle.

SORTED TABLE
fr das Anlegen einer sortierten Tabelle.

HASHED TABLE
fr das Anlegen einer Hash-Tabelle. Die vollstndig spezifizierten Tabellenarten legen fest, wie bei Schlsseloperationen auf die Eintrge einer internen Tabelle zugegriffen wird, nmlich mit linearer Suche bei StandardTabellen, mit binrer Suche bei sortierten Tabellen und mit einem Hash-Algorithmus bei HashTabellen.

Zeilentyp
Fr den Zeilentyp <linetype> kann

bei Verwendung von TYPE ein beliebiger an dieser Stelle bekannter Datentyp [Seite 95] angegeben werden, also ein eingebauter ABAP-Typ, ein programmlokaler Typ oder ein Datentyp aus dem ABAP-Dictionary. Bei den generischen elementaren Typen C, N, P und X werden eventuell nicht angegebene Attribute (Feldlnge, Dezimalstellen) automatisch durch die Standardwerte ersetzt. Die Angabe von anderen generischen Typen ist nicht mglich. bei Verwendung von LIKE ein beliebiges an dieser Stelle bekanntes Datenobjekt [Seite 123] angegeben werden. Der Zeilentyp bernimmt den vollstndig spezifizierten Datentyp des referierten Datenobjekts. Auerhalb von Klassen ist aus Kompatibilittsgrnden auch noch der LIKE-Verweis auf Datenbanktabellen und Strukturen im ABAP Dictionary erlaubt.

Alle Zeilen der internen Tabelle erhalten die vollstndig spezifizierten technischen Eigenschaften des angegebenen Datentyps.

Schlssel
Fr den Schlssel <key> knnen folgende Angaben gemacht werden:

[UNIQUE|NON-UNIQUE] KEY <col1>... <coln>


Bei Tabellen mit strukturiertem Zeilentyp knnen alle Komponenten <coli> als Schlsselfelder erklrt werden, die selber weder interne Tabellen sind noch interne

270

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Interne Tabellentypen

Tabellen enthalten. Die einzelnen Schlsselfelder knnen selbst geschachtelte Strukturen sein. Die Unterstrukturen werden beim Schlsselzugriff komponentenweise aufgelst. Die Reihenfolge der Schlsselfeldangabe wird beachtet.

[UNIQUE|NON-UNIQUE] KEY table_line


Bei Tabellen, mit elementarem Zeilentyp (C, D, F, I, N, P, T, X) kann so die gesamte Zeile als Schlssel definiert werden. Bei Tabellen, deren Zeilentyp wieder eine Tabelle ist, fhrt die Anweisung zu einem Syntaxfehler. Bei Tabellen mit strukturiertem Zeilentyp ist es zwar mglich, die gesamte Zeile als Schlssel anzugeben, man sollte sich aber im klaren sein, die gesamte Zeile bei strukturierten Zeilentypen in der Regel kein geeigneter Schlssel ist.

[UNIQUE|NON-UNIQUE] DEFAULT KEY


Es werden die Felder des Standardschlssels als Schlsselfelder definiert. Bei strukturiertem Zeilentyp ist der Standardschlssel aus allen Spalten der internen Tabelle aufgebaut, die einen zeichenartigen Typ (C, D, T, N, X, STRING, XSTRING) haben. Bei internen Tabellen mit geschachtelter Zeilenstruktur ergibt sich der Standard-Schlssel durch Linearisierung der Zeilenstruktur. Bei elementarem Zeilentyp ist der Standardschlssel die Zeile selbst. Bei elementaren Tabellen, deren Zeilentyp wieder ein interne Tabelle ist, ist der Standardschlssel leer. Die Angabe des Schlssels ist optional. Ohne Angabe des Schlssels wird ein generischer Tabellentyp mit beliebigem Schlssel definiert, der zur Zeit nur zur Typisierung von Feldsymbolen [Seite 209] und von Schnittstellenparametern in Prozeduren [Seite 467] verwendet werden kann (Ausnahme: Besonderheiten bei Standard-Tabellen [Seite 275]). Die optionalen Zustze UNIQUE bzw. NON-UNIQUE legen fest, ob der Schlssel eindeutig oder nicht eindeutig ist, also ob eine interne Tabelle doppelte Eintrge enthalten kann oder nicht. Ohne Angabe von UNIQUE bzw. NON-UNIQUE ist der Tabellentyp bezglich der Eindeutigkeit des Schlssels generisch, also nur fr Typisierungen verwendbar. Dabei ist aber zu beachten, da bei gleichzeitiger Angabe der Tabellenart folgende Einschrnkungen gelten:

Bei Standard-Tabellen ist der Zusatz UNIQUE nicht erlaubt und der Zusatz NONUNIQUE wird immer automatisch dazugeneriert. Bei Hash-Tabellen mu der Zusatz UNIQUE immer explizit angegeben werden.

Initialer Hauptspeicherbedarf
Der initiale Hauptspeicherbedarf eines internen Tabellenobjekts kann schon bei der Definition des Datentyps mit dem Zusatz

INITIAL SIZE <n>


beeinflut werden. Diese Gre gehrt nicht zum Datentyp der internen Tabelle und hat keinen Einflu auf eine Typberprfung. Mit obigem Zusatz kann man Speicherplatz fr <n> Tabellenzeilen whrend der Deklaration eines entsprechenden Tabellenobjekts vorbelegen. Wenn der initiale Hauptspeicher beim Fllen der Tabelle erschpft ist, wird zustzlicher Platz in der doppelten Gre des initialen Bereichs angelegt, sofern diese nicht die Grenze von 8 Kilobyte bersteigt. Weitere Bereiche werden dann bei Bedarf mit einer konstanten Gre in der Grenordnung von 12 Kilobyte angelegt. Die Bestimmung des initialen Hauptspeicherbedarfs kann in den meisten Fllen dem System berlassen werden. Beim erstmaligen Fllen der internen Tabelle wird nur wenig Speicher belegt. Der belegte Platz entspricht je nach Zeilenbreite einer Angabe von 16 <= <n> <= 100.

April 2001

271

ABAP Programmierung (BC-ABA) Interne Tabellentypen

SAP AG

Die Angabe eines konkreten Werts <n> ist nur dann sinnvoll, wenn die Anzahl der Eintrge in der Tabelle von vornherein feststeht und der initiale Hauptspeicherbedarf mglichst passend dimensioniert werden soll (Ausnahme: Ranglisten beim Tabellenzeilen anhngen [Seite 324]). Dies kann insbesondere bei tiefen internen Tabellen wichtig sein, bei denen die inneren Tabellen nur wenige (z.B. nicht mehr als 5 Eintrge) enthalten. Um bergroe Speicheranforderungen zu vermeiden, werden groe Werte fr <n> wie folgt behandelt: Der grtmgliche Wert fr <n> ergibt sich aus 8 Kilobyte geteilt durch die Zeilenlnge. Wird <n> grer angegeben, ersetzt das System den Wert von <n> so, da das Produkt n Zeilenbreite in der Grenordnung von 12 Kilobyte liegt.

TYPES: BEGIN OF line, column1 TYPE i, column2 TYPE i, column3 TYPE i, END OF LINE. TYPES itab TYPE SORTED TABLE OF line WITH UNIQUE KEY column1.
Es wird ein Tabellentyp ITAB definiert. Die Tabellenart ist eine sortierte Tabelle, der Zeilentyp ist die Struktur LINE und der eindeutige Schlssel ist durch die Komponente COLUMN1 definiert.

TYPES vector TYPE HASHED TABLE OF i WITH UNIQUE KEY table_line. TYPES: BEGIN OF line, column1 TYPE i, column2 TYPE i, column3 TYPE i, END OF line. TYPES itab TYPE SORTED TABLE OF line WITH UNIQUE KEY column1. TYPES: BEGIN OF deepline, field TYPE c, table1 TYPE vector, table2 TYPE itab, END OF deepline. TYPES deeptable TYPE STANDARD TABLE OF deepline WITH DEFAULT KEY.
Es wird ein Tabellentyp VECTOR der Tabellenart Hash-Tabelle, dem elementaren Zeilentyp I und der gesamten Zeile als eindeutigem Schlssel definiert. Der zweite Tabellentyp entspricht dem vorherigem Beispiel. Die Struktur DEEPLINE enthlt diese internen Tabellen als Komponenten. Der Tabellentyp DEEPTABLE hat den Zeilentyp DEEPLINE. Elemente dieser internen Tabelle sind also selbst interne Tabellen. Der Schlssel ist der Standardschlssel, also die Spalte FIELD. Der Schlssel ist nicht eindeutig, da die Tabellenart eine Standardtabelle ist.

272

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Interne Tabellenobjekte

Interne Tabellenobjekte
Interne Tabellenobjekte sind als dynamische Datenobjekte immer Variablen [Seite 128]. Wie alle Variablen werden interne Tabellenobjekte mit der Anweisung DATA deklariert. Daneben sind die syntaktisch gleichen Anweisungen STATICS fr statische interne Tabellen in Prozeduren [Seite 467] und CLASS-DATA fr statische interne Tabellen in Klassen mglich. Wir beschrnken uns hier auf die Anweisung DATA. Alle Angaben gelten entsprechend fr STATICS und CLASSDATA.

Bezug auf bekannte interne Tabellentypen


Wie bei der Deklaration aller Datenobjekte, knnen interne Tabellenobjekte durch den LIKEbzw. TYPE-Zusatz [Seite 117] der DATA-Anweisung deklariert werden.

DATA <itab> TYPE <type>|LIKE <obj> [WITH HEADER LINE].


Der LIKE-Zusatz verweist dabei auf ein bereits deklariertes Tabellenobjekt des gleichen Programms. Der TYPE-Zusatz kann auf einen mit TYPES deklarierten programmlokalen Tabellentyp [Seite 269] oder auf einen Tabellentyp aus dem ABAP Dictionary verweisen. Dabei ist zu beachten, da zur Zeit nur Verweise auf vollstndig spezifizierte Tabellentypen mglich sind. Ein TYPE-Verweis auf generische Tabellentypen, also Typen mit generischer Tabellenart (ANY TABLE, INDEX TABLE) oder unvollstndiger Schlsselangabe ist nicht mglich (Ausnahme: Besonderheiten bei Standard-Tabellen [Seite 275]). Der optionale Zusatz WITH HEADER LINE deklariert zustzlich zur eigentlichen internen Tabelle ein gleichnamiges Datenobjekt, das den Zeilentyp der internen Tabelle bernimmt. Dieses Datenobjekt heit Kopfzeile der internen Tabelle und kann bei Operationen auf internen Tabellen als Arbeitsbereich dienen (siehe Kopfzeilen als Arbeitsbereich [Seite 345]). Bei Tabellen mit Kopfzeile mu die Namensgleichheit zwischen eigentlicher interner Tabelle, in diesem Zusammenhang auch Tabellenkrper genannt, und Kopfzeile besonders beachtet werden. Wenn bei Tabellen mit Kopfzeile der Tabellenkrper adressiert werden soll, mu dieser durch eckige Klammern hinter dem Namen (<itab>[]) kenntlich gemacht werden. Ansonsten interpretiert ABAP von einigen Ausnahmen abgesehen den Namen prinzipiell als Kopfzeile und nicht als die interne Tabelle selbst. Um Tabelle und Arbeitsbereich unterscheidbar zu machen, sollten deshalb interne Tabellen mglichst ohne Kopfzeilen angelegt werden. Insbesondere drfen interne Tabellen bei der Schachtelung in Strukturen oder in andere interne Tabellen keine Kopfzeilen haben, da dies zu zweideutigen Ausdrcken fhrt.

TYPES vector TYPE SORTED TABLE OF i WITH UNIQUE KEY table_line. DATA: itab TYPE vector, jtab LIKE itab WITH HEADER LINE. * MOVE ITAB TO JTAB. MOVE itab TO jtab[].
Das Tabellenobjekt ITAB bezieht sich auf den vollstndig spezifizierten Tabellentyp VECTOR. Das Tabellenobjekt JTAB hat den gleichen Datentyp wie ITAB. Zustzlich wird zu JTAB eine Kopfzeile angelegt. In der ersten MOVE-Anweisung adressiert JTAB die Kopfzeile. Da diese den Datentyp I hat und der Tabellentyp von ITAB nicht in einen elementaren Typ konvertierbar ist, fhrt diese MOVE-Anweisung zum

<-

Syntaxfehler!

April 2001

273

ABAP Programmierung (BC-ABA) Interne Tabellenobjekte

SAP AG

entsprechenden Syntaxfehler. Die zweite MOVE-Anweisung ist korrekt, da beide Operanden Tabellenobjekte sind.

Deklaration neuer interner Tabellen


Statt mit LIKE oder TYPE auf bekannte interne Tabellen zu verweisen, ist es auch mglich mit der DATA-Anweisung neue interne Tabellen zu konstruieren. Der konstruierte Tabellentyp besteht dann nicht eigenstndig, sondern nur als Attribut des Tabellenobjekts. Man kann nicht mit dem TYPE- sondern nur mit dem LIKE-Zusatz auf ihn verweisen. Die Syntax fr die Konstruktion eines Tabellenobjekts entspricht der Definition eines Tabellentyps mit der TYPESAnweisung:

DATA <itab> TYPE|LIKE <tabkind> OF <linetype> WITH <key> [INITIAL SIZE <n>] [WITH HEADER LINE].
Wie bei der Definition eines Tabellentyps [Seite 269] definiert der Typkonstruktor:

<tabkind> OF <linetype> WITH <key>


Tabellenart <tabkind>, Zeilentyp <linekind> und Schlssel <key> der internen Tabelle <itab>. Da die technischen Eigenschaften von Datenobjekten immer vollstndig bestimmt sind, mu die Tabelle in der DATA-Anweisung vollstndig spezifiziert werden. Es knnen keine generischen Tabellenarten (ANY TABLE, INDEX TABLE) sondern nur voll spezifizierte Tabellenarten (STANDARD TABLE bzw. TABLE, SORTED TABLE, HASHED TABLE) angegeben werden. Der Schlssel mu angegeben und die Eindeutigkeit mu spezifiziert werden (Ausnahme: Besonderheiten bei Standard-Tabellen [Seite 275]). Optional kann wie in der TYPES-Anweisung mit dem Zusatz INITIAL SIZE der initiale Hauptspeicherbedarf beeinflut werden. Auch bei der Deklaration neuer interner Tabellen erlaubt der Zusatz WITH HEADER LINE das Anlegen einer Kopfzeile. Fr die Kopfzeile gilt das gleiche wie beim Bezug auf bekannte interne Tabellentypen.

DATA itab TYPE HASHED TABLE OF spfli WITH UNIQUE KEY carrid connid.
Das Tabellenobjekt ITAB hat die Tabellenart Hash-Tabelle, einen Zeilentyp, welcher der flachen Struktur SPFLI aus dem ABAP Dictionary entspricht, und einen eindeutigen Schlssel mit den Schlsselfeldern CARRID und CONNID. Die Tabelle ITAB stellt sozusagen ein programmlokales Abbild der Datenbanktabelle SPFLI dar und ist damit bestens zur Bearbeitung von Daten aus dieser Datenbanktabelle geeignet, wenn die Zugriffe ausschlielich ber den Schlssel erfolgen sollen.

274

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Besonderheiten bei Standard-Tabellen

Besonderheiten bei Standard-Tabellen


Whrend es sortierte Tabellen, Hash-Tabellen und Schlsselangaben zu Tabellen erst seit Release 4.0 gibt, gab es Standard-Tabellen auch schon vor diesem Release. Weiterhin ist die Definition eines beliebigen Zeilentyps, die Definition von Tabellentypen und die Deklaration von Tabellen ohne Kopfzeile erst seit Release 3.0 mglich. Dies bedingt einige Besonderheiten beim Anlegen von Standardtabellen, die aus Kompatibilittsgrnden erhalten bleiben.

Standard-Tabellen vor Release 3.0


Vor Release 3.0 gab es nur interne Tabellenobjekte mit Kopfzeile, deren Zeilentyp eine flache Struktur ist. Es gab keine selbstndigen Tabellentypen. Ein solches Tabellenobjekt wurde ausschlielich dadurch angelegt, da der OCCURS-Zusatz wie folgt bei der Deklaration einer flachen Struktur zugefgt wird:

DATA: BEGIN OF <itab> OCCURS <n>, ... <fi>..., ... END OF <itab>.
Die Anweisungskette deklariert eine interne Tabelle <itab>, deren Zeilentyp der flachen Struktur entspricht, die ohne den OCCURS-Zusatz erzeugt wrde. Weiterhin wird dabei immer eine Kopfzeile fr die interne Tabelle angelegt. Die Zahl <n> im OCCURS-Zusatz hat die gleiche Bedeutung, wie im Zusatz INITIAL SIZE ab Release 4.0. Dabei wirkt die Angabe der Zahl 0 wie das Weglassen des Zusatzes INITIAL SIZE. Der initiale Hauptspeicherbedarf der internen Tabelle wird dann vom System bestimmt. Obige Anweisung ist auch zu Release 4.0 noch mglich und hat in etwa die gleiche Funktionalitt wie folgende Anweisungen:

TYPES: BEGIN OF <itab>, ... <fi>..., ... END OF <itab>. DATA <itab> TYPE STANDARD TABLE OF <itab> WITH NON-UNIQUE DEFAULT KEY INITIAL SIZE <n> WITH HEADER LINE.
Bei der ursprnglichen Anweisung wird jedoch kein selbstndiger Datentyp <itab> angelegt, sondern der Zeilentyp existiert nur als Attribut des Datenobjekts <itab>.

Standard-Tabellen seit Release 3.0


Seit Release 3.0 knnen Tabellentypen mit

TYPES <t> TYPE|LIKE <linetype> OCCURS <n>.


und Tabellenobjekte mit

DATA <itab> TYPE|LIKE <linetype> OCCURS <n> [WITH HEADER LINE].


angelegt werden. Der Zusatz OCCURS bewirkt, da aus dem Datentyp <linetype> eine Standard-Tabelle dieses Zeilentyps konstruiert wird. Der Zeilentyp kann ein beliebiger Datentyp

April 2001

275

ABAP Programmierung (BC-ABA) Besonderheiten bei Standard-Tabellen

SAP AG

sein. Die Zahl <n> im OCCURS-Zusatz hat die gleiche Bedeutung, wie vor Release 3.0. Interne Tabellen vor Release 4.0 hatten als Schlssel immer den Standardschlssel, d.h. alle nichtnumerischen Felder, die weder interne Tabellen sind noch enthalten. Obige Anweisungen sind auch zu Release 4.0 mglich und haben genau die gleiche Funktionalitt wie

TYPES|DATA <itab> TYPE|LIKE STANDARD TABLE OF <linetype> WITH NON-UNIQUE DEFAULT KEY INITIAL SIZE <n> [WITH HEADER LINE].
Sie knnen also auch durch diese Anweisungen ersetzt werden.

Standard-Tabellen seit Release 4.0


Beim Anlegen von Standard-Tabellen sind folgende Formen der Anweisungen TYPES und DATA mglich. Die zustzliche Angabe INITIAL SIZE ist bei allen Anweisungen mglich. Die zustzliche Angabe WITH HEADER LINE ist bei den DATA-Anweisungen mglich.

Standard-Tabellentypen
Generischer Standard-Tabellentyp:

TYPES <itab> TYPE|LIKE [STANDARD] TABLE OF <linetype>.


Der Tabellenschlssel ist nicht definiert.
Vollstndig spezifizierter Standard-Tabellentyp:

TYPES <itab> TYPE|LIKE [STANDARD] TABLE OF <linetype> WITH [NON-UNIQUE] <key>.


Der Schlssel einer vollstndig spezifizierten Standardtabelle ist immer nicht eindeutig.

Standard-Tabellenobjekte
Kurzformen der DATA-Anweisung

DATA <itab> TYPE|LIKE [STANDARD] TABLE OF <linetype>. DATA <itab> TYPE|LIKE [STANDARD] TABLE OF <linetype> WITH DEFAULT KEY.
Diese beiden DATA-Anweisungen werden vom System automatisch zur folgenden Anweisung vervollstndigt:

DATA <itab> TYPE|LIKE STANDARD TABLE OF <linetype> WITH NON-UNIQUE DEFAULT KEY.
Die beiden Kurzformen der DATA-Anweisung sollen dazu dienen, die Deklaration von StandardTabellen, die kompatibel zu den internen Tabellen vor Release 4.0 sind, mglichst einfach zu halten. Wenn in einer DATA-Anweisung Bezug auf obigen generischen Standard-Tabellentyp genommen wird, wird ebenfalls automatisch der Standardschlssel als Tabellenschlssel verwendet.
Vollstndig spezifizierte Standard-Tabelle:

DATA <itab> TYPE|LIKE [STANDARD] TABLE OF <linetype> WITH [NON-UNIQUE] <key>.


Der Schlssel einer Standardtabelle ist immer nicht eindeutig.

276

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Besonderheiten bei Standard-Tabellen

April 2001

277

ABAP Programmierung (BC-ABA) Interne Tabellen bearbeiten

SAP AG

Interne Tabellen bearbeiten


Beim Bearbeiten interner Tabellenobjekte sind prinzipiell zu unterscheiden: Operationen mit der gesamten internen Tabelle [Seite 279] Operationen mit einzelnen Zeilen [Seite 293]

278

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Operationen mit der gesamten internen Tabelle

Operationen mit der gesamten internen Tabelle


Beim Zugriff auf die gesamte interne Tabelle wird der Tabellenkrper als ein Datenobjekt angesprochen. Folgende Zugriffe auf den Tabellenkrper sind von Bedeutung: Interne Tabellen zuweisen [Seite 280] Interne Tabellen initialisieren [Seite 282] Interne Tabellen vergleichen [Seite 284] Interne Tabellen sortieren [Seite 286] Interne Tabellen als Schnittstellenparameter [Seite 291] Attribute interner Tabellen bestimmen [Seite 292] Weiterhin knnen interne Tabellen in Open SQL-Anweisungen angesprochen werden, um Daten aus Datenbanktabellen in interne Tabellen einzulesen oder umgekehrt. Mehr dazu unter Datenbanktabellen lesen und verarbeiten [Seite 1129].

April 2001

279

ABAP Programmierung (BC-ABA) Interne Tabellen zuweisen

SAP AG

Interne Tabellen zuweisen


Wie jedes Datenobjekt knnen interne Tabellen Operanden der MOVE-Anweisung [Seite 150]

MOVE <itab1> TO <itab2>.


oder der gleichbedeutenden Zuweisung

<itab2> = <itab1>.
sein. Beide Operanden mssen kompatibel oder ineinander konvertierbare interne Tabellen [Seite 203] sein. Diese Anweisungen weisen den gesamten Inhalt der Tabelle <itab1> der Tabelle <itab2> zu, einschlielich der Daten von eventuell geschachtelten internen Tabellen. Der ursprngliche Inhalt der Zieltabelle wird dabei berschrieben. Bei Tabellen mit Kopfzeile ist zu beachten, da Kopfzeile und Tabellenkrper den gleichen Namen haben. Um nicht die Kopfzeile, sondern die Tabelle selbst bei einer Zuweisung anzusprechen, mssen hinter dem Namen zwei eckige Klammern ([]) angehngt werden.

DATA: BEGIN OF line, col1(1) TYPE c, col2(1) TYPE c, END OF line. DATA: etab LIKE TABLE OF line WITH HEADER LINE, ftab LIKE TABLE OF line. line-col1 = 'A'. line-col2 = 'B'. APPEND line TO etab. MOVE etab[] TO ftab. LOOP AT ftab INTO line. WRITE: / line-col1, line-col2. ENDLOOP.
Die Listenausgabe ist:
A B

Es werden zwei Standard-Tabellen ETAB und FTAB mit dem Zeilentyp der Struktur LINE angelegt. ETAB hat eine Kopfzeile. Nach dem zeilenweisen fllen von ETAB mit APPEND, wird ihr gesamter Inhalt an FTAB zugewiesen, wobei der Gebrauch der eckigen Klammern zu beachten ist.

DATA: ftab TYPE WITH itab TYPE WITH fl TYPE

SORTED TABLE OF f NON-UNIQUE KEY table_line, HASHED TABLE OF i UNIQUE KEY table_line, f.

DO 3 TIMES. INSERT sy-index INTO TABLE itab. ENDDO.

280

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Interne Tabellen zuweisen

ftab = itab. LOOP AT ftab INTO fl. WRITE: / fl. ENDLOOP.


Die Listenausgabe ist:
1.000000000000000E+00 2.000000000000000E+00 3.000000000000000E+00

FTAB ist eine sortierte Tabelle mit Zeilentyp F und nicht eindeutigem Schlssel. ITAB ist eine Hash-Tabelle mit Zeilentyp I und eindeutigem Schlssel. Die Zeilentypen und damit die gesamten Tabellen sind ineinander konvertierbar. Daher kann der Inhalt von ITAB an FTAB zugewiesen werden. Bei der Zuweisung der unsortierten Tabelle ITAB an die sortierte Tabelle FTAB wird der Inhalt automatisch nach deren Schlssel sortiert.

DATA: BEGIN OF iline, num TYPE i, END OF iline, BEGIN OF fline, num TYPE f, END OF fline, itab LIKE TABLE OF iline, ftab LIKE TABLE OF fline. DO 3 TIMES. iline-num = sy-index. APPEND iline-num TO itab. ENDDO. ftab = itab. loop AT ftab INTO fline. WRITE: / fline-num. ENDLOOP.
Die Listenausgabe kann so aussehen:
6.03823403895813E-154 6.03969074613219E-154 6.04114745330626E-154

Die Zeilentypen der Standard-Tabellen ITAB und FTAB sind Strukturen, jede mit jeweils einer Komponente des Typs I oder F. Die Zeilentypen sind konvertierbar, jedoch nicht kompatibel. Bei der Zuweisung von ITAB zu FTAB wird daher der Inhalt der Tabelle ITAB zeilenweise in Felder vom Typ C konvertiert [Seite 201] und den Zeilen von FTAB zugewiesen. ABAP interpretiert die bergebenen Daten als Felder vom Typ F und erhlt sinnlose Ergebnisse.

April 2001

281

ABAP Programmierung (BC-ABA) Interne Tabellen initialisieren

SAP AG

Interne Tabellen initialisieren


Wie alle Datenobjekte knnen interne Tabellen mit der Anweisung

CLEAR <itab>.
initialisiert werden. Dabei wird der fr die Tabelle bentigte Hauptspeicherplatz bis auf die initiale Speicheranforderung [Seite 269] freigegeben. Bei Tabellen mit Kopfzeile ist zu beachten, da Kopfzeile und Tabellenkrper den gleichen Namen haben. Um nicht die Kopfzeile, sondern die Tabelle selbst beim Initialisieren mit CLEAR anzusprechen, mssen hinter dem Namen zwei eckige Klammern ([]) angehngt werden:

CLEAR <itab>[].
Um sicher zu gehen, da die Tabelle selbst initialisiert wird und nicht eine eventuell vorhandene Kopfzeile, kann man die Anweisung

REFRESH <itab>.
verwenden, die immer auf den Tabellenkrper zugreift. Auch bei REFRESH bleibt die initiale Speicheranforderung fr die Tabelle reserviert. Dieser Speicherplatz kann mit der Anweisung:

FREE <itab>.
frei gegeben werden. Mit FREE kann eine interne Tabelle auch direkt initialisiert und ihr gesamter Speicherplatz inklusive der initialen Speicheranforderung freigegeben werden, ohne da vorher REFRESH oder CLEAR verwendet werden mu. FREE greift wie REFRESH auf den Tabellenkrper und nicht auf den Tabellenarbeitsbereich zu. Nach einer FREE-Anweisung ist die interne Tabelle weiterhin vorhanden. Sie belegt noch Speicherplatz fr den Tabellen-Header (zur Zeit 256 Byte). Bei erneutem Fllen reserviert das System den Speicherplatz fr die Zeilen neu.

REPORT demo_int_tables_clear . DATA: BEGIN OF line, col1(1) TYPE c, col2(1) TYPE c, END OF line. DATA itab LIKE TABLE OF line. line-col1 = 'A'. line-col2 = 'B'. APPEND line TO itab. REFRESH itab. IF itab IS INITIAL. WRITE 'ITAB is empty'. FREE itab. ENDIF.
Die Listenausgabe ist:
ITAB is empty.

Es wird eine Standard-Tabelle ITAB gefllt und dann mit REFRESH initialisiert. In der IF-Anweisung wird mit dem logischen ITAB IS INITIAL geprft, ob ITAB leer ist. Ist ITAB leer, wird auch der Speicherplatz freigegeben.

282

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Interne Tabellen initialisieren

April 2001

283

ABAP Programmierung (BC-ABA) Interne Tabellen vergleichen

SAP AG

Interne Tabellen vergleichen


Wie alle Datenobjekte knnen interne Tabellen als Operanden logischer Ausdrcke [Seite 238] eingesetzt werden:

.... <itab1> <operator> <itab2> ...


Fr <operator> knnen alle fr Vergleiche zwischen verschiedenen Datentypen [Seite 239] mglichen Operatoren verwendet werden (EQ, =, NE, <>, ><, GE, >=, LE, <=, GT, >, LT, <). Bei Tabellen mit Kopfzeile ist zu beachten, da Kopfzeile und Tabellenkrper den gleichen Namen haben. Um nicht die Kopfzeile, sondern die Tabelle selbst bei einem Vergleich anzusprechen, mssen hinter dem Namen zwei eckige Klammern ([]) angehngt werden. Das erste Kriterium fr einen Vergleich interner Tabellen ist die Anzahl der Zeilen. Je mehr Zeilen ein interne Tabelle enthlt, desto grer ist sie. Enthalten zwei interne Tabellen die gleiche Anzahl an Zeilen, werden Sie Zeile fr Zeile und Komponente fr Komponente verglichen. Handelt es sich bei den Komponenten der Tabellenzeilen um geschachtelte interne Tabellen, werden sie rekursiv verglichen. Bei anderen Operatoren als dem Gleichheitsoperator, hlt der Vergleich nach dem ersten ungleichen Komponentenpaar an und gibt das entsprechende Ergebnis zurck.

REPORT demo_int_tables_compare . DATA: BEGIN OF line, col1 TYPE i, col2 TYPE i, END OF line. DATA: itab LIKE TABLE OF line, jtab LIKE TABLE OF line. DO 3 TIMES. line-col1 = sy-index. line-col2 = sy-index ** 2. APPEND line TO itab. ENDDO. MOVE itab TO jtab. line-col1 = 10. line-col2 = 20. APPEND line TO itab. IF itab GT jtab. WRITE / 'ITAB GT JTAB'. ENDIF. APPEND line TO jtab. IF itab EQ jtab. WRITE / 'ITAB EQ JTAB'. ENDIF. line-col1 = 30. line-col2 = 80. APPEND line TO itab.

284

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Interne Tabellen vergleichen

IF jtab LE itab. WRITE / 'JTAB LE ITAB'. ENDIF. line-col1 = 50. line-col2 = 60. APPEND line TO jtab. IF itab NE jtab. WRITE / 'ITAB NE JTAB'. ENDIF. IF itab LT jtab. WRITE / 'ITAB LT JTAB'. ENDIF.
Die Listenausgabe ist:
ITAB GT JTAB ITAB EQ JTAB JTAB LE ITAB ITAB NE JTAB ITAB LT JTAB

Es werden zwei Standard-Tabellen, ITAB und JTAB, angelegt. ITAB wird mit drei Zeilen gefllt und JTAB zugewiesen. ITAB wird eine weitere Zeile hinzugefgt und der erste logische Ausdruck gibt zurck, da ITAB grer als JTAB ist. Nachdem JTAB die gleiche Zeile angehngt wurde, zeigt der zweite logische Ausdruck, da beide Tabellen gleich sind. Dann wird ITAB eine weitere Zeile angehngt und der dritte logische Ausdruck zeigt an, da JTAB kleiner gleich ITAB ist. Dann wird eine weitere Zeile an JTAB angehngt, deren Inhalt ungleich dem Inhalt der letzten Zeile von ITAB ist. Der nchste logische Ausdruck gibt zurck, da ITAB ungleich JTAB ist. Das erste Tabellenfeld, dessen Inhalt fr ITAB und JTAB unterschiedlich ist, ist COL1 in der letzten Tabellenzeile, nmlich 30 fr ITAB und 50 fr JTAB. Im letzten logischen Ausdruck ist daher ITAB kleiner als JTAB.

April 2001

285

ABAP Programmierung (BC-ABA) Interne Tabellen sortieren

SAP AG

Interne Tabellen sortieren


Standard- und Hash-Tabellen knnen im Programm sortiert werden. Zum Sortieren solcher Tabellen nach ihrem Schlssel verwendet man die Anweisung:

SORT <itab> [ASCENDING|DESCENDING] [AS TEXT] [STABLE].


Die interne Tabelle <itab> wird aufsteigend nach ihrem Schlssel sortiert. Diese Anweisung greift immer auf die Tabelle selbst zu und nicht auf eine eventuell vorhandene Kopfzeile. Die Prioritt der Sortierung richtet sich dabei nach der Reihenfolge in der die Schlsselfelder bei der Tabellendefinition angegeben sind. Beim Standardschlssel ist die Reihenfolge der nichtnumerischen Felder in den Zeilen der Tabelle ausschlaggebend. Die Sortierreihenfolge kann mit den Zustzen ASCENDING oder DESCENDING als aufsteigend bzw. als absteigend angegeben werden. Standardmig wird aufsteigend sortiert. Je grer der Sortierschlssel ist, desto grer ist der Laufzeitverbrauch beim Sortieren. Enthlt der Sortierschlssel sogar eine geschachtelte interne Tabelle, kann der Sortiervorgang sehr langsam werden. Tabellen der Tabellenart sortierte Tabelle knnen durch die Anweisung SORT nicht umsortiert werden, da solche Tabellen vom System immer nach ihrem Schlssel sortiert gehalten werden. Falls statisch erkennbar fhrt die Anweisung SORT fr eine sortierte Tabelle zu einem Syntaxfehler. Bei generischen sortierten Tabellen fhrt die Anweisung SORT zu Laufzeitfehlern, falls der Sortierschlssel nicht mit einem Anfangsstck des Tabellenschlssels bereinstimmt, eine absteigende Sortierreihenfolge oder der Zusatz AS TEXT angegeben ist. Mit anderen Worten ist die Anweisung SORT bei generischen internen Tabellen genau dann erlaubt, wenn sich die interne Sortierung nicht ndert.

Sortieren nach anderem Sortierschlssel


Falls eine interne Tabelle mit strukturiertem Zeilentyp nach einem anderen Schlssel sortiert werden soll, kann man diesen in der SORT-Anweisung angeben:

SORT <itab> [ASCENDING|DESCENDING] [AS TEXT] [STABLE] BY <f1> [ASCENDING|DESCENDING] [AS TEXT] ... <fn> [ASCENDING|DESCENDING] [AS TEXT].
Die Tabelle wird statt nach dem Tabellenschlssel nach den angegebenen Komponenten <f1>... <fn> sortiert. Die Zahl der Sortierfelder ist auf 250 begrenzt. Die Prioritt der Sortierung richtet sich nach der Reihenfolge, in der die Felder <fi> angegeben sind. Die vor BY angegebene Sortierreihenfolge gilt fr alle Felder. Die Sortierreihenfolge hinter einem Feld wirkt nur fr die entsprechende Spalte der Tabelle. Ein Sortierfeld kann dynamisch gesetzt werden, indem man (<f>) anstatt <fi> schreibt. Der Inhalt des Feldes <f> bestimmt den Namen des Sortierfelds. Ist <f> bei Ausfhrung der Anweisung leer, wird das Feld beim Sortieren ignoriert. Enthlt es einen ungltigen Komponentennamen, tritt ein Laufzeitfehler ein. Falls der Zeilentyp der internen Tabelle Objektreferenzvariablen als Komponenten <comp> enthlt oder der gesamte Zeilentyp eine Referenzvariable ist, knnen die Attribute <attr> des Objekts, auf welches die jeweilige Referenz einer Zeile zeigt, ber <comp->attr> bzw. <table_line->attr> als Sortierkriterium angegeben werden.

286

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Interne Tabellen sortieren

Alphabetisches Sortieren
Zustzlich zu den Zustzen ASCENDING oder DESCENDING kann fr die gesamte Sortierung oder fr jedes Sortierfeld eine alphabetische Sortierung definiert werden:

SORT <itab>... AS TEXT....


Dieser Zusatz beeinflut die Sortiermethode fr Zeichenketten. Ohne den Zusatz werden Zeichenketten binr nach der plattformabhngigen Darstellung der einzelnen Zeichen sortiert. Mit dem Zusatz AS TEXT werden Zeichenketten alphabetisch nach der eingestellten Textumgebung sortiert. Die Textumgebung wird standardmig nach dem Stammsatz des Benutzers eingestellt. Sie kann aber ausnahmsweise auch ber die Anweisung

SET LOCALE LANGUAGE


gesetzt werden. Der Zusatz AS TEXT erspart die Konvertierung in ein sortierbares Format [Seite 174] von Zeichenketten. Solch eine Konversion ist nur notwendig, wenn

eine interne Tabelle alphabetisch sortiert und danach binr durchsucht werden soll. eine interne Tabelle mit zeichenartigen Schlsseln mehrfach umsortiert werden soll, da dann nur einmal konvertiert werden mu. alphabetische Indizes fr Datenbanktabellen programmgesteuert aufgebaut werden sollen

Wenn der Zusatz AS TEXT fr die gesamte Sortierung gilt, wirkt er nur auf Sortierfelder vom Typs C im Sortierschlssel. Wenn AS TEXT speziell fr ein Sortierfeld angegeben wird, mu dieses vom Typ C sein.

Stabile Sortierung
Mit dem Zusatz

SORT <itab>... STABLE.


kann eine stabile Sortierung erreicht werden. D.h. die relative Reihenfolge von Zeilen, die sich im Sortierschlssel nicht unterscheiden bleibt beim Sortieren unverndert. Ohne den Zusatz STABLE bleibt die Reihenfolge nicht erhalten und mehrmaliges Sortieren einer Tabelle nach dem gleichen Sortierschlssel ndert bei jedem Sortieren erneut die Reihenfolge. Auf der anderen Seite ist der Laufzeitverbrauch beim stabilen Sortieren grer als beim instabilen Sortieren.

REPORT demo_int_tables_sort_stable. DATA: BEGIN OF line, land(3) TYPE name(10) TYPE age TYPE weight TYPE END OF line. c, c, i, p DECIMALS 2,

DATA itab LIKE STANDARD TABLE OF line WITH NON-UNIQUE KEY land. line-land = 'G'. line-name = 'Hans'. line-age = 20. line-weight = '80.00'. APPEND line TO itab.

April 2001

287

ABAP Programmierung (BC-ABA) Interne Tabellen sortieren

SAP AG

line-land = 'USA'. line-name = 'Nancy'. line-age = 35. line-weight = '45.00'. APPEND line TO itab. line-land = 'USA'. line-name = 'Howard'. line-age = 40. line-weight = '95.00'. APPEND line TO itab. line-land = 'GB'. line-name = 'Jenny'. line-age = 18. line-weight = '50.00'. APPEND line TO itab. line-land = 'F'. line-name = 'Michele'. line-age = 30. line-weight = '60.00'. APPEND line TO itab. line-land = 'G'. line-name = 'Karl'. line-age = 60. line-weight = '75.00'. APPEND line TO itab. PERFORM loop_at_itab. SORT itab. PERFORM loop_at_itab. SORT itab. PERFORM loop_at_itab. SORT itab STABLE. PERFORM loop_at_itab. SORT itab DESCENDING BY land weight ASCENDING. PERFORM loop_at_itab. FORM loop_at_itab. LOOP AT itab INTO line. WRITE: / line-land, line-name, line-age, line-weight. ENDLOOP. SKIP. ENDFORM.
Die Listenausgabe ist:
G USA USA GB F G F G G GB USA USA F G G Hans Nancy Howard Jenny Michele Karl Michele Hans Karl Jenny Howard Nancy Michele Karl Hans 20 35 40 18 30 60 30 20 60 18 40 35 30 60 20 80.00 45.00 95.00 50.00 60.00 75.00 60.00 80.00 75.00 50.00 95.00 45.00 60.00 75.00 80.00

288

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Interne Tabellen sortieren

GB Jenny USA Howard USA Nancy F G G GB USA USA USA USA GB G G F Michele Karl Hans Jenny Howard Nancy Nancy Howard Jenny Karl Hans Michele

18 40 35 30 60 20 18 40 35 35 40 18 60 20 30

50.00 95.00 45.00 60.00 75.00 80.00 50.00 95.00 45.00 45.00 95.00 50.00 75.00 80.00 60.00

Es werden vier Sortiervorgnge auf einer Standard-Tabelle mit einem Schlsselfeld durchgefhrt. Zuerst wird zweimal hintereinander ohne den Zusatz STABLE nach dem Schlssel der Tabelle (LAND) sortiert. Die Sortierung ist instabil. Die Reihenfolge der zweiten und dritten Zeile ndert sich. Dann wird die gleiche Sortierung mit dem Zusatz STABLE durchgefhrt. Die Sortierung ist stabil. Die Reihenfolge der Zeilen bleibt bestehen. Schlielich wird nach einem neuen durch LAND und WEIGHT definierten Sortierschlssel sortiert. Die allgemeine Sortierreihenfolge ist absteigend, aber fr WEIGHT wird aufsteigend definiert.

REPORT demo_int_tables_sort_text. DATA: BEGIN OF line, text(6) TYPE c, xtext(160) TYPE x, END OF line. DATA itab LIKE HASHED TABLE OF line WITH UNIQUE KEY text. line-text = 'Muller'. CONVERT TEXT line-text INTO SORTABLE CODE line-xtext. INSERT line INTO TABLE itab. line-text = 'Mller'. CONVERT TEXT line-text INTO SORTABLE CODE line-xtext. INSERT line INTO TABLE itab. line-text = 'Moller'. CONVERT TEXT line-text INTO SORTABLE CODE line-xtext. INSERT line INTO TABLE itab. line-text = 'Miller'. CONVERT TEXT line-text INTO SORTABLE CODE line-xtext. INSERT line INTO TABLE itab. SORT itab. PERFORM loop_at_itab. SORT itab BY xtext. PERFORM loop_at_itab.

April 2001

289

ABAP Programmierung (BC-ABA) Interne Tabellen sortieren

SAP AG

SORT itab AS TEXT. PERFORM loop_at_itab. FORM loop_at_itab. LOOP AT itab INTO line. WRITE / line-text. ENDLOOP. SKIP. ENDFORM.
Dss Beispiel demonstriert die alphabetische Sortierung von Zeichenketten. Die Tabelle ITAB enthlt eine Spalte mit Textfeldern und eine Spalte mit zugehrigen lnderspezifisch sortierbaren binren Zeichen, die durch Konvertierung in ein sortierbares Format [Seite 174] erzeugt werden. Die Tabelle wird dreimal sortiert. Erst binr nach dem Schlsselfeld TEXT, dann binr nach dem Feld XTEXT, schlielich alphabetisch nach dem Schlsselfeld TEXT. Die Listenausgabe ist im Fall einer deutschen Textumgebung:
Miller Moller Muller Mller Miller Moller Mller Muller Miller Moller Mller Muller

Bei der ersten Sortierung folgt 'Mller' hinter 'Muller', da die interne Darstellung des Zeichens '' hinter der Darstellung fr 'u' liegt. Die beiden anderen Sortierungen sind alphabetisch. Die binre Sortierung nach XTEXT hat das gleiche Ergebnis, wie die alphabetische Sortierung nach dem Feld TEXT.

290

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Interne Tabellen als Schnittstellenparameter

Interne Tabellen als Schnittstellenparameter


Interne Tabellen knnen wie andere Datenobjekte auch per Wert oder Referenz an die Parameterschnittstelle [Seite 477] von Prozeduren [Seite 467] bergeben werden. Bei Tabellen mit Kopfzeile ist dabei zu beachten, da der Tabellenkrper durch zwei eckige Klammern ([]) hinter dem Tabellennamen kenntlich gemacht werden mu. Die Formalparameter der Parameterschnittstellen von Prozeduren knnen als interne Tabellen typisiert werden. Zur Typisierung knnen dabei auer den vorgegebenen generischen Typen des TYPE-Zusatzes [Seite 117] auch die generischen internen Tabellentypen [Seite 269] verwendet werden. Aus Kompatibilittsgrnden zu vorhergehenden Releases knnen Formalparameter in Unterprogrammen und Funktionsbausteinen auch als TABLES-Parameter angegeben werden. Der Formalparameter wird dadurch als Standard-Tabelle mit Standardschlssel und Kopfzeile typisiert. Wenn eine Tabelle ohne Kopfzeile als Aktualparameter an einen solchen Formalparameter bergeben wird, dann wird in der Prozedur automatisch eine lokale Kopfzeile zu dieser Tabelle angelegt.

April 2001

291

ABAP Programmierung (BC-ABA) Attribute interner Tabellen bestimmen

SAP AG

Attribute interner Tabellen bestimmen


Um zur Laufzeit Attribute einer internen Tabelle zu bestimmen, die eventuell nicht statisch bekannt sind, verwendet man die Anweisung:

DESCRIBE TABLE <itab> [LINES <l>] [OCCURS <n>] [KIND <k>].


Mit dem Parameter LINES wird die Anzahl der gefllten Zeilen in die Variable <l> geschrieben. Mit OCCURS wird der beim Anlegen in INITIAL SIZE angegebene Wert in die Variable <n> geschrieben. Mit dem Parameter KIND wird die Tabellenart als 'T' fr Standard-Tabellen, 'S' fr sortierte Tabellen und 'H' fr Hash-Tabellen in die Variable <k> geschrieben.

REPORT demo_int_tables_describe_table . DATA: BEGIN OF line, col1 TYPE i, col2 TYPE i, END OF line. DATA itab LIKE HASHED TABLE OF line WITH UNIQUE KEY col1 INITIAL SIZE 10. DATA: lin TYPE i, ini TYPE i, knd(1) TYPE c. DESCRIBE TABLE itab LINES lin OCCURS ini KIND knd. WRITE: / lin, ini, knd. DO 1000 TIMES. line-col1 = sy-index. line-col2 = sy-index ** 2. INSERT line INTO TABLE itab. ENDDO. DESCRIBE TABLE itab LINES lin OCCURS ini KIND knd. WRITE: / lin, ini, knd.
Die Listenausgabe ist:
0 1,000 10 10 H H

Es wird eine Hash-Tabelle ITAB angelegt und gefllt. Die Anweisung DESCRIBE TABLE wird vor und nach dem Fllen der Tabelle ausgefhrt. Die aktuelle Zeilenzahl ndert sich, die Zahl der initialen Zeilen und die Tabellenart kann sich natrlich nicht ndern.

292

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Operationen mit einzelnen Zeilen

Operationen mit einzelnen Zeilen


Folgende Operationen sind typisch beim Zugriff auf einzelne Zeilen von Tabellen:

Zeilenweises Fllen einer Tabelle Zeilenweises Lesen einer Tabelle Modifizieren einzelner Zeilen Lschen einzelner Zeilen

Einflu der Tabellenart


Beim Zugriff auf einzelne Zeilen mssen wir zwischen Operationen unterscheiden, die fr alle Tabellenarten mglich sind und solchen, die nur mit Index-Tabellen mglich sind. Bei den IndexTabellen (Standard- und sortierte Tabellen) wird ein interner Index verwaltet, so da Indexzugriffe mglich sind. Hash-Tabellen haben keinen linearen Index, so da nur Schlsselzugriffe mglich sind. Die Operationen, die fr alle Tabellenarten mglich sind, fhren keine Indexzugriffe durch. Sie knnen beispielsweise auch in Prozeduren [Seite 467] oder mit Feldsymbolen [Seite 209] ausgefhrt werden, deren Tabellenart nicht durch eine Typisierung festgelegt ist. Wir bezeichnen solche Operationen deshalb auch als generische Operationen. Die Anweisungen zum Zugriff auf Zeilen beliebiger Tabellenarten unterscheiden sich von den Anweisungen zum Zugriff auf Index-Tabellen bis auf wenige Ausnahmen durch den Zusatz TABLE hinter dem entsprechenden Schlsselwort. Beispielsweise werden mit MODIFY TABLE die Zeilen beliebiger Tabellen gendert und mit MODIFY nur die Zeilen von Index-Tabellen.

Zugriffsmethoden
Beim Zugriff auf einzelne Tabelleneintrge unterscheiden wir zwei Methoden.

Zugriff ber Arbeitsbereiche


Beim Zugriff ber Arbeitsbereiche arbeitet man nicht direkt mit den Daten in der Tabelle, sondern man verwendet ein anderes Datenobjekt als Arbeitsbereich. Der Arbeitsbereich dient als Schnittstelle zu den Eintrgen der internen Tabelle und mu in den Zeilentyp der internen Tabelle konvertierbar sein. Am gnstigsten ist die Verwendung eines zum Zeilentyp kompatiblen Arbeitsbereichs. Beim Lesen von Daten aus Tabellenzeilen, berschreibt der Inhalt der angesprochenen Tabellenzeile den Inhalt des Arbeitsbereichs, dessen Inhalt dann im Programm verwendet werden kann. Beim Schreiben von Daten in Tabellenzeilen, mssen die Daten zuerst in den Arbeitsbereich eingegeben werden, aus dem das System sie in die Tabellenzeile bertrgt. Die Datenbertragung folgt den Regeln der Wertzuweisung mit MOVE [Seite 150].

April 2001

293

ABAP Programmierung (BC-ABA) Operationen mit einzelnen Zeilen

SAP AG

Tabelle

Tabelle lesen

Tabelle ndern Arbeitsbereich


Bei Tabellen mit Kopfzeile kann die Kopfzeile als vorgegebener Arbeitsbereich verwendet werden. Anweisungen fr den Zugriff auf Tabelleneintrge ber Arbeitsbereiche knnen die Kopfzeile implizit verwenden.

Zugriff ber Feldsymbole


Beim Zugriff ber Feldsymbole [Seite 209] entfllt das Kopieren von Daten in einen Arbeitsbereich. Feldsymbolen knnen einzelne Zeilen von internen Tabellen zugewiesen werden. Im Idealfall ist das Feldsymbol entsprechend dem Zeilentyp der internen Tabelle typisiert. Nach der Zuweisung ist das Arbeiten mit dem Feldsymbol dann gleichbedeutend mit einem Direktzugriff auf die zugewiesene Zeile.

Tabelle

<
Feldsymbol

>

In den folgenden Abschnitten werden die Operationen fr die verschiedenen Tabellenarten erlutert. Danach wird zusammenfassend auf den Zugriff ber Feldsymbole und ber Kopfzeilen eingegangen. Operationen fr alle Tabellenarten [Seite 296] Operationen mit Index-Tabellen [Seite 323]

294

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Operationen mit einzelnen Zeilen

Zugriff ber Feldsymbole [Seite 343] Kopfzeilen als Arbeitsbereich [Seite 345]

April 2001

295

ABAP Programmierung (BC-ABA) Operationen fr alle Tabellenarten

SAP AG

Operationen fr alle Tabellenarten


Die im folgenden aufgefhrten Operationen knnen mit den Zeilen aller Tabellenarten durchgefhrt werden. Die Operationen werden fr jede Tabellenart spezifisch ausgefhrt. Diese Operationen sollen dann verwendet werden, wenn sie die einzig mglichen fr die verwendete Tabellenart sind oder wenn zum Zeitpunkt der Programmerstellung die Tabellenart nicht festliegt (z.B. generische Formalparameter in Prozeduren). Falls die Tabellenart feststeht, sollten aus Grnden der Performance auch die spezifischen Operationen verwendet werden. Beispielsweise sollten Index-Tabellen mit der dafr vorgesehenen Anweisung APPEND TO gefllt werden, whrend Hash-Tabellen oder generische Tabellen nur mit INSERT INTO TABLE gefllt werden knnen. Tabellenzeilen einfgen [Seite 297] Tabellenzeilen verdichtet einfgen [Seite 300] Tabellenzeilen lesen [Seite 302] Tabellenzeilen ndern [Seite 308] Tabellenzeilen lschen [Seite 311] Tabellenzeilen in Schleifen bearbeiten [Seite 315]

296

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Tabellenzeilen einfgen

Tabellenzeilen einfgen
Es knnen eine oder mehrere Zeilen in interne Tabellen eingefgt werden:

Einzelne Zeilen einfgen


Um eine Tabellenzeile in eine beliebige Tabelle einzufgen verwendet man die Anweisung:

INSERT <line> INTO TABLE <itab>.


Dabei ist <line> entweder ein zum Zeilentyp kompatibler Arbeitsbereich oder der Ausdruck INITIAL LINE. Die Forderung der Kompatibilitt [Seite 138] des Arbeitsbereichs ergibt sich daraus, da die Felder des Tabellenschlssels typgerecht versorgt werden mssen. Mit INITIAL LINE wird eine typgerecht initialisierte Leerzeile eingefgt. Falls die interne Tabelle einen eindeutigen Schlssel hat, werden Zeilen, deren Schlssel in der Tabelle schon vorhanden ist, nicht eingefgt und SY-SUBRC wird auf 4 gesetzt. Bei erfolgreichem Einfgen ist SY-SUBRC gleich 0. Das Einfgen erfolgt fr die einzelnen Tabellenarten wie folgt:

Standard-Tabellen Die Zeile wird als letzte Zeile an die interne Tabelle angehngt. Die Anweisung arbeitet wie die spezifische Anweisung APPEND zum Zeilen anhngen [Seite 324].

Sortierte Tabellen Die Zeile wird gem Tabellenschlssel in die Tabelle einsortiert. Bei nicht eindeutigem Schlssel wird an der obersten Stelle von eventuell vorhandenen Duplikaten eingefgt. Die Laufzeit hngt logarithmisch von der Anzahl bereits vorhandener Tabelleneintrge ab.

Hash-Tabellen Die Zeile wird gem Tabellenschlssel in die interne Hash-Verwaltung der Tabelle eingefgt.

Mehrere Zeilen einfgen


Um mehrere Tabellenzeilen auf einmal in eine beliebige Tabelle einzufgen verwendet man die Anweisung:

INSERT LINES OF <itab1> [FROM <n1>] [TO <n2>] INTO TABLE <itab2>.
Dabei sind <itab1> und <itab2> Tabellen mit kompatiblem Zeilentyp. Es werden die Zeilen der Tabelle <itab1> nach den gleichen Regeln wie beim Einfgen einer einzelnen Zeile hintereinander in die Tabelle <itab2> eingefgt. Falls <itab1> eine Index-Tabelle ist, knnen ber <n1> und <n2> die Indexe der ersten bzw. letzten anzuhngenden Zeile von ITAB1 angegeben werden. Die Methode, Zeilen einer Tabelle in eine andere einzufgen kann je nach Gre der Tabellen und an welcher Stelle eingefgt wird um bis zu einen Faktor 20 schneller sein, als in einer Schleife zeilenweise einzufgen.

April 2001

297

ABAP Programmierung (BC-ABA) Tabellenzeilen einfgen

SAP AG

Beispiele
Einzelne Zeilen einfgen.

REPORT demo_int_tables_insert . DATA: BEGIN OF line, land(3) TYPE name(10) TYPE age TYPE weight TYPE END OF line. c, c, i, p DECIMALS 2,

DATA itab LIKE SORTED TABLE OF line WITH NON-UNIQUE KEY land name age weight. line-land = 'G'. line-name = 'Hans'. line-age = 20. line-weight = '80.00'. INSERT line INTO TABLE itab. line-land = 'USA'. line-name = 'Nancy'. line-age = 35. line-weight = '45.00'. INSERT line INTO TABLE itab. line-land = 'USA'. line-name = 'Howard'. line-age = 40. line-weight = '95.00'. INSERT line INTO TABLE itab. line-land = 'GB'. line-name = 'Jenny'. line-age = 18. line-weight = '50.00'. INSERT line INTO TABLE itab. line-land = 'F'. line-name = 'Michele'. line-age = 30. line-weight = '60.00'. INSERT line INTO TABLE itab. line-land = 'G'. line-name = 'Karl'. line-age = 60. line-weight = '75.00'. INSERT line INTO TABLE itab. LOOP AT itab INTO line. WRITE: / line-land, line-name, line-age, line-weight. ENDLOOP.
Die Listenausgabe ist: :
F G G GB USA USA Michele Hans Karl Jenny Howard Nancy 30 20 60 18 40 35 60,00 80,00 75,00 50,00 95,00 45,00

In eine sortierte interne Tabelle werden einzelne Zeieln eingefgt.

Mehrere Zeilen einfgen

298

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Tabellenzeilen einfgen

REPORT demo_int_tables_insert_lines . DATA: BEGIN OF line, col1 TYPE i, col2 TYPE i, END OF line. DATA: itab LIKE STANDARD TABLE OF line, jtab LIKE SORTED TABLE OF line WITH NON-UNIQUE KEY col1 col2. DO 3 TIMES. line-col1 = APPEND line line-col1 = APPEND line ENDDO. sy-index. line-col2 = sy-index ** 2. TO itab. sy-index. line-col2 = sy-index ** 3. TO jtab.

INSERT LINES OF itab INTO TABLE jtab. LOOP AT jtab INTO line. WRITE: / sy-tabix, line-col1, line-col2. ENDLOOP.
Die Listenausgabe ist: :
1 2 3 4 5 6 1 1 2 2 3 3 1 1 4 8 9 27

Es werden zwei interne Tabellen vom gleichen Zeilentyp aber unterschiedlicher Tabellenart angelegt und jeweils mit drei Zeilen gefllt. Danach wird die gesamte Tabelle ITAB in die sortierte Tabelle JTAB einsortiert.

April 2001

299

ABAP Programmierung (BC-ABA) Tabellenzeilen verdichtet einfgen

SAP AG

Tabellenzeilen verdichtet einfgen


Mit folgender Anweisung lassen sich verdichtete interne Tabellen ohne duplikative Eintrge erstellen:

COLLECT <wa> INTO <itab>.


Der Zeilentyp von <itab> mu flach strukturiert und alle nicht zum Tabellenschlssel gehrigen Felder mssen einen numerischen Typ (F, I, P) haben. Die einzufgende Zeile wird als zum Zeilentyp kompatibler Arbeitsbereich angegeben. Beim Einfgen wird berprft ob schon ein zum Tabellenschlssel passender Tabelleneintrag vorliegt. Wenn nicht, hat die Anweisung COLLECT die gleiche Wirkung wie beim Tabellenzeilen einfgen [Seite 297]. Liegt aber schon ein Eintrag vor, fgt COLLECT keine neue Zeile ein, sondern addiert den Inhalt der numerischen Felder des Arbeitsbereichs zum Inhalt der entsprechenden Felder des vorhandenen Eintrags. Um verdichtete Tabellen zu erstellen sollte ausschlielich mit COLLECT gearbeitet werden um Zeilen einzufgen. Falls dazwischen andere Anweisungen zum Einfgen von Zeilen verwendet werden knnen doppelte Eintrge auftreten. Das Einfgen erfolgt fr die einzelnen Tabellenarten wie folgt:

Standard-Tabellen Ist COLLECT die erste Fll-Anweisung fr eine Standard-Tabelle, wird intern eine temporre Hash-Verwaltung generiert, die bereits vorhandene Zeilen lokalisiert. Diese Hash-Verwaltung lebt so lange, bis eine andere Anweisung den Inhalt von Schlsselfeldern oder die Reihenfolge der Zeilen in der internen Tabelle ndert. Danach werden bereits vorhandene Eintrge ber eine lineare Suche lokalisiert, deren Laufzeit nicht unabhngig von der Anzahl bereits vorhandener Zeilen ist, sondern linear von ihr abhngt. Das Systemfeld SY-TABIX enthlt nach COLLECT den Index der eingefgten bzw. verdichteten Zeile.

Sortierte Tabellen Bereits vorhandene Zeilen werden mit binrer Suche lokalisiert. Die Laufzeit hngt logarithmisch von der Anzahl bereits vorhandener Zeilen ab. Das Systemfeld SY-TABIX enthlt nach COLLECT den Index der eingefgten bzw. verdichteten Zeile.

Hash-Tabellen Bereits vorhandene Zeilen werden mit dem Hash-Algorithmus der internen Tabelle lokalisiert. Das Systemfeld SY-TABIX enthlt nach COLLECT den Wert 0, da HashTabellen keinen linearen Index haben.

REPORT demo_int_tables_collect . DATA: BEGIN OF line, col1(3) TYPE c, col2(2) TYPE n, col3 TYPE i, END OF line. DATA itab LIKE SORTED TABLE OF line WITH NON-UNIQUE KEY col1 col2.

300

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Tabellenzeilen verdichtet einfgen

line-col1 = 'abc'. line-col2 = '12'. line-col3 = 3. COLLECT line INTO itab. WRITE / sy-tabix. line-col1 = 'def'. line-col2 = '34'. line-col3 = 5. COLLECT line INTO itab. WRITE / sy-tabix. line-col1 = 'abc'. line-col2 = '12'. line-col3 = 7. COLLECT line INTO itab. WRITE / sy-tabix. LOOP AT itab INTO line. WRITE: / line-col1, line-col2, line-col3. ENDLOOP.
Die Listenausgabe ist:
1 2 1 abc 12 def 34 10 5

Eine sortierte Tabelle wird verdichtet gefllt. Die ersten beiden COLLECTAnweisungen wirken wie normale Fll-Anweisungen. In der dritten COLLECTAnweisung wird die erste Zeile von ITAB gendert. Die folgende Abbildung verdeutlicht die drei Schritte:

Arbeitsbereich

abc 12 3 abc 12 3

1 1

Tabelle abc 12 3 abc 12 3

d e ff de

34 5 34 5

2 2 3 3

abc 12 3 abc 12 3 d e ff 3 4 5 de 34 5 a b c 1 2 10 a b c 1 2 10 d e ff 3 4 5 de 34 5
Schlssel

abc 12 7 abc 12 7

April 2001

301

ABAP Programmierung (BC-ABA) Tabellenzeilen lesen

SAP AG

Tabellenzeilen lesen
Um eine einzelne Zeile einer beliebigen Tabelle auszulesen, verwendet man die Anweisung

READ TABLE <itab> <key> <result>.


In beliebigen Tabellen knnen Zeilen nur ber einen Schlssel und nicht ber den Index gesucht werden. Mit der Angabe <key> wird der Suchschlssel angegeben. Die Angabe <result> bestimmt, wie mit einer gefundenen Zeile verfahren wird. Falls ein Eintrag gefunden wird, wird SY-SUBRC auf Null, ansonsten auf Vier gesetzt, falls er nicht durch einen Zusatz beeinflut wird. Bei Index-Tabellen wird SY-TABIX auf den Index der gefundenen Zeile gesetzt. Wird bei nicht eindeutigen Schlsseln ein doppelter Eintrag gefunden, wird der erste Eintrag genommen.

Angabe des Suchschlssels


Als Suchschlssel kann der Tabellenschlssel oder ein anderer Schlssel angegeben werden.

Verwendung des Tabellenschlssels


Um den Tabellenschlssel der Tabelle <itab> als Suchschlssel zu verwenden, ist <key> wie folgt anzugeben:

READ TABLE <itab> FROM <wa> <result>.


oder als:

READ TABLE <itab> WITH TABLE KEY <k1> = <f1>... <kn> = <fn> <result>.
Im ersten Fall mu <wa> ein zum Zeilentyp von <itab> kompatibler Arbeitsbereich sein. Die Werte der Schlsselfelder werden aus den entsprechenden Komponenten des Arbeitsbereichs entnommen. Im zweiten Fall werden die Werte fr jedes Schlsselfeld explizit angegeben. Es drfen keine identischen Schlsselangaben mehrfach vorgenommen werden. Falls der Name eines Schlsselfelds erst zur Laufzeit bekannt ist, kann er dynamisch ber (<ni>) = <fi> als Inhalt eines Felds <ni> angegeben werden. Falls die Datentypen von <fi> nicht kompatibel zu den Schlsselfeldern sind, findet eine Konvertierung statt. Falls der Zeilentyp der internen Tabelle unstrukturiert ist, kann ein Vergleich mit der Pseudokomponenten table_line angegeben werden:

READ TABLE <itab> WITH TABLE KEY table_line = <f> <result>.


Der Inhalt der gesamten Tabellenzeilen werden mit dem Inhalt des Felds <f> verglichen. Falls <f> nicht kompatibel zum Zeilentyp der Tabelle ist, wird der Wert in den Zeilentyp konvertiert. Dieser Suchschlssel ermglicht es bestimmte Zeile auch in solchen internen Tabellen zu finden, deren Zeilentyp nicht strukturiert ist, also ein Einzelfeld oder ein interner Tabellentyp ist. Falls der Zeilentyp der internen Tabelle Objektreferenzvariablen als Komponenten <comp> enthlt oder der gesamte Zeilentyp eine Referenzvariable ist, knnen die Attribute <attr> des Objekts, auf welches die jeweilige Referenz einer Zeile zeigt, ber <comp->attr> bzw. <table_line->attr> als Schlsselwerte angegeben werden. Die Suche erfolgt fr die einzelnen Tabellenarten wie folgt:

Standard-Tabellen Der Eintrag wird linear gesucht, wobei die Laufzeit linear von der Anzahl der Tabellenzeilen abhngt.

302

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Tabellenzeilen lesen

Sortierte Tabellen Der Eintrag wird binr gesucht, wobei die Laufzeit logarithmisch von der Anzahl der Tabellenzeilen abhngt.

Hash-Tabellen Der Eintrag wird ber den Hash-Algorithmus der internen Tabelle bestimmt, wobei die Laufzeit nicht von der Anzahl der Tabellenzeilen abhngt.

Verwendung eines anderen Suchschlssels


READ TABLE <itab> WITH KEY <k1> = <f1>... <kn> = <fn> <result>.
Der Suchschlssel besteht aus beliebigen Tabellenfeldern <k1>...<kn>. Falls der Name einer Komponente erst zur Laufzeit bekannt ist, kann er dynamisch ber (<ni>) = <fi> als Inhalt eines Felds <ni> angegeben werden. Ist <ni> bei der Ausfhrung der Anweisung leer, wird das Suchfeld ignoriert. Falls die Datentypen von <fi> nicht kompatibel zu den Komponenten sind, findet eine Konvertierung statt. Alle Komponenten des Suchschlssels knnen durch die Angabe von Offset und Lnge weiter auf Teilfelder [Seite 205] eingegrenzt werden. Falls der Zeilentyp der internen Tabelle unstrukturiert ist, kann wie oben ein Vergleich mit der Pseudokomponenten table_line angegeben werden. Ebenso knnen die Attribute von Objekten als Schlssel angegegen werden. Die Suche erfolgt fr alle Tabellenarten linear, wobei die Laufzeit linear von der Anzahl der Tabellenzeilen abhngt.

Angabe des Ausgabeverhaltens


Das Ausgabeverhalten spezifiziert, was mit einer gefundenen Zeile passiert.

Verwendung eines Arbeitsbereichs


Um die gefundene Zeile in einen Arbeitsbereich zu schreiben, gibt man das Ausgabeverhalten <result> wie folgt an:

READ TABLE <itab> <key> INTO <wa> [COMPARING <f1> <f2>... |ALL FIELDS] [TRANSPORTING <f1> <f2>... |ALL FIELDS |NO FIELDS].
Ohne die Zustze COMPARING oder TRANSPORTING mu der Inhalt der Tabellenzeile in den Datentyp des Arbeitsbereichs <wa> konvertierbar sein. Bei der Angabe von COMPARING oder TRANSPORTING mssen Zeilentyp und Arbeitsbereich kompatibel sein. Es empfiehlt sich, immer einen zum Zeilentyp kompatiblen Arbeitsbereich zu verwenden. Mit dem Zusatz COMPARING wird erreicht, da bei strukturierten Zeilentypen die angegebenen Tabellenfelder <fi> vor dem Transport mit den entsprechenden Feldern des Arbeitsbereichs verglichen werden. Durch die Angabe ALL FIELDS werden alle Teilfelder verglichen. Wird ein Eintrag mit dem angegeben Suchschlssel <key> gefunden und ist der Inhalt der verglichenen Felder gleich, gibt SY-SUBRC den Wert 0 zurck. Sind die Inhalte nicht gleich, gibt SY-SUBRC den Wert 2 zurck. Findet das System keinen Eintrag, gibt SY-SUBRC den Wert 4 zurck. Ein gefundener Eintrag wird unabhngig vom Ergebnis des Vergleichs in den Zielbereich gelesen. Mit dem Zusatz TRANSPORTING kann man bei strukturierten Zeilentypen angeben, welche Tabellenfelder <fi> in den Arbeitsbereich transportiert werden sollen. Durch die Angabe ALL

April 2001

303

ABAP Programmierung (BC-ABA) Tabellenzeilen lesen

SAP AG

FIELDS, werden wie ohne die Angabe von TRANSPORTING die Inhalte aller Felder transportiert. Durch die Angabe NO FIELDS, werden keine Felder transportiert. Im letzten Fall dient die READ-Anweisung also nur dazu, die Systemfelder SY-SUBRC und bei Index-Tabellen SY-TABIX zu fllen. Die Angabe des Arbeitsbereichs <wa> mit TRANSPORTING NO FIELDS ist also nicht notwendig und sollte weggelassen werden. In beiden Zustzen knnen die Felder <fi> auch dynamisch ber (<ni>) als Inhalt eines Felds <ni> angegeben werden. Ist <ni> bei der Ausfhrung der Anweisung leer, wird es ignoriert. Alle Felder <fi> knnen durch die Angabe von Offset und Lnge weiter auf Teilfelder [Seite 205] eingegrenzt werden.

Verwendung eines Feldsymbols


Um die gefundene Zeile einem Feldsymbol zuzuweisen, gibt man das Ausgabeverhalten <result> wie folgt an:

READ TABLE <itab> <key> ASSIGNING <FS>.


Nach der READ-Anweisung zeigt das Feldsymbol auf die Tabellenzeile. Wenn der Zeilentyp strukturiert ist, empfiehlt es sich, das Feldsymbol bei der Deklaration [Seite 211] entsprechend zu typisieren, damit auf die Komponenten der Zeilen zugegriffen werden kann. Falls eine statische Typisierung nicht mglich ist, mu fr den Zugriff auf die Komponenten von Strukturen mit weiteren Feldsymbolen und der Mglichkeit Strukturen komponentenweise zuzuweisen [Seite 223] gearbeitet werden. Mehr Informationen zur Zuweisung von Tabellenzeilen an Feldsymbole befinden sich unter Zugriff ber Feldsymbole [Seite 343].

REPORT demo_int_tables_read_comparing. DATA: BEGIN OF line, col1 TYPE i, col2 TYPE i, END OF line. DATA itab LIKE HASHED TABLE OF line WITH UNIQUE KEY col1. DO 4 TIMES. line-col1 = sy-index. line-col2 = sy-index ** 2. INSERT line INTO TABLE itab. ENDDO. line-col1 = 2. line-col2 = 3. READ TABLE itab FROM line INTO line COMPARING col2. WRITE: 'SY-SUBRC =', sy-subrc. SKIP. WRITE: / line-col1, line-col2.
Die Listenausgabe ist:
SY-SUBRC = 2 2 4

304

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Tabellenzeilen lesen

Eine Hash-Tabelle wird mit einer Liste von Quadratzahlen gefllt. Der zum Zeilentyp kompatible Arbeitsbereich LINE wird mit den Zahlen 2 und 3 gefllt. In der READAnweisung wird die Zeile der Tabelle gefunden, in der das Schlsselfeld COL1 den gleichen Inhalt wie der Arbeitsbereich hat und in diesen kopiert. SY-SUBRC ist zwei, da beim Vergleich des Felds COL2 unterschiedliche Zahlen gefunden werden.

REPORT demo_int_tables_read_transport . DATA: BEGIN OF line, col1 TYPE i, col2 TYPE i, END OF line. DATA itab LIKE SORTED TABLE OF line WITH UNIQUE KEY col1. DO 4 TIMES. line-col1 = sy-index. line-col2 = sy-index ** 2. INSERT line INTO TABLE itab. ENDDO. CLEAR line. READ TABLE itab WITH TABLE KEY col1 = 3 INTO line TRANSPORTING col2. WRITE: 'SY-SUBRC =', sy-subrc, / 'SY-TABIX =', sy-tabix.

SKIP. WRITE: / line-col1, line-col2.


Die Listenausgabe ist:
SY-SUBRC = SY-TABIX = 0 0 3 9

Eine sortierte Tabelle wird mit einer Liste von Quadratzahlen gefllt. In der READAnweisung wird die Zeile der Tabelle gelesen, in der das Schlsselfeld COL1 den Wert 3 hat. Es wird nur der Inhalt von COL2 in den Arbeitsbereich LINE kopiert. SYSUBRC ist Null und SY-TABIX ist drei, da ITAB eine Index-Tabelle ist.

REPORT demo_int_tables_read_transp_no . DATA: BEGIN OF line, col1 TYPE i, col2 TYPE i, END OF line. DATA itab LIKE SORTED TABLE OF line WITH UNIQUE KEY col1. DO 4 TIMES. line-col1 = sy-index. line-col2 = sy-index ** 2.

April 2001

305

ABAP Programmierung (BC-ABA) Tabellenzeilen lesen

SAP AG

INSERT line INTO TABLE itab. ENDDO. READ TABLE itab WITH KEY col2 = 16 WRITE: 'SY-SUBRC =', sy-subrc, / 'SY-TABIX =', sy-tabix.
0 4

TRANSPORTING NO FIELDS.

Die Listenausgabe ist:


SY-SUBRC = SY-TABIX =

Eine sortierte Tabelle wird mit einer Liste von Quadratzahlen gefllt. In der READAnweisung wird die Zeile der Tabelle gesucht, in der das Feld COL2 den Wert 16 hat. Es wird nicht der Tabellenschlssel verwendet. Es werden keine Felder in einen Arbeitsbereich kopiert und keine Zeilen einem Feldsymbol zugewiesen. Es werden lediglich Systemfelder gesetzt. SY-SUBRC ist Null, da eine Zeile gefunden wurde und SY-TABIX ist vier.

REPORT demo_int_tables_read_assigning . DATA: BEGIN OF line, col1 TYPE i, col2 TYPE i, END OF line. DATA itab LIKE HASHED TABLE OF line WITH UNIQUE KEY col1. FIELD-SYMBOLS <fs> LIKE LINE OF itab. DO 4 TIMES. line-col1 = sy-index. line-col2 = sy-index ** 2. INSERT line INTO TABLE itab. ENDDO. READ TABLE itab WITH TABLE KEY col1 = 2 ASSIGNING <fs>. <fs>-col2 = 100. LOOP AT itab INTO line. WRITE: / line-col1, line-col2. ENDLOOP.
Die Listenausgabe ist:
1 2 3 4 1 100 9 16

Eine Hash-Tabelle wird mit einer Liste von Quadratzahlen gefllt. In der READAnweisung wird die Zeile der Tabelle gelesen, in der das Schlsselfeld COL1 den Wert 2 hat und dem Feldsymbol <FS> zugewiesen. Der Komponente COL2 von <FS> wird der Wert 100 zugewiesen. Dadurch ndert sich auch das entsprechende Tabellenfeld.

306

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Tabellenzeilen lesen

April 2001

307

ABAP Programmierung (BC-ABA) Tabellenzeilen ndern

SAP AG

Tabellenzeilen ndern
Um einzelne Zeilen einer beliebigen internen Tabelle zu ndern, verwendet man die Anweisung MODIFY. Dabei kann man entweder eine einzige Zeile ber den Tabellenschlssel suchen und ndern oder mehrere Zeilen ber eine Bedingung suchen und ndern. Wird bei nicht eindeutigen Schlsseln ein doppelter Eintrag gefunden, wird der erste Eintrag gendert.

Eine Zeile ber den Tabellenschlssel ndern


Um eine einzige Zeile zu ndern, verwendet man folgende Anweisung:

MODIFY TABLE <itab> FROM <wa> [TRANSPORTING <f1> <f2> ...].


Der Arbeitsbereich <wa>, der zum Zeilentyp der internen Tabelle kompatibel sein mu, spielt in dieser Anweisung eine Doppelrolle. Zum einen dient er dem Auffinden der zu ndernden Zeile, zum anderen enthlt er die neuen Inhalte. Die interne Tabelle wird nach der Zeile durchsucht, in welcher der Inhalt des Tabellenschlssels mit den entsprechenden Feldern in <wa> bereinstimmt. Die Suche erfolgt fr die einzelnen Tabellenarten wie folgt:

Standard-Tabellen Der Eintrag wird linear gesucht, wobei die Laufzeit linear von der Anzahl der Tabellenzeilen abhngt. Der erste gefundene Eintrag wird gendert.

Sortierte Tabellen Der Eintrag wird binr gesucht, wobei die Laufzeit logarithmisch von der Anzahl der Tabellenzeilen abhngt. Der erste gefundene Eintrag wird gendert.

Hash-Tabellen Der Eintrag wird ber den Hash-Algorithmus der internen Tabelle bestimmt, wobei die Laufzeit nicht von der Anzahl der Tabellenzeilen abhngt.

Wenn eine Zeile gefunden wird, werden die Inhalte der Nicht-Schlsselfelder des Arbeitsbereichs an die entsprechenden Felder der gefundenen Zeile zugewiesen und SY-SUBRC auf 0 gesetzt. Ansonsten ist SY-SUBRC gleich 4. Wird bei nicht eindeutigen Schlsseln ein doppelter Eintrag gefunden, wird der erste Eintrag gendert. Mit dem Zusatz TRANSPORTING knnen die zuzuweisenden Nicht-Schlsselfelder explizit in einer Liste angegeben werden. Die Felder <fi> knnen dabei auch dynamisch ber (<ni>) als Inhalt eines Felds <ni> angegeben werden. Ist <ni> bei der Ausfhrung der Anweisung leer, wird es ignoriert. Alle Felder <fi> knnen durch die Angabe von Offset und Lnge weiter auf Teilfelder [Seite 205] eingegrenzt werden. Bei Tabellen mit komplexer Zeilenstruktur fhrt die Verwendung des TRANSPORTING-Zusatzes zu Performancegewinnen, wenn das System dadurch keine unntigen Transporte tabellenfrmiger Komponenten durchfhren mu.

Mehrere Zeilen ber eine Bedingung ndern


Um eine oder mehrere Zeilen ber eine Bedingung zu ndern, verwendet man folgende Anweisung:

MODIFY <itab> FROM <wa> TRANSPORTING <f1> <f2> ... WHERE <cond>.

308

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Tabellenzeilen ndern

Es werden alle Zeilen gendert, die den logischen Ausdruck [Seite 238] <cond> erfllen. Der logische Ausdruck <cond> kann aus verschiedenen Vergleichen zusammengesetzt sein. In jedem einzelnen Vergleich mu der erste Operand eine Komponente der Zeilenstruktur sein. Falls die Tabellenzeilen nicht strukturiert sind, kann der erste Operand der Vergleiche auch die Pseudokomponente TABLE_LINE sein. Ein Vergleich bezieht sich dann auf die gesamte Zeile. Falls der Zeilentyp der internen Tabelle Objektreferenzvariablen als Komponenten <comp> enthlt oder der gesamte Zeilentyp eine Referenzvariable ist, knnen die Attribute <attr> des Objekts, auf welches die jeweilige Referenz einer Zeile zeigt, ber <comp->attr> bzw. <table_line->attr> als Vergleichswerte angegeben werden. Der Arbeitsbereich <wa>, der zum Zeilentyp der internen Tabelle kompatibel sein mu, enthlt die neuen Inhalte, die mit dem TRANSPORTING-Zusatz an die zu ndernden Zeilen zugewiesen werden mssen. Im Gegensatz zur obigen MODIFY-Anweisung ist der TRANSPORTING-Zusatz hier nicht optional. Weiterhin drfen nur bei Standard-Tabellen die Schlsselfelder der Tabelle modifiziert werden. Falls mindestens eine Tabellenzeile gendert wurde, wird SY-SUBRC auf 0, ansonsten auf 4 gesetzt.

Beispiele
REPORT demo_int_tables_modify . DATA: BEGIN OF line, col1 TYPE i, col2 TYPE i, END OF line. DATA itab LIKE HASHED TABLE OF line WITH UNIQUE KEY col1. DO 4 TIMES. line-col1 = sy-index. line-col2 = sy-index ** 2. INSERT line INTO TABLE itab. ENDDO. line-col1 = 2. line-col2 = 100. MODIFY TABLE itab FROM line. LOOP AT itab INTO line. WRITE: / line-col1, line-col2. ENDLOOP.
Die Listenausgabe ist:
1 2 3 4 1 100 9 16

Eine Hash-Tabelle wird mit einer Liste von Quadratzahlen gefllt. In der MODIFYAnweisung wird die Zeile der Tabelle gendert, in der das Schlsselfeld COL1 den Wert 2 hat.

April 2001

309

ABAP Programmierung (BC-ABA) Tabellenzeilen ndern

SAP AG

REPORT demo_int_tables_modify_transp. DATA: BEGIN OF line, col1 TYPE i, col2 TYPE i, END OF line. DATA itab LIKE HASHED TABLE OF line WITH UNIQUE KEY col1. DO 4 TIMES. line-col1 = sy-index. line-col2 = sy-index ** 2. INSERT line INTO TABLE itab. ENDDO. line-col2 = 100. MODIFY itab FROM line TRANSPORTING col2 WHERE ( col2 > 1 ) AND ( col1 < 4 ). LOOP AT itab INTO line. WRITE: / line-col1, line-col2. ENDLOOP.
Die Listenausgabe ist:
1 2 3 4 1 100 100 16

Eine Hash-Tabelle wird mit einer Liste von Quadratzahlen gefllt. In der MODIFYAnweisung werden die Zeilen der Tabelle gendert, in der die Inhalte von Feld COL2 grer als 1 und von Feld COL1 kleiner als 4 sind.

310

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Tabellenzeilen lschen

Tabellenzeilen lschen
Um einzelne Zeilen einer beliebigen internen Tabelle zu lschen, verwendet man die Anweisung DELETE. Dabei kann man entweder eine einzige Zeile ber den Tabellenschlssel suchen und lschen, mehrere Zeilen ber eine Bedingung suchen und lschen oder benachbarte doppelte Eintrge suchen und lschen. Wird bei nicht eindeutigen Schlsseln ein doppelter Eintrag gefunden, wird der erste Eintrag gelscht.

Eine Zeile ber den Tabellenschlssel lschen


Um den Tabellenschlssel der Tabelle <itab> als Suchschlssel zu verwenden, verwendet man eine der folgenden Anweisungen: DELETE TABLE <itab> FROM <wa>. oder: DELETE TABLE <itab> WITH TABLE KEY <k1> = <f1>... <kn> = <fn>. Im ersten Fall mu <wa> ein zum Zeilentyp von <itab> kompatibler Arbeitsbereich sein. Die Werte der Schlsselfelder werden aus den entsprechenden Komponenten des Arbeitsbereichs entnommen. Um Tabellen mit elementaren Zeilentyp und dem Schlssel TABLE_LINE ber den Tabellenschlssel zu lschen, kann entweder die erste Variante verwendet werden, oder die Pseudokomponente TABLE_LINE als Operand in der zweiten Variante verwendet werden. Im zweiten Fall werden die Werte fr jedes Schlsselfeld explizit angegeben. Falls der Name eines Schlsselfelds erst zur Laufzeit bekannt ist, kann er dynamisch ber (<ni>) = <fi> als Inhalt eines Felds <ni> angegeben werden. Falls die Datentypen von <fi> nicht kompatibel zu den Schlsselfeldern sind, findet eine Konvertierung statt. Die Suche erfolgt fr die einzelnen Tabellenarten wie folgt:

Standard-Tabellen Der zu lschende Eintrag wird linear gesucht, wobei die Laufzeit linear von der Anzahl der Tabellenzeilen abhngt.

Sortierte Tabellen Der zu lschende Eintrag wird binr gesucht, wobei die Laufzeit logarithmisch von der Anzahl der Tabellenzeilen abhngt.

Hash-Tabellen Der zu lschende Eintrag wird ber den Hash-Algorithmus der internen Tabelle bestimmt, wobei die Laufzeit nicht von der Anzahl der Tabellenzeilen abhngt.

Wenn eine Zeile gefunden wird, wird sie aus der Tabelle gelscht und SY-SUBRC auf 0 gesetzt. Ansonsten ist SY-SUBRC gleich 4. Wird bei nicht eindeutigen Schlsseln ein doppelter Eintrag gefunden, wird der erste Eintrag gelscht.

Mehrere Zeilen ber eine Bedingung lschen


Um eine oder mehrere Zeilen ber eine Bedingung zu lschen, verwendet man folgende Anweisung: DELETE <itab> WHERE <cond>.

April 2001

311

ABAP Programmierung (BC-ABA) Tabellenzeilen lschen

SAP AG

Es werden alle Zeilen gelscht, die den logischen Ausdruck [Seite 238] <cond> erfllen. Der logische Ausdruck <cond> kann aus verschiedenen Vergleichen zusammengesetzt sein. In jedem einzelnen Vergleich mu der erste Operand eine Komponente der Zeilenstruktur sein. Falls die Tabellenzeilen nicht strukturiert sind, kann der erste Operand der Vergleiche auch die Pseudokomponente TABLE_LINE sein. Ein Vergleich bezieht sich dann auf die gesamte Zeile. Falls mindestens eine Tabellenzeile gelscht wurde, wird SY-SUBRC auf 0, ansonsten auf 4 gesetzt. Falls der Zeilentyp der internen Tabelle Objektreferenzvariablen als Komponenten <comp> enthlt oder der gesamte Zeilentyp eine Referenzvariable ist, knnen die Attribute <attr> des Objekts, auf welches die jeweilige Referenz einer Zeile zeigt, ber <comp->attr> bzw. <table_line->attr> als Vergleichswerte angegeben werden.

Benachbarte doppelte Eintrge lschen


Um benachbarte doppelte Eintrge zu lschen, verwendet man folgende Anweisung: DELETE ADJACENT DUPLICATE ENTRIES FROM <itab> [COMPARING <f1> <f2>... |ALL FIELDS]. Das System lscht alle benachbarten doppelten Eintrge aus der internen Tabelle <itab>. Eintrge sind doppelt, wenn Sie eines der folgenden Vergleichskriterien erfllen:

Ohne den Zusatz COMPARING mssen die Inhalte der Schlsselfelder des Tabellenschlssels in benachbarten Zeilen identisch sein. Mit dem Zusatz COMPARING <f1> <f2>... mssen die Inhalte der angegebenen Felder <f1> <f2>... in benachbarten Zeilen gleich sein. Die Felder <fi> knnen auch dynamisch ber (<ni>) als Inhalt eines Felds <ni> angegeben werden. Ist <ni> bei der Ausfhrung der Anweisung leer, wird es ignoriert. Alle Felder <fi> knnen durch die Angabe von Offset und Lnge weiter auf Teilfelder [Seite 205] eingegrenzt werden. Mit dem Zusatz COMPARING ALL FIELDS mssen die Inhalte aller Felder in benachbarten Zeilen gleich sein.

Mit dieser Anweisung knnen alle doppelten Eintrge aus einer internen Tabelle gelscht werden, wenn die Tabelle nach dem angegebenen Vergleichskriterium sortiert ist. Wird mindestens ein doppelter Eintrag gelscht, wird SY-SUBRC auf 0, ansonsten auf 4 gesetzt.

REPORT demo_int_tables_delete_from . DATA: BEGIN OF line, col1 TYPE i, col2 TYPE i, END OF line. DATA itab LIKE HASHED TABLE OF line WITH UNIQUE KEY col1. DO 4 TIMES. line-col1 = sy-index. line-col2 = sy-index ** 2. INSERT line INTO TABLE itab. ENDDO. line-col1 = 1.

312

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Tabellenzeilen lschen

DELETE TABLE itab: FROM line, WITH TABLE KEY col1 = 3. LOOP AT itab INTO line. WRITE: / line-col1, line-col2. ENDLOOP.
Die Listenausgabe ist:
2 4 4 16

Eine Hash-Tabelle wird mit einer Liste von Quadratzahlen gefllt. In den DELETEAnweisungen werden die Zeilen der Tabelle gelscht, in der das Schlsselfeld COL1 den Inhalt 1 oder 3 hat.

REPORT demo_int_tables_delete_where. DATA: BEGIN OF line, col1 TYPE i, col2 TYPE i, END OF line. DATA itab LIKE HASHED TABLE OF line WITH UNIQUE KEY col1. DO 4 TIMES. line-col1 = sy-index. line-col2 = sy-index ** 2. INSERT line INTO TABLE itab. ENDDO. DELETE itab WHERE ( col2 > 1 ) AND ( col1 < 4 ). LOOP AT itab INTO line. WRITE: / line-col1, line-col2. ENDLOOP.
Die Listenausgabe ist:
1 4 1 16

Eine Hash-Tabelle wird mit einer Liste von Quadratzahlen gefllt. In der DELETEAnweisung werden die Zeilen der Tabelle gelscht, in der die Inhalte von Feld COL2 grer als 1 und von Feld COL1 kleiner als 4 sind.

REPORT demo_int_tables_delete_adjacen. DATA off TYPE i. DATA: BEGIN OF line, col1 TYPE i, col2(1) TYPE c, END OF line. DATA itab LIKE STANDARD TABLE OF line WITH NON-UNIQUE KEY col2.

April 2001

313

ABAP Programmierung (BC-ABA) Tabellenzeilen lschen

SAP AG

line-col1 line-col1 line-col1 line-col1 line-col1 line-col1 line-col1

= = = = = = =

1. 1. 1. 2. 3. 4. 5.

line-col2 line-col2 line-col2 line-col2 line-col2 line-col2 line-col2

= = = = = = =

'A'. 'A'. 'B'. 'B'. 'B'. 'B'. 'A'.

APPEND APPEND APPEND APPEND APPEND APPEND APPEND

line line line line line line line

TO TO TO TO TO TO TO

itab. itab. itab. itab. itab. itab. itab.

off = 0. PERFORM list. DELETE ADJACENT DUPLICATES FROM itab COMPARING ALL FIELDS. off = 14. PERFORM list. DELETE ADJACENT DUPLICATES FROM itab COMPARING col1. off = 28. PERFORM list. DELETE ADJACENT DUPLICATES FROM itab. off = 42. PERFORM list. FORM list. SKIP TO LINE 3. LOOP AT itab INTO line. WRITE: AT /off line-col1, line-col2. ENDLOOP. ENDFORM.
Die Listenausgabe ist:
1 A 1 A 1 B 2 B 3 B 4 B 5 A 1 A 1 B 2 B 3 B 4 B 5 A 1 A 2 B 3 B 4 B 5 A 1 A 2 B 5 A

Es wird eine Standard-Tabelle angelegt und gefllt. Die erste DELETE-Anweisung lscht die zweite Zeile, da sie den gleichen Inhalt wie die erste Zeile hat. Die zweite DELETE-Anweisung lscht die zweite Zeile aus der restlichen Tabelle, da der Inhalt des Feldes COL1 mit dem der ersten Zeile gleich ist. Die dritte DELETE-Anweisung lscht die dritte und vierte Zeile aus der restlichen Tabelle, da der Inhalt des Schlsselfeldes COL2 gleich mit dem der zweiten Zeile ist. Obwohl der Inhalt des Schlsselfelds fr die erste und fnfte Zeile gleich ist, wird die fnfte Zeile nicht gelscht, weil sie nicht zur ersten Zeile benachbart ist.

314

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Tabellenzeilen in Schleifen bearbeiten

Tabellenzeilen in Schleifen bearbeiten


Mit der Anweisung LOOP knnen spezielle Schleifen [Seite 259] ber beliebige interne Tabellen ausgefhrt werden:

LOOP AT <itab> <result> <bedingung>. <anweisungsblock> ENDLOOP.


Die einzelnen Zeilen der Tabelle werden nacheinander gem der im Ausgabeverhalten <result> gemachten Angaben gelesen und knnen im Anweisungsblock der Kontrollstruktur LOOPENDLOOP verarbeitet werden. Die Schleifen knnen alle Zeilen der internen Tabelle umfassen oder es knnen Bedingungen zur Zeilenauswahl <bedingung> angegeben werden. Innerhalb einer Schleife ist eine Gruppenstufenverarbeitung mglich. Die Reihenfolge, in der die Zeilen bearbeitet werden, hngt wie folgt von der Tabellenart ab:

Standard-Tabellen und sortierte Tabellen Die Eintrge werden gem des linearen Index bearbeitet. Innerhalb des Verarbeitungsblocks enthlt SY-TABIX den Index der aktuellen Zeile.

Hash-Tabellen Die Eintrge werden solange keine Sortierung stattfand in der Reihenfolge bearbeitet, in der sie in die Tabelle eingefgt wurden. Innerhalb des Verarbeitungsblocks enthlt SYTABIX den Wert 0.

Mehrere LOOP-Schleifen sind schachtelbar. Das Systemfeld SY-TABIX hat nach Verlassen der Schleife den gleichen Wert wie vor Beginn der Schleife. Nach der Anweisung ENDLOOP enthlt das Systemfeld SY-SUBRC den Wert 0, wenn mindestens eine Zeile bearbeitet wurde, ansonsten den Wert 4. Innerhalb einer Schleife drfen keine ndernden Operationen mit der gesamten internen Tabelle [Seite 279] durchgefhrt werden. Dabei ist zu beachten, da auch das Sichern einer globalen internen Tabelle mit der LOCAL-Anweisung [Seite 471] in einer Prozedur eine ndernde Operation auf der gesamten internen Tabelle ist, da dabei der Inhalt der Tabelle ausgetauscht wird. Beim Aufruf von Prozeduren innerhalb von Schleifen sollte kontrolliert werden, ob nicht eine der Prozeduren die gesamte interne Tabelle ndert. Nach einer gesamten nderung kann die Schleife nicht mehr richtig durchlaufen werden. Werden innerhalb eines Schleifendurchgangs einzelne Zeilen eingefgt oder gelscht, so wird dies wie folgt in den weiteren Schleifendurchlufen bercksichtigt:

Das Einfgen von Zeilen hinter der aktuellen Zeile, bewirkt, da die neuen Zeilen in den nachfolgenden Schleifendurchgngen durchlaufen werden. Das Lschen von Zeilen hinter der aktuellen Zeile, bewirkt, da die gelschten Zeilen in den nachfolgenden Schleifendurchgngen nicht mehr durchlaufen werden. Das Einfgen von Zeilen vor oder auf der aktuellen Zeile, bewirkt, da die internen Schleifenzhler entsprechend hoch gesetzt werden. Das Lschen von Zeilen vor oder auf der aktuellen Zeile, bewirkt, da die internen Schleifenzhler entsprechend herab gesetzt werden.

April 2001

315

ABAP Programmierung (BC-ABA) Tabellenzeilen in Schleifen bearbeiten

SAP AG

Angabe des Ausgabeverhaltens


Das Ausgabeverhalten spezifiziert, wie eine Tabellenzeile im Anweisungsblock der Schleife zur Verfgung steht.

Verwendung eines Arbeitsbereichs


Um in der Schleife den Inhalt der aktuellen Zeile in einen Arbeitsbereich zu lesen, gibt man das Ausgabeverhalten <result> wie folgt an:

LOOP AT <itab> INTO <wa> <bedingung>.


Der Inhalt der Tabellenzeilen mu in den Datentyp des Arbeitsbereichs <wa> konvertierbar sein. Bei jedem Schleifendurchlauf wird eine Zeile der Tabelle in den Arbeitsbereich kopiert. Das Ende der Schleife beeinflut den Arbeitsbereich nicht, d.h. der Inhalt von <wa> nach ENDLOOP ist wie im letzten Schleifendurchgang. Wird die Schleife nicht durchlaufen, da die Tabelle leer ist oder keine Zeile die Bedingung <cond> erfllt, wird der Arbeitsbereich nicht gendert.

Verwendung eines Feldsymbols


Um in der Schleife den Inhalt der aktuellen Zeile ber ein Feldsymbol ansprechen zu knnen, gibt man das Ausgabeverhalten <result> wie folgt an:

LOOP AT <itab> ASSIGNING <FS> <bedingung>.


In jedem Schleifendurchgang zeigt das Feldsymbol <FS> auf die gelesene Tabellenzeile. Wenn der Zeilentyp strukturiert ist, empfiehlt es sich, das Feldsymbol bei der Deklaration [Seite 211] entsprechend zu typisieren, damit auf die Komponenten der Zeilen zugegriffen werden kann. Falls eine statische Typisierung nicht mglich ist, mu fr den Zugriff auf die Komponenten von Strukturen mit weiteren Feldsymbolen und der Mglichkeit Strukturen komponentenweise zuzuweisen [Seite 223] gearbeitet werden. Das Ende der Schleife beeinflut das Feldsymbol nicht, d.h. ihm bleibt nach ENDLOOP die letzte gelesene Zeile zugewiesen. Wird die Schleife nicht durchlaufen, da die Tabelle leer ist oder keine Zeile die Bedingung <cond> erfllt, wird dem Feldsymbol keine Zeile zugewiesen. Mehr Informationen zur Zuweisung von Tabellenzeilen an Feldsymbole finden sich unter Zugriff ber Feldsymbole [Seite 343].

Zeilenzuweisung unterdrcken
Wenn der Inhalt der Tabellenzeilen innerhalb des Anweisungsblocks nicht bentigt wird, kann die Zuweisung an einen Arbeitsbereich oder an ein Feldsymbol wie folgt unterdrckt werden:

LOOP AT <itab> TRANSPORTING NO FIELDS <bedingung>.


Diese Anweisung ist sinnvoll, um zum Beispiel bei Index-Tabellen die internen Indexe bestimmter Zeilen im Systemfeld SY-TABIX zu finden oder bei beliebigen Tabellen die Anzahl von Zeilen festzustellen, die einer bestimmten Bedingung gengen.

Bedingungen angeben
Um nicht alle Zeilen einer internen Tabelle zu lesen, kann wie folgt eine Bedingung zur Zeilenauswahl angegeben werden:

LOOP AT <itab> <result> WHERE <cond>.


Es werden alle Zeilen bearbeitet, die den logischen Ausdruck [Seite 238] <cond> erfllen. Der logische Ausdruck <cond> kann aus verschiedenen Vergleichen zusammengesetzt sein. In

316

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Tabellenzeilen in Schleifen bearbeiten

jedem einzelnen Vergleich mu der erste Operand eine Komponente der Zeilenstruktur sein. Falls die Tabellenzeilen nicht strukturiert sind, kann der erste Operand der Vergleiche auch die Pseudokomponente TABLE-LINE sein. Ein Vergleich bezieht sich dann auf die gesamte Zeile. Falls der Zeilentyp der internen Tabelle Objektreferenzvariablen als Komponenten <comp> enthlt oder der gesamte Zeilentyp eine Referenzvariable ist, knnen die Attribute <attr> des Objekts, auf welches die jeweilige Referenz einer Zeile zeigt, ber <comp->attr> bzw. <table_line->attr> als erstes Feld eines Vergleichs verwendet werden.

Gruppenstufenverarbeitung
Innerhalb einer LOOP-Schleife ber ein interne Tabelle ist eine Gruppenstufenverarbeitung mglich. Gruppenstufen in einer internen Tabelle bedeuten, da hintereinanderfolgende Zeilen anhand des Inhalts bestimmter Felder in Gruppen eingeteilt werden knnen. Die Gruppeneinteilung interner Tabellen richtet sich statisch nach der Reihenfolge der Felder in der Zeilenstruktur. Das erste Feld legt die hierarchisch hchste Gruppenstufe fest und so weiter. Die Gruppenstufenhierarchie mu schon beim Anlegen der internen Tabelle bekannt sein. Die Gruppierung von Zeilen zu Gruppenstufen ergibt sich dadurch, da die interne Tabelle genau nach der Reihenfolge sortiert wird, die ihrem Aufbau entspricht, d.h. zuerst nach dem ersten Feld, dann nach dem zweiten Feld und so weiter. Tabellen, deren Tabellenschlssel mit den ersten Feldern bereinstimmt sind also besonders gut fr die Gruppenstufenverarbeitung geeignet. Die folgende Abbildung verdeutlicht Gruppenstufen in einer sortierten Tabelle, wobei unterschiedliche Inhalte in den ersten drei Feldern durch verschiedene Farben angedeutet werden.

April 2001

317

ABAP Programmierung (BC-ABA) Tabellenzeilen in Schleifen bearbeiten

SAP AG

Gruppenstufen
Jeder Farbwechsel in einer Spalte bedeutet einen Gruppenstufenwechsel der entsprechenden Hierarchiestufe. Innerhalb der Anweisungsblcke von LOOP-Schleifen kann mit der Gruppenstufen-Anweisung AT auf einen Gruppenstufenwechsel reagiert werden, um Anweisungen nur fr die entsprechende Zeilen auszufhren. Damit knnen beispielsweise Summen von bestimmten Untermengen aller Zeilen mit der Anweisung SUM berechnet werden. Die Gruppenstufen-Anweisung AT definiert innerhalb einer LOOP-Schleife einen Anweisungsblock, der durch ENDAT beendet wird:

AT <level>. <anweisungsblock> ENDAT.


Es kann auf folgende Gruppenstufenwechsel reagiert werden:
<level> Bedeutung

FIRST LAST NEW <f>

erste Zeile der internen Tabelle letzte Zeile der internen Tabelle Anfang einer Gruppe von Zeilen mit dem gleichen Inhalt im Feld <f> und in den Feldern links von <f>

318

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Tabellenzeilen in Schleifen bearbeiten

END Of <f> Ende einer Gruppe von Zeilen mit dem gleichen Inhalt im Feld <f> und in den Feldern links von <f>
Die Gruppenstufenanweisungen erlauben es auf Gruppenwechsel in internen Tabellen reagieren, anstatt sie selbst mit logischen Ausdrcken zu programmieren. In der LOOP-Schleife mssen die AT-ENDAT-Anweisungsblcke genau der Gruppenstufenhierarchie entsprechend hintereinander angeordnet sein. Falls die interne Tabelle <itab> Felder der Namen <f1>, <f2>,.... hat und nach diesen Spalten sortiert ist, mssen die Gruppenstufenanweisungen in der Schleife wie folgt aufgebaut sein:

LOOP AT <itab>. AT FIRST.... ENDAT. AT NEW <f1>....... ENDAT. AT NEW <f2>....... ENDAT. ....... <Einzelsatzverarbeitung> ....... AT END OF <f2>.... ENDAT. AT END OF <f1>.... ENDAT. AT LAST..... ENDAT. ENDLOOP.
Die innerste Hierarchiestufe <Einzelsatzverarbeitung> dient der Verarbeitung von Tabellenzeilen, die keinem Gruppenstufenwechsel entsprechen. Es mssen nicht alle Gruppenstufenanweisungen verwendet werden. Alle verwendeten mssen jedoch in der oben angegebenen Reihenfolge programmiert werden. Gruppenstufenanweisungen sollten nicht in Schleifen, die ber WHERE (oder FROM, TO bei Index-Tabellen) in der LOOP-Anweisung eingeschrnkt sind, verwendet werden, und die Tabelle sollte in der Schleife nicht modifiziert werden. Wenn ein Gruppenstufenfeld <fi> erst zur Laufzeit bekannt ist, kann es dynamisch als (<ni>) angegeben werden, wobei <ni> den Namen von <fi> enthlt. Ist <ni> zur Laufzeit leer, wird das Gruppenwechselkriterium ignoriert. Die Gruppenstufenfelder <fi> knnen durch die Angabe von Offset und Lnge weiter auf Teilfelder [Seite 205] eingegrenzt werden. Wenn mit einem Arbeitsbereich <wa> gearbeitet wird, enthlt dieser im AT-ENDATAnweisungsblock nicht die aktuelle Tabellenzeile. Alle zeichenartigen Felder rechts vom aktuellen Gruppenschlssel sind mit Sternen (*) gefllt. Alle anderen Felder rechts vom aktuellen Gruppenschlssel enthalten ihren Initialwert. Innerhalb eines AT-ENDAT-Blocks knnen die Inhalte der numerischen Felder der entsprechenden Gruppenstufe mit folgender Anweisung berechnet werden:

SUM.
Diese Anweisung darf nur innerhalb einer LOOP-Schleife angegeben werden. Innerhalb eines AT-ENDAT-Blocks, werden die Summen der numerischen Felder aller Zeilen in der aktuellen Zeilengruppe berechnet und in die entsprechenden Felder des Arbeitsbereichs geschrieben. Auerhalb eines AT-ENDAT-Blocks (Einzelsatzverarbeitung) werden die Summen der numerischen Felder aller Zeilen der internen Tabelle in jedem Schleifendurchlauf berechnet und in die entsprechenden Felder des Arbeitsbereichs geschrieben. Die SUM-Anweisung ist also nur in AT-ENDAT-Blcken sinnvoll. Enthlt die interne Tabelle eine geschachtelte Tabelle, kann die SUM-Anweisung nicht verwendet werden. Weiterhin kann die SUM-Anweisung nicht verwendet werden, wenn ein Feldsymbol statt eines Arbeitsbereichs in der LOOP-Anweisung verwendet wird.

April 2001

319

ABAP Programmierung (BC-ABA) Tabellenzeilen in Schleifen bearbeiten

SAP AG

REPORT demo_int_tables_at_1. DATA: BEGIN OF line, col1(1) TYPE c, col2 TYPE i, col3 TYPE i, END OF line. DATA itab LIKE HASHED TABLE OF line WITH UNIQUE KEY col1 col2. line-col1 = 'A'. DO 3 TIMES. line-col2 = sy-index. line-col3 = sy-index ** 2. INSERT line INTO TABLE itab. ENDDO. line-col1 = 'B'. DO 3 TIMES. line-col2 = 2 * sy-index. line-col3 = ( 2 * sy-index ) ** 2. INSERT line INTO TABLE itab. ENDDO. SORT itab. LOOP AT itab INTO line. WRITE: / line-col1, line-col2, line-col3. AT END OF col1. SUM. ULINE. WRITE: / line-col1, line-col2, line-col3. SKIP. ENDAT. AT LAST. SUM. ULINE. WRITE: / line-col1, line-col2, line-col3. ENDAT. ENDLOOP.
Die Listenausgabe ist:
A A 1 2 1 4

A 3 9 ________________________________ A B B 6 2 4 14 4 16

320

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Tabellenzeilen in Schleifen bearbeiten

B 6 36 ________________________________ B 12 56

________________________________ * 18 70

Es wird eine Hash-Tabelle ITAB angelegt, mit sechs Zeilen gefllt und sortiert. In der LOOP-ENDLOOP-Schleife wird der Arbeitsbereich LINE verwendet und fr jeden Schleifendurchlauf ausgegeben. Das erste Feld des Tabellenschlssels COL1 wird zur Gruppenstufenverarbeitung verwendet. Die Summe aller numerischer Felder wird immer berechnet, wenn sich der Inhalt von COL1 ndert und einmal fr die letzte Tabellenzeile.

REPORT demo_int_tables_at_2. DATA: BEGIN OF line, carrid TYPE connid TYPE fldate TYPE custtype TYPE class TYPE bookid TYPE END OF line. sbook-carrid, sbook-connid, sbook-fldate, sbook-custtype, sbook-class, sbook-bookid,

DATA itab LIKE SORTED TABLE OF line WITH UNIQUE KEY table_line. SELECT carrid connid fldate custtype class bookid FROM sbook INTO CORRESPONDING FIELDS OF TABLE itab. LOOP AT itab INTO line. AT FIRST. WRITE / 'List of Bookings'. ULINE. ENDAT. AT NEW carrid. WRITE: / 'Carrid:', line-carrid. ENDAT. AT NEW connid. WRITE: / 'Connid:', line-connid. ENDAT. AT NEW fldate. WRITE: / 'Fldate:', line-fldate. ENDAT. AT NEW custtype. WRITE: / 'Custtype:', line-custtype. ENDAT. WRITE: / line-bookid, line-class.

April 2001

321

ABAP Programmierung (BC-ABA) Tabellenzeilen in Schleifen bearbeiten

SAP AG

AT END OF class. ULINE. ENDAT. ENDLOOP.


In diesem etwas ausfhrlicherem Beispiel wird die sortierte interne Tabelle ITAB ber die Open SQL-Anweisung SELECT mit Daten aus der Datenbanktabelle SBOOK gefllt. Die Reihenfolge der Spalten in der internen Tabelle definiert die Gruppenstufenhierarchie. Da der Tabellenschlssel die gesamte Zeile ist, stimmt die Sortierreihenfolge mit der Gruppenstufenhierarchie berein. Die Anordnung der Gruppenstufenanweisungen in der LOOP-ENDLOOP-Schleife ist wichtig. Die Listenausgabe ist in etwa:
List of Bookings Carrid: AA Connid: 0017 Fldate: 1998/11/22 Custtype: B 00063509 C 00063517 C ... ______________________________________________ 00063532 F 00063535 F ... ______________________________________________ Custtype: P 00063653 C 00063654 C ... ______________________________________________ 00063668 F 00063670 F ... ______________________________________________ Fldate: 1998/29/11 Custtype: B 00064120 C 00064121 C ...

und so weiter.

322

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Operationen fr Index-Tabellen

Operationen fr Index-Tabellen
Die im folgenden aufgefhrten Operationen knnen nur mit den Zeilen von Index-Tabellen (sortierte und Standard-Tabellen) und manche sogar nur mit den Zeilen von Standard-Tabellen durchgefhrt werden. Da Indexzugriffe auf Tabellen aber immer schneller als Schlsselzugriffe sind, sollten die spezifischen Indexoperationen immer verwendet werden, wenn es statisch feststeht, da die interne Tabelle eine Index-Tabelle ist. Insbesondere beim zeilenweisen Fllen ist das Anhngen von Tabellenzeilen an eine StandardTabelle die schnellstmgliche Methode, da bei Standardtabellen kein eindeutiger Schlssel definiert werden kann und das Anhngen deshalb ohne Untersuchung der bereits vorhandenen Zeilen erfolgt. Wenn also doppelte Eintrge in Kauf genommen oder anders ausgeschlossen werden knnen, kann es sinnvoll sein erst eine Standard-Tabelle zu fllen und diese dann zu sortieren oder einer sortierten Tabelle zuzuweisen, wenn der Datenbestand erst nach dem Fllen sortiert gehalten werden mu. Weiterhin wurde zu Release 4.5A die Performance bei Operationen verbessert, bei denen der interne lineare Index verndert wird. Vorher wuchsen Indexmanipulationskosten beim Einfgen und Lschen von Zeilen in Standard-Tabellen und sortierten Tabellen linear mit der Zeilenzahl. Seit Release 4.5A wachsen die Indexmanipulationskosten nur noch logarithmisch mit der Zeilenzahl, da Tabellenindizes jetzt als Baum verwaltet werden. Damit knnen auch in sehr groen Standard-Tabellen und sortierten Tabellen Zeilen effizient eingefgt und gelscht werden. Tabellenzeilen anhngen [Seite 324] Tabellenzeilen einfgen [Seite 328] Tabellenzeilen ber den Index einfgen [Seite 328] Tabellenzeilen ber den Index lesen [Seite 331] Binre Suche bei Standard-Tabellen [Seite 332] Tabellenzeilen nach Zeichenketten durchsuchen [Seite 333] Tabellenzeilen ber den Index ndern [Seite 335] Tabellenzeilen ber den Index lschen [Seite 338] Indexangaben bei Schleifen [Seite 341]

April 2001

323

ABAP Programmierung (BC-ABA) Tabellenzeilen anhngen

SAP AG

Tabellenzeilen anhngen
Es gibt mehrere Mglichkeiten, Zeilen an Index-Tabellen anzuhngen. Die folgenden Anweisungen haben keine Entsprechung fr beliebige interne Tabellen.

Einzelne Zeilen anhngen


Um eine Tabellenzeile an eine Index-Tabelle anzuhngen verwendet man die Anweisung

APPEND <line> TO <itab>.


Dabei ist <line> entweder ein in den Zeilentyp konvertierbarer Arbeitsbereich <wa> oder der Ausdruck INITIAL LINE. Mit <wa> wird eine neue Zeile an die interne Tabelle <itab> angehngt und mit dem Inhalt des Arbeitsbereichs gefllt. Mit INITIAL LINE wird eine typgerecht initialisierte Leerzeile angehngt. Nach jeder erfolgreichen APPEND-Anweisung enthlt das Systemfeld SYTABIX den Index der angehngten Zeile. Bei Standard-Tabellen und sortierten Tabellen mit nicht eindeutigem Schlssel funktioniert das Anhngen unabhngig davon, ob schon eine Zeile mit dem gleichen Tabellenschlssel existiert oder nicht. Es kann zu doppelten Eintrgen kommen. Bei sortierten Tabellen mit eindeutigem Schlssel wird ein Laufzeitfehler erzeugt, wenn eine bereits vorhandene Zeile nochmals angehngt werden soll. Ebenso kommt es zum Laufzeitfehler, wenn durch das Anhngen die Sortierreihenfolge einer sortierten Tabelle verletzt wird.

Mehrere Zeilen anhngen


Die APPEND-Anweisung erlaubt auch das Anhngen beliebiger interner Tabellen an IndexTabellen:

APPEND LINES OF <itab1> TO <itab2>.


Diese Anweisung hngt die gesamte Tabelle ITAB1 an ITAB2 an. Die Tabellenart von ITAB1 ist beliebig. Der Zeilentyp von ITAB1 mu in den Zeilentyp von ITAB2 konvertierbar sein. Wenn eine Index-Tabelle an eine andere Index-Tabelle angehngt wird, knnen die anzuhngenden Zeilen spezifiziert werden:

APPEND LINES OF <itab1> [FROM <n1>] [TO <n2>] TO <itab2>.


<n1> und <n2> geben den Index der ersten bzw. letzten anzuhngenden Zeile von ITAB1 an. Zeilen einer Tabelle mit APPEND an eine andere interne Tabelle anzuhngen, ist etwa um einen Faktor 3 bis 4 mal schneller, als sie in einer LOOP-Schleife zeilenweise anzuhngen. Nach der APPEND-Anweisung enthlt das Systemfeld SY-TABIX den Index der zuletzt angehngten Zeile. Beim Anhngen mehrerer Zeilen an sortierte Tabellen, drfen eindeutig definierte Tabellenschlssel und die Sortierreihenfolge nicht verletzt werden, sonst kommt es zu Laufzeitfehlern.

Ranglisten
Mit der APPEND-Anweisung knnen in Standard-Tabellen Ranglisten erzeugt werden. Dazu beginnt man mit einer leeren Tabelle und verwendet:

APPEND <wa> TO <itab> SORTED BY <f>.


Die neue Zeile wird nicht als letzte Zeile der internen Tabelle <itab> angehngt, sondern die interne Tabelle wird absteigend nach Feld <f> sortiert. Der Arbeitsbereich <wa> mu hier

324

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Tabellenzeilen anhngen

kompatibel zum Zeilentyp der internen Tabelle sein. Der Zusatz SORTED BY ist nicht bei sortierten Tabellen mglich. Mit dieser Anweisung kann die interne Tabelle maximal die beim Anlegen der Tabelle im Parameter INITIAL SIZE angegebene Anzahl von Zeilen enthalten. Dies ist eine Ausnahme von der allgemeinen Regel. Werden mehr Zeilen als angegeben hinzugefgt, wird die jeweils letzte Zeile verworfen. Dies ist ntzlich beim Anlegen von Ranglisten mit begrenzter Lnge (z.B. "Top Ten"). Typischerweise verwendet man die APPEND-Anweisung zum Erstellen von Ranglisten die nicht mehr als 100 Eintrge enthalten. Fr grere Listen empfiehlt es sich aus Performancegrnden die Tabellen normal zu sortieren [Seite 286].

DATA: BEGIN OF wa, col1(1) TYPE c, col2 TYPE i, END OF wa. DATA itab LIKE TABLE OF wa. DO 3 TIMES. APPEND INITIAL LINE TO itab. wa-col1 = sy-index. wa-col2 = sy-index ** 2. APPEND wa TO itab. ENDDO. LOOP AT itab INTO wa. WRITE: / wa-col1, wa-col2. ENDLOOP.
Die Listenausgabe ist:
1 2 3 0 1 0 4 0 9

Es wird eine interne Tabelle ITAB mit zwei Spalten angelegt und in der DO-Schleife gefllt. Bei jedem Schleifendurchgang wird erst eine Zeile mit Initialwerten angehngt, dann wird der Tabellenarbeitsbereich mit dem Schleifenindex und dem Quadrat des Schleifenindexes gefllt und angehngt.

DATA: BEGIN OF line1, col1(3) TYPE c, col2(2) TYPE n, col3 TYPE i, END OF line1, tab1 LIKE TABLE OF line1. DATA: BEGIN OF line2, field1(1) TYPE c, field2 LIKE tab1, END OF line2, tab2 LIKE TABLE OF line2.

April 2001

325

ABAP Programmierung (BC-ABA) Tabellenzeilen anhngen

SAP AG

line1-col1 = 'abc'. line1-col2 = '12'. line1-col3 = 3. APPEND line1 TO tab1. line1-col1 = 'def'. line1-col2 = '34'. line1-col3 = 5. APPEND line1 TO tab1. line2-field1 = 'A'. line2-field2 = tab1. APPEND line2 TO tab2. REFRESH tab1. line1-col1 = 'ghi'. line1-col2 = '56'. line1-col3 = 7. APPEND line1 TO tab1. line1-col1 = 'jkl'. line1-col2 = '78'. line1-col3 = 9. APPEND line1 TO tab1. line2-field1 = 'B'. line2-field2 = tab1. APPEND line2 TO tab2. LOOP AT tab2 INTO line2. WRITE: / line2-field1. LOOP AT line2-field2 INTO line1. WRITE: / line1-col1, line1-col2, line1-col3. ENDLOOP. ENDLOOP.
Die Listenausgabe ist:
A abc def B ghi jkl 12 34 56 78 3 5 7 9

Es werden zwei interne Tabellen TAB1 und TAB2 angelegt. TAB2 hat eine tiefe Struktur, da die zweite Komponente von LINE2 den Datentyp der Tabelle TAB1 hat. LINE1 wird gefllt und an TAB1 angehngt. Anschlieend wird LINE2 gefllt und an TAB2 angehngt. Nachdem TAB1 mit der Anweisung REFRESH initialisiert wurde, wird der gleiche Vorgang wiederholt.

DATA: BEGIN OF line, col1(1) TYPE c, col2 TYPE i, END OF line. DATA: itab1 LIKE TABLE OF line, jtab LIKE itab. DO 3 TIMES. line-col1 = APPEND line line-col1 = APPEND line ENDDO. sy-index. line-col2 = sy-index ** 2. TO itab1. sy-index. line-col2 = sy-index ** 3. TO jtab.

APPEND LINES OF jtab FROM 2 TO 3 TO itab1.

326

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Tabellenzeilen anhngen

LOOP AT itab1 INTO line. WRITE: / line-col1, line-col2. ENDLOOP.


Die Listenausgabe ist:
1 2 3 2 3 1 4 9 8 27

Es werden zwei interne Tabellen gleichen Typs, ITAB und JTAB, angelegt. In der DO-Schleife wird ITAB mit einer Liste von Quadratzahlen, JTAB mit einer Liste von Kubikzahlen gefllt. Anschlieend werden die letzten beiden Zeilen von JTAB an ITAB angehngt.

DATA: BEGIN OF line3, col1 TYPE i, col2 TYPE i, col3 TYPE i, END OF line3. DATA itab2 LIKE TABLE OF line3 INITIAL SIZE 2. line3-col1 = 1. line3-col2 = 2. line3-col3 = 3. APPEND line3 TO itab2 SORTED BY col2. line3-col1 = 4. line3-col2 = 5. line3-col3 = 6. APPEND line3 TO itab2 SORTED BY col2. line3-col1 = 7. line3-col2 = 8. line3-col3 = 9. APPEND line3 TO itab2 SORTED BY col2. LOOP AT itab2 INTO line3. WRITE: / line3-col2. ENDLOOP.
Die Listenausgabe ist:
8 5

Es werden drei Zeilen mit der Anweisung APPEND und dem Zusatz SORTED BY einer internen Tabelle ITAB hinzugefgt. Die Zeile mit dem kleinsten Wert des Felds COL2 fllt weg, da die Anzahl der Zeilen fr diese APPEND-Anweisung mit INITIAL SIZE auf zwei festgelegt ist.

April 2001

327

ABAP Programmierung (BC-ABA) Tabellenzeilen ber den Index einfgen

SAP AG

Tabellenzeilen ber den Index einfgen


Die Anweisung INSERT, die auch zum Einfgen von Zeilen in beliebige Tabellen dient, erlaubt auch das ndern ber den Zeilenindex. Es knnen eine oder mehrere Zeilen ber den Index in Index-Tabellen eingefgt werden:

Einzelne Zeilen einfgen


Um eine Tabellenzeile in eine Index-Tabelle einzufgen verwendet man die Anweisung:

INSERT <line> INTO <itab> [INDEX <idx>].


Dabei ist <line> entweder ein in den Zeilentyp konvertierbarer Arbeitsbereich <wa> oder der Ausdruck INITIAL LINE. Mit <wa> wird eine neue Zeile in die interne Tabelle <itab> eingefgt und mit dem Inhalt des Arbeitsbereichs gefllt. Mit INITIAL LINE wird eine typgerecht initialisierte Leerzeile eingefgt. Bei Verwendung der Option INDEX, wird die neue Zeile vor der Zeile mit dem Index <idx> eingefgt. Die neue Zeile erhlt den Index <idx> und der Index aller folgenden Zeilen wird um 1 erhht. Besteht die Tabelle aus <idx> - 1 Zeilen, wird die neue Zeile hinter der letzten Zeile angehngt. Hat die Tabelle weniger als <idx> - 1 Zeilen, kann die neue Zeile nicht eingefgt werden und SY-SUBRC wird auf 4 gesetzt. Bei erfolgreichem Einfgen ist SY-SUBRC gleich 0. Ohne den Zusatz INDEX kann obige Anweisung nur innerhalb einer LOOP-Schleife verwendet werden. Dann wird die neue Zeile vor der aktuellen Zeile eingefgt. <idx> wird also implizit auf SY-TABIX gesetzt. Bei Standard-Tabellen und sortierten Tabellen mit nicht-eindeutigem Schlssel funktioniert das Einfgen unabhngig davon, ob schon eine Zeile mit dem gleichen Tabellenschlssel existiert oder nicht. Es kann zu doppelten Eintrgen kommen. Bei sortierten Tabellen mit eindeutigem Schlssel wird ein Laufzeitfehler erzeugt, wenn eine bereits vorhandene Zeile nochmals eingefgt werden soll. Ebenso kommt es zum Laufzeitfehler, wenn durch das Einfgen die Sortierreihenfolge einer sortierten Tabelle verletzt wird.

Mehrere Zeilen einfgen


Um mehrere Tabellenzeilen auf einmal in ein Index-Tabelle einzufgen verwendet man die Anweisung:

INSERT LINES OF <itab1> INTO <itab2> [INDEX <idx>].


Diese Anweisung fgt die Zeilen der gesamten Tabelle ITAB1 nach den gleichen Regeln wie beim Einfgen einer einzelnen Zeile hintereinander in ITAB2 ein. Die Tabellenart von ITAB1 ist beliebig. Der Zeilentyp von ITAB1 mu in den Zeilentyp von ITAB2 konvertierbar sein. Wenn eine Index-Tabelle an eine andere Index-Tabelle angehngt wird, knnen die anzuhngenden Zeilen spezifiziert werden:

INSERT LINES OF <itab1> [FROM <n1>] [TO <n2>] INTO <itab2> [INDEX <idx>].
<n1> und <n2> geben den Index der ersten bzw. letzten einzufgenden Zeile von ITAB1 an. Die Methode, Zeilen einer Tabelle in eine andere einzufgen kann je nach Gre der Tabellen und an welcher Stelle eingefgt wird um bis zu einen Faktor 20 schneller sein, als in einer Schleife zeilenweise einzufgen.

328

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Tabellenzeilen ber den Index einfgen

REPORT demo_int_tables_insert_ind_1. DATA: BEGIN OF line, col1 TYPE i, col2 TYPE i, END OF line. DATA itab LIKE TABLE OF line. DO 2 TIMES. line-col1 = sy-index. line-col2 = sy-index ** 2. APPEND line TO itab. ENDDO. line-col1 = 11. line-col2 = 22. INSERT line INTO itab INDEX 2. INSERT INITIAL LINE INTO itab INDEX 1. LOOP AT itab INTO line. WRITE: / sy-tabix, line-col1, line-col2. ENDLOOP.
Die Listenausgabe ist:
1 2 3 4 0 1 11 2 0 1 22 4

Es wird eine interne Tabelle ITAB angelegt und mit zwei Zeilen gefllt. Eine neue Zeile wird vor der zweiten Zeile eingefgt. Eine Zeile mit Initialwerten wird vor der ersten Zeile eingefgt.

REPORT demo_int_tables_insert_ind_2. DATA: BEGIN OF line, col1 TYPE i, col2 TYPE i, END OF line. DATA itab LIKE TABLE OF line. DO 2 TIMES. line-col1 = sy-index. line-col2 = sy-index ** 2. APPEND line TO itab. ENDDO. LOOP AT itab INTO line. line-col1 = 3 * sy-tabix. line-col2 = 5 * sy-tabix. INSERT line INTO itab. ENDLOOP.

April 2001

329

ABAP Programmierung (BC-ABA) Tabellenzeilen ber den Index einfgen

SAP AG

LOOP AT itab INTO line. WRITE: / sy-tabix, line-col1, line-col2. ENDLOOP.


Die Listenausgabe ist:
1 2 3 4 3 1 9 2 5 1 15 4

Es wird eine interne Tabelle ITAB angelegt und mit zwei Zeilen gefllt. In einer LOOP-Schleife wird vor jeder vorhandenen Zeile eine neue Zeile eingefgt.

REPORT demo_int_tables_insert_ind_3. DATA: BEGIN OF line, col1 TYPE i, col2 TYPE i, END OF line. DATA: itab LIKE TABLE OF line, jtab LIKE itab. DO 3 TIMES. line-col1 = APPEND line line-col1 = APPEND line ENDDO. sy-index. line-col2 = sy-index ** 2. TO itab. sy-index. line-col2 = sy-index ** 3. TO jtab.

INSERT LINES OF itab INTO jtab INDEX 1. LOOP AT jtab INTO line. WRITE: / sy-tabix, line-col1, line-col2. ENDLOOP.
Die Listenausgabe ist: :
1 2 3 4 5 6 1 2 3 1 2 3 1 4 9 1 8 27

Es werden zwei interne Tabellen vom gleichen Typ angelegt und jeweils mit drei Zeilen gefllt. Danach wird die gesamte Tabelle ITAB vor der ersten Zeile von JTAB eingefgt.

330

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Tabellenzeilen ber den Index lesen

Tabellenzeilen ber den Index lesen


Die Anweisung READ, die auch zum Lesen von einzelnen Zeilen beliebiger Tabellen dient, erlaubt auch das Lesen ber den Zeilenindex. Um eine einzelne Zeile einer Index-Tabelle auszulesen, verwendet man die Anweisung

READ TABLE <itab> INDEX <idx> <result>.


Das System liest die Zeile mit dem Index <idx> aus Tabelle <itab>. Dieser Zugriff ist schneller als die Suche ber einen Schlssel [Seite 302]. Die Angabe <result> bestimmt wie dort, wie mit einer gelesenen Zeile verfahren wird. Wird ein Eintrag mit dem angegebenen Index gefunden, enthlt das Systemfeld SY-SUBRC den Wert 0 und SY-TABIX den Index dieser Zeile. Ansonsten ist SY-SUBRC ungleich 0. Ist <idx> kleiner oder gleich 0, tritt ein Laufzeitfehler auf. Ist <idx> grer als die Anzahl vorhandener Zeilen, wird SY-SUBRC auf 4 gesetzt.

REPORT demo_int_tables_read_index. DATA: BEGIN OF line, col1 TYPE i, col2 TYPE i, END OF line. DATA itab LIKE SORTED TABLE OF line WITH UNIQUE KEY col1. FIELD-SYMBOLS <fs> LIKE LINE OF itab. DO 20 TIMES. line-col1 = sy-index. line-col2 = 2 * sy-index. APPEND line TO itab. ENDDO. READ TABLE itab ASSIGNING <fs> INDEX 7. WRITE: sy-subrc, sy-tabix. WRITE: / <fs>-col1, <fs>-col2.
Die Listenausgabe ist:
0 7 7 14

Es wird eine sortierte Tabelle ITAB angelegt und mit 20 Zeilen gefllt. Die Zeile mit dem Index 7 wird gelesen und dem Feldsymbol <FS> zugewiesen.

April 2001

331

ABAP Programmierung (BC-ABA) Binre Suche bei Standard-Tabellen

SAP AG

Binre Suche bei Standard-Tabellen


Wenn beim Lesen von Tabellenzeilen [Seite 302] aus Standard-Tabellen ein anderer Schlssel als der Standardschlssel verwendet wird, kann die Suche statt linear auch binr durchgefhrt werden. Hierzu mu der Zusatz BINARY SEARCH in die entsprechenden beiden READAnweisungen verwendet werden:

READ TABLE <itab> WITH KEY = <f> <result> BINARY SEARCH.


und

READ TABLE <itab> WITH KEY <k1> = <f1>... <kn> = <fn> <result> BINARY SEARCH.
Voraussetzung ist, da die Standardtabelle aufsteigend nach dem angegebenen Suchschlssel sortiert ist. Der Zusatz erffnet die Mglichkeit, einen Schlsselzugriff in Standard-Tabellen genauso schnell wie in sortierten Tabellen durchzufhren.

REPORT demo_int_tables_read_index_bin. DATA: BEGIN OF line, col1 TYPE i, col2 TYPE i, END OF line. DATA itab LIKE STANDARD TABLE OF line. DO 4 TIMES. line-col1 = sy-index. line-col2 = sy-index ** 2. APPEND line TO itab. ENDDO. SORT itab BY col2. READ TABLE itab WITH KEY col2 = 16 INTO line BINARY SEARCH. WRITE: 'SY-SUBRC =', sy-subrc.
Die Listenausgabe ist:
SY-SUBRC = 0

Eine Standard-Tabelle wird mit einer Liste von Quadratzahlen gefllt und aufsteigend nach dem Feld COL2 sortiert. In der READ-Anweisung wird binr die Zeile der Tabelle gesucht und gefunden, in der das Feld COL2 den Wert 16 hat.

332

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Tabellenzeilen nach Zeichenketten durchsuchen

Tabellenzeilen nach Zeichenketten durchsuchen


Um die Zeilen einer Index-Tabelle nach einer bestimmten Zeichenkette zu durchsuchen, verwendet man die Anweisung:

SEARCH <itab> FOR <str> <options>.


Diese Anweisung durchsucht die Zeilen der internen Tabelle <itab> nach der Zeichenkette in <str>. Falls die Suche erfolgreich ist, wird SY-SUBRC auf 0 und SY-TABIX auf den Index der Tabellenzeile gesetzt, in der die Zeichenkette gefunden wurde. SY-FDPOS enthlt den Offset der Zeichenkette in der Tabellenzeile. Andernfalls wird SY-SUBRC auf 4 gesetzt. Die Anweisung behandelt alle Tabellenzeilen unabhngig von ihrem tatschlichen Typ als Felder des Typs C. Es werden keine Konvertierungen durchgefhrt. Der Suchstring <str> kann die gleiche Form haben, wie beim normalen Zeichenketten suchen [Seite 176] in Feldern. Die verschiedenen Optionen (<options>) fr die Suche in der Tabelle <itab> sind:

ABBREVIATED
Die Tabelle <itab> wird nach einem Wort durchsucht, das die Zeichenfolge in <str> enthlt. Die Zeichen knnen durch andere Zeichen getrennt sein. Das erste Zeichen des Wortes und im String <str> mssen identisch sein.

STARTING AT <lin1>
Die Tabelle <itab> wird ab Zeile <lin1> nach <str> durchsucht, wobei <lin1> eine Variable sein kann.

ENDING AT <lin2>
Die Tabelle <itab> wird bis Zeile <lin2> nach <str> durchsucht, wobei <lin2> eine Variable sein kann.

AND MARK
Wenn der Suchstring gefunden wird, werden alle Zeichen des Suchstrings (und alle dazwischen liegenden Zeichen bei Verwendung von ABBREVIATED) in Grobuchstaben umgesetzt.

Diese Anweisung funktioniert nur mit Index-Tabellen. Sie hat keine Entsprechung fr HashTabellen.

REPORT demo_int_tables_search_index. DATA: BEGIN OF line, index TYPE i, text(8) TYPE c, END OF line. DATA itab LIKE SORTED TABLE OF line WITH UNIQUE KEY index. DATA num(2) TYPE n. DO 10 TIMES. line-index = sy-index. num = sy-index.

April 2001

333

ABAP Programmierung (BC-ABA) Tabellenzeilen nach Zeichenketten durchsuchen

SAP AG

CONCATENATE 'string' num INTO line-text. APPEND line TO itab. ENDDO. SEARCH itab FOR 'string05' AND MARK. WRITE: / '''string05'' found at line', (1) sy-tabix, 'with offset', (1) sy-fdpos. SKIP. READ TABLE itab INTO line INDEX sy-tabix. WRITE: / line-index, line-text.
Die Listenausgabe ist:
'string05' found at line 5 with offset 4 5 STRING05

Der Offset der gefundenen Zeichenkette wird durch die Breite der ersten Tabellenspalte vom Typ I der Lnge 4 bestimmt. Die Option AND MARK verndert den Tabelleninhalt der entsprechenden Zeile.

334

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Tabellenzeilen ber den Index ndern

Tabellenzeilen ber den Index ndern


Die Anweisung MODIFY, die auch zum ndern von Zeilen beliebiger Tabellen dient, erlaubt auch das ndern ber den Zeilenindex. Weiterhin gibt es eine spezielle Variante der Anweisung WRITE TO, mit der Zeilen in Standard-Tabellen modifiziert werden knnen.

Einzelne Zeilen mit MODIFY ndern


Um eine Zeile ber den Index zu ndern, verwendet man folgende Anweisung:

MODIFY <itab> FROM <wa> [INDEX <idx>] [TRANSPORTING <f1> <f2>... ].


Der im Zusatz FROM angegebene Arbeitsbereich <wa> ersetzt die adressierte Zeile in der Tabelle <itab>. Der Arbeitsbereich mu in den Zeilentyp der internen Tabelle konvertierbar sein. Bei Verwendung der Option INDEX wird der Inhalt des Arbeitsbereichs der Zeile mit dem Index <idx> zugewiesen. Bei erfolgreichem Ersetzen wird SY-SUBRC auf 0 gesetzt. Enthlt die interne Tabelle weniger Zeilen als <idx>, wird keine Zeile gendert und SY-SUBRC wird auf 4 gesetzt. Ohne den Zusatz INDEX kann obige Anweisung nur innerhalb einer LOOP-Schleife verwendet werden. Dann wird die aktuelle Zeile gendert. <idx> wird also implizit auf SY-TABIX gesetzt. Beim ndern von Zeilen in sortierten Tabellen ist zu beachten, da der Inhalt der Schlsselfelder nicht gendert werden darf und ein Laufzeitfehler auftritt, wenn im Programm versucht wird den Inhalt eines Schlsselfelds durch einen anderen Wert zu ersetzen. Eine Zuweisung des gleichen Werts ist aber mglich. Mit dem Zusatz TRANSPORTING knnen die zu ndernden Felder wie beim Tabellenzeilen ndern [Seite 308] in beliebigen Tabellen explizit in einer Liste angegeben werden. Bei sortierten Tabellen drfen dabei nur Nicht-Schlsselfelder angegeben werden.

Zeilen mit WRITE TO ndern


In Standard-Tabellen knnen Zeilen auch mit der folgenden Anweisung gendert werden:

WRITE <f> TO <itab> INDEX <idx>.


Diese Variante der Anweisung WRITE TO [Seite 153] konvertiert den Inhalt des Felds <f> nach Typ C und bertrgt die resultierende Zeichenkette in die Zeile mit dem Index <idx>. Bei erfolgreichem Ersetzen wird SY-SUBRC auf 0 gesetzt. Enthlt die interne Tabelle weniger Zeilen als <idx>, wird keine Zeile gendert und SY-SUBRC wird auf 4 gesetzt. Der Datentyp von <f> mu in ein Characterfeld konvertierbar sein, ansonsten tritt ein Syntaxoder Laufzeitfehler auf. Die Zeile wird unabhngig von ihrem tatschlichen Zeilentyp immer als Zeichenkette interpretiert. Die Bearbeitung von Teilfeldern [Seite 205] ist wie beim normalen WRITE TO mglich. Diese Anweisung sollte bei strukturierten Zeilentypen nur verwendet werden, wenn ein Zeichen, dessen Position genau bekannt ist, umgesetzt werden soll. Eine andere Anwendungsmglichkeit sind interne Tabellen, deren gesamter Zeilentyp zeichenartig ist. Tabellen mit solchem Typ werden beispielsweise bei der dynamischen Programmierung [Seite 534] oft verwendet.

REPORT demo_int_tables_modify_ind. DATA: BEGIN OF line, col1 TYPE i,

April 2001

335

ABAP Programmierung (BC-ABA) Tabellenzeilen ber den Index ndern

SAP AG

col2 TYPE i, END OF line. DATA itab LIKE TABLE OF line. DO 3 TIMES. line-col1 = sy-index. line-col2 = sy-index ** 2. APPEND line TO itab. ENDDO. LOOP AT itab INTO line. IF sy-tabix = 2. line-col1 = sy-tabix * 10. line-col2 = ( sy-tabix * 10 ) ** 2. MODIFY itab FROM line. ENDIF. ENDLOOP. LOOP AT itab INTO line. WRITE: / sy-tabix, line-col1, line-col2. ENDLOOP.
Die Ausgabe sieht so aus:
1 2 3 1 20 3 1 400 9

In diesem Beispiel wird eine sortierte ITAB mit drei Zeilen gefllt. Die zweite Zeile wird durch den Inhalt des Arbeitsbereichs LINE ersetzt.

REPORT demo_int_tables_modify_ind_ind. DATA name(4) TYPE c VALUE 'COL2'. DATA: BEGIN OF line, col1 TYPE i, col2 TYPE i, END OF line. DATA itab LIKE SORTED TABLE OF line WITH UNIQUE KEY col1. DO 4 TIMES. line-col1 = sy-index. line-col2 = sy-index ** 2. APPEND line TO itab. ENDDO. line-col2 = 222. MODIFY itab FROM line INDEX 2 TRANSPORTING (name). line-col1 = 3. line-col2 = 333. MODIFY itab FROM line INDEX 3.

336

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Tabellenzeilen ber den Index ndern

LOOP AT itab INTO line. WRITE: / sy-tabix, line-col1, line-col2. ENDLOOP.


Die Listenausgabe ist:
1 2 3 4 1 2 3 4 1 222 333 16

Es wird eine sortierte Tabelle mit vier Zeilen gefllt. In der zweiten Zeile und dritten Zeile wird die Komponente COL2 modifiziert. Falls bei der Modifikation der dritten Zeile der Wert von LINE-COL1 ungleich 3 wre, kme es zu einem Laufzeitfehler, da ein Schlsselfeld einer sortierten Tabelle nicht gendert werden darf.

REPORT demo_int_tables_write_ind. DATA text(72) TYPE c. DATA code LIKE TABLE OF text. text = 'This is the first line.'. APPEND text TO code. text = 'This is the second line. It is ugly.'. APPEND text TO code. text = 'This is the third and final line.'. APPEND text TO code. WRITE 'nice.' TO code+31 INDEX 2. LOOP AT code INTO text. WRITE / text. ENDLOOP.
Die Ausgabe sieht so aus:
This is the first line. This is the second line. It is nice. This is the third and final line.

In diesem Beispiel wird eine interne Tabelle CODE mit einem elementaren Feld vom Typ C definiert, das 72 Zeichen lang ist. Nachdem die Tabelle mit drei Zeilen gefllt wurde, wird die zweite Zeile mit der Anweisung WRITE TO gendert. Das Wort "ugly" wird durch das Wort "nice" ersetzt.

April 2001

337

ABAP Programmierung (BC-ABA) Tabellenzeilen ber den Index lschen

SAP AG

Tabellenzeilen ber den Index lschen


Die Anweisung DELETE, die auch zum Lschen von Zeilen beliebiger Tabellen dient, erlaubt auch das Lschen ber den Zeilenindex. Es knnen einzelne oder mehrere Zeilen ber den Index gelscht werden.

Einzelne Zeilen lschen


Um eine Zeile ber den Index zu lschen, verwendet man folgende Anweisung:

DELETE <itab> [INDEX <idx>].


Bei Verwendung der Option INDEX wird die Zeile mit dem Index <idx> aus der Tabelle <itab> gelscht, der Index der folgenden Zeilen um 1 erniedrigt und SY-SUBRC auf 0 gesetzt. Gibt es keine Zeile mit dem Index <idx>, wird SY-SUBRC auf 4 gesetzt. Ohne den Zusatz INDEX kann obige Anweisung nur innerhalb einer LOOP-Schleife verwendet werden. Dann wird die aktuelle Zeile gelscht. <idx> wird also implizit auf SY-TABIX gesetzt.

Mehrere Zeilen lschen


Um mehrere Zeilen ber den Index zu lschen, verwendet man folgende Anweisung:

DELETE <itab> [FROM <n1>] [TO <n2>] [WHERE <condition>].


Dabei mu mindestens einer der Zustze angegeben werden. Der WHERE-Zusatz arbeitet wie beim Tabellenzeilen lschen [Seite 311] in beliebigen Tabellen. Zustzlich zum WHERE-Zusatz knnen die zu lschenden Zeilen bei Index-Tabellen auch direkt mit FROM und TO angegeben werden. Es werden alle Zeilen aus <itab> gelscht, deren Index zwischen <n1> und <n2> liegt. Ohne den Zusatz FROM werden die Eintrge ab der ersten Zeile gelscht. Ohne den Zusatz TO werden die Eintrge bis zur letzten Zeile gelscht. Wird mindestens eine Zeile gelscht, wird SY-SUBRC auf 0, ansonsten auf 4 gesetzt.

REPORT demo_int_tables_delete_ind_1. DATA: BEGIN OF line, col1 TYPE i, col2 TYPE i, END OF line. DATA itab LIKE SORTED TABLE OF line WITH UNIQUE KEY col1. DO 5 TIMES. line-col1 = sy-index. line-col2 = sy-index ** 2. APPEND line TO itab. ENDDO. DELETE itab INDEX: 2, 3, 4. WRITE: 'SY-SUBRC =',sy-subrc. SKIP.

338

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Tabellenzeilen ber den Index lschen

LOOP AT itab INTO line. WRITE: / sy-tabix, line-col1, line-col2. ENDLOOP.


Die Listenausgabe ist:
SY-SUBRC 1 2 3 4 1 3 5 1 9 25

Es wird eine sortierte Tabelle ITAB mit fnf Zeilen gefllt. Dann werden drei Zeilen mit den Indizes 2, 3 und 4 gelscht. Nach dem Lschen der Zeile mit Index 2, wird der Index der folgenden Zeilen um 1 erniedrigt. Beim nchsten Lschvorgang wird daher die Zeile gelscht, die zuerst den Index 4 hatte. Der dritte Lschvorgang scheitert, weil die Tabelle nur noch aus 3 Zeilen besteht.

REPORT demo_int_tables_delete_ind_2. DATA: BEGIN OF line, col1 TYPE i, col2 TYPE i, END OF line. DATA itab LIKE TABLE OF line. DO 30 TIMES. line-col1 = sy-index. line-col2 = sy-index ** 2. APPEND line TO itab. ENDDO. LOOP AT itab INTO line. IF line-col1 < 28. DELETE itab. ENDIF. ENDLOOP. LOOP AT itab INTO line. WRITE: / sy-tabix, line-col1, line-col2. ENDLOOP.
Die Listenausgabe ist:
1 2 3 28 29 30 784 841 900

Es wird eine Standard Tabelle ITAB mit 30 Zeilen gefllt. Innerhalb einer LOOPSchleife werden alle Zeilen, deren Wert im Feld COL1 kleiner als 28 ist, gelscht.

REPORT demo_int_tables_delete_ind_3.

April 2001

339

ABAP Programmierung (BC-ABA) Tabellenzeilen ber den Index lschen

SAP AG

DATA: BEGIN OF line, col1 TYPE i, col2 TYPE i, END OF line. DATA itab LIKE TABLE OF line. DO 40 TIMES. line-col1 = sy-index. line-col2 = sy-index ** 2. APPEND line TO itab. ENDDO. DELETE itab FROM 3 TO 38 WHERE col2 > 20. LOOP AT itab INTO line. WRITE: / line-col1, line-col2. ENDLOOP.
Die Listenausgabe ist:
1 2 3 4 39 40 1 4 9 16 1.521 1.600

Es werden alle Zeilen mit Index zwischen 3 und 39 aus der Standard-Tabelle ITAB gelscht, bei denen die Werte in COL2 grer als 20 sind.

340

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Indexangaben bei Schleifen

Indexangaben bei Schleifen


Bei der Anweisung LOOP, die Schleifen ber beliebige Tabellen ausfhrt, knnen bei IndexTabellen die zu lesenden Zeilen ber Indexangaben eingeschrnkt werden:

LOOP AT <itab> <result> [FROM <n1>] [TO <n2>] <bedingung>. <anweisungsblock> ENDLOOP.
Die Ausfhrung der Schleife erfolgt wie beim Tabellenzeilen in Schleifen bearbeiten [Seite 315] bei beliebigen internen Tabellen. Innerhalb des Verarbeitungsblocks enthlt SY-TABIX den Index der aktuellen Zeile. Mit den Zustzen FROM und TO knnen die Indizes <n1> und <n2> der ersten bzw. letzten zu lesenden Zeile angegeben werden. Mit FROM und TO wird tatschlich die Anzahl der Zeilen eingeschrnkt, die gelesen werden mu. Der WHERE-Zusatz in der Bedingung verhindert lediglich, da die Ausgabe <result> bearbeitet wird. Bei WHERE mssen alle Zeilen gelesen werden. Um die Performance zu verbessern, sollten FROM und TO also soweit wie mglich eingesetzt werden. Es kann auch vorteilhaft sein, die Schleife unter bestimmten Bedingungen mit den Anweisungen CONTINUE oder EXIT abzukrzen oder zu beenden.

REPORT demo_int_tables_loop_ind. DATA: BEGIN OF line, col1 TYPE i, col2 TYPE i, END OF line. DATA itab LIKE SORTED TABLE OF line WITH UNIQUE KEY table_line. DO 30 TIMES. line-col1 = sy-index. line-col2 = sy-index ** 2. APPEND line TO itab. ENDDO. LOOP AT itab INTO line FROM 10 TO 25 WHERE col2 > 400. WRITE: / sy-tabix, line-col2. ENDLOOP.
Die Listenausgabe ist:
21 22 23 24 25 441 484 529 576 625

Es wird eine sortierte Tabelle ITAB mit 30 Zeilen gefllt. Die LOOP-Schleife liest nur die Zeilen mit Index zwischen 10 und 25. Weiterhin ist der Inhalt von COL2 auf Werte grer als 400 eingeschrnkt.

April 2001

341

ABAP Programmierung (BC-ABA) Indexangaben bei Schleifen

SAP AG

342

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Zugriff ber Feldsymbole

Zugriff ber Feldsymbole


Beim Lesen von Tabellenzeilen mit READ und der Schleifenverarbeitung mit LOOP knnen die Zeilen interner Tabellen mit dem Zusatz

... ASSIGNING <FS>


einem Feldsymbol zugewiesen werden. Das Feldsymbol <FS> zeigt direkt auf die zugewiesene Zeile im Arbeitsspeicher. Whrend der Inhalt der Zeile bei der Zuweisung an einen Arbeitsbereich mit dem INTO-Zusatz nur indirekt zur Verfgung steht, kann er ber das Feldsymbol direkt gelesen und verndert werden. Beim ndernden Zugriff auf Tabellenzeilen ber Feldsymbole mu beachtet werden, da bei sortierten Tabellen und Hash-Tabellen der Inhalt von Schlsselfeldern nicht gendert werden darf. Jede Wertzuweisung an ein Schlsselfeld ber ein Feldsymbol fhrt zu einem Laufzeitfehler. In Schleifen ist zu beachten, da die Anweisung SUM der Gruppenstufenverarbeitung nicht mglich ist, wenn mit Feldsymbolen gearbeitet wird, da diese Anweisung auf Arbeitsbereichen ausgefhrt wird.

Vorteile von Feldsymbolen


Bei lesenden Zugriffen entfallen die Kopierkosten bei der Zuweisung der Tabellenzeilen an den Arbeitsbereich. Bei ndernden Zugriffen mit der Anweisung MODIFY mu nicht erst ein Arbeitsbereich mit Werten gefllt und dann der Tabellenzeile zugewiesen werden, sondern es kann direkt mit dem Feldsymbol gearbeitet werden. Dies fhrt bei groen bzw. komplexen Tabellenzeilen zu Performancegewinnen und erleichtert die Verarbeitung geschachtelter interner Tabellen.

Verwaltungskosten beim READ


Es ist aber zu beachten, da beim Zugriff ber Feldsymbole interne Verwaltungskosten entstehen. Nach einer READ-Anweisung mit Feldsymbol, mu die Zuweisung der Zeile an das Feldsymbol in der Tabelle registriert werden. Falls eine an ein Feldsymbol zugewiesene Tabellenzeile gelscht wird, mu die Zuweisung intern aufgehoben werden, damit das Feldsymbol nicht auf einen undefinierten Bereich zeigt. Beim Zugriff auf einzelne Zeilen lohnt sich die Verwendung von Feldsymbolen bei rein lesenden Zugriffen mit der READ-Anweisung ab einer Zeilenbreite von ca. 1000 Bytes. Bei der Kombination mit ndernden Zugriffen ber die MODIFY-Anweisung lohnen sich Feldsymbole schon ab einer Zeilenbreite von ca. 100 Bytes.

Verwaltungskosten beim LOOP


Um die Verwaltungskosten fr die Verwendung von Feldsymbolen bei der Schleifenverarbeitung zu minimieren, wird intern nicht die Zuweisung jeder aktuellen Zeile an das Feldsymbol registriert, sondern nur die Zuweisung einer beliebigen Zeile der Tabelle an das Feldsymbol. Erst beim Verlassen der Schleife wird die Zuweisung der Zeile des letzten Schleifendurchgangs an das Feldsymbol registriert. Als Konsequenz lohnt sich die Verwendung von Feldsymbolen bei der Schleifenverarbeitung schon ab ca. 10 Zeilen. Andererseits ist es dadurch nicht mglich, dem Feldsymbol innerhalb der Schleife ein anderes oder gar kein Feld zuzuweisen. Die Ausfhrung der Anweisungen ASSIGN, UNASSIGN oder die Verwendung des ASSIGNING-Zusatzes fr das gleiche Feldsymbol im Anweisungsblock der Schleife fhrt zu Laufzeitfehlern.

April 2001

343

ABAP Programmierung (BC-ABA) Zugriff ber Feldsymbole

SAP AG

DATA: BEGIN OF line, col1 TYPE i, col2 TYPE i, END OF line. DATA itab LIKE SORTED TABLE OF line WITH UNIQUE KEY col1. FIELD-SYMBOLS <fs> LIKE LINE OF itab. DO 4 TIMES. line-col1 = sy-index. line-col2 = sy-index ** 2. APPEND line TO itab. ENDDO. READ TABLE itab WITH TABLE KEY col1 = 2 ASSIGNING <fs>. <fs>-col2 = 100. READ TABLE itab WITH TABLE KEY col1 = 3 ASSIGNING <fs>. DELETE itab INDEX 3. IF <fs> IS ASSIGNED. WRITE '<fs> is assigned!'. ENDIF. LOOP AT itab ASSIGNING <fs>. WRITE: / <fs>-col1, <fs>-col2. ENDLOOP.
Die Listenausgabe ist:
1 2 4 1 100 16

Es wird eine sortierte Tabelle ITAB mit 4 Zeilen gefllt. Die zweite Zeile wird dem entsprechend typisierten Feldsymbol <FS> zugewiesen und ber <FS> modifiziert. Nach der Zuweisung der dritten Zeile an <FS> wird diese gelscht. Dadurch ist der logische Ausdruck in der IF-Anweisung unwahr. In der LOOP-Schleife wird <FS> zur Ausgabe der Tabellenzeilen verwendet. Danach zeigt <FS> auf die dritte Zeile der Tabelle.

344

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Kopfzeilen als Arbeitsbereich

Kopfzeilen als Arbeitsbereich


Beim Anlegen von internen Tabellenobjekten [Seite 273] kann eine gleichnamige Kopfzeile deklariert werden. Die Kopfzeile kann in den Operationen mit einzelnen Zeilen als Arbeitsbereich verwendet werden, der zum Zeilentyp der internen Tabelle kompatibel ist. Die entsprechenden ABAP-Anweisungen haben Kurzformen, bei denen die explizite Angabe eines Arbeitsbereichs entfllt und bei denen die Kopfzeile implizit als Arbeitsbereich verwendet wird. Die folgende Tabelle stellt die expliziten Anweisungen ohne Verwendung einer Kopfzeile den impliziten Anweisungen mit Verwendung einer Kopfzeile gegenber:
Operationen ohne Kopfzeile Operationen mit Kopfzeile

Operationen fr alle Tabellenarten

INSERT <wa> INTO TABLE <itab>. COLLECT <wa> INTO <itab>. READ TABLE <itab>... INTO <wa>. MODIFY TABLE <itab> FROM <wa>... MODIFY <itab> FROM <wa>...WHERE... DELETE TABLE <itab> FROM <wa>. LOOP AT ITAB INTO <wa>...
Operationen fr Index-Tabellen

INSERT TABLE ITAB. COLLECT <itab>. READ TABLE <itab>... MODIFY TABLE <itab>... MODIFY <itab>... WHERE... DELETE TABLE <itab>. LOOP AT ITAB... APPEND <itab>. INSERT <itab>... MODIFY <itab>...

APPEND <wa> TO <itab>. INSERT <wa> INTO <itab>... MODIFY <itab> FROM <wa>...

Die implizite Verwendung der Kopfzeile macht die Anweisungen zwar krzer, aber nicht unbedingt lesbarer, da Ziel- und Quellfeld der Zuweisungen nicht ersichtlich sind. Weiterhin kann auch die Namensgleichheit zwischen interner Tabelle und Kopfzeile bei Operationen mit der gesamten internen Tabelle [Seite 279] zu Verwirrung fhren. Um Tabelle und Arbeitsbereich unterscheidbar zu machen, sollten deshalb Operationen auf internen Tabellen mglichst mit Arbeitsbereichen erfolgen, die andere Namen als die Tabelle haben.

Im folgenden werden zwei Programme gegenbergestellt, die eine interne Tabelle mit und ohne Kopfzeile bearbeiten. Die Funktion beider Programme ist identisch. Bearbeitung mit Kopfzeile:

TYPES: BEGIN OF line, col1 TYPE i, col2 TYPE i, END OF line. DATA itab TYPE HASHED TABLE OF line WITH UNIQUE KEY col1 WITH HEADER LINE. DO 4 TIMES. itab-col1 = sy-index.

April 2001

345

ABAP Programmierung (BC-ABA) Kopfzeilen als Arbeitsbereich

SAP AG

itab-col2 = sy-index ** 2. INSERT TABLE itab. ENDDO. itab-col1 = 2. READ TABLE itab FROM itab. itab-col2 = 100. MODIFY TABLE itab. itab-col1 = 4. DELETE TABLE itab. LOOP AT itab. WRITE: / itab-col1, itab-col2. ENDLOOP. Bearbeitung ohne Kopfzeile: TYPES: BEGIN OF line, col1 TYPE i, col2 TYPE i, END OF line. DATA: itab TYPE HASHED TABLE OF line WITH UNIQUE KEY col1, wa LIKE LINE OF itab. DO 4 TIMES. wa-col1 = sy-index. wa-col2 = sy-index ** 2. INSERT wa INTO TABLE itab. ENDDO. wa-col1 = 2. READ TABLE itab FROM wa INTO wa. wa-col2 = 100. MODIFY TABLE itab FROM wa. wa-col1 = 4. DELETE TABLE itab FROM wa. LOOP AT itab INTO wa. WRITE: / wa-col1, wa-col2. ENDLOOP.
Die Listenausgabe ist in beiden Fllen:
1 2 3 1 100 9

Die Anweisungen des Programms ohne Verwendung einer Kopfzeile sind aussagekrftiger. Als weiteren Schritt knnte man z.B. einen weiteren Arbeitsbereich einfhren, der nur zur Spezifikation des Schlssels dient und dem keine Werte aus der Tabelle zugewiesen werden.

346

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Extrakte

Extrakte
Interne Tabellen haben eine feste Zeilenstruktur und sind nicht immer geeignet, Datenbestnde mit unterschiedlichen Strukturen zu bearbeiten. Fr diesen Zweck bietet ABAP die Mglichkeit, sogenannte Extrakte bzw. Extraktdatenbestnde zu bilden. Ein Extrakt ist ein sequentieller Datenbestand im Speicherbereich des Programms. Es kann nur innerhalb einer speziellen Schleife auf die einzelnen Stze des Bestands zugegriffen werden. Ein Index- oder Schlsselzugriff wie bei internen Tabellen ist dagegen nicht mglich. Fr ein ABAPProgramm kann genau ein Extraktdatenbestand angelegt werden. Die Gre des Extraktdatenbestands ist wie bei internen Tabellen im Prinzip unbegrenzt. Ab 500 kB Gre wird er in eine Datei des Betriebssystems ausgelagert. Praktisch erreichbar sind Gren von bis zu 2 GB, vorausgesetzt, da gengend Platz im Dateisystem ist. Ein Extraktdatenbestand besteht aus einer Folge von Stzen definierter Struktur, die jedoch nicht einheitlich sein mu. In einem Extraktdatenbestand knnen Stze unterschiedlicher Lnge und Struktur hintereinander abgelegt werden. Dadurch entfllt die Notwendigkeit fr jede abzuspeichernde Struktur einen eigenen Datenbestand anlegen zu mssen. Dies vermindert den internen Verwaltungsaufwand erheblich. Im Unterschied zu internen Tabellen werden Extraktdatenbestnde teilweise komprimiert gespeichert. Dadurch ist der Platzbedarf geringer als fr interne Tabellen. Weiterhin mu die Struktur von Extraktdatenbestnden nicht zu Beginn des Programms festgelegt werden, sondern ergibt sich dynamisch aus dem Programmverlauf. Wie bei Schleifen ber interne Tabellen ist auch bei Extrakten eine Gruppenstufenverarbeitung mglich. Die interne Verwaltung von Extraktdatenbestnden ist entsprechend optimiert, so da die Gruppenstufenverarbeitung bei Extrakten schneller als bei internen Tabellen ist. Um einen Extraktdatenbestand in einem Programm zu erzeugen und zu fllen und zu bearbeiten, sind die folgenden Schritte hintereinander auszufhren: 1. Die Satzarten, die im Extraktdatenbestand vorkommen sollen, mssen als Feldgruppe deklariert werden und die Struktur jeder Satzart mu durch das Aufnehmen von Feldern in jede Feldgruppe definiert werden. Extrakt definieren [Seite 348] 2. Der Extraktdatenbestand mu zeilenweise durch Extraktion der gewnschten Daten gefllt werden. Extrakt mit Daten fllen [Seite 350] 3. Der gefllte Extraktdatenbestand kann sortiert und in einer Schleife verarbeitet werden. Eine Vernderung des Bestands ist nicht mehr mglich. Extrakte verarbeiten [Seite 352]

April 2001

347

ABAP Programmierung (BC-ABA) Extrakt definieren

SAP AG

Extrakt definieren
Die Definition eines Extrakts erfolgt in zwei Schritten. Erst mssen die Einzelstze deklariert und dann ihre Struktur definiert werden.

Extraktstze als Feldgruppen deklarieren


Ein Extraktdatenbestand besteht aus einer Folge von Stzen. Die Stze knnen unterschiedlicher Struktur sein. Alle Stze einheitlicher Struktur bilden eine Satzart. Alle Satzarten eines Extraktdatenbestands mssen mit der Anweisung FIELD-GROUPS als Feldgruppen deklariert werden:

FIELD-GROUPS <fg>.
Diese Anweisung deklariert eine Feldgruppe <fg>. Eine Feldgruppe ist eine Zusammenfassung mehrerer Felder unter einem Namen. Feldgruppen sollten am besten zu Beginn des Programms am Ende des Deklarationsteils deklariert werden. Eine Feldgruppe stellt keinen Speicherplatz fr die Felder bereit, sondern enthlt Zeiger auf existierende Felder. Beim Fllen des Extraktdatenbestands mit Stzen, bestimmen diese Zeiger den Inhalt der abgespeicherten Stze. Es kann eine spezielle Feldgruppe HEADER definiert werden:

FIELD-GROUPS HEADER.
Diese Feldgruppe wird beim Fllen des Extraktdatenbestands automatisch jeder der brigen Feldgruppen vorangestellt. D.h. im Extraktdatenbestand enthlt ein Satz einer Feldgruppe <fg> im vorderen Teil immer die Felder der Feldgruppe HEADER. Diese Felder dienen beim Sortieren des Extraktdatenbestands als Standardsortierschlssel.

Struktur der Feldgruppe definieren


Um die Struktur eines Einzelsatzes zu definieren, mssen wie folgt Felder in die entsprechende Feldgruppe aufgenommen werden:

INSERT <f1>... <fn> INTO <fg>.


Diese Anweisung definiert die Felder der Feldgruppe <fg>. Die Feldgruppe <fg> mu zuvor mit der Anweisung FIELD-GROUPS definiert werden. Als Felder <fi> drfen nur global sichtbare Datenobjekte des ABAP-Programms verwendet werden. Lokale Datenobjekte, die in einer Prozedur [Seite 467] definiert sind, knnen nicht in eine Feldgruppe aufgenommen werden. Die Anweisung INSERT stellt wie die Anweisung FIELD-GROUPS keinen Speicherplatz fr Felder bereit und bertrgt keine Werte. Die Anweisung INSERT erzeugt in der Feldgruppe <fg> Zeiger auf die Felder <fi> und definiert damit die Struktur der Extraktstze. Whrend der Programmausfhrung knnen solange Felder in eine Feldgruppe aufgenommen werden, bis diese Feldgruppe zum ersten mal verwendet wird, um einen Extraktsatz zu fllen. Erst ab diesem Zeitpunkt liegt die Struktur des Satzes fest und darf nicht mehr gendert werden. Vor der ersten Verwendung ist eine Feldgruppe also beliebig dynamisch erweiterbar. Da die spezielle Feldgruppe HEADER Teil jedes Extraktsatzes ist, kann die Struktur der Feldgruppe HEADER nach dem Fllen des ersten Extraktsatzes nicht mehr gendert werden. Ein Feld kann zwar in mehreren Feldgruppen vorkommen, dies fhrt jedoch zu unntiger mehrfacher Datenhaltung im Extraktdatenbestand. Die Struktur einer Feldgruppe mu nicht unbedingt explizit mit INSERT definiert werden. Falls die Feldgruppe HEADER definiert ist,

348

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Extrakt definieren

besteht eine undefinierte Feldgruppe implizit aus den Feldern der Feldgruppe HEADER, ansonsten bleibt sie leer.

REPORT demo_extract_field_groups. NODES: spfli, sflight. FIELD-GROUPS: header, flight_info, flight_date. INSERT: spfli-carrid spfli-connid sflight-fldate INTO header, spfli-cityfrom spfli-cityto INTO flight_info.
Das Programm sei mit der logischen Datenbank [Seite 1257] F1S verknpft. Die Anweisung NODES deklariert die entsprechenden Schnittstellen-Arbeitsbereiche [Seite 135]. Es werden drei Feldgruppen erzeugt. Mit der INSERT-Anweisung werden in zwei der Feldgruppen Felder aufgenommen.

April 2001

349

ABAP Programmierung (BC-ABA) Extrakt mit Daten fllen

SAP AG

Extrakt mit Daten fllen


Nach der Deklaration der mglichen Satzarten als Feldgruppen und der Definition ihrer Struktur, kann der eigentliche Extraktdatenbestand mit folgender Anweisung erzeugt werden:

EXTRACT <fg>.
Bei der ersten EXTRACT-Anweisung eines Programms wird der Extraktdatenbestand angelegt und der erste Extraktsatz hinzugefgt. Bei jeder weiteren EXTRACT-Anweisung wird dem Datenbestand ein neuer Extraktsatz hinzugefgt. Jeder Extraktsatz enthlt genau die Felder, die in der Feldgruppe <fg> enthalten sind und gegebenenfalls die Felder der Feldgruppe HEADER als Sortierschlssel am Anfang. Ohne die explizite Angabe einer Feldgruppe <fg> ist die Anweisung

EXTRACT.
eine Kurzform der Anweisung

EXTRACT HEADER.
Beim Extrahieren wird der hinzugefgte Extraktsatz mit den aktuellen Inhalten der entsprechenden Felder gefllt. Sobald die erste EXTRACT-Anweisung zu einer Feldgruppe <fg> ausgefhrt wurde, liegt die Struktur des entsprechenden Extraktsatzes im Extraktdatenbestand fest und es knnen keine weiteren Felder in die Feldgruppen <fg> und HEADER aufgenommen werden. Falls eine Feldgruppe danach modifiziert und in einer weiteren EXTRACT-Anweisung verwendet wird, kommt es zu einem Laufzeitfehler. Durch mehrfaches Ausfhren von EXTRACT-Anweisungen mit unterschiedlichen Feldgruppen, wird der Extraktdatenbestand mit Stzen unterschiedlicher Lnge und Struktur gefllt. Da die Feldgruppen bis zu ihrer ersten Verwendung in einer EXTRACT-Anweisung dynamisch modifiziert werden knnen, bieten Extraktdatenbestnde also den Vorteil, da ihre Struktur nicht zu Beginn des Programms festgelegt werden mu.

Das folgende Programm sei mit der logischen Datenbank [Seite 1257] F1S verknpft.

REPORT demo_extract_extract. NODES: spfli, sflight. FIELD-GROUPS: header, flight_info, flight_date. INSERT: spfli-carrid spfli-connid sflight-fldate INTO header, spfli-cityfrom spfli-cityto INTO flight_info. START-OF-SELECTION. GET spfli. EXTRACT flight_info. GET sflight. EXTRACT flight_date.

350

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Extrakt mit Daten fllen

Es werden drei Feldgruppen erzeugt. In der INSERT-Anweisung werden in zwei der Feldgruppen Felder aufgenommen. Whrend der GET [Seite 1048]-Ereignisse wird der Extraktdatenbestand durch zwei unterschiedliche Satzarten gefllt. Die Stze der Feldgruppe FLIGHT_INFO bestehen aus den fnf Feldern SPFLI-CARRID, SPFLICONNID, SFLIGHT-FLDATE, SPFLI-CITYFROM und SPFLI-CITYTO. Die ersten drei Felder sind die der vorangestellten Feldgruppe HEADER. Die Stze der Feldgruppe FLIGHT_DATE bestehen nur aus den drei Feldern der Feldgruppe HEADER. Die folgende Abbildung zeigt den Aufbau des Extraktdatenbestands:

April 2001

351

ABAP Programmierung (BC-ABA) Extrakte verarbeiten

SAP AG

Extrakte verarbeiten
Ein Extraktdatenbestand kann verarbeitet werden, wenn er vollstndig mit den gewnschten Daten gefllt ist. Nach der ersten Bearbeitung knnen keine weiteren Stze mehr in den Datenbestand extrahiert werden. Extrakt auslesen [Seite 353] Extrakt sortieren [Seite 356] Gruppenstufenverarbeitung [Seite 359] Anzahlen und Summen ermitteln [Seite 363]

352

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Extrakt auslesen

Extrakt auslesen
hnlich wie bei der Schleifenverarbeitung interner Tabellen knnen die Daten eines Extraktdatenbestands ber eine Schleife [Seite 259] ausgelesen werden:

LOOP. ... [AT FIRST | AT <fgi> [WITH <fgj>] | AT LAST. ... ENDAT.] ... ENDLOOP.
Mit der Anweisung LOOP wird die Erzeugung des Extraktdatenbestands eines Programms abgeschlossen und eine Schleife ber seine smtlichen Stze ausgefhrt. Es wird pro Schleifendurchlauf ein Extraktdatensatz eingelesen. Die Werte der extrahierten Daten werden innerhalb der Schleife direkt in die Ausgangsfelder zurckgestellt. Es knnen mehrere Schleifen hintereinander ausgefhrt werden. Die Schleife ber einen Extraktdatenbestand ist nicht schachtelbar. Weiterhin knnen innerhalb und nach der Schleife keine weiteren EXTRACTAnweisungen verwendet werden. In beiden Fllen kommt es zum Laufzeitfehler. Im Unterschied zu internen Tabellen wird bei Extraktdatenbestnden also kein spezieller Arbeitsbereich oder ein Feldsymbol als Schnittstelle bentigt. Fr jeden gelesenen Satz knnen die eingelesenen Daten innerhalb der Schleife unter ihren ursprnglichen Feldnamen weiterverarbeitet werden.

Schleifensteuerung
Um verschiedene Anweisungen nur fr bestimmte Stze des Datenbestands auszufhren, kann man die Steueranweisungen AT und ENDAT verwenden. Die Anweisungsblcke zwischen den Steueranweisungen werden fr die unterschiedlichen Argumente von AT wie folgt abgearbeitet:

AT FIRST Der Anweisungsblock wird einmal beim ersten Satz des Datenbestands ausgefhrt AT <fgi> [WITH <fgj>] Der Anweisungsblock wird dann abgearbeitet, wenn die Satzart des aktuellen eingelesenen Extraktsatzes durch die Feldgruppe <fgi> definiert wurde. Wenn Sie den Zusatz WITH <fgj> verwenden, mu im Extraktdatenbestand auf den eingelesenen Satz der Feldgruppe <fgi> unmittelbar ein Satz der Feldgruppe <fgj> folgen.

AT LAST Der Anweisungsblock wird einmal beim letzten Satz des Datenbestands ausgefhrt

Die Steueranweisungen AT und ENDAT knnen auch zur Gruppenstufenverarbeitung [Seite 359] eingesetzt werden.

April 2001

353

ABAP Programmierung (BC-ABA) Extrakt auslesen

SAP AG

Das folgende Programm sei mit der logischen Datenbank [Seite 1257] F1S verknpft.

REPORT demo_extract_loop. NODES: spfli, sflight. FIELD-GROUPS: header, flight_info, flight_date. INSERT: spfli-carrid spfli-connid sflight-fldate INTO header, spfli-cityfrom spfli-cityto INTO flight_info. START-OF-SELECTION. GET spfli. EXTRACT flight_info. GET sflight. EXTRACT flight_date. END-OF-SELECTION. LOOP. AT FIRST. WRITE / 'Start of LOOP'. ULINE. ENDAT. AT flight_info WITH flight_date. WRITE: / 'Info:', spfli-carrid , spfli-connid, sflight-fldate, spfli-cityfrom, spfli-cityto. ENDAT. AT flight_date. WRITE: / 'Date:', spfli-carrid , spfli-connid, sflight-fldate. ENDAT. AT LAST. ULINE. WRITE / 'End of LOOP'. ENDAT. ENDLOOP.
Das Anlegen und Fllen des Extraktdatenbestands entspricht dem Beispiel unter Extrakt mit Daten fllen [Seite 350]. Zum Zeitpunkt END-OF-SELECTION [Seite 1053] ist die Datenbeschaffung durch die logische Datenbank abgeschlossen und der Datenbestand wird in der LOOP-Schleife einmal gelesen. Durch die Steueranweisungen AT FIRST und AT LAST werden zu Beginn und Ende der Schleife jeweils eine Zeile und eine Linie in die Liste geschrieben. Durch die Steueranweisung AT <fgi> werden fr jede der beiden Satzarten die entsprechenden Felder ausgegeben. Durch den Zusatz WITH FLIGHT_DATE werden die Stze der Feldgruppe FLIGHT_INFO nur dann ausgegeben, wenn danach mindestens ein Satz der Feldgruppe FLIGHT_DATE kommt, also wenn die logische Datenbank zu einem Flug mindestens ein Datum bergeben hat.

354

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Extrakt auslesen

Der Anfang der Ausgabeliste sieht etwa folgendermaen aus:

Da der Inhalt des Felds SFLIGHT-FLDATE im Bereich HEADER der Satzart FLIGHT_INFO auf der Liste als Gatter (#) dargestellt ist, liegt daran, da die logische Datenbank am Ende einer Hierarchiestufe alle Felder dieser Stufe mit HEXNullwerten fllt. Diese Eigenschaft ist wichtig fr das Sortieren und die Gruppenstufenverarbeitung [Seite 359] von Extraktdatenbestnden.

April 2001

355

ABAP Programmierung (BC-ABA) Extrakt sortieren

SAP AG

Extrakt sortieren
hnlich wie bei der Sortierung interner Tabellen knnen die Daten eines Extraktdatenbestands mit folgender Anweisung sortiert werden:

SORT [ASCENDING|DESCENDING] [AS TEXT] [STABLE] BY <f1> [ASCENDING|DESCENDING] [AS TEXT] ... <fn> [ASCENDING|DESCENDING] [AS TEXT].
Die Anweisung SORT schliet die Erzeugung des Extraktdatenbestands eines Programms ab und sortiert gleichzeitig dessen Stze. Ohne den Zusatz BY, wird der Datenbestand nach dem durch die Feldgruppe HEADER festgelegten Schlssel sortiert. Ein Extraktdatenbestand kann beliebig oft in einem Programm mit verschiedenen Schlsseln sortiert werden. Voraussetzung dafr ist lediglich, da alle Felder, nach denen sortieren werden soll, bereits beim Extrahieren der Daten im HEADER stehen. Die SORT-Anweisung darf nicht in einer LOOP- Schleife stehen. Sortieren und Lesen des Extraktdatenbestands knnen aber beliebig nacheinander ausgefhrt werden. Nach Ausfhrung der SORT-Anweisung drfen keine weiteren EXTRACT-Anweisungen mehr verwendet werden. Es kommt ansonsten zu einem Laufzeitfehler. Mit dem Zusatz BY kann ein anderer Sortierschlssel definiert werden. Dann wird der Datenbestand nach den angegebenen Komponenten <f1>... <fn> sortiert. Diese Komponenten mssen entweder Felder der Feldgruppe HEADER sein, oder Feldgruppen, die nur Felder der Feldgruppe HEADER enthalten. Die Zahl der Sortierschlsselfelder ist auf 50 begrenzt. Die Reihenfolge der Komponenten <f1>... <fn> bestimmt die Prioritt der Sortierung. Die Zustze, die vor BY stehen, wirken standardmig fr alle hinter BY angegebenen Felder. Die Zustze, die hinter den einzelnen Felder stehen, berschreiben fr diese Felder die vor BY angegebenen Zustze. Die Sortierreihenfolge kann ber DESCENDING (absteigend) oder ASCENDING (aufsteigend) definiert werden. Standardmig wird aufsteigend sortiert. Fr Zeichenketten kann die Sortiermethode ber den Zusatz AS TEXT bestimmt werden. Der Zusatz bewirkt wie bei internen Tabellen [Seite 286] eine alphabetische Sortierung. Falls ein Extraktdatenbestand mehrfach alphabetisch sortiert werden soll, empfiehlt es sich aus Performancegrnden, statt des Textfeldes ein alphabetisch sortierbares Feld in den Sortierschlssel aufzunehmen, welches mit der CONVERT-Anweisung [Seite 174] gefllt wird. Wenn AS TEXT vor BY steht, wirkt der Zusatz nur auf Felder des Typs C im Sortierschlssel. Wenn AS TEXT hinter einem Sortierschlsselfeld steht, mu dieses vom Typ C sein. Wenn AS TEXT hinter einer Feldgruppe steht wirkt der Zusatz nur auf Felder des Typs C in dieser Gruppe. Die Sortierung ist standardmig nicht stabil, d.h. die alte Reihenfolge von Stzen mit dem gleichen Sortierschlssel wird nicht unbedingt beibehalten. Mit dem Zusatz STABLE kann die stabile Sortierung erzwungen werden. Falls nicht gengend Hauptspeicher zur Sortierung der Daten zur Verfgung steht, werden Daten beim Sortieren in eine externe Hilfsdatei geschrieben, die durch den SAP-Profile-Parameter DIR_SORTTMP bestimmt wird. Die Anweisung SORT sortiert alle Felder des Sortierschlssels, die den Inhalt HEX-Null haben immer vor alle andere Eintrge. Dies ist wichtig bei der Verwendung logischer Datenbanken [Seite 1257]. Eine logische Datenbank fllt nach dem Lesen aller Daten einer Hierarchiestufe alle Felder dieser Stufe mit HEX-Null. Bei der Verwendung einer Feldliste in der GET [Seite 1048]-

356

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Extrakt sortieren

Anweisung (Zusatz FIELDS) fllt die logische Datenbank alle Felder, die nicht in der Feldliste aufgefhrt sind ebenfalls mit HEX-Null. Jede Sortierung des Extraktdatenbestands mit der SORT-Anweisung definiert Gruppenstufen und ist die Vorraussetzung fr die Gruppenstufenverarbeitung [Seite 359].

Das folgende Programm sei mit der logischen Datenbank [Seite 1257] F1S verknpft.

REPORT demo_extract_sort. NODES: spfli, sflight. FIELD-GROUPS: header, flight_info, flight_date. INSERT: spfli-carrid spfli-connid sflight-fldate INTO header, spfli-cityfrom spfli-cityto INTO flight_info. START-OF-SELECTION. GET spfli. EXTRACT flight_info. GET sflight. EXTRACT flight_date. END-OF-SELECTION. SORT DESCENDING. LOOP. AT FIRST. WRITE / 'Start of LOOP'. ULINE. ENDAT. AT flight_info WITH flight_date. WRITE: / 'Info:', spfli-carrid , spfli-connid, sflight-fldate, spfli-cityfrom, spfli-cityto. ENDAT. AT flight_date. WRITE: / 'Date:', spfli-carrid , spfli-connid, sflight-fldate. ENDAT. AT LAST. ULINE. WRITE / 'End of LOOP'. ENDAT. ENDLOOP.
Dieses Beispiel ist bis auf die Anweisung SORT DESCENDING identisch zum Beispiel unter Extrakt auslesen [Seite 353]. Durch die SORT-Anweisung wird der Extraktdatenbestand vor dem Lesen durch die Schleife LOOP-ENDLOOP absteigend nach den drei Feldern in der Feldgruppe HEADER sortiert. Das Ende der Ausgabeliste sieht wie folgt aus:

April 2001

357

ABAP Programmierung (BC-ABA) Extrakt sortieren

SAP AG

Beachtenswert ist, da die Stze mit dem Wert HEX-Null in dem Feld SFLIGHTFLDATE (undefinierte Zeichen auf der Liste) vor die brigen Stze sortiert werden. Dadurch bleibt die Hierarchie der Daten aus der logischen Datenbank unabhngig von der brigen Sortierreihenfolge erhalten.

358

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Gruppenstufenverarbeitung

Gruppenstufenverarbeitung
Durch die Ausfhrung einer Sortierung ber die SORT-Anweisung werden Gruppenstufen im Extraktdatenbestand definiert. Allgemeine Hinweise zu Gruppenstufen finden sich bei der Schleifenverarbeitung interner Tabellen [Seite 315]. Die Gruppenstufenhierarchie eines Extraktdatenbestands entspricht der Reihenfolge der Felder in der Feldgruppe HEADER. Nach der Sortierung kann die AT-Anweisung in einer LOOP-Schleife eingesetzt werden, um Anweisungsblcke anzulegen, die nur bei Gruppenstufenwechseln verarbeitet werden:

AT NEW <f> | AT END OF <f>. ... ENDAT.


Ein Gruppenstufenwechsel liegt vor, wenn das Feld <f> oder ein bergeordnetes Feld des Sortierschlssels im aktuellen Extraktsatz einen anderen Wert hat als im vorhergehenden Satz (bei AT NEW) bzw. nachfolgenden Satz (bei AT END) des Extraktdatenbestands. Das Feld <f> mu in der Feldgruppe HEADER enthalten sein. Wenn der Extraktdatenbestand nicht sortiert ist, wird der Anweisungsblock innerhalb AT-ENDAT nie ausgefhrt. Weiterhin werden bei der Bestimmung von Gruppenwechseln alle Extraktstze ignoriert, bei denen die Feldinhalte von <f> HEX-Null sind. Die AT... ENDAT-Verarbeitungsblcke einer Schleife werden gem ihrer Reihenfolge bearbeitet. Diese Reihenfolge sollte der Prioritt der Sortierung entsprechen. Diese ist nicht unbedingt die Reihenfolge der Felder in der Feldgruppe HEADER, sondern kann auch in der SORT-Anweisung bestimmt werden. Wurde ein Extraktdatenbestand nach den Feldern <f1>, <f2>,... sortiert, so sollte die Gruppenstufenverarbeitung wie folgt in der LOOP-Schleife zwischen den anderen Schleifensteueranweisungen angeordnet werden:

LOOP. AT FIRST.... ENDAT. AT NEW <f1>....... ENDAT. AT NEW <f2>....... ENDAT. ... AT <fgi>..... ENDAT. <Einzelsatzverarbeitung ohne Steueranweisung> ... AT END OF <f2>.... ENDAT. AT END OF <f1>.... ENDAT. AT LAST..... ENDAT. ENDLOOP.
Es mssen nicht alle der hier gezeigten Anweisungsblcke verwendet werden, sondern nur die wirklich bentigten.

REPORT demo_extract_at_new. DATA: t1(4) TYPE c, t2 TYPE i. FIELD-GROUPS: header. INSERT t2 t1 INTO header.

April 2001

359

ABAP Programmierung (BC-ABA) Gruppenstufenverarbeitung

SAP AG

t1 t1 t1 t1 t1 t1 t1 t1 t1 t1

='AABB'. ='BBCC'. ='AAAA'. ='AABB'. ='BBBB'. ='BBCC'. ='AAAA'. ='BBBB'. ='AAAA'. ='AABB'.

t2 t2 t2 t2 t2 t2 t2 t2 t2 t2

= = = = = = = = = =

1. 2. 2. 1. 2. 2. 1. 1. 3. 1.

EXTRACT EXTRACT EXTRACT EXTRACT EXTRACT EXTRACT EXTRACT EXTRACT EXTRACT EXTRACT

header. header. header. header. header. header. header. header. header. header.

SORT BY t1 t2. LOOP. AT FIRST. WRITE 'Start of LOOP'. ULINE. ENDAT. AT NEW t1. WRITE / ' ENDAT. AT NEW t2. WRITE / ' ENDAT. New T1:'.

New T2:'.

WRITE: /14 t1, t2. AT END OF t2. WRITE / 'End of T2'. ENDAT. AT END OF t1. WRITE / 'End of T1'. ENDAT. AT LAST. ULINE. ENDAT. ENDLOOP.
Es wird ein Beispielextrakt erstellt, der nur die Felder der Feldgruppe HEADER enthlt. Nach der Sortierung treten die in der folgenden Abbildung angedeuteten Gruppenstufenwechsel im Extraktdatenbestand auf.

360

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Gruppenstufenverarbeitung

In der LOOP-Schleife werden der Inhalt des Datenbestands und die erkannten Gruppenstufenwechsel wie folgt ausgegeben:

April 2001

361

ABAP Programmierung (BC-ABA) Gruppenstufenverarbeitung

SAP AG

362

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Anzahlen und Summen ermitteln

Anzahlen und Summen ermitteln


Beim Auslesen eines sortierten Extraktdatenbestands mit LOOP, kann auf zwei automatisch generierte Felder CNT(<f>) und SUM(<g>) zugegriffen werden. Diese Felder enthalten die Anzahlen unterschiedlicher Werte bzw. Summen ber numerische Felder. Die Felder werden am Ende einer Gruppenstufe und nach dem Einlesen des letzten Satzes des Datenbestands wie folgt gefllt:

CNT(<f>) Falls <f> ein nichtnumerisches Feld der Feldgruppe HEADER ist und der Extraktdatenbestand auch nach <f> sortiert wurde, steht in CNT(<f>) die Anzahl der unterschiedlichen Werte, die <f> innerhalb der Gruppenstufe bzw. des gesamten Datenbestands hat.

SUM(<g>) Falls <g> ein numerisches Feld des Extraktdatenbestands ist, steht in SUM (<g>) die Summe der Werte von <g> innerhalb der Gruppenstufe bzw. des gesamten Datenbestands.

Auf die Felder kann vor Gruppenstufenwechseln in den Verarbeitungsblcken nach AT END OF bzw. nach dem Einlesen des gesamten Datenbestands im Verarbeitungsblock nach AT LAST zugegriffen werden. Beim Zugriff auf die Felder CNT(<f>) und SUM(<g>) ohne vorherige Sortierung des Datenbestands kann es zu einem Laufzeitfehler kommen.

REPORT demo_extract_cnt_sum . DATA: t1(4) TYPE c, t2 TYPE i. FIELD-GROUPS: header, test. INSERT t2 t1 INTO header. t1 t1 t1 t1 t1 t1 t1 t1 t1 t1 ='AABB'. ='BBCC'. ='AAAA'. ='AABB'. ='BBBB'. ='BBCC'. ='AAAA'. ='BBBB'. ='AAAA'. ='AABB'. t2 t2 t2 t2 t2 t2 t2 t2 t2 t2 = = = = = = = = = = 1. 2. 2. 1. 2. 2. 1. 1. 3. 1. EXTRACT EXTRACT EXTRACT EXTRACT EXTRACT EXTRACT EXTRACT EXTRACT EXTRACT EXTRACT test. test. test. test. test. test. test. test. test. test.

SORT BY t1 t2. LOOP. WRITE: /20 t1, t2. AT END OF t2. ULINE. WRITE: 'Sum:', 20 sum(t2). ULINE. ENDAT.

April 2001

363

ABAP Programmierung (BC-ABA) Anzahlen und Summen ermitteln

SAP AG

AT END OF t1. WRITE: 'Different values:', (6) cnt(t1). ULINE. ENDAT. AT LAST. ULINE. WRITE: 'Sum:', 20 sum(t2), / 'Different values:', (6) cnt(t1). ENDAT. ENDLOOP.
Es wird ein Beispielextrakt erstellt, der nur die Felder der Feldgruppe HEADER enthlt. Nach der Sortierung, werden der Inhalt des Datenbestands, sowie die Anzahl der verschiedenen Felder T1 und die Summen der Felder T2 am Ende jeder Gruppenstufe und am Ende der Schleife wie folgt ausgegeben:

364

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Anzahlen und Summen ermitteln

April 2001

365

ABAP Programmierung (BC-ABA) Daten aufbereiten

SAP AG

Daten aufbereiten
Dieser Abschnitt zeigt den Einsatz von internen Tabellen und Extrakten bei der Datenverarbeitung am Beispiel der Aufbereitung von Daten fr die Darstellung auf einer Liste. Die aufzubereitenden Datenmengen werden im allgemeinen aus Datenbanktabellen oder aus externen Dateien gelesen, oder es werden generische Daten im Programm selbst erstellt. Datenaufbereitung fr eine Liste bedeutet meistens Sortierung der Daten, Berechnung von Summen, Abzhlen von Posten und so weiter. Das Beispiel fr aufbereitete Daten [Seite 367] zeigt eine Liste, deren Ausgabedaten entsprechend bearbeitet wurden. Bei der Aufbereitung von Daten ist zu unterscheiden zwischen der Aufbereitung whrend der Datenbeschaffung und der Aufbereitung nach der Datenbeschaffung.

Daten whrend der Beschaffung aufbereiten


Bei der generischen Erstellung eigener Datenbestnde oder beim Zugriff ber Open SQLAnweisungen auf Datenbanken knnen Daten unter Umstnden schon bei der Beschaffung ausreichend aufbereitet werden.

Daten nach der Beschaffung aufbereiten


Beim Zugriff auf Datenbanktabellen ber logische Datenbanken, beim Lesen aus sequentiellen Dateien, oder wenn z.B. die Mglichkeiten von Open SQL nicht ausreichend sind, stehen die Daten dem Programm oft in einer Reihenfolge und Struktur zur Verfgung, die nachbearbeitet werden mu. Um solche Daten nachtrglich aufzubereiten, speichert man die Daten whrend der Beschaffung in einem temporren Datenbestand ab. Dabei ist die Aufbereitung unabhngig von der Methode der Datenbeschaffung. Der Programmablauf bei der direkten Ausfhrung von Reports [Seite 1034] ist an diese Vorgehensweise angepasst. In ABAP dienen interne Tabellen und Extrakte zur Abspeicherung solcher temporren Datenbestnde.

Interne Tabellen
Der Einsatz interner Tabellen ist sinnvoll, wenn die Datenbestnde die zugrundeliegenden Datenstrukturen mglichst direkt abbilden sollen, und wenn direkt auf einzelne Daten zugegriffen werden soll.

Extraktdatenbestnde
Der Einsatz eines Extrakts ist sinnvoll, wenn groe Datenmengen wiederholt und in Ihrer Gesamtheit verarbeitet werden sollen. Daten beim Lesen aufbereiten [Seite 369] Daten ber interne Tabellen aufbereiten [Seite 371] Daten ber Extrakte aufbereiten [Seite 375]

366

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Beispiel fr aufbereitete Daten

Beispiel fr aufbereitete Daten


Bei vielen Auswertungen mssen Daten in einer anderen Reihenfolge verarbeitet werden, als sie abgespeichert sind. Da die Ergebnisse von Leseoperationen normalerweise aber die Reihenfolge der Speicherung widerspiegeln, mu das gesamte selektierte Datenmaterial umsortiert werden. Ein typisches Ergebnis einer Datenaufbereitung im Zusammenhang mit einer FlugbuchungsAnwendung ist das Erstellen einer Liste [Seite 827], die Buchungsdaten fr jede Flugnummer liefern soll. Die Flugverbindungen sollen nach Abflugsort, die Flge nach Datum und die Kundendaten nach Klasse und Raucher/Nichtraucher sortiert sein. Zu jedem Flug soll die Anzahl der Passagiere und das gesamte Gepckgewicht bestimmt werden. Ein Ausschnitt aus der Ausgabeliste soll etwa wie folgt aussehen:

April 2001

367

ABAP Programmierung (BC-ABA) Beispiel fr aufbereitete Daten

SAP AG

368

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Daten beim Lesen aufbereiten

Daten beim Lesen aufbereiten


Eine Methode der Datenaufbereitung besteht darin, die entsprechenden Zustze der SELECTAnweisung zu verwenden. Bei dieser Methode der Aufbereitung mssen smtliche Datenbankzugriffe selbst programmiert werden. Auerdem mte noch ein Selektionsbild programmiert werden, das es dem Benutzer erlaubt, die Menge der gelesenen Daten einzuschrnken. Schlielich ist die gezeigte Methode der geschachtelten SELECT-Schleifen uerst unperformant. Es empfiehlt sich, die Daten blockweise in interne Tabellen oder Extrakte zu stellen und nachtrglich zu bearbeiten.

REPORT demo_data_process_read. DATA: sum TYPE i, cnt TYPE i, wa_spfli TYPE spfli, wa_sflight TYPE sflight, wa_sbook TYPE sbook. SELECT * FROM spfli INTO wa_spfli ORDER BY cityfrom cityto connid. SKIP. WRITE: / wa_spfli-carrid, wa_spfli-connid, 'from', (15) wa_spfli-cityfrom, 'to', (15) wa_spfli-cityto. ULINE. SELECT * FROM sflight INTO wa_sflight WHERE carrid = wa_spfli-carrid AND connid = wa_spfli-connid ORDER BY fldate. SKIP. WRITE: / 'Date:', wa_sflight-fldate. WRITE: 20 'Book-ID', 40 'Smoker', 50 'Class'. ULINE. sum = 0. cnt = 0. SELECT * FROM sbook INTO wa_sbook WHERE carrid = AND connid = AND fldate = ORDER BY class

wa_sflight-carrid wa_sflight-connid wa_sflight-fldate smoker bookid.

WRITE: / wa_sbook-bookid UNDER 'Book-ID', wa_sbook-smoker UNDER 'Smoker', wa_sbook-class UNDER 'Class'. sum = sum + wa_sbook-luggweight. cnt = cnt + 1. ENDSELECT.

April 2001

369

ABAP Programmierung (BC-ABA) Daten beim Lesen aufbereiten

SAP AG

ULINE. WRITE: 'Number of bookings: ', (3) cnt, / 'Total luggage weight:', (3) sum, wa_sbook-wunit. ENDSELECT. ENDSELECT.
Dieses Programm erzeugt die Liste in Beispiel fr aufbereitete Daten [Seite 367]. Es verwendet den Zusatz ORDER BY der SELECT-Anweisung fr die Sortierung der Daten.

370

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Daten ber interne Tabellen aufbereiten

Daten ber interne Tabellen aufbereiten


Um Daten aus Datenbanktabellen in internen Tabellen abzuspeichern, verwendet man oft fr jede gelesene Datenbanktabelle eine interne Tabelle, die einen Teil oder alle Spalten der Datenbanktabelle enthlt. Dabei kann man jede Datenbanktabelle auf eine interne Tabelle flacher Struktur abbilden oder auch tiefe interne Tabellen mit geschachtelten Strukturen anlegen. Bei mehreren Tabellen mit flacher Struktur mu man mit redundanten Schlsseln arbeiten um die Tabellen zu verknpfen. Bei geschachtelten internen Tabellen knnen die Daten der Datenbanktabellen auch hierarchisch abgelegt werden. Das Abspeichern von Daten in internen Tabellen und die nachfolgende Aufbereitung hat jedoch Nachteile bei sehr groen Datenmengen. Beim Verteilen sehr groer Datenmengen auf verschiedene interne Tabellen, kann der Laufzeitbedarf whrend der Aufbereitung recht hoch werden, da alle Tabellen einzeln abgearbeitet werden mssen. Da interne Tabellen unkomprimiert gespeichert werden, bedeuten groe Datenmengen weiterhin einen hohen Speicherplatzbedarf. Gegebenenfalls mu das System den Datenbestand aus dem Arbeitsspeicher auslagern, was die Ausfhrung der Bearbeitung nochmals verlangsamt.

Datenaufbereitung mit flachen internen Tabellen


Das folgende Programm sei mit der logischen Datenbank [Seite 1257] F1S verknpft.

REPORT demo_data_process_int_tables_1. DATA: sum TYPE i, cnt TYPE i. NODES: spfli, sflight, sbook. DATA: tab_spfli TYPE TABLE OF spfli, tab_sflight TYPE TABLE OF sflight, tab_sbook TYPE TABLE OF sbook. DATA: wa_spfli LIKE LINE OF tab_spfli, wa_sflight LIKE LINE OF tab_sflight, wa_sbook LIKE LINE OF tab_sbook. START-OF-SELECTION. GET spfli. APPEND spfli TO tab_spfli. GET sflight. APPEND sflight TO tab_sflight. GET sbook. APPEND sbook TO tab_sbook. END-OF-SELECTION. SORT: tab_spfli BY cityfrom cityto connid, tab_sflight BY fldate, tab_sbook BY class smoker bookid. LOOP AT tab_spfli INTO wa_spfli.

April 2001

371

ABAP Programmierung (BC-ABA) Daten ber interne Tabellen aufbereiten

SAP AG

SKIP. WRITE: / wa_spfli-carrid, wa_spfli-connid, 'from', (15) wa_spfli-cityfrom, 'to', (15) wa_spfli-cityto. ULINE. LOOP AT tab_sflight INTO wa_sflight WHERE carrid = wa_spfli-carrid AND connid = wa_spfli-connid. SKIP. WRITE: / 'Date:', wa_sflight-fldate. WRITE: 20 'Book-ID', 40 'Smoker', 50 'Class'. ULINE. sum = 0. cnt = 0. LOOP AT tab_sbook INTO wa_sbook WHERE carrid = wa_sflight-carrid AND connid = wa_sflight-connid AND fldate = wa_sflight-fldate. WRITE: / wa_sbook-bookid UNDER 'Book-ID', wa_sbook-smoker UNDER 'Smoker', wa_sbook-class UNDER 'Class'. sum = sum + wa_sbook-luggweight. cnt = cnt + 1. ENDLOOP. ULINE. WRITE: 'Number of bookings: ', (3) cnt, / 'Total luggage weight:', (3) sum, wa_sbook-wunit. ENDLOOP. ENDLOOP.
Dieses Programm erzeugt die Liste in Beispiel fr aufbereitete Daten [Seite 367]. Die Datenbeschaffung ber GET [Seite 1048]-Ereignisse ist deutlich von der Sortierung getrennt. Struktur und der Inhalt der Datenbanktabellen werden vollstndig auf drei interne Tabellen abgebildet. Nach der Sortierung werden die Tabelleninhalte ausgegeben. Die Schleifenstruktur entspricht genau der Struktur der SELECT-Schleifen des Beispiels unter Daten beim Lesen aufbereiten [Seite 369].

Datenaufbereitung mit geschachtelten internen Tabellen


Das folgende Programm sei mit der logischen Datenbank [Seite 1257] F1S verknpft.

REPORT demo_data_process_int_tables_2. DATA: sum TYPE i, cnt TYPE i.

372

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Daten ber interne Tabellen aufbereiten

NODES: spfli, sflight, sbook. DATA: BEGIN OF wa_sbook, bookid TYPE sbook-bookid, smoker TYPE sbook-smoker, class TYPE sbook-class, luggweight TYPE sbook-luggweight, wunit TYPE sbook-wunit, END OF wa_sbook. DATA: BEGIN OF wa_sflight, fldate TYPE sflight-fldate, sbook LIKE TABLE OF wa_sbook, END OF wa_sflight. DATA: BEGIN OF wa_spfli, carrid TYPE spfli-carrid, connid TYPE spfli-connid, cityfrom TYPE spfli-cityfrom, cityto TYPE spfli-cityto, sflight LIKE TABLE OF wa_sflight, END OF wa_spfli. DATA tab_spfli LIKE TABLE OF wa_spfli. START-OF-SELECTION. GET spfli. REFRESH wa_spfli-sflight. GET sflight. REFRESH wa_sflight-sbook. GET sbook. MOVE-CORRESPONDING sbook TO wa_sbook. APPEND wa_sbook TO wa_sflight-sbook. GET sflight LATE. MOVE-CORRESPONDING sflight TO wa_sflight. APPEND wa_sflight TO wa_spfli-sflight. GET spfli LATE. MOVE-CORRESPONDING spfli TO wa_spfli. APPEND wa_spfli TO tab_spfli. END-OF-SELECTION. SORT tab_spfli BY cityfrom cityto connid. LOOP AT tab_spfli INTO wa_spfli. SKIP. WRITE: / wa_spfli-carrid, wa_spfli-connid, 'from', (15) wa_spfli-cityfrom, 'to', (15) wa_spfli-cityto. ULINE. SORT wa_spfli-sflight BY fldate. LOOP AT wa_spfli-sflight INTO wa_sflight. SKIP. WRITE: / 'Date:', wa_sflight-fldate. WRITE: 20 'Book-ID', 40 'Smoker', 50 'Class'.

April 2001

373

ABAP Programmierung (BC-ABA) Daten ber interne Tabellen aufbereiten

SAP AG

ULINE. SORT wa_sflight-sbook BY class smoker bookid. sum = 0. cnt = 0. LOOP AT wa_sflight-sbook INTO wa_sbook. WRITE: / wa_sbook-bookid UNDER 'Book-ID', wa_sbook-smoker UNDER 'Smoker', wa_sbook-class UNDER 'Class'. sum = sum + wa_sbook-luggweight. cnt = cnt + 1. ENDLOOP. ULINE. WRITE: 'Number of bookings: ', (3) cnt, / 'Total luggage weight:', (3) sum, wa_sbook-wunit. ENDLOOP. ENDLOOP.
Dieses Programm erzeugt die Liste in Beispiel fr aufbereitete Daten [Seite 367]. Whrend der GET [Seite 1048]-Ereignisse werden die Daten in die dreifach geschachtelte Tabelle TAB_SPFLI mit der Untertabelle SFLIGHT und deren Untertabelle SBOOK eingelesen. Die Sortierung erfolgt in den einzelnen Schachtelungsebenen. Diese Programmierung erfordert keine Schlsselbeziehungen zwischen den internen Tabellen (keine WHERE-Bedingungen), ist aber komplexer als mit flachen Tabellen. Der interne Verwaltungsaufwand ist ebenfalls hher, was sich negativ auf den Speicherplatzbedarf und die Laufzeit auswirken kann.

374

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Daten ber Extrakte aufbereiten

Daten ber Extrakte aufbereiten


Die Stze verschiedener Datenbanktabellen knnen in einem einzigen Extrakt gespeichert werden, da die Einzelstze in Extrakten verschieden strukturiert sein knnen.

Das folgende Programm sei mit der logischen Datenbank [Seite 1257] F1S verknpft.

REPORT demo_data_process_extract. NODES: spfli, sflight, sbook. FIELD-GROUPS: header, flight_info, flight_booking. INSERT: spfli-cityfrom spfli-cityto spfli-connid sflight-fldate sbook-class sbook-smoker sbook-bookid INTO header, spfli-carrid INTO flight_info, sbook-luggweight sbook-wunit INTO flight_booking. START-OF-SELECTION. GET spfli. EXTRACT flight_info. GET sflight. GET sbook. EXTRACT flight_booking. END-OF-SELECTION. SORT. LOOP. AT flight_info. SKIP. WRITE: / spfli-carrid, spfli-connid, 'from', (15) spfli-cityfrom, 'to', (15) spfli-cityto. ULINE. ENDAT. AT NEW sflight-fldate. SKIP. WRITE: / 'Date:', sflight-fldate. WRITE: 20 'Book-ID', 40 'Smoker', 50 'Class'. ULINE. ENDAT. AT flight_booking. WRITE: / sbook-bookid UNDER 'Book-ID', sbook-smoker UNDER 'Smoker', sbook-class UNDER 'Class'. ENDAT. AT END OF sflight-fldate.

April 2001

375

ABAP Programmierung (BC-ABA) Daten ber Extrakte aufbereiten

SAP AG

ULINE. WRITE: 'Number of bookings: ', (3) cnt(sbook-bookid), / 'Total luggage weight:', sum(sbook-luggweight), sbook-wunit. ENDAT. ENDLOOP.
Dieses Programm erzeugt die Liste in Beispiel fr aufbereitete Daten [Seite 367]. Es werden drei Feldgruppen angelegt, in die verschiedene Felder aufgenommen werden. Whrend der GET [Seite 1048]-Ereignisse wird der Extraktdatenbestand ber EXTRACT-Anweisungen gefllt. Bei GET SFLIGHT steht keine EXTRACTAnweisung, da das gewnschte Feld SFLIGHT_FLDATE Teil der Feldgruppe HEADER ist und somit automatisch bei jedem untergeordneten Ereignis GET SBOOK extrahiert wird. Nach der Datenbeschaffung wird die Erzeugung des Datenbestands ber die SORTAnweisung abgeschlossen und nach dem Sortierschlssel HEADER sortiert. In der LOOP-ENDLOOP-Schleife wird der sortierte Extraktdatenbestand in die Ausgabeliste geschrieben, wobei verschiedene AT-ENDAT-Blcke, sowie die Felder CNT(...) und SUM(...) zum Einsatz kommen.

376

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Externe Datenspeicherung

Externe Datenspeicherung
Dieser Abschnitt beschreibt die externe Datenspeicherung in ABAP, also wie Daten aus ABAPProgrammen abgespeichert und wieder gelesen werden knnen. Die hier beschriebenen Techniken ergnzen die persistente Speicherung von Daten in der zentralen Datenbank des R/3Systems. Datenobjekte als Cluster speichern [Seite 378] Arbeiten mit Dateien [Seite 401]

April 2001

377

ABAP Programmierung (BC-ABA) Datenobjekte als Cluster speichern

SAP AG

Datenobjekte als Cluster speichern


Sie knnen beliebig komplexe interne Datenobjekte eines ABAP-Programms in sogenannten Daten-Clustern zusammenfassen und temporr im ABAP- Memory oder dauerhaft in Datenbanken abspeichern.

In den folgenden Topics erfahren Sie mehr ber die Speicherung von Daten-Clustern im Memory und in Datenbanken
Daten-Cluster im ABAP-Memory [Seite 379] Daten-Cluster in Datenbanken [Seite 384]

378

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Daten-Cluster im ABAP-Memory

Daten-Cluster im ABAP-Memory
Sie knnen Daten-Cluster im ABAP-Memory abspeichern. Das ABAP-Memory ist ein Speicherbereich im internen Modus (Rollbereich) eines ABAP-Programms und den von dort ber das Schlsselwort CALL TRANSACTION oder SUBMIT aufgerufenen Programmen. Das ABAP-Memory ist unabhngig von welchem ABAP-Programm oder Programm-Modul es innerhalb einer Aufrufkette erzeugt wird. D.h. ein als ABAP-Memory abgespeichertes Objekt kann von einem beliebigen ABAP-Programm einer Aufrufkette wieder gelesen werden. Das in diesem Abschnitt beschriebene ABAP-Memory ist aber nicht das gleiche wie das transaktionsbergreifende globale SAP-Memory. Mehr dazu findet sich auch unter Daten zwischen Programmen bergeben [Seite 1119]. Damit haben Sie die Mglichkeit, Daten ber mehrere Stufen der Programmhierarchie zwischen verschiedenen Modularisierungseinheiten zu bergeben. Zum Beispiel knnen Sie Daten bergeben zwischen:

Ausfhrbaren Programmen (Reports) und anderen Reports, die mit SUBMIT aufgerufen werden Transaktionen und ausfhrbaren Programmen (Reports) verschiedenen Dialogbausteinen Programmen und Funktionsbausteinen

und so weiter. Das Memory wird beim Verlassen der Transaktion wieder freigegeben. Sie speichern Datenobjekte im Memory mit der Anweisung EXPORT TO MEMORY.
Datenobjekte im Memory speichern [Seite 380]

Sie lesen Datenobjekte aus dem Memory mit der Anweisung IMPORT FROM MEMORY.
Datenobjekte aus dem Memory lesen [Seite 381]

Sie lschen Daten-Cluster im Memory mit der Anweisung FREE MEMORY.


Daten-Cluster im Memory lschen [Seite 383]

April 2001

379

ABAP Programmierung (BC-ABA) Daten-Cluster im ABAP-Memory

SAP AG

Datenobjekte im Memory speichern


Um Datenobjekte aus einem ABAP-Programm in das ABAP-Memory zu schreiben, verwenden Sie die folgende Anweisung:
Syntax

EXPORT <f1> [FROM <g1>] <f2> [FROM <g2>] ... TO MEMORY ID <key>.
Diese Anweisung legt die in der Liste angegebenen Datenobjekte als Cluster im Memory ab. Ohne Verwendung der Option FROM <gi> wird ein Datenobjekt <fi> unter seinem Namen abgespeichert. Verwenden Sie diese Option, wird ein Datenobjekt <gi> unter dem Namen <fi> abgespeichert. Mit der Bezeichnung <key>, die maximal 32 Stellen haben kann, identifizieren Sie die Daten im Memory. Die EXPORT-Anweisung berschreibt immer vollstndig den Inhalt eines eventuell vorhandenen Daten-Clusters mit der gleichen Bezeichnung <key>.

Bei internen Tabellen mit Kopfzeile kann nur die eigentliche Tabelle, nicht die Kopfzeile abgespeichert werden. Bei der EXPORT-Anweisung wird der Tabellenname als Tabelle interpretiert. Dies ist eine Ausnahme von der allgemeinen Regel, nach der Anweisungen den Tabellennamen normalerweise als Tabellenarbeitsbereich interpretieren (siehe Auswahl eines Tabellentyps [Seite 291]).

REPORT demo_data_ext_cluster_export. DATA text1(10) TYPE c VALUE 'Exporting'. DATA: itab TYPE TABLE OF sbook, wa_itab LIKE LINE OF itab. DO 5 TIMES. wa_itab-bookid = 100 + sy-index. APPEND wa_itab TO itab. ENDDO. EXPORT text1 text2 = 'Literal' TO MEMORY ID 'text'. EXPORT itab TO MEMORY ID 'table'.
In diesem Beispiel werden die Textfelder TEXT1 und TEXT2 unter der Bezeichnung "text" und die interne Tabelle ITAB unter der Bezeichnung "table" im ABAP-Memory des Programms SAPMZTS1 gespeichert.

380

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Daten-Cluster im ABAP-Memory

Datenobjekte aus dem Memory lesen


Um Datenobjekte aus dem ABAP-Memory in ein ABAP-Programm zu lesen, verwenden Sie die folgende Anweisung:
Syntax

IMPORT <f1> [TO <g1>] <f2> [TO <g2>] ... FROM MEMORY ID <key>.
Diese Anweisung liest die in der Liste angegebenen Datenobjekte aus einem Cluster im Memory. Ohne Verwendung der Option TO <gi> wird das Datenobjekt <fi> aus dem Memory dem Datenobjekt gleichen Namens im Programm zugeordnet. Verwenden Sie diese Option, wird das Datenobjekt <fi> des Memorys in das Feld <gi> geschrieben. Mit der Bezeichnung <key>, die maximal 32 Stellen haben kann, identifizieren Sie die Daten im Memory. Sie mssen nicht alle Objekte lesen, die unter einer bestimmten Bezeichnung <key> abgespeichert sind, sondern knnen ber die Namen <fi> eine Auswahl treffen. Enthlt das Memory unter der angegebenen Bezeichnung <key> keine Objekte, wird SY-SUBRC auf 4 gesetzt. Existiert dagegen ein Daten-Cluster mit dieser Bezeichnung im Memory, so ist SY-SUBRC immer 0, unabhngig davon, ob das bezeichnete Datenobjekt <fi> auch vorhanden ist. Liegt ein Datenobjekt <fi> nicht im Cluster vor, bleibt das Zielfeld unverndert. Das System berprft bei dieser Anweisung nicht ob die Struktur der Objekte im Memory mit denen, in die sie geschrieben werden sollen, bereinstimmt. Die Daten werden Bit ft Bit transportiert. Bei nichtvertrglichen Strukturen kann es daher zu Schiefstnden kommen.

REPORT demo_data_ext_cluster_import. DATA text1(10) TYPE c VALUE 'Exporting'. DATA: itab TYPE TABLE OF sbook, wa_itab LIKE LINE OF itab. DO 5 TIMES. wa_itab-bookid = 100 + sy-index. APPEND wa_itab TO itab. ENDDO. EXPORT text1 text2 = 'Literal' TO MEMORY ID 'text'. EXPORT itab TO MEMORY ID 'table'. SUBMIT demo_data_ext_cluster_import2 AND RETURN. SUBMIT demo_data_ext_cluster_import3.
Der erste Teil dieses Programms entspricht dem Beispiel unter Datenobjekte im Memory speichern [Seite 380]. Im vorliegenden Beispiel werden zustzlich die beiden Programme DEMO_DATA_EXT_CLUSTER_IMPORT2 und DEMO_DATA_EXT_CLUSTER_IMPORT3 ber SUBMIT aufgerufen. Sie knnen die Programme hinter SUBMIT durch Doppelklick auf ihre Namen aus dem ABAP-Editor heraus erzeugen und pflegen. Mehr Informationen zu SUBMIT finden Sie unter Ausfhrbare Programme (Reports) aufrufen [Seite 1105].

April 2001

381

ABAP Programmierung (BC-ABA) Daten-Cluster im ABAP-Memory

SAP AG

Beispiel fr DEMO_DATA_EXT_CLUSTER_IMPORT2:

REPORT demo_data_ext_cluster_import2. DATA: text1(10) TYPE c, text3 LIKE text1 VALUE 'Initial'. IMPORT text3 FROM MEMORY ID 'text'. WRITE: / sy-subrc, text3. IMPORT text2 TO text1 FROM MEMORY ID 'text'. WRITE: / sy-subrc, text1.
Beispiel fr DEMO_DATA_EXT_CLUSTER_IMPORT3:

REPORT demo_data_ext_cluster_import3. DATA: jtab TYPE TABLE OF sbook, wa_jtab LIKE LINE OF jtab. IMPORT itab TO jtab FROM MEMORY ID 'table'. LOOP AT jtab INTO wa_jtab. WRITE / wa_jtab-bookid. ENDLOOP.
Die Ausgabe erfolgt auf zwei aufeinanderfolgenden Bildern und sieht so aus:

und

In DEMO_DATA_EXT_CLUSTER_IMPORT2 wird versucht ein Datenobjekt TEXT3 aus dem Daten-Cluster "text" zu lesen, das nicht vorhanden ist. Deshalb bleibt das Zielfeld TEXT3 unverndert. Das vorhandene Datenobjekt TEXT2 wird nach TEXT1 gestellt. In beiden Fllen ist SY-SUBRC gleich 0, da der Cluster "text" Daten enthlt. In DEMO_DATA_EXT_CLUSTER_IMPORT3 wird die interne Tabelle ITAB aus dem Cluster "table" in die interne Tabelle JTAB geschrieben. Beide Tabellen haben die gleiche Struktur, nmlich die der im ABAP-Dictionary abgelegten Tabelle SBOOK.

382

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Daten-Cluster im ABAP-Memory

Daten-Cluster im Memory lschen


Um Datenobjekte im ABAP-Memory zu lschen, verwenden Sie die folgende Anweisung:
Syntax

FREE MEMORY [ID <key>].


Ohne den Zusatz ID <key> lscht diese Anweisung das gesamte Memory, also auch alle zuvor ber EXPORT im ABAP- Memory abgelegten Daten-Cluster. Mit dem Zusatz ID <key> lscht diese Anweisung nur das Daten-Cluster mit dieser Bezeichnung.

Sie sollten die Anweisung FREE MEMORY nur mit dem ID-Zusatz verwenden, da durch das Lschen des gesamten Memorys auch die Speicherinhalte von eventuellen Systemroutinen verloren gehen.

REPORT demo_data_ext_cluster_free. DATA: text(10) TYPE c VALUE '0123456789', iden(3) TYPE c VALUE 'XYZ'. EXPORT text TO MEMORY ID iden. text = 'xxxxxxxxxx'. IMPORT text FROM MEMORY ID iden. WRITE: / sy-subrc, text. FREE MEMORY ID iden. text = 'xxxxxxxxxx'. IMPORT text FROM MEMORY ID iden. WRITE: / sy-subrc, text.
Die Ausgabe dieses Beispiels ist:
0 4 0123456789 xxxxxxxxxx

Die Anweisung FREE MEMORY lscht den Daten-Cluster "XYZ". Daher ist nach der flogenden IMPORT-Anweisung SY-SUBRC gleich 4 und das Zielfeld unverndert.

April 2001

383

ABAP Programmierung (BC-ABA) Daten-Cluster in Datenbanken

SAP AG

Daten-Cluster in Datenbanken
Sie knnen Daten-Cluster in speziellen Datenbanken des ABAP-Dictionarys abspeichern. Diese Datenbanken heien ABAP-Cluster-Datenbanken und haben eine vorgeschriebene Struktur:
Cluster-Datenbanken [Seite 385]

Diese Methode ermglicht es Ihnen, komplexe Datenobjekte mit beliebig tiefer Struktur in einem Schritt bestndig abzuspeichern, ohne sie an die flache Struktur einer relationalen Datenbank anpassen zu mssen. Ihre Datenobjekte werden dadurch systemweit verfgbar und jeder Benutzer kann darauf zugreifen. Fr einen erfolgreichen Zugriff mssen die Datentypen der abgespeicherten Objekte bekannt sein. Die Speicherung von Datenobjekten in Cluster-Datenbanken ist sinnvoll fr die Sicherung von Ergebnissen, die Sie aus der Analyse von in relationalen Datenbanken vorhandenen Informationen erhalten. Wenn Sie beispielsweise eine Liste der umsatzstrksten Kunden oder eine Gesamtadressliste aus den Personaldaten smtlicher Filialen erstellen wollen, knnen Sie ABAP-Programme schreiben, die diese Aufgaben lsen und die Ergebnisse als Daten-Cluster abspeichern. Zum Aktualisieren der abgespeicherten Daten-Cluster, knnen Sie je nach Bedarf diese Programme zum Beispiel periodisch im Hintergrund ablaufen lassen. Fr die weitere Verwendung der Ergebnisse knnen Sie andere Programme verwenden, die nur auf den DatenCluster zugreifen. Diese Methode kann die Antwortzeit des Systems erheblich verkrzen, denn Sie vermeidet, da fr jede Verwendung eines Ergebnisses erneut auf die verteilten Daten relationaler Datenbanken zugegriffen und das Ergebnis neu erstellt werden mu. Die Speicherung eines Daten-Clusters ist ABAP-spezifisch. Sie knnen zwar auch mit SQLAnweisungen auf Cluster-Datenbanken zugreifen, die Entschlsselung der Struktur des abgespeicherten Daten-Clusters ist aber nur durch ABAP-Anweisungen mglich. Sie speichern Datenobjekte in Cluster-Datenbanken mit der Anweisung EXPORT TO DATABASE.
Datenobjekte in Cluster-Datenbanken speichern [Seite 390]

Sie erstellen Inhaltsverzeichnisse von Daten-Clustern und lesen Datenobjekte aus ClusterDatenbanken mit der Anweisung IMPORT FROM DATABASE.
Inhaltsverzeichnis eines Daten-Clusters erstellen [Seite 392] Datenobjekte aus Cluster-Datenbanken lesen [Seite 394]

Sie lschen Daten-Cluster in Cluster-Datenbanken mit der Anweisung DELETE FROM DATABASE.
Daten-Cluster in Cluster-Datenbanken lschen [Seite 396]

Wie Sie mit Open SQL-Anweisungen auf Cluster-Datenbanken zugreifen knnen erfahren Sie unter
Mit Open SQL-Anweisungen auf Cluster-Datenbanken zugreifen [Seite 398]

384

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Cluster-Datenbanken

Cluster-Datenbanken
Cluster-Datenbanken, in denen Sie Daten-Cluster speichern knnen, sind spezielle relationale Datenbanken des ABAP-Dictionary. Ihre Zeilenstruktur ist unterteilt in einen teilweise standardisierten Anfangsbereich mehrerer Felder und einem groen Feld zur Aufnahme des Daten-Clusters. In den folgenden beiden Topics erfahren Sie die Regeln zum Aufbau einer Cluster-Datenbank und etwas ber die systemdefinierte Cluster-Datenbank INDX.
Struktur von Cluster-Datenbanken [Seite 386] Beispiel einer Cluster-Datenbank [Seite 388]

April 2001

385

ABAP Programmierung (BC-ABA) Struktur von Cluster-Datenbanken

SAP AG

Struktur von Cluster-Datenbanken


Cluster-Datenbanken haben folgende Struktur:
ABAP/4-Cluster-Datenbank (zum Beispiel INDX)
1 Name Typ Lnge MANDT CHAR 3 Mandant 2 2 RELID CHAR 2 3 3 ... CHAR ... 4 4 SRTF2 INT4 4 ... ... ... 5 5 ... ... ... ... ... ... 6 6 CLUSTR INT2 2 7 7 CLUSTD VARC ............. Daten-Cluster Datenlnge

Bezeichnung Bereich Zeilenzhler

Benutzerdatenfelder

Die Regeln fr den Aufbau einer Cluster-Datenbank sind im folgenden aufgefhrt. Dabei mssen die unter 1 bis 4 aufgefhrten Felder als Schlsselfelder angelegt werden. Die erwhnten Datentypen sind ABAP-Dictionary-Typen. 1. Soll die Tabelle mandantenabhngig sein, mu das erste Feld den Namen MANDT, den Typ CHAR und eine Lnge von 3 Bytes haben, um die Mandantenkennung aufzunehmen. Das System fllt das Feld MANDT beim Speichern eines Daten-Clusters entweder automatisch mit dem aktuellen Mandaten oder mit einem explizit in der EXPORT-Anweisung angegebenen Mandanten. 2. Das nchste Feld (im Fall mandantenunabhngiger Tabellen ist dies das erste Feld) mu den Namen RELID, den Typ CHAR und eine Lnge von 2 Bytes haben. Es enthlt eine Bereichskennung. Cluster-Datenbanken sind in verschiedene Bereiche untergliedert. Das System fllt das Feld RELID beim Speichern eines Daten-Clusters durch die Bereichskennung, die in der EXPORT-Anweisung angegeben wird. 3. Das nchste Feld ist ein Typ CHAR Feld variabler Lnge. Es enthlt die Bezeichnung <key> des Clusters, die im Programm whrend des Speicherns mit dem Zusatz ID der EXPORT-Anweisung angegeben wird. Da das nachfolgende Feld ausgerichtet ist, kann das System das Feld RELID mit bis zu 3 ungenutzten Fllbytes am Ende auffllen. Wenn Sie Ihre eigene Cluster-Datenbank anlegen, sollten Sie die Lnge dieses Feldes entsprechend planen. 4. Das nchste Feld mu den Namen SRTF2, und denTyp INT4 der Lnge 4 haben. Einzelne Daten-Cluster knnen sich ber mehrere Zeilen der Datenbanktabelle ausdehnen, wobei theoretisch pro Cluster 2**31 Zeilen mglich sind. Das Feld SRTF2 enthlt die laufenden Nummern der Zeilen innerhalb eines gespeicherten Daten-Clusters und kann Werte zwischen 0 und 2**31-1 enthalten. Das System fllt dieses Feld automatisch beim Speichern eines Daten-Clusters (siehe 7.). 5. Hinter SRTF2 knnen beliebig viele Benutzerdatenfelder beliebiger Namen und Typen folgen. Das System fllt diese Felder nicht automatisch whrend des Speicherns eines Daten-Clusters. Sie mssen diesen Feldern vor der EXPORT-Anweisung im Programm explizit Werte zuweisen. Normalerweise enthalten diese Felder Verwaltungsinformationen wie z.B. Programmname, Benutzerkennung etc. 6. Das vorletzte Feld einer Zeile mu den Namen CLUSTR und den Typ INT2 der Lnge 2 haben. Das Feld CLUSTR enthlt die Lnge der Daten im folgenden Feld CLUSTD. Das System fllt dieses Feld automatisch beim Speichern eines Daten-Clusters.

386

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Struktur von Cluster-Datenbanken

7. Das letzte Feld einer Zeile mu den Namen CLUSTD und den Typ VARC haben. Die Lnge ist frei whlbar und betrgt blicherweise einige 1000 Bytes. In dieses Feld schreibt das System whrend des Speicherns die eigentlichen Daten des DatenClusters. Die Daten werden komprimiert abgespeichert. Reicht die Lnge von CLUSTD nicht fr ein Daten-Cluster aus, wird es ber mehrere Zeilen verteilt. Diese Zeilen werden im Feld SRTF2 (siehe 4.) numeriert. Sie knnen sich entweder eigene Cluster-Datenbanken gem obiger Regeln anlegen (hierzu siehe die Dokumentation BC - ABAP Dictionary [Extern]) oder Sie knnen die systemdefinierte Cluster-Datenbank INDX verwenden: Beispiel einer Cluster-Datenbank [Seite 388]

April 2001

387

ABAP Programmierung (BC-ABA) Beispiel einer Cluster-Datenbank

SAP AG

Beispiel einer Cluster-Datenbank


Die Datenbank INDX ist ein Beispiel fr eine Cluster-Datenbank und ist in Ihrem System standardmig installiert. Sie ist fr Benutzeranwendungen vorgesehen. Die Benutzung dieser Datenbank ist praktisch, da Sie nicht erst eine neue anlegen mssen. Andererseits knnen alle Benutzer auf Ihre dort gespeicherten Daten zugreifen, sie ndern oder lschen. Es empfiehlt sich also fr jede Anwendung eine eigene Cluster-Datenbank anzulegen, die man beispielsweise leicht als Kopie von INDX erstellen kann. Die Struktur der Datenbank INDX sehen Sie, wenn Sie im ABAP-Editor Bearbeiten Weitere Funktionen Kommandoeingabe whlen und dann SHOW INDX eingeben, oder auf das Wort INDX, z.B. in einer TABLES-Anweisung, doppelklicken:

Sie sehen fr jedes Feld den ABAP-Dictionary-Datentyp und den entsprechenden Datentyp der ABAP Programmiersprache (d.h. den Datentyp der Komponenten des Tabellenarbeitsbereichs, der durch TABLES erzeugt wird). Die ersten vier Felder sind die Schlsselfelder der Tabelle INDX und entsprechen genau der Beschreibung unter Struktur von Cluster-Datenbanken [Seite 386]. Das dritte Feld fr die Bezeichnung des Clusters hat hier den Namen SRTFD und ein Lnge vom 22 Bytes. D.h. die im ABAP-Programm im Zusatz ID der EXPORT-Anweisung angegebene Bezeichnung <key> kann fr INDX maximal 22 Zeichen enthalten. Die nchsten sieben Felder sind nicht standardisiert und fr Benutzereingaben vorgesehen, z.B.:

AEDAT: nderungsdatum USERA: Benutzername PGMID: Programmname

388

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Beispiel einer Cluster-Datenbank

Die letzten zwei Felder sind wieder vorgeschrieben. Das Feld CLUSTD zur Aufnahme des eigentlichen Daten-Clusters hat in der Tabelle INDX eine Lnge von 2886 Bytes. Beispiele zur Verwendung der Tabelle INDX finden Sie unter Datenobjekte in Cluster-Datenbanken speichern [Seite 390] Inhaltsverzeichnis eines Daten-Clusters erstellen [Seite 392] Datenobjekte aus Cluster-Datenbanken lesen [Seite 394] Daten-Cluster in Cluster-Datenbanken lschen [Seite 396]

April 2001

389

ABAP Programmierung (BC-ABA) Beispiel einer Cluster-Datenbank

SAP AG

Datenobjekte in Cluster-Datenbanken speichern


Um Datenobjekte aus einem ABAP-Programm in Cluster-Datenbanken zu speichern, verwenden Sie die folgende Anweisung:
Syntax

EXPORT <f1> [FROM <g1>] <f2> [FROM <g2>] ... TO DATABASE <dbtab>(<ar>) [CLIENT <cli>] ID <key>.
Diese Anweisung legt die in der Liste angegebenen Datenobjekte als Cluster in der ClusterDatenbank <dbtab> ab. Sie mssen <dbtab> mit der TABLES-Anweisung deklarieren. Ohne Verwendung der Option FROM <gi> wird ein Datenobjekt <fi> unter seinem Namen abgespeichert. Verwenden Sie diese Option, wird ein Datenobjekt <gi> unter dem Namen <fi> abgespeichert. Mit <ar>, geben Sie die zweistellige Bereichskennung fr das abzuspeichernde Cluster in der Datenbank an. (siehe Punkt 2 unter Struktur von Cluster-Datenbanken [Seite 386]). Mit der Bezeichnung <key>, deren maximale Lnge von der Lnge des Bezeichnerfelds in <dbtab> abhngt identifizieren Sie die Daten in der Datenbank. (siehe Punkt 3 unter Struktur von Cluster-Datenbanken [Seite 386]). Mit der Option CLIENT <cli> knnen Sie bei mandantenabhngigen Cluster-Datenbanken die automatische Mandatenbehandlung abschalten und den Mandanten selbst angeben. Diese Option mu direkt hinter dem Namen der Datenbank stehen. (siehe Punkt 1 unter Struktur von Cluster-Datenbanken [Seite 386]). Die EXPORT-Anweisung transportiert auch den Inhalt der Benutzerfelder des Tabellenarbeitsbereichs <dbtab> in die Datenbanktabelle. Sie knnen diese Felder vorher gem Ihren Anforderungen fllen. (siehe Punkt 5 unter Struktur von Cluster-Datenbanken [Seite 386]). Die EXPORT-Anweisung berschreibt immer vollstndig den Inhalt eines eventuell vorhandenen Daten-Clusters im gleichen Bereich <ar>, mit der gleichen Bezeichnung <key> und im gleichen Mandant <cli>.

Bei internen Tabellen mit Kopfzeile kann nur die eigentliche Tabelle, nicht die Kopfzeile abgespeichert werden. Bei der EXPORT-Anweisung wird der Tabellenname als Tabelle interpretiert. Dies ist eine Ausnahme von der allgemeinen Regel, nach der Anweisungen den Tabellennamen normalerweise als Tabellenarbeitsbereich interpretieren (siehe Auswahl eines Tabellentyps [Seite 291]).

REPORT demo_data_ext_cluster_export_d. DATA wa_indx TYPE indx. DATA: BEGIN OF wa_itab, col1 TYPE i, col2 TYPE i, END OF wa_itab. DATA itab LIKE TABLE OF wa_itab.

390

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Beispiel einer Cluster-Datenbank

DO 3000 TIMES. wa_itab-col1 = sy-index. wa_itab-col2 = sy-index ** 2. APPEND wa_itab TO itab. ENDDO. wa_indx-aedat = sy-datum. wa_indx-usera = sy-uname. wa_indx-pgmid = sy-repid. EXPORT itab TO DATABASE indx(hk) ID 'Table' FROM wa_indx. WRITE: ' SRTF2', AT 20 'AEDAT', AT 35 'USERA', AT 50 'PGMID'. ULINE. SELECT * FROM indx INTO wa_indx WHERE relid = 'HK' AND srtfd = 'Table'. WRITE: / wa_indx-srtf2 wa_indx-aedat wa_indx-usera wa_indx-pgmid ENDSELECT.
Es wird eine interne Tabelle ITAB mit 3000 Zeilen gefllt und nach der Zuweisung von Werten zu einigen Benutzerfeldern von INDX wird ITAB nach INDX exportiert. Da INDX eine relationale Datenbank ist, knnen die einzelnen Zeilen mit Open SQLAnweisungen angesprochen werden. ber die SELECT-Anweisung werden die durch EXPORT abgespeicherten Zeilen durch geeignete WHERE-Bedingungen selektiert. Die Ausgabe einiger Datenbankfelder sieht folgendermaen aus:

UNDER UNDER UNDER UNDER

'SRTF2', 'AEDAT', 'USERA', 'PGMID'.

Die Ausgabe zeigt, da die Benutzerfelder AEDAT, USERA und PGMID durch EXPORT transportiert wurden und da sich der ITAB enthaltende Daten-Cluster ber 6 Zeilen ausdehnt. Wenn Sie die Zahl 3000 in der DO-Anweisung ndern ndert sich die Anzahl der von diesem Daten-Cluster belegten Zeilen.

April 2001

391

ABAP Programmierung (BC-ABA) Beispiel einer Cluster-Datenbank

SAP AG

Inhaltsverzeichnis eines Daten-Clusters erstellen


Um das Inhaltsverzeichnis eines Daten-Clusters aus einer ABAP-Cluster-Datenbank zu erstellen, verwenden Sie die folgende Anweisung:
Syntax

IMPORT DIRECTORY INTO <dirtab> FROM DATABASE <dbtab>(<ar>) [CLIENT <cli>] ID <key>.
Diese Anweisung erstellt in der Tabelle <dirtab> ein Inhaltsverzeichnis der Datenobjekte eines Daten-Clusters in der Datenbank <dbtab>. Sie mssen <dbtab> mit der TABLES-Anweisung deklarieren. Die Speicherung eines Daten-Clusters in einer Datenbank erfolgte normalerweise durch eine EXPORT TO DATABASE- Anweisung (siehe Datenobjekte in Cluster-Datenbanken speichern [Seite 390]). Informationen zur Struktur der Datenbanktabelle <dbtab> finden Sie unter Struktur von Cluster-Datenbanken [Seite 386]. Mit <ar>, geben Sie die zweistellige Bereichskennung fr das abgespeicherte Cluster in der Datenbank an. Mit der Bezeichnung <key>, deren maximale Lnge von der Lnge des Bezeichnerfelds in <dbtab> abhngt identifizieren Sie die Daten in der Datenbank. Mit der Option CLIENT <cli> knnen Sie bei mandantenabhngigen Cluster-Datenbanken die automatische Mandatenbehandlung abschalten und den Mandanten selbst angeben. Diese Option mu direkt hinter dem Namen der Datenbank stehen. Die IMPORT-Anweisung liest automatisch auch den Inhalt der Benutzerfelder des Tabellenarbeitsbereichs <dbtab> aus der Datenbanktabelle. Kann ein Inhaltsverzeichnis erstellt werden, wird SY-SUBRC auf 0, ansonsten auf 4 gesetzt. Sie mssen die interne Tabelle <dirtab> gem der ABAP-Dictionary Struktur CDIR aufbauen. Verwenden Sie dazu den Zusatz TYPE der DATA-Anweisung. Die Struktur CDIR hat folgende Komponenten:
Feldname Typ Beschreibung

NAME OTYPE

CHAR Name des abgespeicherten Objekts im Cluster CHAR Typ des Objekts: F bedeutet elementares Feld R bedeutet Feldleiste T bedeutet interne Tabelle

FTYPE TFILL FLENG

CHAR Datentyp des Objekts. Strukturierte Datentypen ergeben C. INT4 INT2 Anzahl gefllter Zeilen bei internen Tabellen. Lnge des Feldes, bzw. der Struktur.

REPORT demo_data_ext_cluster_import_2.

392

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Beispiel einer Cluster-Datenbank

DATA: dirtab TYPE TABLE OF cdir, wa_dirtab LIKE LINE OF dirtab. IMPORT DIRECTORY INTO dirtab FROM DATABASE indx(hk) ID 'Table'. IF sy-subrc = 0. WRITE: / 'AEDAT:', indx-aedat, / 'USERA:', indx-usera, / 'PGMID:', indx-pgmid. WRITE / 'Directory:'. LOOP AT dirtab INTO wa_dirtab. WRITE: / wa_dirtab-name, wa_dirtab-otype, wa_dirtabftype, wa_dirtab-tfill, wa_dirtab-fleng. ENDLOOP. ELSE. WRITE 'Not found'. ENDIF.
Dieses Programm erstellt ein Inhaltsverzeichnis des mit dem Beispielprogramm unter Datenobjekte in Cluster-Datenbanken speichern [Seite 390] abgespeicherten Daten-Clusters. Die Ausgabe sieht folgendermaen aus:

Das Inhaltsverzeichnis DIRTAB enthlt eine Zeile, die zeigt, da in dem DatenCluster eine interne Tabelle namens ITAB mit 3000 gefllten Zeilen der Lnge 8 gespeichert ist.

April 2001

393

ABAP Programmierung (BC-ABA) Beispiel einer Cluster-Datenbank

SAP AG

Datenobjekte aus Cluster-Datenbanken lesen


Um Datenobjekte aus einer ABAP-Cluster-Datenbank in ein ABAP-Programm zu lesen, verwenden Sie die folgende Anweisung:
Syntax

IMPORT <f1> [TO <g1>] <f2> [TO <g2>] ... FROM DATABASE <dbtab>(<ar>) [CLIENT <cli>] ID <key>|MAJOR-ID <maid> [MINOR-ID <miid>].
Diese Anweisung liest die in der Liste angegebenen Datenobjekte aus einem Daten-Cluster in der Datenbank <dbtab>. Sie mssen <dbtab> mit der TABLES-Anweisung deklarieren. Ohne Verwendung der Option TO <gi> wird das Datenobjekt <fi> aus der Datenbank dem Datenobjekt gleichen Namens im Programm zugeordnet. Verwenden Sie diese Option, wird das Datenobjekt <fi> aus der Datenbank in das Feld <gi> geschrieben. Die Speicherung eines Daten-Clusters in einer Datenbank erfolgte normalerweise durch eine EXPORT TO DATABASE- Anweisung (siehe Datenobjekte in Cluster-Datenbanken speichern [Seite 390]). Informationen zur Struktur der Datenbanktabelle <dbtab> finden Sie unter Struktur von Cluster-Datenbanken [Seite 386]. Mit <ar>, geben Sie die zweistellige Bereichskennung fr das abgespeicherte Cluster in der Datenbank an. Mit der Bezeichnung <key>, deren maximale Lnge von der Lnge des Bezeichnerfelds in <dbtab> abhngt identifizieren Sie die Daten in der Datenbank. Sie knnen den Zusatz ID <key> durch MAJOR-ID <maid> ersetzen. Dann wird das Daten-Cluster ausgewhlt, dessen Bezeichnung im ersten Teil mit <maid> bereinstimmt. Geben Sie zusammen mit dem Zusatz MAJOR-ID noch MINOR-ID <miid> an, dann wird das Daten-Cluster ausgewhlt, dessen Bezeichnung im zweiten Teil (die Positionen hinter der Lnge von <maid>) grer oder gleich <miid> ist. Mit der Option CLIENT <cli> knnen Sie bei mandantenabhngigen Cluster-Datenbanken die automatische Mandatenbehandlung abschalten und den Mandanten selbst angeben. Diese Option mu direkt hinter dem Namen der Datenbank stehen. Die IMPORT-Anweisung liest automatisch auch den Inhalt der Benutzerfelder des Tabellenarbeitsbereichs <dbtab> aus der Datenbanktabelle. Sie mssen nicht alle Objekte lesen, die unter einer bestimmten Bezeichnung <key> abgespeichert sind, sondern knnen ber die Namen <fi> eine Auswahl treffen. Enthlt die Datenbank unter den angegebenen Schlsseln <ar>, <key> und <cli> keine Objekte, wird SY-SUBRC auf 4 gesetzt. Existiert dagegen ein Daten-Cluster mit diesen Schlsseln in der Datenbank, so ist SY-SUBRC immer 0, unabhngig davon, ob das bezeichnete Datenobjekt <fi> auch vorhanden ist. Liegt ein Datenobjekt <fi> nicht im Cluster vor, bleibt das Zielfeld unverndert. Das System berprft bei dieser Anweisung zur Laufzeit ob die Struktur der Objekte in der Datenbank mit denen, in die sie geschrieben werden sollen, bereinstimmt. Falls dies nicht der Fall ist tritt ein Laufzeitfehler auf. Ausnahmen sind Felder vom Typ C, die auch am Ende eine strukturierten Datenobjekts stehen knnen. Diese knnen verlngert, verkrzt, hinzugefgt oder weggelassen werden.

REPORT demo_data_ext_cluster_import_d.

394

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Beispiel einer Cluster-Datenbank

DATA: BEGIN OF wa_jtab, col1 TYPE i, col2 TYPE i, END OF wa_jtab, jtab LIKE TABLE OF wa_jtab. IMPORT itab TO jtab FROM DATABASE indx(hk) ID 'Table'. WRITE: / 'AEDAT:', indx-aedat, / 'USERA:', indx-usera, / 'PGMID:', indx-pgmid. SKIP. WRITE 'JTAB:'. LOOP AT jtab INTO wa_jtab FROM 1 TO 5. WRITE: / wa_jtab-col1, wa_jtab-col2. ENDLOOP.
Dieses Programm liest die mit dem Beispielprogramm unter Datenobjekte in ClusterDatenbanken speichern [Seite 390] abgespeicherte interne Tabelle ITAB aus der Cluster-Datenbank INDX in die interne Tabelle JTAB. Die Ausgabe einiger Benutzerfelder von INDX und der ersten fnf Zeilen von JTAB sieht folgendermaen aus:

April 2001

395

ABAP Programmierung (BC-ABA) Beispiel einer Cluster-Datenbank

SAP AG

Daten-Cluster in Cluster-Datenbanken lschen


Um Daten-Cluster aus Datenbanken zu lschen, verwenden Sie die folgende Anweisung:
Syntax

DELETE FROM DATABASE <dbtab>(<ar>) [CLIENT <cli>] ID <key>.


Diese Anweisung lscht das gesamte Daten-Cluster des Bereichs <ar> und der Bezeichnung <key> der Datenbanktabelle <dbtab>. Sie mssen <dbtab> mit der TABLES-Anweisung deklarieren. Mit der Option CLIENT <cli> knnen Sie bei mandantenabhngigen Cluster-Datenbanken die automatische Mandatenbehandlung abschalten und den Mandanten selbst angeben. Diese Option mu direkt hinter dem Namen der Datenbank stehen. Die Speicherung eines Daten-Clusters in einer Datenbank erfolgte normalerweise durch eine EXPORT TO DATABASE- Anweisung (siehe Datenobjekte in Cluster-Datenbanken speichern [Seite 390]). Informationen zur Struktur der Datenbanktabelle <dbtab> finden Sie unter Struktur von Cluster-Datenbanken [Seite 386]. Diese DELETE-Anweisung lscht alle Zeilen der Cluster-Datenbank, ber die sich das angesprochene Daten-Cluster erstreckt. Kann ein Daten-Cluster mit dem angegeben Schlssel gelscht werden, wird SY-SUBRC auf 0 gesetzt, ansonsten auf 4.

REPORT demo_data_ext_cluster_delete. DATA dirtab TYPE TABLE OF cdir. IMPORT DIRECTORY INTO dirtab FROM DATABASE indx(hk) ID 'Table'. WRITE: / 'SY-SUBRC, IMPORT:', sy-subrc. DELETE FROM DATABASE indx(hk) ID 'Table'. WRITE: / 'SY-SUBRC, DELETE:', sy-subrc. IMPORT DIRECTORY INTO dirtab FROM DATABASE indx(hk) ID 'Table'. WRITE: / 'SY-SUBRC, IMPORT:', sy-subrc.
Dieses Programm lscht das mit dem Beispielprogramm unter Datenobjekte in Cluster-Datenbanken speichern [Seite 390] abgespeicherte Daten-Cluster. Falls das Daten-Cluster bei Programmstart vorhanden ist, sieht die Ausgabe so aus:
SY-SUBRC, IMPORT: SY-SUBRC, DELETE: SY-SUBRC, IMPORT: 0 0 4

Bei der ersten IMPORT-Anweisung ist der Daten-Cluster noch vorhanden. Die DELETE-Anweisung wird erfolgreich abgeschlossen. Bei der zweiten IMPORTAnweisung ist der Daten-Cluster nicht mehr vorhanden.

396

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Beispiel einer Cluster-Datenbank

April 2001

397

ABAP Programmierung (BC-ABA) Beispiel einer Cluster-Datenbank

SAP AG

Open SQL-Anweisungen und Cluster-Datenbanken


Cluster-Datenbanken sind im ABAP-Dictionary definierte relationale Datenbanken, die von ABAP auf eine spezielle Art und Weise benutzt werden. Deshalb knnen Sie prinzipiell auch mit Open SQL [Seite 1129]-Anweisungen auf Cluster-Datenbanken zugreifen. Um mit Open SQL-Anweisungen sinnvoll mit Cluster-Datenbanktabellen zu arbeiten, mssen Sie die spezielle Struktur dieser Datenbanktabellen beachten (siehe Struktur von ClusterDatenbanken [Seite 386]). Zum Beispiel macht es wenig Sinn die Felder CLUSTR und CLUSTID ber die Anweisung SELECT zu lesen oder ber die Anweisung UPDATE zu ndern. Diese Felder enthalten das vom System kodierte Daten-Cluster und knnen nur durch die Anweisungen EXPORT TO DATABASE und IMPORT FROM DATABASE richtig behandelt werden. Die ndernden Open SQL-Anweisungen UPDATE, MODIFY und DELETE sollten Sie nur dann verwenden, wenn entsprechende Kombinationen der Anweisungen fr Daten-Cluster zu lange Laufzeiten ergeben. Die Open SQL-Anweisung INSERT sollten Sie in Cluster-Datenbanken berhaupt nicht verwenden. Sie knnen Open SQL-Anweisungen fr bestimmte Wartungs- und Pflegearbeiten Ihrer ClusterDatenbank einsetzen. Beispielsweise knnen Sie mit SELECT-Anweisungen die ClusterDatenbanktabelle gezielt nach bestimmten Daten-Clustern durchsuchen, wobei Sie auch Informationen der Benutzerdatenfelder verwenden knnen (siehe Beispiel unter Datenobjekte in Cluster-Datenbanken speichern [Seite 390]). Dazu ist die IMPORT FROM DATABASEAnweisung nicht geeignet.

REPORT demo_data_ext_cluster_open_1. DATA count TYPE i VALUE 0. DATA wa_indx TYPE indx. SELECT FROM INTO WHERE * indx wa_indx relid = 'HK' AND srtf2 = 0 AND usera = sy-uname.

DELETE FROM DATABASE indx(hk) ID indx-srtfd. IF sy-subrc = 0. count = count + 1. ENDIF. ENDSELECT. WRITE: / count, 'Cluster(s) deleted'.
Dieses Beispielprogramm lscht alle Daten-Cluster des Bereichs "HK" aus der Tabelle INDX, die im Feld USERA den Namen des aktuellen Programmbenutzers enthalten. Durch die SELECT-Anweisung wird das Feld SRTFD des Tabellenarbeitsbereichs INDX gefllt und in der DELETE-Anweisung verwendet. Durch die Spezifizierung von SRTF2 = 0 in der WHERE-Klausel wird sichergestellt, da jedes Daten-Cluster nur einmal behandelt wird.

398

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Beispiel einer Cluster-Datenbank

Verwechseln Sie nicht die DELETE-Anweisung des Open SQL-Befehlssatzes mit der DELETE-Anweisung fr Daten-Cluster (siehe Daten-Cluster in Cluster-Datenbanken lschen [Seite 396]). Lschen Sie nie nur bestimmte Zeilen eines Daten-Clusters, sondern immer alle Zeilen. Das folgende Besipiel demonstriert Ihnen, wie Sie die Bezeichnung und den Bereich eines Daten-Clusters in einer Datenbanktabelle ber die Open SQL-Anweisung UPDATE ndern knnen. Die Lsung dieser Aufgabe wre mit den ClusterAnweisungen EXPORT, IMPORT und DELETE erheblich aufwendiger gewesen.

REPORT demo_data_ext_cluster_open_2. DATA: dirtab TYPE TABLE OF cdir, wa_dirtab LIKE LINE OF dirtab. UPDATE indx SET relid = 'NW' srtfd = 'Internal' WHERE relid = 'HK' AND srtfd = 'Table'. WRITE: / 'UPDATE:', / 'SY-SUBRC:', sy-subrc, / 'SY-DBCNT:', sy-dbcnt. IMPORT DIRECTORY INTO dirtab FROM DATABASE indx(nw) ID 'Internal'. WRITE: / 'IMPORT:', / 'SY-SUBRC:', sy-subrc.
Dieses Programm ndert das mit dem Beispielprogramm unter Datenobjekte in Cluster-Datenbanken speichern [Seite 390] abgespeicherte Daten-Cluster. Falls das Daten-Cluster bei Programmstart vorhanden ist, und in der UPDATE-Anweisung sonst keine Fehler auftreten, sieht die Ausgabe so aus:
UPDATE: SY-SUBRC: SY-DBCNT: IMPORT: SY-SUBRC: 0 0 6

Die UPDATE-Anweisung [Seite 1185] ndert die sechs zum spezifizierten DatenCluster gehrigen Zeilen der Datenbanktabelle INDX. Danach findet die Anweisung IMPORT DIRECTORY das Daten-Cluster im Bereich "NW" unter der Bezeichnung "Internal".

April 2001

399

ABAP Programmierung (BC-ABA) Beispiel einer Cluster-Datenbank

SAP AG

400

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Arbeiten mit Dateien

Arbeiten mit Dateien


ABAP ermglicht es, mit sequentiellen Dateien zu arbeiten, die sich auf dem Anwendungsserver oder auf dem Prsentationsserver befinden. Solche Dateien knnen z.B. zur Zwischenspeicherung von Daten oder als Schnittstelle zwischen lokalen Programmen und dem SAP-System dienen.
Arbeiten mit Dateien auf dem Anwendungsserver [Seite 402] Arbeiten mit Dateien auf dem Prsentationsserver [Seite 433]

Die physische Addressierung von Dateien und Dateipfaden ist plattformabhngig. Das R/3System liefert ein Funktionsmodul und einige Transaktionen, die es Ihnen ermglichen, mit plattformunabhngigen Dateinamen zu arbeiten:
Verwendung plattformunabhngiger Dateinamen [Seite 449]

April 2001

401

ABAP Programmierung (BC-ABA) Arbeiten mit Dateien auf dem Anwendungsserver

SAP AG

Arbeiten mit Dateien auf dem Anwendungsserver


ABAP bietet einige Anweisungen fr die Verarbeitung von Daten, die nicht in Datenbanken, sondern in sequentiellen Dateien auf dem Anwendungsserver liegen. Die folgenden Topics beschreiben
Dateihandhabung in ABAP [Seite 403] Daten in Dateien schreiben [Seite 422] Daten aus Dateien lesen [Seite 424]

Bei Operationen mit sequentiellen Dateien fhrt das System automatisch einige Prfungen durch, die unter Umstnden zu Laufzeitfehlern fhren knnen:
Automatische Prfungen bei Dateioperationen [Seite 426]

402

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Arbeiten mit Dateien auf dem Anwendungsserver

Dateihandhabung in ABAP
In ABAP gibt es drei Anweisungen fr die Handhabung von Dateien:

Die Anweisung OPEN DATASET ffnet eine Datei. Die Anweisung CLOSE DATASET schliet eine Datei. Die Anweisung DELETE DATASET lscht eine Datei.

ffnen einer Datei [Seite 404] Schlieen einer Datei [Seite 420] Lschen einer Datei [Seite 421]

April 2001

403

ABAP Programmierung (BC-ABA) Arbeiten mit Dateien auf dem Anwendungsserver

SAP AG

ffnen einer Datei


Mit der Anweisung OPEN DATASET knnen Sie eine Datei auf dem Anwendungsserver ffnen. Die Grundform der Anweisung OPEN DATASET wird beschrieben in:
Grundform der Anweisung OPEN DATASET [Seite 405]

Die Anweisung OPEN DATASET bietet eine Reihe von Zustzen fr die folgenden Aufgaben:
ABAP-spezifische Zustze: ffnen einer Datei zum Lesen [Seite 406] ffnen einer Datei zum Schreiben [Seite 407] ffnen einer Datei fr das Schreiben an das Ende der Datei [Seite 410] Binrmodus angeben [Seite 412] Textmodus angeben [Seite 414] ffnen einer Datei an einer bestimmten Position [Seite 416] Zustze fr das Betriebssystem: Betriebssystemkommandos absetzen [Seite 418] Empfangen der Betriebssystemnachricht [Seite 419]

Weitere Zustze finden Sie in der Schlsselwortdokumentation zur Anweisung OPEN DATASET.

404

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Arbeiten mit Dateien auf dem Anwendungsserver

Grundform der Anweisung OPEN DATASET

Um eine Datei auf dem Anwendungsserver zu ffnen, benutzen Sie die Anweisung OPEN wie folgt:
Syntax

OPEN DATASET <dsn> [Zustze].


Diese Anweisung ffnet die Datei <dsn>. Wenn Sie keine Zustze fr den Modus angeben, wird die Datei zum Lesen und im Binrmodus geffnet (siehe folgende Topics). Das Feld SY-SUBRC gibt 0 zurck, wenn das System die Datei ffnen konnte. Anderenfalls gibt es SY-SUBRC 8 zurck. Sie geben den Dateinamen <dsn> entweder als Literal oder als Feld an, das den Dateinamen enthlt. Wenn Sie keinen Pfad angeben, ffnet das System die Datei in dem Verzeichnis, in dem das SAP-System auf dem Anwendungsserver luft. Um eine Datei zu ffnen, mu der Benutzer, unter dem das SAP-System luft, die entsprechenden Berechtigungen auf Betriebssystemebene haben.

Dateinamen sind plattformabhngig. Sie mssen Datei- und Pfadnamen gem den Regeln des Betriebssystems angeben, unter dem das SAP-System luft. Um betriebssystemunabhngige Programme zu schreiben, knnen Sie logische Dateinamen benutzen (Informationen zu logischen Dateinamen finden Sie in Verwendung plattformunabhngiger Dateinamen [Seite 449]).

DATA fname(60) TYPE c. fname = '/tmp/myfile'. OPEN DATASET 'myfile'. OPEN DATASET fname.
Dieses Beispiel funktioniert, wenn das SAP-System unter UNIX luft. Das Programm ffnet die Datei "myfile" in dem Verzeichnis, in dem das SAP-System luft und ffnet die Datei "myfile" im Verzeichnis "/tmp". Bei anderen Betriebssystemen mssen Sie die Dateinamen ersetzen. Fr OpenVMS beispielsweise knnen die betreffenden Zeilen wie folgt geschrieben werden:

fname = '[TMP]myfile.BIN' OPEN DATASET 'myfile.BIN'.

April 2001

405

ABAP Programmierung (BC-ABA) Arbeiten mit Dateien auf dem Anwendungsserver ffnen einer Datei zum Lesen

SAP AG

Um eine Datei zum Lesen zu ffnen, verwenden Sie den Zusatz FOR INPUT der Anweisung OPEN DATASET:
Syntax

OPEN DATASET <dsn> FOR INPUT.


Diese Anweisung ffnet eine Datei zum Lesen. Diese Datei mu bereits vorhanden sein; anderenfalls setzt das System SY-SUBRC auf 8 und ignoriert die Anweisung. Wenn die Datei bereits geffnet ist (fr Lese- oder Schreibzugriff oder fr das Schreiben an das Ende der Datei), setzt das System die Positionierung an den Anfang der Datei zurck. Es ist jedoch besserer Programmierstil, bei bereits geffneten Dateien immer erst die CLOSEAnweisung zu benutzen, bevor sie wieder geffnet werden (Informationen zum Schlieen von Dateien finden Sie in Schlieen einer Datei [Seite 420]).

DATA fname(60) TYPE c VALUE 'myfile'. OPEN DATASET fname FOR INPUT. IF sy-subrc = 0. WRITE / 'File opened'. ..... ELSE. WRITE / 'File not found'. ENDIF.
In diesem Beispiel wird die Datei "myfile" zum Lesen geffnet.

406

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Arbeiten mit Dateien auf dem Anwendungsserver

ffnen einer Datei zum Schreiben

Um eine Datei zum Schreiben zu ffnen, verwenden Sie den Zusatz FOR OUTPUT:
Syntax

OPEN DATASET <dsn> FOR OUTPUT.


Diese Anweisung ffnet eine Datei zum Schreiben. Wenn die Datei nicht vorhanden ist, wird sie angelegt. Wenn sie vorhanden und geschlossen ist, wird ihr Inhalt berschrieben. Wenn die Datei bereits vorhanden und geffnet ist (zum Lesen, Schreiben oder Schreiben an das Ende der Datei), wird die Positionierung an den Anfang der Datei zurckgesetzt. Wenn das System die Datei ffnen kann, gibt SY-SUBRC 0 zurck. Anderenfalls gibt SY-SUBRC 8 zurck.

DATA: mess(60) TYPE c, fname(10) TYPE c VALUE '/tmp'. OPEN DATASET fname FOR OUTPUT MESSAGE mess. IF sy-subrc <> 0. WRITE: 'SY-SUBRC:', sy-subrc, / 'System Message:', mess. ENDIF.
Wenn das SAP-System unter UNIX luft, sieht die Ausgabe dieses Beispiels so aus:

Das System kann die Datei nicht ffnen, da es sich um ein Verzeichnis handelt.

Das folgende Programm zeigt, wie die Positionierung durchgefhrt wird, wenn eine Datei zum Schreiben geffnet wird. Es wre jedoch besserer Programmierstil, bei bereits geffneten Dateien immer die CLOSE-Anweisung zu benutzen, bevor sie erneut geffnet werden (Informationen zum Schlieen von Dateien finden Sie in Schlieen einer Datei [Seite 420]).

DATA fname(60) TYPE c VALUE 'myfile'. DATA num TYPE i. OPEN DATASET fname FOR OUTPUT. DO 10 TIMES. num = num + 1. TRANSFER num TO fname. ENDDO. PERFORM input. OPEN DATASET fname FOR OUTPUT. num = 0. DO 5 TIMES. num = num + 10.

April 2001

407

ABAP Programmierung (BC-ABA) Arbeiten mit Dateien auf dem Anwendungsserver

SAP AG

TRANSFER num TO fname. ENDDO. PERFORM input. CLOSE DATASET fname. OPEN DATASET fname FOR OUTPUT. num = 0. DO 5 TIMES. num = num + 20. TRANSFER num TO fname. ENDDO. PERFORM input. FORM input. SKIP. OPEN DATASET fname FOR INPUT. DO. READ DATASET fname INTO num. IF sy-subrc <> 0. EXIT. ENDIF. WRITE / num. ENDDO. ENDFORM.
Ausgabe:
1 2 3 4 5 6 7 8 9 10 10 20 30 40 50 6 7 8 9 10 20 40 60 80 100

In diesem Beispiel geschieht folgendes mit der Datei "myfile": 1. Sie wird zum Schreiben geffnet.

408

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Arbeiten mit Dateien auf dem Anwendungsserver

2. Sie wird mit 10 Ganzzahlen gefllt (Informationen zur TRANSFERAnweisung finden Sie in Daten in Dateien schreiben [Seite 422]). 3. Sie wird auch zum Lesen geffnet. Die Positionierung wird deshalb auf den Anfang der Datei zurckgesetzt. 4. Sie wird in das Feld NUM eingelesen (Informationen zur Anweisung READ DATASET finden Sie in Daten aus Dateien lesen [Seite 424]). Die Werte von NUM werden auf das Ausgabebild geschrieben. 5. Sie wird wieder zum Schreiben geffnet. Die Positionierung wird auf den Anfang der Datei zurckgesetzt. 6. Sie wird mit 5 Ganzzahlen gefllt. Diese Ganzzahlen berschreiben den alten Dateiinhalt. 7. Sie wird erneut zum Lesen geffnet. Die Positionierung wird auf den Anfang der Datei zurckgesetzt. 8. Sie wird in das Feld NUM eingelesen. Die Werte von NUM werden in das Ausgabebild geschrieben. 9. Sie wird geschlossen (Informationen zur Anweisung CLOSE DATASET finden Sie in Schlieen einer Datei [Seite 420]). 10. Sie wird erneut zum Schreiben geffnet. Der Inhalt der bestehenden Datei wird gelscht. 11. Sie wird mit 5 Ganzzahlen gefllt. 12. Sie wird auch zum Lesen geffnet. Die Positionierung wird auf den Anfang der Datei zurckgesetzt. 13. Sie wird in das Feld NUM eingelesen. Die Werte von NUM werden in das Ausgabebild geschrieben.

April 2001

409

ABAP Programmierung (BC-ABA) Arbeiten mit Dateien auf dem Anwendungsserver ffnen einer Datei fr das Schreiben an das Ende der Datei

SAP AG

Um eine Datei fr das Schreiben an das Ende der Datei zu ffnen, benutzen Sie den Zusatz FOR APPENDING der Anweisung OPEN DATASET:
Syntax

OPEN DATASET <dsn> FOR APPENDING.


Diese Anweisung ffnet eine Datei fr das Schreiben an das Ende dieser Datei. Wenn die Datei nicht existiert, wird sie angelegt. Wenn sie bereits existiert und geschlossen ist, ffnet das System die Datei und setzt die Positionierung an das Ende der Datei. Wenn die Datei existiert und bereits geffnet ist (fr Lese- oder Schreibzugriff oder fr das Schreiben an das Ende der Datei), wird die Positionierung an das Ende der Datei gesetzt. SY-SUBRC gibt immer 0 zurck.

Es ist besserer Programmierstil, bei bereits geffneten Dateien die CLOSEAnweisung zu benutzen, bevor sie erneut geffnet werden (Informationen zum Schlieen von Dateien finden Sie in Schlieen einer Datei [Seite 420]).

DATA fname(60) TYPE c VALUE 'myfile'. DATA num TYPE I. OPEN DATASET fname FOR OUTPUT. DO 5 TIMES. num = num + 1. TRANSFER num TO fname. ENDDO. OPEN DATASET fname FOR INPUT. OPEN DATASET fname FOR APPENDING. num = 0. DO 5 TIMES. num = num + 10. TRANSFER num TO fname. ENDDO. OPEN DATASET fname FOR INPUT. DO. READ DATASET fname INTO num. IF sy-subrc <> 0. EXIT. ENDIF. WRITE / num. ENDDO.
Ausgabe:
1 2 3 4 5 10

410

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Arbeiten mit Dateien auf dem Anwendungsserver


20 30 40 50

In diesem Beispiel wird eine Datei "myfile" fr den Schreibzugriff geffnet und mit fnf Ganzzahlen von 1 bis 5 gefllt (Informationen zur Anweisung TRANSFER finden Sie in Daten in Dateien schreiben [Seite 422]). Die nchste OPEN DATASETAnweisung setzt die Positionierung auf den Anfang zurck. Dann wird die Datei fr das Schreiben an das Ende der Datei geffnet, und die Positionierung wird an das Ende gesetzt. Fnf Ganzzahlen von 10 bis 50 werden in die Datei geschrieben. Schlielich wird der Inhalt der Datei gelesen und auf dem Bildschirm ausgegeben.

April 2001

411

ABAP Programmierung (BC-ABA) Arbeiten mit Dateien auf dem Anwendungsserver Binrmodus angeben

SAP AG

Um eine Datei im Binrmodus zu bearbeiten, verwenden Sie den Zusatz IN BINARY MODE der Anweisung OPEN DATASET:
Syntax

OPEN DATASET <dsn> IN BINARY MODE [FOR ....].


Wenn Sie Daten aus einer Datei lesen oder in eine Datei schreiben, die im Binrmodus geffnet ist, werden die Daten Byte fr Byte bertragen. Der Inhalt der Datei wird whrend der bertragung nicht interpretiert. Wenn Sie den Inhalt eines Feldes in eine Datei schreiben, bertrgt das System alle Bytes des Quellfeldes. Wenn Sie Daten aus einer Datei in ein Feld bertragen, hngt die Anzahl der bertragenen Bytes von der Lnge des Zielfeldes ab. Wenn Sie das Zielfeld nach dem Lesen mit einer anderen ABAP-Anweisung ansprechen, interpretiert das System den Feldinhalt abhngig von dessen Datentyp.

DATA fname(60) TYPE c VALUE 'myfile'. DATA: num1 num2 text1(4) text2(8) hex TYPE TYPE TYPE TYPE TYPE i, i, c, c, x.

OPEN DATASET fname FOR OUTPUT IN BINARY MODE. num1 = 111. text1 = 'TEXT'. TRANSFER num1 TO fname. TRANSFER text1 TO fname. OPEN DATASET fname FOR INPUT IN BINARY MODE. READ DATASET fname INTO text2. WRITE / text2. OPEN DATASET fname FOR INPUT IN BINARY MODE. READ DATASET fname INTO num2. WRITE / num2. OPEN DATASET fname FOR INPUT IN BINARY MODE. SKIP. DO. READ DATASET fname INTO hex. If sy-subrc <> 0. EXIT. ENDIF. WRITE hex. ENDDO.
Ausgabe:
###oTEXT 111

412

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Arbeiten mit Dateien auf dem Anwendungsserver

00 00 00 6F 54 45 58 54

Nach ffnen der Datei "myfile" fr das Schreiben im Binrmodus wird der Inhalt der Felder NUM1 und TEXT1 in die Datei geschrieben (Informationen zur Anweisung TRANSFER finden Sie in Daten in Dateien schreiben [Seite 422]). Dann wird die Datei zum Lesen geffnet, und der gesamte Inhalt wird in das Feld TEXT2 bertragen (Informationen zur Anweisung READ DATASET finden Sie in Daten aus Dateien lesen [Seite 424]). Die ersten vier Stellen der Zeichenkette TEXT2 haben keinen Sinn, da es sich bei den entsprechenden Bytes um die (plattformabhngige) Darstellung der Ganzzahl 111 handelt. Das System versucht, alle Bytes als Zeichen zu interpretieren. Diese Interpretation funktioniert nur bei den letzten vier Bytes. Nach Rcksetzen der Positionierung mit einer OPEN-Anweisung werden die ersten vier Bytes der Datei nach NUM2 bertragen. Der Wert von NUM2 ist sinnvoll, da er denselben Datentyp wie NUM1 hat. Schlielich werden die acht Bytes der Datei nacheinancer in das Feld HEX eingelesen. Aus der Bildschirmausgabe von HEX knnen Sie die hexadezimale Darstellung des Dateiinhalts ersehen. Die letzten vier Bytes sind die ASCII-Darstellung der Zeichen im Wort TEXT.

April 2001

413

ABAP Programmierung (BC-ABA) Arbeiten mit Dateien auf dem Anwendungsserver Textmodus angeben

SAP AG

Um eine Datei im Textmodus zu bearbeiten, verwenden Sie den Zusatz IN TEXT MODE der Anweisung OPEN DATASET wie folgt:
Syntax

OPEN DATASET <dsn> FOR .... IN TEXT MODE.


Wenn Sie Daten aus einer Datei lesen oder Daten in eine Datei schreiben, die im Textmodus geffnet ist, werden die Daten Zeile fr Zeile bertragen. Das System nimmt an, da die Datei eine Zeilenstruktur hat.

Fr jede TRANSFER-Anweisung (Informationen zur Anweisung TRANSFER finden Sie in Daten in Dateien schreiben [Seite 422]) bertrgt das System alle Bytes - mit Ausnahme von Leerzeichen am Ende - in die Datei und stellt eine Zeilenendemarkierung an das Ende. Fr jede Anweisung READ DATASET (Informationen zur Anweisung READ DATASET finden Sie in Daten aus Dateien lesen [Seite 424]) liest das System alle Daten bis zur nchsten Zeilenendemarkierung. Wenn das Zielfeld zu klein ist, wird die Zeile abgeschnitten. Wenn das Zielfeld lnger ist als die Zeile, wird es von rechts mit Leerzeichen gefllt.

Sie sollten den Textmodus benutzen, wenn Sie Zeichenketten in Dateien schreiben wollen oder wenn Sie wissen, da eine vorhandene Datei auf Zeilenbasis formatiert ist. Im Textmodus knnen Sie z.B. Dateien lesen, die mit einem beliebigen Editor auf Ihrem Anwendungsserver erstellt wurden.

Das folgende Beispielprogramm wurde fr SAP-Systeme geschrieben, die unter UNIX-Systemen laufen, die eine ASCII-Darstellung benutzen:

DATA fname(60) TYPE c VALUE 'myfile'. DATA: text(4) TYPE c, hex TYPE x. OPEN DATASET fname FOR OUTPUT IN TEXT MODE. TRANSFER '12 TRANSFER '123456 TRANSFER '1234 ' TO fname. 9 ' TO fname. ' TO fname.

OPEN DATASET fname FOR INPUT IN TEXT MODE. READ DATASET fname INTO text. WRITE / text. READ DATASET fname INTO text. WRITE text. READ DATASET fname INTO text. WRITE text. OPEN DATASET fname FOR INPUT IN BINARY MODE. SKIP. DO. READ DATASET fname INTO hex. IF sy-subrc <> 0.

414

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Arbeiten mit Dateien auf dem Anwendungsserver

EXIT. ENDIF. WRITE hex. ENDDO.


Ausgabe:
12 1234 1234 31 32 0A 31 32 33 34 35 36 20 20 39 0A 31 32 33 34 0A

In diesem Beispiel wird eine Datei "myfile" fr das Schreiben im textmodus geffnet. Drei Literale der Lnge 10 werden in die Datei bertragen. Nach dem ffnen der Datei fr das Lesen im Textmodus werden die gespeicherten Zeilen in das Feld TEXT (Lnge 4) eingelesen. Die erste Zeile wird von rechts mit zwei Leerzeichen aufgefllt. Die letzten fnf Stellen der zweiten Zeile werden abgeschnitten. Das ffnen der Datei im Binrmodus und das Einlesen in das Hexadezimalfeld HEX zeigt die Struktur der Datei: Die Zahlen zwischen 31 und 36 sind die ASCII-Darstellungen der numerischen Zeichen 1 bis 6, whrend 20 das Leerzeichen darstellt. Das Zeilenende wird jeweils durch 0A gekennzeichnet. Beachten Sie, da Leerzeichen am Ende der Literale nicht in die Datei geschrieben werden.

April 2001

415

ABAP Programmierung (BC-ABA) Arbeiten mit Dateien auf dem Anwendungsserver ffnen einer Datei an einer bestimmten Position

SAP AG

Um eine Datei an einer bestimmten Position zu ffnen, verwenden Sie den Zusatz AT POSITION der Anweisung OPEN DATASET:
Syntax

OPEN DATASET <dsn> [FOR ....] [IN ... MODE] AT POSITION <pos>.
Diese Anweisung ffnet eine Datei <dsn> und setzt die Positionierung fr das Lesen oder Schreiben auf <pos>. Die Position <pos> wird vom Anfang der Datei an in Bytes gezhlt. Sie knnen keine Position angeben, die vor dem Beginn der Datei liegt. Die Angabe einer Position <pos> ist hauptschlich dann sinnvoll, wenn Sie im Binrmodus arbeiten, da die physische Darstellung einer Textdatei vom Betriebssystem abhngt.

DATA fname(60) TYPE c VALUE 'myfile'. DATA num TYPE I. OPEN DATASET fname FOR OUTPUT AT POSITION 16. DO 5 TIMES. num = num + 1. TRANSFER num TO fname. ENDDO. OPEN DATASET fname FOR INPUT. DO 9 TIMES. READ DATASET fname INTO num. WRITE / num. ENDDO. OPEN DATASET fname FOR INPUT AT POSITION 28. SKIP. DO 2 TIMES. READ DATASET fname INTO num. WRITE / num. ENDDO.
Ausgabe:
0 0 0 0 1 2 3 4 5 4 5

In diesem Beispiel wird die Datei "myfile" im Binrmodus geffnet (Standardmodus). Die Anfangsposition wird fr das Schreiben mit 16 und fr das Lesen mit 28 angegeben. Wie in diesem Beispiel dargestellt, sind Positionsangaben fr das

416

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Arbeiten mit Dateien auf dem Anwendungsserver

Schreiben und Lesen von Ganzzahlen dann sinnvoll, wenn die Positionen durch 4 teilbar sind.

April 2001

417

ABAP Programmierung (BC-ABA) Arbeiten mit Dateien auf dem Anwendungsserver Betriebssystemkommandos absetzen

SAP AG

Unter den Betriebssystemen UNIX und WINDOWS NT knnen Sie ein Betriebssystemkommando mit OPEN DATASET absetzen. Verwenden Sie hierfr den Zusatz FILTER:
Syntax

OPEN DATASET <dsn> FILTER <filt>.


Das Betriebssystemkommando, das im Feld <filt> enthalten ist, wird bei ffnen der Datei <dsn> mitverarbeitet.

Das folgende Beispiel gilt fr das Betriebssystem UNIX:

DATA dsn(20) TYPE c VALUE '/usr/test.Z'. OPEN DATASET dsn FOR OUTPUT FILTER 'compress'. ...... OPEN DATASET dsn FOR INPUT FILTER 'uncompress'.
Die erste OPEN-Anweisung ffnet die Datei '/usr/test.Z' so, da ausgegebene Daten komprimiert in diese eingelesen werden. Die zweite OPEN-Anweisung ffnet die Datei '/usr/test.Z' so, da die Daten beim Auslesen aus der Datei wieder entkomprimiert werden.

418

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Arbeiten mit Dateien auf dem Anwendungsserver

Empfangen der Betriebssystemnachricht

Um nach dem Versuch, eine Datei zu ffnen, die Nachricht des Betriebssystems zu erhalten, verwenden Sie den Zusatz MESSAGE der Anweisung OPEN DATASET:
Syntax

OPEN DATASET <dsn> MESSAGE <msg>.


Das System stellt die Betriebssystemnachricht in die Variable <msg>. Verwenden Sie diesen Zusatz zusammen mit dem Systemfeld SY-SUBRC fr die Fehlerbehandlung.

DATA: mess(60) TYPE c, fname(10) TYPE c VALUE 'hugo.xyz'. OPEN DATASET fname MESSAGE mess. IF sy-subrc <> 0. WRITE: 'SY-SUBRC:', sy-subrc, / 'System Message:', mess. ENDIF.
Wenn das SAP-System unter UNIX luft und die Datei "hugo.xyz" nicht existiert, sieht die Ausgabe in diesem Beispiel so aus:

April 2001

419

ABAP Programmierung (BC-ABA) Arbeiten mit Dateien auf dem Anwendungsserver

SAP AG

Schlieen einer Datei


Um eine Datei auf dem Anwendungsserver zu schlieen, verwenden Sie die Anweisung CLOSE:
Syntax

CLOSE DATASET <dsn>.


Diese Anweisung schliet die Datei <dsn>. Die Namensgebung wird in ffnen einer Datei [Seite 404] beschrieben. Sie mssen eine Datei eigentlich nur dann schlieen, wenn Sie ihren Inhalt beim nchsten ffnen fr den Schreibzugriff lschen wollen (weitere Informationen sowie ein Beispiel finden Sie in ffnen einer Datei zum Schreiben [Seite 407]).

Um Fehler zu vermeiden und Ihre Programme leichter lesbar zu machen, sollten Sie eine Datei jedoch immer schlieen, bevor Sie die nchste Anweisung OPEN DATASET benutzen. Mit der Anweisung CLOSE gliedern Sie Ihr Programm in logische Blcke und erleichtern die Pflege des Programms.

DATA fname(60) TYPE c VALUE 'myfile'. OPEN DATASET fname FOR OUTPUT. ..... CLOSE fname. OPEN DATASET fname FOR INPUT. ..... CLOSE fname. OPEN DATASET fname FOR INPUT AT POSITION <pos>. ..... CLOSE fname.
Die Anweisung CLOSE ist in diesem Beispiel zwar nicht erforderlich, verbessert jedoch das Programmlayout.

420

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Arbeiten mit Dateien auf dem Anwendungsserver

Lschen einer Datei


Um eine Datei auf dem Anwendungsserver zu lschen, benutzen Sie die Anweisung DELETE DATASET:
Syntax

DELETE DATASET <dsn>.


Diese Anweisung lscht die Datei <dsn>. Die Namensgebung wird in ffnen einer Datei [Seite 404] beschrieben. Wenn das System die Datei <dsn> lschen kann, gibt SY-SUBRC 0 zurck. Anderenfalls gibt SY-SUBRC 4 zurck.

DATA fname(60) TYPE c VALUE 'myfile'. OPEN DATASET fname FOR OUTPUT. OPEN DATASET fname FOR INPUT. IF sy-subrc = 0. WRITE / 'File found'. ELSE. WRITE / 'File not found'. ENDIF. DELETE DATASET fname. OPEN DATASET fname FOR INPUT. IF sy-subrc = 0. WRITE / 'File found'. ELSE. WRITE / 'File not found'. ENDIF.
Ausgabe:
File found File not found

In diesem Beispiel wird die Datei "myfile" fr den Schreibzugriff geffnet, sofern sie noch nicht existiert. Das System findet diese Datei, wenn sie fr den Lesezugriff geffnet wird. Nach Verwendung der Anweisung DELETE DATASET findet das System die Datei nicht mehr.

April 2001

421

ABAP Programmierung (BC-ABA) Arbeiten mit Dateien auf dem Anwendungsserver

SAP AG

Daten in Dateien schreiben


Um Daten in eine Datei auf dem Anwendungsserver zu schreiben, benutzen Sie die Anweisung TRANSFER wie folgt:
Syntax

TRANSFER <f> to <dsn> [LENGTH <len>].


Die Anweisung schreibt den Wert des Feldes <f> in die Datei <dsn>. Sie knnen den bertragungsmodus mit der Anweisung OPEN DATASET angeben. Wenn die Datei nicht zum Schreiben geffnet ist, versucht das System, sie im Binrmodus zu ffnen. Es ist jedoch besser, eine Datei nur mit der Anweisung OPEN DATASET zu ffnen. Die Anweisung OPEN DATASET und die Namensgebung fr Dateien werden in ffnen einer Datei [Seite 404] beschrieben. Der Datentyp des Feldes <f> kann elementar sein, oder es kann sich um eine Feldleiste handeln, die keine internen Tabellen beinhaltet. Interne Tabellen knnen nicht in einem Lauf in Dateien geschrieben werden. Mit dem Zusatz LENGTH knnen Sie die Lnge <len> der zu bertragenden Daten angeben. Das System bertrgt die ersten <len> Bytes in die Datei. Wenn <len> nicht ausreicht, werden berzhlige Bytes abgeschnitten. Wenn <len> zu gro ist, fllt das System die bertragene Zeile von rechts mit Leerzeichen.

Das folgende Programm zeigt, wie interne Tabellen in eine Datei geschrieben werden:

DATA fname(60) TYPE c VALUE 'myfile'. TYPES: BEGIN OF line, col1 TYPE i, col2 TYPE i, END OF line. DATA: lin TYPE line, TAB TYPE TABLE OF line. DO 5 TIMES. lin-col1 = sy-index. lin-col2 = sy-index ** 2. APPEND lin TO tab. ENDDO. OPEN DATASET fname FOR OUTPUT. LOOP AT tab INTO lin. TRANSFER lin TO fname. ENDLOOP. CLOSE DATASET fname. OPEN DATASET fname FOR INPUT. DO. READ DATASET FNAME INTO lin. IF sy-subrc <> 0. EXIT. ENDIF.

422

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Arbeiten mit Dateien auf dem Anwendungsserver

WRITE: / lin-col1, lin-col2. ENDDO. CLOSE DATASET fname.


Ausgabe:
1 2 3 4 5 1 4 9 16 25

In diesem Beispiel werden eine Feldleiste LIN und eine interne Tabelle TAB mit Zeilentyp LINE angelegt. Nachdem die interne Tabelle TAB gefllt worden ist, wird sie Zeile fr Zeile in die Datei myfile geschrieben. Dann wird die Datei in die Feldleiste LIN eingelesen, und der Inhalt von LIN wird in das Ausgabebild geschrieben.

Das folgende Beispielprogramm wurde fr SAP-Systeme geschrieben, die auf UNIXSystemen laufen, die mit einer ASCII-Darstellung arbeiten.

DATA fname(60) TYPE c VALUE 'myfile'. DATA: text1(4) VALUE '1234', text2(8) VALUE '12345678', hex TYPE x. OPEN DATASET fname FOR OUTPUT IN TEXT MODE. TRANSFER: text1 TO fname LENGTH 6, text2 TO fname LENGTH 6. CLOSE DATASET fname. OPEN DATASET fname FOR INPUT. DO. READ DATASET fname INTO hex. IF sy-subrc <> 0. EXIT. ENDIF. WRITE hex. ENDDO. CLOSE DATASET fname.
Ausgabe:
31 32 33 34 20 20 0A 31 32 33 34 35 36 0A

In diesem Beispiel werden die Zeichenketten TEXT1 und TEXT2 im Textmodus in die Datei "myfile" geschrieben. Die Ausgabelnge wird mit 6 angegeben. Indem Sie die Datei Byte fr Byte in das hexadezimale Feld einlesen, knnen Sie sehen, wie sie gespeichert wird: Die Zahlen 31 bis 36 sind die ASCII-Darstellungen der numerischen Zeichen 1 bis 6. 20 stellt ein Leerzeichen dar, und 0A kennzeichnet das Ende einer Zeile. TEXT1 wird von rechts mit zwei Leerzeichen aufgefllt. Zwei Stellen von TEXT2 werden abgeschnitten.

April 2001

423

ABAP Programmierung (BC-ABA) Arbeiten mit Dateien auf dem Anwendungsserver

SAP AG

Daten aus Dateien lesen


Um Daten aus einer Datei auf dem Anwendungsserver zu lesen, verwenden Sie die Anweisung READ DATASET:
Syntax

READ DATASET <dsn> INTO <f> [LENGTH <len>].


Diese Anweisung liest Daten aus der Datei <dsn> in die Variable <f>. Um festlegen zu knnen, in welche Variable Sie Daten aus einer Datei einlesen, msen Sie die Struktur der Datei kennen. Sie knnen den bertragungsmodus mit der Anweisung OPEN DATASET angeben. Wenn die Datei nicht zum Lesen geffnet wird, versucht das System, sie im Binrmodus zu ffnen. Es ist jedoch besser, eine Datei nur mit der Anweisung OPEN DATASET zu ffnen. Die Anweisung OPEN DATASET und die Namensgebung fr Dateien werden in ffnen einer Datei [Seite 404] beschrieben. Nach einer erfolgreichen Leseoperation gibt SY-SUBRC 0 zurck. Wenn das Ende der Datei erreicht ist, gibt SY-SUBRC 4 zurck. Wenn die Datei nicht geffnet werden kann, gibt SY-SUBRC 8 zurck. Wenn Sie im Binrmodus arbeiten, knnen Sie den Zusatz LENGTH verwenden, um die Lnge der nach <f> bertragenen Daten herauszufinden. Das System setzt den Wert der Variable <len> auf diese Lnge.

DATA fname(60) TYPE c VALUE 'myfile'. DATA: text1(12) TYPE c VALUE 'abcdefghijkl', text2(5) TYPE c, leng TYPE i. OPEN DATASET fname FOR OUTPUT IN BINARY MODE. TRANSFER text1 TO fname. CLOSE DATASET fname. OPEN DATASET fname FOR INPUT IN BINARY MODE. DO. READ DATASET fname INTO text2 LENGTH LENG. WRITE: / sy-subrc, text2, leng. IF sy-subrc <> 0. EXIT. ENDIF. ENDDO. CLOSE DATASET fname.
Ausgabe:
0 abcde 0 fghij 4 kl### 5 5 2

In diesem Beispiel wird die Datei "myfile" mit 12 Bytes aus dem Feld TEXT1 gefllt. Dann wird sie in Portionen von 5 Bytes in das Feld TEXT2 eingelesen. Beachten Sie, da das System die letzten drei Bytes von TEXT2 mit Nullen auffllt, nachdem das Ende der Datei erreicht ist, und da die Anzahl der bertragenen Bytes im Feld LENG angegeben wird.

424

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Arbeiten mit Dateien auf dem Anwendungsserver

Wenn Sie im Textmodus arbeiten, knnen Sie den Zusatz LENGTH benutzen, um die Lnge der aktuellen Zeile in der Datei herauszufinden. Das System setzt den Wert der Variable <len> auf die Zeilenlnge. Dafr zhlt das System die Anzahl der Bytes von der aktuellen Position bis zur nchsten Zeilenendemarkierung in der Datei.

DATA fname(60) TYPE c VALUE 'myfile'. DATA: text1(4) TYPE c VALUE '1234 ', text2(8) TYPE c VALUE '12345678', text3(2) TYPE c, leng TYPE i. OPEN DATASET fname FOR OUTPUT IN TEXT MODE. TRANSFER: text1 TO fname, text2 TO fname. CLOSE DATASET fname. OPEN DATASET fname FOR INPUT IN TEXT MODE. DO 2 TIMES. READ DATASET fname INTO text3 LENGTH leng. WRITE: / text3, leng. ENDDO. CLOSE DATASET fname.
Ausgabe:
12 12 4 8

In diesem Beispiel werden die Zeichenketten TEXT1 und TEXT2 im Textmodus in die Datei myfile" geschrieben. Dann werden sie in die Zeichenkette TEXT3 (Lnge 2) eingelesen. Die Speicherlnge der Zeilen wird in das Feld LENG geschrieben.

April 2001

425

ABAP Programmierung (BC-ABA) Arbeiten mit Dateien auf dem Anwendungsserver

SAP AG

Automatische Prfungen bei Dateioperationen


Das R/3-System fhrt bei Operationen mit sequentiellen Dateien folgende automatische Prfungen durch: Mit einer Berechtigungsprfung ber das Berechtigungsobjekt S_DATASET prft das System, ob das aktuelle ABAP-Programm auf die spezifizierte Datei zugreifen darf.
Berechtigungsprfung fr bestimmte Programme und Dateien [Seite 427]

Mit einer Verprobung gegen die Tabelle SPTH prft das System, ob die spezifizierte Datei generell fr einen Dateizugriff aus ABAP vorgesehen ist . Die Tabelle SPTH ermglicht weiterhin eine Prfung der Benutzerberechtigung.
Allgemeine Verprobung bei Dateizugriffen [Seite 430]

426

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Berechtigungsprfung fr bestimmte Programme und Dateien

Berechtigungsprfung fr bestimmte Programme und Dateien


Bei Zugriffen auf sequentielle Dateien auf dem Anwendungsserver mit den Anweisungen

OPEN DATASET READ DATASET TRANSFER DELETE DATASET

fhrt das System automatisch eine Berechtigungsprfung ber das Berechtigungsobjekt S_DATASET durch. Mit diesem Objekt knnen Sie die Berechtigung von bestimmten Programmen zum Zugriff auf bestimmte Dateien erteilen und auch die Berechtigung zur Benutzung von Betriebssystemkommandos als Dateifilter vergeben.

Die generelle Zugriffserlaubnis aus ABAP auf Dateien und benutzerabhngige Berechtigungsprfungen steuern Sie nicht mit dem Berechtigungsobjekt S_DATASET, sondern mit der Tabelle SPTH (siehe Allgemeine Verprobung bei Dateizugriffen [Seite 430]).
Das Berechtigungsobjekt S_DATASET

Das Objekt S_DATASET besteht aus folgenden Feldern:

ABAP-Programmname Name des ABAP-Programms, aus dem der Zugriff erfolgen darf. Hiermit knnen Sie den Zugriff auf die Dateien auf einige bekannte Zugriffsprogramme beschrnken.

Aktivitt Die mglichen Werte sind: 33: Normales Lesen einer Datei 34: Normales Schreiben oder Lschen einer Datei A6: Lesen einer Datei mit Filter (Betriebssystemkommando) A7: Schreiben einer Datei mit Filter (Betriebssystemkommando)

Dateiname Name der Betriebssystemdatei. Hiermit knnen Sie die Dateien einschrnken, auf die zugegriffen werden darf.

Weitere Informationen zu Berechtigungsobjekten finden Sie in der Dokumentation BC - Benutzer und Rollen [Extern].

Ist das Ergebnis der automatischen Berechtigungsprfung negativ, erfolgt ein Laufzeitfehler

April 2001

427

ABAP Programmierung (BC-ABA) Berechtigungsprfung fr bestimmte Programme und Dateien

SAP AG

Fhren Sie deshalb die Berechtigungsprfung vor dem Dateizugriff mit dem Funktionsbaustein AUTHORITY_CHECK_DATASET im ABAP-Programm durch.
Der Funktionsbaustein AUTHORITY_CHECK_DATASET

Mit diesem Funktionsbaustein knnen Sie in ABAP-Programmen die Berechtigung zum Zugriff auf eine Datei vor dem ffnen der Datei prfen. Damit greifen Sie einem Laufzeitfehler bei der automatischen Berechtigungsprfung vor. Der Funktionbaustein hat folgende Importparameter:

PROGRAM Name des ABAP-Programms, aus dem der Dateizugriff erfolgt. Falls kein Programmname angegeben wird, wird das aktuelle Programm angenommen.

ACTIVITY Zugriffstyp, die mglichen Werte sind:


-

READ: Datei lesen, WRITE: Datei ndern, READ_WITH_FILTER: Datei ber Filterfunktion lesen, WRITE_WITH_FILTER: Datei ber Filterfunktion ndern, DELETE: Datei lschen. Diese Werte sind in der Typgruppe SABC wie folgt als Konstanten vordefiniert:

TYPE-POOL SABC . CONSTANTS: SABC_ACT_READ(4) SABC_ACT_WRITE(5) SABC_ACT_READ_WITH_FILTER(16) SABC_ACT_WRITE_WITH_FILTER(17) SABC_ACT_DELETE(6) SABC_ACT_INIT(4) SABC_ACT_ACCEPT(6) SABC_ACT_CALL(4)

VALUE VALUE VALUE VALUE VALUE VALUE VALUE VALUE

'READ', 'WRITE', 'READ_WITH_FILTER', 'WRITE_WITH_FILTER', 'DELETE', 'INIT', 'ACCEPT', 'CALL'.

FILENAME Name der Datei, auf die zugegriffen wird.

TYPE-POOLS SABC. ..... CALL FUNCTION 'AUTHORITY_CHECK_DATASET' EXPORTING PROGRAM = SY-REPID ACTIVITY = SABC_ACT_READ FILENAME = '/tmp/sapv01' EXCEPTIONS NO_AUTHORITY = 1 ACTIVITY_UNKNOWN = 2. ......

428

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Berechtigungsprfung fr bestimmte Programme und Dateien

Dieser Aufruf des Funktionsbausteins fragt ab, ob das laufende Programm lesend auf die Datei '/tmp/sapv01' zugreifen darf.

April 2001

429

ABAP Programmierung (BC-ABA) Berechtigungsprfung fr bestimmte Programme und Dateien

SAP AG

Allgemeine Verprobung bei Dateizugriffen


Bei Zugriffen auf sequentielle Dateien auf dem Anwendungsserver mit den Anweisungen

OPEN DATASET TRANSFER DELETE DATASET

fhrt das System automatisch eine Verprobung gegen die Tabelle SPTH durch. Die Tabelle SPTH regelt die generellen Lese- und Schreibzugriffe von ABAP auf Dateien und ob Dateien in eine Sicherungsprozedur aufgenommen werden sollen. In der Tabelle SPTH knnen Lese- oder Schreibzugriffe auf generisch spezifizierbare Dateien unabhngig vom R/3-Berechtigungskonzept generell verboten werden. Fr die brigen Dateien (also solche, deren Lese- oder Schreibzugriffe in der Tabelle SPTH generell erlaubt sind) knnen Berechtigungsprfungen mit dem R/3-Berechtigungskonzept durchgefhrt werden. Hierfr knnen in der Tabelle SPTH Berechtigungsgruppen fr programmunabhngige Prfungen der Benutzerberechtigungen definiert werden. Fr diesen Zweck hat die Tabelle SPTH folgende Spalten:

PATH Diese Spalte enthlt generische Dateinamen. Das bedeutet, da die Dateien der Anwendungsserver, fr die ein Eintrag in dieser Spalte am genauesten gilt, die in den brigen Spalten dieser Zeile spezifizierten Eigenschaften erhalten.

SPTH enthalte die drei folgenden Eintrge in der Spalte PATH:

* /tmp /tmp/myfile
Dann gelten die Eintrge in der

ersten Zeile fr alle Dateien des Anwendungsservers bis auf die des Pfads '/tmp'. zweiten Zeile fr alle Dateien des Anwendungsservers im Pfad '/tmp' bis auf die Datei '/tmp/myfile'. dritten Zeile fr die Anwendungsserverdatei '/tmp/myfile'.

SAVEFLAG Diese Spalte enthlt Flags, die durch 'X' gesetzt werden. Ein gesetztes Flag bedeutet, da die in Spalte PATH spezifizierten Dateien in eine Sicherungsprozedur aufgenommen werden sollen.

FS_NOREAD Diese Spalte enthlt Flags, die durch 'X' gesetzt werden. Ein gesetztes Flag bedeutet, da aus ABAP keinerlei Zugriff auf die in Spalte PATH spezifizierten Dateien erfolgen darf. Dieses Flag bersteuert alle

430

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Berechtigungsprfung fr bestimmte Programme und Dateien

Benutzerberechtigungen. Das Setzen von FS_NOREAD bedingt automatisch das Setzen von FS_NOWRITE. Falls das Flag nicht gesetzt ist, kann bei entsprechender Berechtigung (siehe Spalte FSBRGRU und Berechtigungsprfung fr bestimmte Programme und Dateien [Seite 427]) von ABAP aus auf die Dateien zugegriffen werden.

FS_NOWRITE Diese Spalte enthlt Flags, die durch 'X' gesetzt werden. Ein gesetztes Flag bedeutet, da aus ABAP kein ndernder Zugriff auf die in Spalte PATH spezifizierten Dateien erfolgen darf. Dieses Flag bersteuert alle Benutzerberechtigungen. Falls das Flag nicht gesetzt ist, knnen die Dateien bei entsprechender Berechtigung (siehe Spalte FSBRGRU und Berechtigungsprfung fr bestimmte Programme und Dateien [Seite 427]) von ABAP aus gendert werden.

FSBRGRU Diese Spalte enthlt den Namen von Berechtigungsgruppen. Eine Berechtigungsgruppe entspricht dem ersten Feld (RS_BRGRU) des Berechtigungsobjekts S_PATH. ber das zweite Feld (ACTVT) des Berechtigungsobjekts S_PATH knnen Leseberechtigung (Wert 3) bzw. Pflegeberechtigung (Wert 2) eines Benutzers fr die Dateien der Berechtigungsgruppe berprft werden. Eintrge in der Spalte FSBRGRU fassen also Dateien der Anwendungsserver zu Berechtigungsgruppen zusammen. Durch die Vergabe von Berechtigungen fr das Berechtigungsobjekt S_PATH sind Dateizugriffe also benutzerabhngig regelbar.

Im Vergleich zur Berechtigungsprfung ber das Berechtigungsobjekt S_DATASET (siehe Berechtigungsprfung fr bestimmte Programme und Dateien [Seite 427]), ist die Berechtigungsprfung gegen das Berechtigungsobjekt S_PATH unabhngig vom verwendeten ABAP-Programm. Weiterhin beschrnkt sich die Prfung nicht auf eine Einzeldatei, sondern umfat alle generisch spezifizierten Dateien der Spalte PATH. Kein Eintrag in Spalte FSBRGRU bedeuted, da die Dateien der Spalte PATH keiner Berechtigungsgruppe zugeordnet sind und daher keine Berechtigungsprfung gegen das Berechtigungsobjekt S_PATH erfolgt.

Ein negatives Ergebnis der automatischen Verprobung eines Dateizugriffs fhrt zu einem Laufzeitfehler.

Die Tabelle SPTH enthalte beispielsweise folgende Eintrge:

April 2001

431

ABAP Programmierung (BC-ABA) Berechtigungsprfung fr bestimmte Programme und Dateien

SAP AG

PATH

S A V EF LA G

FS_ NO RE AD

FS_ NOW RITE

F S B R G R U

* /tmp /tmp/fi les


X

X F I L E

Bei diesen Einstellungen kann kein ABAP-Programm auf irgendwelche Dateien des Anwendungsservers zugreifen, bis auf die Dateien des Pfads '/tmp'. Alle ABAP-Programme knnen lesend und schreibend auf die Dateien des Pfads '/tmp' zugreifen. Nur Benutzer, die eine Berechtigung fr die Berechtigungsgruppe FILE haben, knnen ABAP-Programme verwenden, die auf die Dateien des Pfads '/tmp/files' lesend und schreibend zugreifen. Diese Dateien sind auch fr die Sicherung vorgesehen. Mit obiger Tabelle fhren deshalb die folgenden Programmzeilen bei allen Benutzern zum Laufzeitfehler:

DATA: fname(60) TYPE c. fname = '/system/files'. OPEN DATASET fname FOR OUTPUT.

432

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Arbeiten mit Dateien auf dem Prsentationsserver

Arbeiten mit Dateien auf dem Prsentationsserver


Um mit Dateien auf dem Prsentationsserver zu arbeiten, verwenden Sie spezielle Funktionsbausteine, die in der Funktionsbibliothek zur Verfgung gestellt werden. Als Schnittstelle zwischen Programm und Funktionsbaustein verwenden Sie dabei interne Tabellen. Sie knnen:
Daten mit Benutzerdialog auf den Prsentationsserver schreiben [Seite 434] Daten ohne Benutzerdialog auf den Prsentationsserver schreiben [Seite 437] Daten mit Benutzerdialog vom Prsentationsserver lesen [Seite 440] Daten ohne Benutzerdialog vom Prsentationsserver lesen [Seite 443] Dateien auf dem Prsentationsserver berprfen [Seite 446]

Die physischen Dateinamen hngen vom Betriebssystem des Prsentationsservers ab. Sie knnen logische Dateinamen benutzen, um plattformunabhngige ABAP-Programme zu schreiben (siehe Verwendung plattformunabhngiger Dateinamen [Seite 449]).

April 2001

433

ABAP Programmierung (BC-ABA) Daten mit Benutzerdialog auf den Prsentationsserver schreiben

SAP AG

Daten mit Benutzerdialog auf den Prsentationsserver schreiben


Um Daten aus einer internen Tabelle mit Benutzerdialog auf den Prsentationsserver zu schreiben, benutzen Sie den Funktionsbaustein DOWNLOAD. Die wichtigsten Parameter sind unten aufgelistet. Weitere Informationen finden Sie in der Dokumentation zum Funktionsbaustein in Transaktion SE37.
Wichtige Importparameter Parameter Funktion

BIN_FILESIZE Dateilnge fr binre Dateien CODEPAGE FILENAME FILETYPE ITEM MODE

Nur fr Download unter DOS: Wert IBM Dateiname (Vorgabewert fr Benutzerdialog) Dateityp (Vorgabewert fr Benutzerdialog) berschrift fr Benutzerdialogfenster Schreibmodus (leer = berschreiben, 'A' = anhngen)

Mit FILETYPE geben Sie den bertragungsmodus an. Mgliche Werte: BIN Binre Dateien: Sie mssen die Dateilnge angeben. Die interne Tabelle mu aus einer Spalte mit Datentyp X bestehen.

ASC ASCII-Dateien. DAT Excel-Dateien: Die Spalten werden durch Tabulatoren getrennt, die Zeilen durch Zeilenschaltungen und Zeilenvorschbe.

WK1 Excel- und Lotus-Dateien: Die Daten werden in ein WK1-Spreadsheet geschrieben.

Wichtige Exportparameter Parameter Funktion

ACT_FILENAME Dateiname (eingegeben im Benutzerdialog) ACT_FILETYPE Dateityp (eingegeben im Benutzerdialog) FILESIZE


Table Parameters Parameter Funktion

Anzahl der bertragenen Bytes

DATA_TAB Interne Quelltabelle

434

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Daten mit Benutzerdialog auf den Prsentationsserver schreiben

Ausnahmeparameter Parameter Funktion

INVALID_FILESIZE INVALID_TYPE

Ungltiger Parameter BIN_FILESIZE Ungltiger Wert fr Parameter FILETYPE

INVALID_TABLE_WIDTH Ungltige Tabellenstruktur

Angenommen, das fr die Prsentation verwendete Betriebssystem ist WINDOWS NT und das folgende Programm liegt vor:

REPORT demo_data_ext_download. DATA: name TYPE rlgrap-filename, typ TYPE rlgrap-filetype, fname TYPE rlgrap-filename, ftype TYPE rlgrap-filetype, fsize TYPE i. TYPES: BEGIN OF line, col1 TYPE i, col2 TYPE i, END OF line. DATA: lin TYPE line, tab TYPE TABLE OF line. DO 5 TIMES. lin-col1 = sy-index. lin-col2 = sy-index ** 2. APPEND lin TO tab. ENDDO. name = 'C:\temp\saptest.xls'. typ = 'DAT'. CALL FUNCTION 'DOWNLOAD' EXPORTING codepage filename filetype item IMPORTING act_filename act_filetype filesize TABLES data_tab EXCEPTIONS invalid_filesize invalid_table_width invalid_type

= = = =

'IBM' name typ 'Test fr Excel File'(005)

= fname = ftype = fsize = tab = 1 = 2 = 3.

April 2001

435

ABAP Programmierung (BC-ABA) Daten mit Benutzerdialog auf den Prsentationsserver schreiben

SAP AG

IF sy-subrc NE 0. MESSAGE e888(sabapdocu) WITH text-006. ENDIF. WRITE: / / / 'SY-SUBRC:'(001), 'Name :'(002), 'Type :'(003), 'Size :'(004), sy-subrc, (60) fname, ftype, fsize.

Nach dem Starten dieses Programms erscheint das folgende Benutzerdialogfenster:

In diesem Fenster kann der Benutzer die Vorgabewerte ndern. Nach Anklicken von bertragen bertrgt das System die Daten aus der internen Tabelle TAB, die im Programm gefllt wurde, in die Datei d:\temp\saptest.xls. Wenn die Datei bereits existiert, fragt das System den Benutzer, ob sie ersetzt werden soll. Das System fgt Tabulatoren zwischen den Spalten sowie Zeilenschaltungen und Zeilenvorschbe am Ende jeder Zeile ein. Ausgabe:
SY-SUBRC: 0 Name : d:\temp\saptest.xls Type : DAT Size : 27

Die Datei d:\temp\saptest.xls kann jetzt aus Excel heraus auf dem Prsentationsserver geffnet werden. Das Excel-Bild sieht dann so aus:

436

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Daten mit Benutzerdialog auf den Prsentationsserver schreiben

Daten ohne Benutzerdialog auf den Prsentationsserver schreiben


Um Daten ohne Benutzerdialog aus einer internen Tabelle auf den Prsentationsserver zu schreiben, verwenden Sie den Funktionsbaustein WS_DOWNLOAD. Die wichtigsten Parameter sind unten aufgelistet. Weitere Informationen finden Sie in der Dokumentation des Funktionsbausteins in Transaktion SE37.
Wichtige Importparameter Parameter Function

BIN_FILESIZE Dateilnge fr binre Dateien CODEPAGE FILENAME FILETYPE MODE

Nur fr Download unter DOS: Wert IBM Dateiname Dateityp Schreibmodus (leer = berschreiben, 'A' = anhngen)

Mit FILETYPE geben Sie den bertragungsmodus an. Mgliche Werte: BIN Binre Dateien: Sie mssen die Dateilnge angeben. Die interne Tabelle mu aus einer Spalte mit Datentyp X bestehen.

ASC ASCII-Dateien. DAT Excel-Dateien: Die Spalten werden durch Tabulatoren getrennt, die Zeilen durch Zeilenschaltungen und Zeilenvorschbe.

WK1 Excel- und Lotus-Dateien: Die Daten werden in ein WK1-Spreadsheet geschrieben.

Exportparameter Parameter Funktion

FILELENGTH Anzahl der bertragenen Bytes


Table Parameters Parameter Funktion

DATA_TAB Interne Quelltabelle


Ausnahmeparameter Parameter Funktion

April 2001

437

ABAP Programmierung (BC-ABA) Daten mit Benutzerdialog auf den Prsentationsserver schreiben

SAP AG

FILE_OPEN_ERROR FILE_WRITE_ERROR INVALID_FILESIZE INVALID_TYPE

System kann Datei nicht ffnen System kann nicht in Datei schreiben Ungltiger Parameter BIN_FILESIZE Ungltiger Werte fr Parameter FILETYPE

INVALID_TABLE_WIDTH Ungltige Tabellenstruktur

Angenommen, das fr die Prsentation verwendete Betriebssystem ist WINDOWS NT und das folgende Programm liegt vor:

REPORT demo_data_ext_ws_download. TYPES tab_type(80) TYPE c. DATA: flength TYPE i. DATA tab TYPE TABLE OF tab_type. APPEND 'This is the first line of my text. ' TO tab. APPEND 'The second line. ' TO tab. APPEND ' The third line. ' TO tab. APPEND ' The fourth line. ' TO tab. APPEND ' Fifth and final line. ' TO tab. CALL FUNCTION 'WS_DOWNLOAD' EXPORTING codepage filename filetype IMPORTING filelength TABLES data_tab EXCEPTIONS file_open_error file_write_error invalid_filesize invalid_table_width invalid_type

= 'IBM' = 'c:\temp\saptest.txt' = 'ASC' = flength = tab = = = = = 1 2 3 4 5.

IF sy-subrc NE 0. MESSAGE e888(sabapdocu) WITH 'Fehler in Funktionsbaustein WS_DOWNLOAD'. ENDIF. WRITE: 'SY-SUBRC :', sy-subrc, / 'File length:', flength.
Ausgabe:
SY-SUBRC : 0 151 File length:

438

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Daten mit Benutzerdialog auf den Prsentationsserver schreiben

Das System hat die fnf Zeilen der Tabelle TAB in die ASCII-Datei d:\temp\saptest.txt bertragen. Mit dem WINDOWS File Manager knnen Sie Vorhandensein und Lnge der Datei wie folgt berprfen:

Die Datei kann jetzt ber jeden Editor auf dem Prsentationsserver geffnet werden. Im folgenden Beispiel wird der DOS-Editor verwendet:

April 2001

439

ABAP Programmierung (BC-ABA) Daten mit Benutzerdialog auf den Prsentationsserver schreiben

SAP AG

Daten mit Benutzerdialog vom Prsentationsserver lesen


Um Daten vom Prsentationsserver in eine interne Tabelle mit Benutzerdialog einzulesen, verwenden Sie den Funktionsbaustein UPLOAD. Die wichtigsten Parameter sind unten aufgelistet. Weitere Informationen finden Sie in der Dokumentation zum Funktionsbaustein in Transaktion SE37.
Wichtige Importparameter Parameter Funktion

CODEPAGE Nur fr Upload unter DOS: Wert IBM FILENAME FILETYPE ITEM

Dateiname (Vorgabewert fr Benutzerdialog) Dateityp (Vorgabewert fr Benutzerdialog) Header fr Benutzerdialogfenster

Mit FILETYPE geben Sie den bertragungsmodus an. Mgliche Werte: BIN Binre Dateien ASC ASCII-Dateien: Textdateien mit Zeilenendemarkierungen DAT Excel-Dateien, die als Textdateien gesichert werden mit Spalten, die durch Tabulatoren getrennt sind, und Zeilen, die durch Zeilenschaltungen und Zeilenvorschbe getrennt sind.

WK1 Excel- und Lotus-Dateien, die als WK1-Spreadsheet gesichert werden.

Wichtige Exportparameter Parameter Funktion

FILESIZE

Anzahl der bertragenen Bytes

ACT_FILENAME Name der Datei (eingegeben im Benutzerdialog) ACT_FILETYPE Dateityp (eingegeben im Benutzerdialog)
Tabellenparameter Parameter Funktion

DATA_TAB Interne Zieltabelle


Ausnahmeparameter Parameter Funktion

CONVERSION_ERROR

Fehler in der Datenkonvertierung

440

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Daten mit Benutzerdialog auf den Prsentationsserver schreiben

INVALID_TABLE_WIDTH Ungltige Tabellenstruktur INVALID_TYPE Falscher Parameter FILETYPE

Angenommen, das fr die Prsentation verwendete Betriebssystem ist WINDOWS NT, und die Datei ist eine Excel-Tabelle:

Wenn diese Tabelle als Textdatei mit Tabulatoren zwischen den Spalten nach d:\temp\mytable.txt gesichert wird, kann das folgende Programm die Tabelle lesen:

REPORT demo_data_ext_upload. DATA: fname TYPE rlgrap-filename, ftype TYPE rlgrap-filetype, fsize TYPE i. TYPES: BEGIN OF line, col1(10) TYPE c, col2(10) TYPE c, col3(10) TYPE c, END OF line. DATA: lin TYPE line, tab TYPE TABLE OF line. CALL FUNCTION 'UPLOAD' EXPORTING codepage filename filetype item File'(002) IMPORTING filesize act_filename act_filetype TABLES data_tab EXCEPTIONS conversion_error invalid_table_width invalid_type

= = = =

'IBM' 'd:\temp\mytable.txt' 'DAT' 'Read Test fr Excel

= fsize = fname = ftype = tab = 1 = 2 = 3.

IF sy-subrc NE 0. MESSAGE e888(sabapdocu) WITH text-001. ENDIF.

April 2001

441

ABAP Programmierung (BC-ABA) Daten mit Benutzerdialog auf den Prsentationsserver schreiben

SAP AG

WRITE: / / /

'SY-SUBRC:'(003), 'Name :'(004), 'Type :'(005), 'Size :'(006),

sy-subrc, (60) fname, ftype, fsize.

SKIP. LOOP AT tab INTO lin. WRITE: / lin-col1, lin-col2, lin-col3. ENDLOOP.
Nach dem Starten dieses Programms erscheint das folgende Benutzerdialogfenster:

In diesem Fenster kann der Benutzer die Vorgabewerte ndern. Nach Anklicken von bertragen bertrgt das System die Daten aus der Datei d:\temp\mytable.txt in die interne Tabelle TAB. Ausgabe:
SY-SUBRC: 0 Name : d:\temp\mytable.txt Type : DAT Size : 69 Billy My Herman Conan the Fair the the Kid Lady German Barbarian

Der Inhalt der internen Tabelle TAB ist identisch mit dem Inhalt der ursprnglichen Excel-Tabelle.

442

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Daten mit Benutzerdialog auf den Prsentationsserver schreiben

Daten ohne Benutzerdialog vom Prsentationsserver lesen


Um Daten vom Prsentationsserver ohne Benutzerdialog in eine interne Tabelle zu lesen, verwenden Sie den Funktionsbaustein WS_UPLOAD. Die wichtigsten Parameter werden unten aufgelistet. Weitere Informationen finden Sie in der Dokumentation zum Funktionsbaustein in Transaktion SE37.
Wichtige Exportparameter Parameter Funktion

CODEPAGE Nur fr Download unter DOS: Wert IBM FILENAME FILETYPE


Dateiname Dateityp

Mit FILETYPE knnen Sie den bertragungsmodus angeben. Mgliche Werte: BIN Binre Dateien ASC ASCII-Dateien: Textdateien mit Zeilenendemarkierungen DAT Excel-Dateien, die als Textdateien gesichert werden mit Spalten, die durch Tabulatoren getrennt sind, und Zeilen, die durch Zeilenschaltungen und Zeilenvorschbe getrennt sind.

WK1 Excel- und Lotus-Dateien, die als WK1-Spreadsheet gesichert werden.

Exportparameter Parameter Funktion

FILELENGTH Anzahl der bertragenen Bytes


Tabellenparameter Parameter Funktion

DATA_TAB Interne Zieltabelle


Ausnahmeparameter Parameter Funktion

CONVERSION_ERROR FILE_OPEN_ERROR FILE_READ_ERROR

Fehler in der Datenkonvertierung System kann Datei nicht ffnen System kann Datei nicht lesen

INVALID_TABLE_WIDTH Ungltige Tabellenstruktur

April 2001

443

ABAP Programmierung (BC-ABA) Daten mit Benutzerdialog auf den Prsentationsserver schreiben

SAP AG

INVALID_TYPE

Ungltiger Wert fr Parameter FILETYPE

Angenommen, das fr die Prsentation genutzte Betriebssystem ist WINDOWS NT, und die Datei ist eine Textdatei:

Das folgende Programm liest diese Textdatei:

REPORT demo_data_ext_ws_upload. TYPES tab_type(80) TYPE c. DATA: tab TYPE TABLE OF tab_type, lin TYPE tab_type. DATA: flength TYPE i. SUBMIT demo_data_ext_ws_download AND RETURN. CALL FUNCTION 'WS_UPLOAD' EXPORTING codepage filename filetype IMPORTING filelength TABLES data_tab EXCEPTIONS conversion_error file_open_error file_read_error invalid_table_width invalid_type

= 'IBM' = 'C:\temp\saptest.txt' = 'ASC' = flength = tab = = = = = 1 2 3 4 5.

IF sy-subrc NE 0. MESSAGE e888(sabapdocu) WITH 'Fehler in Funktionsbaustein WS_UPLOAD'. ENDIF.

444

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Daten mit Benutzerdialog auf den Prsentationsserver schreiben

WRITE: 'SY-SUBRC:', sy-subrc, / 'Length :', flength. SKIP. LOOP AT tab INTO lin. WRITE: / lin. ENDLOOP.
Ausgabe:

April 2001

445

ABAP Programmierung (BC-ABA) Daten mit Benutzerdialog auf den Prsentationsserver schreiben

SAP AG

Dateien auf dem Prsentationsserver berprfen


Um Informationen ber Dateien auf dem Prsentationsserver und ber das Betriebssystem des Prsentationsservers zu erhalten, verwenden Sie den Funktionsbaustein WS_QUERY. Die wichtigsten Parameter sind unten angegeben. Mehr Informationen finden Sie in der Dokumentation des Funktionsbausteins in Transaktion SE37.
Wichtige Importparameter Parameter Funktion

FILENAME Dateiname fr Abfragebefehle 'FE', 'FL' und 'DE' QUERY


Abfragebefehl

Der Importparameter QUERY definiert den Abfragebefehl. Einige wichtige Befehle: CD: aktuelles Verzeichnis abfragen EN: Umgebungsvariable abfragen FL: Lnge der mit FILENAME angegebenen Datei abfragen FE: Vorhandensein der mit FILENAME angegebenen Datei abfragen DE: Vorhandensein des mit FILENAME angegebenen Verzeichnisses abfragen WS: Windows-System des Prsentationsservers abfragen OS: Betriebssystem des Prsentationsservers abfragen

Exportparameter Parameter Funktion

RETURN

Ergebnis der Abfrage ('0' bedeutet 'nein' und '1' bedeutet 'ja')

Ausnahmeparameter Parameter Funktion

INV_QUERY Falscher Wert fr QUERY oder FILENAME

Angenommen, das fr die Prsentation genutzte Betriebssystem ist WINDOWS NT, und die Datei SYSTEM.INI existiert wie hier dargestellt:

Das folgende Programm bestimmt einige Attribute des Betriebssystems und dieser Datei:

REPORT demo_data_ext_ws_query. DATA: fname(60) TYPE c, result(30) TYPE c, flength TYPE i.

446

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Daten mit Benutzerdialog auf den Prsentationsserver schreiben

fname = 'C:\WINNT35\SYSTEM.INI'. CALL FUNCTION 'WS_QUERY' EXPORTING query = 'OS' IMPORTING return = result EXCEPTIONS inv_query = 1. IF sy-subrc = 0. WRITE: / 'Operating System:', result. ENDIF. CALL FUNCTION 'WS_QUERY' EXPORTING query = 'WS' IMPORTING return = result EXCEPTIONS inv_query = 1. IF sy-subrc = 0. WRITE: / 'Windows:', result. ENDIF. CALL FUNCTION 'WS_QUERY' EXPORTING filename = fname query = 'FE' IMPORTING return = result EXCEPTIONS inv_query = 1. IF sy-subrc = 0. WRITE: / 'File exists ?', result. ENDIF. CALL FUNCTION 'WS_QUERY' EXPORTING filename = fname query = 'FE' IMPORTING return = result EXCEPTIONS inv_query = 1. IF sy-subrc = 0. WRITE: / 'File exists ?', result. ENDIF. CALL FUNCTION 'WS_QUERY' EXPORTING filename = fname query = 'FL' IMPORTING return = flength

April 2001

447

ABAP Programmierung (BC-ABA) Daten mit Benutzerdialog auf den Prsentationsserver schreiben

SAP AG

EXCEPTIONS inv_query = 1. IF sy-subrc = 0. WRITE: / 'File Length:', flength. ENDIF.


Ausgabe des Programms:
Operating System: NT Windows: WN32 File exists ? 1 File Length: 210

Das Windows-System WN32 ist das Windows-System von WINDOWS NT. Informationen zu den Abkrzungen erhalten Sie, indem Sie den Cursor auf das Feld QUERY im Dokumentationsbild des Funktionsbausteins stellen und Hilfe anwhlen.

448

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Verwendung plattformunabhngiger Dateinamen

Verwendung plattformunabhngiger Dateinamen


Die Dateinamen, die Sie in den ABAP-Anweisungen fr die Verarbeitung von Dateien angeben, sind die physischen Dateinamen. Das bedeutet, da sie die Anforderungen des Betriebssystems, unter dem das SAP-System luft, genau erfllen mssen. Nachdem Sie eine Datei aus einem ABAP-Programm heraus mit einem bestimmten Namen und Pfad angelegt haben, knnen Sie diese Datei genau an dieser Position finden, nachdem Sie sich auf Betriebssystemebene angemeldet haben. Da die Regeln fr die Namensgebung bei Dateien und Pfaden von Betriebssystem zu Betriebssystem unterschiedlich sind, knnen Sie Ihre ABAP-Programme nicht von einem Betriebssystem zum anderen portieren, es sei denn, Sie nutzen die im folgenden beschriebenen Werkzeuge. Um ABAP-Programme portierbar zu machen, bietet das SAP-System das Konzept der logischen Dateinamen und logischen Pfade an. Logische Dateien und Pfade sind mit physischen Dateien und Pfaden verbunden. Diese Verbindung wird in speziellen Tabellen hergestellt. Sie knnen diese Tabellen gem Ihren Anforderungen pflegen. In Ihren ABAP-Programmen benutzen Sie den Funktionsbaustein FILE_GET_NAME, um physische Dateinamen aus logischen zu erzeugen. Die Pflege plattformunabhngiger Dateinamen ist Teil des Customizing. Sie finden eine ausfhrliche Beschreibung ber Werkzeuge Business Engineering Customizing Einfhrungsprojekte SAP-Refer.-IMG anzeigen. Auf dem nchsten Bild whlen Sie Basis Basis allgemein Plattformunabhngige Dateinamenvergabe. Eine Beschreibung des Funktionsbaustein FILE_GET_NAME erhalten Sie, indem Sie dessen Namen im Einstiegsbild der Transaktion SE37 eingeben und Dokumentation whlen. Auf dem nchsten Bild whlen Sie FBausteindoku. Eine weitere Mglichkeit um plattformunabhngige Dateinamen zu pflegen bietet die Transaktion FILE. Die folgenden Abschnitte enthalten einen Kurzberblick ber die Arbeit mit plattformunabhngigen Dateinamen mit der Transaktion FILE. Nach Aufruf der Transaktion FILE knnen Sie durch entsprechende Auswahl im Rahmen Navigation die obengenannten Tabellen pflegen wie es in folgenden Topics erlutert wird.
Syntaxgruppen pflegen [Seite 450] Betriebssysteme Syntaxgruppen zuordnen [Seite 451] Logische Pfade anlegen und definieren [Seite 453] Logische Dateinamen anlegen und definieren [Seite 455]

Danach wird erklrt, wie Sie den Funktionsbaustein FILE_GET_NAME verwenden, um logische Dateinamen in ABAP-Programmen in physische Dateinamen umzusetzen.
Verwendung von logischen Dateien in ABAP-Programmen [Seite 456]

Weitere Informationen zu plattformunabhngigen Dateinamen finden Sie noch in der Dokumentation Plattformunabhngige Dateinamenvergabe [Extern] in der erweiterten Funktionsbibliothek.

April 2001

449

ABAP Programmierung (BC-ABA) Verwendung plattformunabhngiger Dateinamen

SAP AG

Syntaxgruppen pflegen
Syntaxgruppen enthalten die Namen aller Betriebssysteme, die derselben Syntax fr die Vergabe von Dateinamen folgen. Whlen Sie im Rahmen Navigation der Transaktion FILE Definition von Syntaxgruppen aus, um Syntaxgruppen zu pflegen. Das folgende Bild erscheint:

Auf diesem Bild sehen Sie eine Liste der verfgbaren Syntaxgruppen. Sie knnen neue Syntaxgruppen definieren, indem Sie Neue Eintrge anklicken. Informationen ber die Zuordnung von Betriebssystemen zu Syntaxgruppen finden Sie in Betriebssysteme Syntaxgruppen zuordnen [Seite 451].

450

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Verwendung plattformunabhngiger Dateinamen

Betriebssysteme Syntaxgruppen zuordnen


Whlen Sie im Rahmen Navigation der Transaktion FILE Zuordnung Betriebssysteme zur Syntaxgruppe aus, um die Zuordnung von Betriebssystemen zu vorhandenen Syntaxgruppen anzuzeigen oder zu pflegen. Das folgende Bild wird angezeigt:

Sie sehen hier eine Liste der derzeit untersttzten Betriebssysteme. Um neue Eintrge hinzuzufgen, klicken Sie auf Neue Eintrge. Um vorhandene Eintrge einer Syntaxgruppe zuzuordnen, whlen Sie ein Betriebssystem und klicken Sie auf Detail. Das folgende Bild erscheint:

April 2001

451

ABAP Programmierung (BC-ABA) Verwendung plattformunabhngiger Dateinamen

SAP AG

Das Betriebssystem HP-UX ist hier der Syntaxgruppe UNIX zugeordnet.

452

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Verwendung plattformunabhngiger Dateinamen

Logische Pfade anlegen und definieren


Jeder logische Dateiname kann mit einem logischen Pfad verbunden sein. Der logische Pfad stellt einem logischen Dateinamen plattformabhngige physische Pfade zur Verfgung. Um einen logischen Pfad anzulegen, whlen Sie im Rahmen Navigation der Transaktion FILE Definition von logischen Dateipfaden aus. Auf dem angezeigten Bild definieren Sie einen neuen logischen Pfad wie im folgenden Beispiel dargestellt:

Sichern Sie den logischen Pfad mit Save. Whlen Sie im Rahmen Navigation der Transaktion FILE --> Zuordnung logische - physische Dateipfade aus, um vorhandene logische Pfade mit physischen Pfaden und Syntaxgruppen zu verbinden. Auf dem angezeigten Bild whlen Sie entweder einen logischen Pfad, um dessen Verbindung zu einer Syntaxgruppe zu pflegen, oder klicken Sie auf Neue Eintrge, um neue Verbindungen anzulegen. Der physische Pfad fr die Syntaxgruppe UNIX kann z.B. so definiert werden:

Fr die Eingabefelder Logischer Pfad und Syntaxgruppe gibt es Listen der mglichen Eintrge. Um den Physischen Pfad anzulegen, knnen Sie reservierte Wrter verwenden (in spitze Klammern eingeschlossen), die zur Laufzeit durch die aktuellen Werte ersetzt werden. Sie erhalten eine Liste der reservierten Wrter, indem Sie den Cursor auf das Eingabefeld stellen und Hilfe whlen. Das reservierte Wort <FILENAME> mu immer im physischen Pfad enthalten sein. Sein aktueller Wert wird mit dem logischen Dateinamen definiert, der den logischen Pfad

April 2001

453

ABAP Programmierung (BC-ABA) Verwendung plattformunabhngiger Dateinamen

SAP AG

verwendet. Der aktuelle Wert des reservierten Wortes <PARAM_1>, der im vorliegenden Beispiel verwendet wird, ist ein Importparameter des Funktionsbausteins FILE_GET_NAME.

454

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Verwendung plattformunabhngiger Dateinamen

Logische Dateinamen anlegen und definieren


Um einen logischen Dateinamen anzulegen, whlen Sie im Rahmen Navigation der Transaktion FILE Definition von logischen Definition Dateinamen mandantenunabhngig aus und whlen Neue Eintrge. Definieren Sie einen logischen Dateinamen wie im folgenden Beispiel dargestellt:

Sie knnen entweder wie hier dargestellt eine logische Datei mit einem logischen Pfad verbinden oder den vollstndigen physischen Dateinamen im Eingabefeld Phys.Datei angeben. Im letzteren Fall gilt der logische Dateiname nur fr ein Betriebssystem. Die Regeln fr die Eingabe einer vollstndigen physischen Datei sind dieselben wie fr die Definition des physischen Pfades fr den logischen Pfad. ber Hilfe erhalten Sie weitere Informationen sowie eine Liste der reservierten Wrter. Wenn eine logische Datei mit einem logischen Pfad verbunden ist, gilt die logische Datei fr alle Syntaxgruppen, die fr den logischen Pfad gepflegt werden. Der in Phys. Datei angegebene Dateiname ersetzt das reservierte Wort <FILENAME> in den physischen Pfaden, die dem logischen Pfad zugeordnet sind. Um diesen Namen betriebssystemunabhngig zu machen, whlen Sie Namen, die mit einem Buchstaben beginnen, bis zu 8 Buchstaben haben und keine Sonderzeichen enthalten. Sichern Sie die Definitionen mit Sichern.

April 2001

455

ABAP Programmierung (BC-ABA) Verwendung plattformunabhngiger Dateinamen

SAP AG

Verwendung von logischen Dateien in ABAP-Programmen


Mit dem Funktionsbaustein FILE_GET_NAME erstellen Sie in Ihren ABAP-Programmen einen physischen Dateinamen aus einem logischen Dateinamen. Um den Aufruf des Funktionsbausteins in Ihrem Programm einzufgen, whlen Sie Bearbeiten Anweisungsmuster... im ABAP-Editorbild. Ein Dialogfenster erscheint, in dem Sie Call Function auswhlen und FILE_GET_NAME eingeben. Die Parameter dieses Funktionsbausteins sind im folgenden aufgelistet.
Importparameter Parameter Funktion

CLIENT

Die Pflegetabellen fr die logischen Dateien und Pfade sind mandantenabhngig. Deshalb kann der gewnschte Mandant importiert werden. Der aktualle Mandant ist im Feld SY-MANDT gespeichert. Geben Sie den logischen Dateinamen in Grobuchstaben an, den Sie umsetzen wollen. Sie knnen jedes Betriebssystem importieren, das in der Liste der Transaktion SF04 enthalten ist (siehe Betriebssysteme Syntaxgruppen zuordnen [Seite 451]). Der physische Dateiname wird entsprechend der Syntaxgruppe angelegt, mit der das Betriebssystem verbunden ist. Vorgabeparameter ist der Wert des Systemfeldes SY-OPSYS. Wenn Sie diese Importparameter angeben, werden die reservierten Wrter <PARAM_1> und <PARAM_2> in den physischen Pfadnamen durch die importierten Werte ersetzt. Mit diesem Flag knnen Sie festlegen, ob das Betriebssystem des Prsentationsservers importiert werden soll anstelle des Betriebssystems, das durch den Parameter OPERATING_SYSTEM importiert wird.

LOGICAL_FILENAME OPERATING_SYSTEM

PARAMETER_1 PARAMETER_2 USE_PRESENTATION _SERVER

WITH_FILE_EXTENSION Wenn Sie hier einen Wert angeben, wird das fr den logischen Dateinamen angegebene Dateiformat an den physischen Dateinamen angehngt.
Exportparameter Parameter Funktion

EMERGENCY_FLAG Wenn dieser Parameter ungleich SPACE ist, ist im logischen Pfad kein physischer Name definiert. Ein physischer Name fr den Bedarfsfall wurde aus der Tabelle FILENAME und dem Profilparameter DIR_GLOBAL angelegt. FILE_FORMAT Dieser Parameter enthlt das fr den logischen Dateinamen definierte Dateiformat. Sie knnen diesen Parameter z.B. nutzen um zu entscheiden, in welchem Modus die Datei geffnet werden soll. Dieser Parameter ist der physische Dateiname, den Sie in den ABAPAnweisungen fr die Verarbeitung von Dateien verwenden knnen.

FILE_NAME

456

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Verwendung plattformunabhngiger Dateinamen

Ausnahmeparameter Parameter Funktion

FILE_NOT_FOUND Diese Ausnahme wird ausgelst, wenn die logische Datei nicht definiert ist. OTHERS Diese Ausnahme wird ausgelst, wenn andere Fehler auftreten.

Angenommen, die logische Datei MYTEMP und der logische Pfad TMP_SUB sind wie in den vorhergehenden Topics definiert und das folgende Programm liegt vor:

REPORT demo_data_ext_file_get_name. DATA: flag(1) TYPE c, format TYPE filename-fileformat, fname(60) TYPE c. WRITE sy-opsys. CALL FUNCTION 'FILE_GET_NAME' EXPORTING logical_filename = 'MYTEMP' operating_system = sy-opsys parameter_1 = '01' IMPORTING emergency_flag = flag file_format = format file_name = fname EXCEPTIONS file_not_found = 1 OTHERS = 2. IF sy-subrc = 0. WRITE: / 'Flag :', flag, / 'Format :', format, / 'Phys. Name:', fname. ENDIF.
Ausgabe:
HP-UX FLAG FORMAT : : BIN

Phys. Name: /tmp/TEST01

In diesem Beispiel luft das SAP-System unter dem Betriebssystem HP-UX, das zur Syntaxgruppe UNIX gehrt. Der logische Dateiname MYTEMP mit dem logischen Pfad TMP_SUB wird in einen physischen Dateinamen /tmp/TEST01 konvertiert wie fr die Syntaxgruppe UNIX angegeben. Das Feld FNAME kann im weiteren Programmablauf genutzt werden, um mit der Datei TEST01 im Verzeichnis /tmp zu arbeiten.

April 2001

457

ABAP Programmierung (BC-ABA) Verwendung plattformunabhngiger Dateinamen

SAP AG

Nehmen wir eine logische Datei mit dem Namen EMPTY und dem physischen Dateinamen TEST an, die mit einem logischen Pfad verbunden ist, der keine Angabe eines physischen Pfades hat. Wenn Sie den EXPORTING-Parameter 'MYTEMP' im obigen Beispiel durch 'EMPTY' ersetzen, erhalten Sie folgende Ausgabe:
HP-UX FLAG FORMAT : X :

Phys. Name: /usr/sap/S11/SYS/global/TEST

Das System hat einen Dateinamen fr den Bedarfsfall angelegt, dessen Pfad von der aktuellen SAP-Installation abhngt.

458

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Modularisierungstechniken

Modularisierungstechniken
Jedes ABAP-Programm ist modular aus Verarbeitungsblcken aufgebaut (siehe Aufbau von ABAP-Programmen [Seite 47]). Bei den Verarbeitungsbcken unterscheiden wir solche, die nur von auerhalb eines ABAP-Programms durch das ABAP-Laufzeitsystem aufgerufen werden knnen, und solche, die auch durch ABAP-Anweisungen in ABAP-Programmen aufgerufen werden knnen. Verarbeitungsblcke, die durch das ABAP-Laufzeitsystem aufgerufen werden:

Ereignisblcke Dialogmodule Unterprogramme Funktionsbausteine Methoden

Verarbeitungsblcke, die aus ABAP-Programmen aufgerufen werden:

Die aus ABAP-Programmen aufrufbaren Verarbeitungsblcke heien Prozeduren. Zustzlich zur Modularisierung in Verarbeitungsblcken bietet ABAP die Mglichkeit der Quelltext-Modularisierung, die es erlaubt ABAP-Anweisungen entweder lokal in Makros oder global in Include-Programmen zusammenzufassen. Dieser Abschnitt zeigt die Modularisierung in Quelltext-Module [Seite 461] und Prozeduren [Seite 467]. Diese Art der Modularisierung dient der Les- und Pflegbarkeit von ABAP-Programmen, der Vermeidung von Redundanzen, der Wiederverwendbarkeit von Funktionalitt und der Kapselung von Daten.

April 2001

459

ABAP Programmierung (BC-ABA) Modularisierungstechniken

SAP AG

Nicht Modularisiert PROGRAM PROGRAM ... ...


Anweisungsfolge Anweisungsfolge

Modularisiert PROGRAM PROGRAM ... ...


Aufruf Modularisierungseinheit Aufruf Modularisierungseinheit

... ...
Anweisungsfolge Anweisungsfolge

... ... ... ...

Aufruf Modularisierungseinheit Aufruf Modularisierungseinheit Aufruf Modularisierungseinheit Aufruf Modularisierungseinheit

... ...
Anweisungsfolge Anweisungsfolge Modularisierungseinheit Modularisierungseinheit Anweisungsfolge Anweisungsfolge

... ...

Die Modularisierung von ABAP-Programmen in Ereignisblcke und Dialogmodule dient dagegen der generellen Ausfhrung von ABAP-Programmen und wird in ABAP Ausfhrung [Seite 1026] behandelt.

460

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Quelltext-Module

Quelltext-Module
Quelltext-Modularisierung bedeutet, ABAP-Anweisungsfolgen in Modulen zusammenzufassen und statt der gesamten Anweisungsfolge das Modul an der entsprechenden Stelle einzubinden.

PROGRAM PROGRAM ... ...


Einbinden der Einbinden der Modularisierungseinheit Modularisierungseinheit

Modularisierungseinheit Modularisierungseinheit Anweisungsfolge Anweisungsfolge

... ...

Bei der Quelltext-Modularisierung werden die Module bei der Generierung des Programms so eingebaut, als wenn der entsprechende Programmtext an der Stelle stnde. Quelltext-Module dienen daher hauptschlich der Vermeidung von mehrfacher Schreibarbeit und der bersichtlichkeit von ABAP-Programmen. Sie dienen nicht der Modularisierung von Aufgaben und Funktionen. Fr diese Zwecke sollten Prozeduren verwendet werden. ABAP enthlt Makros [Seite 462] als programmlokale Quelltext-Module und INCLUDEProgramme [Seite 465] als programmbergreifende Quelltext-Module.

April 2001

461

ABAP Programmierung (BC-ABA) Makros

SAP AG

Makros
Um in einem Programm die gleiche Anweisungsfolge mehrmals wiederzuverwenden, kann diese ein einziges Mal in einem Makro kodiert werden. Dies kann beispielsweise bei lngeren Berechnungen oder komplexen WRITE-Ausgaben sinnvoll sein. Makros stehen nur lokal in einem Programmtext und dort nur fr nachfolgende Zeilen zur Verfgung. Der folgende Anweisungsblock definiert ein Makro <makro>:

DEFINE <makro>. <anweisungen> END-OF-DEFINITION.


Zwischen DEFINE und END-OF-DEFINITION mssen vollstndige Anweisungen angeben werden. Diese Anweisungen knnen bis zu neun Platzhalter &1, &2,...., &9 enthalten. Die Definition eines Makros mu im Programmtext vor seiner Verwendung erfolgen. Makrodefinitionen gehren nicht zum Deklarationsteil eines Programms. Der DEFINEAnweisungsblock wird also nicht automatisch vor die Verarbeitungsblcke eines Programms gezogen. Eine Makro-Definition ist aber auch keine operationale Anweisung, die zur Programmlaufzeit in einem Verarbeitungsblock ausgefhrt wird. Makro-Definitionen werden bei der Programmgenerierung nicht an der Stelle bercksichtigt, an denen sie aufgefhrt sind und tauchen daher in der bersicht zum Aufbau von ABAP-Programmen [Seite 47] nicht auf. Eine Makro-Definition fhrt an beliebiger Position des Programmtexts sozusagen eine Abkrzung ein, die dann in allen nachfolgenden Zeilen dieses Programmtexts verwendet werden kann. Der Programmierer mu dafr sorgen, da die Definition eines Makros im Programmtext vor dessen Verwendung steht. Besondere Vorsicht ist bei der gleichzeitigen Verwendung von Makros und Include-Programmen geboten, da nicht alle Include-Programme bei der statischen Syntaxprfung zur Verfgung stehen (Ausnahme: Top-Inlude). Die Verwendung des Makros erfolgt ber die Anweisung

<makro> [<p1> <p2>... <p9>].


Whrend der Programmgenerierung wird das Makro durch die entsprechenden Anweisungen ersetzt und in den Anweisungen werden die Platzhalter &i wrtlich durch die Parameter <pi> ersetzt. Sie knnen ein Makro in einem anderen Makro verwenden. Ein Makro kann jedoch nicht sich selbst verwenden.

REPORT demo_mod_tech_macros. DATA: result TYPE i, n1 TYPE i VALUE 5, n2 TYPE i VALUE 6. DEFINE operation. result = &1 &2 &3. output &1 &2 &3 result. END-OF-DEFINITION. DEFINE output. write: / 'The result of &1 &2 &3 is', &4. END-OF-DEFINITION.

462

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Makros

operation 4 + 3. operation 2 ** 7. operation n2 - n1.


Die Ausgabe sieht so aus:

The result of 4 + 3 is The result of 2 ** 7 is The result of N2 - N1 is

7 128 1

In diesem Beispiel werden die beiden Makros OPERATION und OUTPUT definiert. OUTPUT ist in OPERATION geschachtelt. OPERATION wird dreimal mit verschiedenen Parametern aufgerufen. Beachten Sie, wie die Platzhalter &1, &2,... wrtlich in den Makros ersetzt werden.

Dieses Beispiel zeigt, da eine Makrodefinition tatschlich nur als Abkrzung fr nachfolgende Zeilen in einem Programmtext wirkt. Es soll nicht zur Nachahmung anregen! Betrachten wir ein Programm mit einem Unterprogramm TEST:

PROGRAM macro_test. ... FORM test. WRITE '...'. ENDFORM.


Das Programm kann durch Einfhrung eines Makros MACRO wie folgt umgeschrieben werden:

PROGRAM macro_test. ... FORM test. DEFINE macro. WRITE '...'. ENDFORM. END-OF-DEFINITION. MACRO.
Die Einfhrung des Makros ndert nichts an der generierten Form des Programms. Ein Verarbeitungsblock, hier ein Unterprogramm, ist und bleibt unteilbar! Das Programm knnte auch wie folgt geschrieben werden:

PROGRAM macro_test. ... DEFINE macro. WRITE '...'. ENDFORM. END-OF-DEFINITION. ...

April 2001

463

ABAP Programmierung (BC-ABA) Makros

SAP AG

FORM test. MACRO.


Bei der Definition des Makros ist einzig und allein wichtig, da es vor der Verwendung steht.

464

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Include-Programme

Include-Programme
Include-Programme sind global verfgbare R/3 Repository-Objekte. Sie dienen ausschlielich der Modularisierung von Quelltext und haben keine Parameterschnittstelle. Include-Programme erfllen eine:
Bibliotheksfunktion zur Wiederverwendung von Quelltext in verschiedenen Programmen. Dies ist beispielsweise bei sehr langen Datendeklarationen, die in verschiedenen Programmen verwendet werden, sinnvoll. Ordnungsfunktion fr komplexe ABAP-Programme. In Funktionsgruppen und in Modulpools werden logisch zusammengehrige Programmteile prinzipiell in IncludeProgrammen abgelegt. Die ABAP Development Workbench untersttzt die Erstellung komplexer Programme dadurch, indem sie die Include-Programme durch Vorwrtsnavigation automatisch anlegt und mit eindeutigen Namen versieht. Eine besondere Rolle spielt dabei das sogenannte Top-Include, das bei richtiger Namenskonvention immer in die Navigation eingebunden ist und bei der Syntaxberprfung paralleler Include-Bausteine mitbercksichtigt wird.

Include-Programme selber anlegen


Wenn Sie selber ein Include-Programm anlegen, mssen Sie das Programmattribut I fr den Typ verwenden. Sie knnen ein Include-Programm auch dadurch anlegen oder ndern, indem Sie auf den Namen des Programms hinter der Include-Anweisung in Ihrem ABAP-Programm doppelklicken. Die Vorwrtsnavigation der ABAP Workbench legt ein nicht vorhandenes Programm an oder ffnet ein vorhandenes. Ein Include-Programm kann nicht unabhngig laufen, sondern mu in andere Programme eingebunden werden. Sie knnen Include-Programme auch in andere Include-Programme einbinden. Die einzigen Einschrnkungen beim Schreiben des Quelltextes eines Include-Programms sind:

Include-Programme knnen sich nicht selbst einbinden. Include-Programme mssen vollstndige Anweisungen enthalten.

Sie mssen sicherstellen, da die Anweisungen eines Include-Programms logisch in den Quelltext des Programms passen, in den es eingebunden wird. Die Anwahl von Prfen bei der Bearbeitung eines Include-Programms im ABAP-Editor reicht dafr normalerweise nicht aus.

***INCLUDE incl_tst. TEXT = 'Hallo!'.


In diesem Beispiel ergibt die Syntaxprfung einen Fehler, da das Feld TEXT nicht im Programm deklariert wurde. Sie knnen jedoch das Programm INCL_TST in jedes Programm einbinden, in dem das Feld TEXT mit dem passenden Typ deklariert wurde. Um sinnvolle Ergebnisse bei der Syntaxprfung zu erhalten, mssen Sie die Prfung fr ein Programm bzw. alle Programme durchfhren, in die das Include-Programm eingebunden ist. Eine Ausnahme stellt das sogenannte Top-Include dar, das auch in die Syntaxprfung paralleler Include-Programme einbezogen wird.

April 2001

465

ABAP Programmierung (BC-ABA) Include-Programme

SAP AG

Include-Programme einbinden
Zum Einbinden eines Include-Programms in ein anderes Programm dient die Anweisung:

INCLUDE <incl>.
Die INCLUDE-Anweisung wirkt wie das Kopieren des Quelltext des Include-Programms <incl> an die Stelle der Anweisung. Whrend der Syntaxprfung wird der Inhalt des Include-Programms mitausgewertet. Include-Programme werden nicht dynamisch zur Laufzeit geladen, sondern bei der Programmgenerierung aufgelst. Nach der Generierung enthlt das Laufzeitobjekt statisch alle eingebundenen Include-Programme. Bei der nachtrglichen nderung von IncludeProgrammen, werden die Verwender automatisch nachgeneriert. Die INCLUDE-Anweisung mu die einzige Anweisung in der Zeile sein und kann nicht ber mehrere Zeilen geschrieben werden.

Nehmen wir folgendes Include-Programm:

***INCLUDE starttxt. WRITE: / 'Program started by', sy-uname, / 'on host', sy-host, 'date:', sy-datum, 'time:', sy-uzeit. ULINE.
Dieses Programm ist in jedes andere ABAP-Programm einbindbar, um z.B. einen Standardkopf auf eine Liste zu schreiben.

REPORT demo_mod_tech_include. INCLUDE starttxt. ............


Die Ausgabe sieht etwa so aus:

Program started by KELLERH on host ds0025 date: 03/19/1998 time: 09:00:39 ___________________________________________________________ ................

466

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Prozeduren

Prozeduren
Prozeduren enthalten Anweisungsfolgen und werden in ABAP-Programmen aufgerufen.

PROGRAM PROGRAM ... ...


Aufruf der Aufruf der Modularisierungseinheit Modularisierungseinheit

Modularisierungseinheit Modularisierungseinheit Anweisungsfolge Anweisungsfolge

Prozeduren werden in ABAP-Programmen definiert und bleiben bei der Generierung der Programme als eigenstndige Module erhalten. Prozeduren knnen innerhalb des Programms aufgerufen werden, in dem sie definiert sind, oder aus anderen Programmen von auerhalb des definierenden Programms. Prozeduren haben Schnittstellen zur Datenbergabe und knnen lokale Daten enthalten. ABAP enthlt folgende Prozeduren:

Unterprogramme [Seite 469] Unterprogramme dienen hauptschlich der lokalen Modularisierung, also dem Aufruf im definierenden Programm. Unterprogramme enthalten mehrfach verwendete Funktionalitt innerhalb eines Programms zusammen und fhren mehrfach bentigte Aufgaben aus. Unterprogramme knnen in jedem ABAP-Programm definiert werden.

Funktionsbausteine [Seite 501] Funktionsbausteine dienen ausschlielich der globalen Modularisierung, also dem Aufruf aus anderen Programmen. Funktionsbausteine enthalten Funktionalitt, die systemweit von verschiedenen Programmen verwendet wird. Funktionsbausteine spielen im R/3-System eine tragende Rolle bei der Wiederverwendung und Kapselung von Verarbeitungslogik. Funktionsbausteine knnen nur in Funktionsgruppen definiert, aber aus allen Programmen aufgerufen werden.

Methoden [Seite 1392] Methoden enthalten die Funktionalitt bzw. das Verhalten von Klassen und deren Instanzen in ABAP Objects, der objektorientierten Erweiterung von ABAP. Methoden knnen nur in Klassen definiert werden und fr den Aufruf von Methoden gelten spezielle Regeln der objektorientierten Programmierung.

Prozeduren werden entweder intern oder extern aufgerufen. Bei externen Prozeduraufrufen ist es wichtig zu wissen, wie der Speicher organisiert wird, wie Bildschirme verabeitet werden und wie auf Schnittstellen-Arbeitsbereiche zugegriffen wird: Organisation von externen Prozeduraufrufen [Seite 516]

April 2001

467

ABAP Programmierung (BC-ABA) Prozeduren

SAP AG

468

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Unterprogramme

Unterprogramme
Unterprogramme sind Prozeduren, die in jedem ABAP-Programmen definiert und aus jedem ABAP-Programm aufgerufen werden knnen. Unterprogramme dienen hauptschlich dem internen Aufruf, also um lokal hufig benutzte Programmteile oder Algorithmen nur einmal schreiben zu mssen. Der globalen Wiederverwendung von Funktionalitt dienen Funktionsbausteine.

Definition von Unterprogrammen [Seite 470] Aufruf von Unterprogrammen [Seite 485]

April 2001

469

ABAP Programmierung (BC-ABA) Definition von Unterprogrammen

SAP AG

Definition von Unterprogrammen


Ein Unterprogramm ist ein Verarbeitungsblock, der zwischen den Anweisungen FORM und ENDFORM eingeschlossen ist:

FORM <subr> [USING ... [VALUE(]<pi>[)] [TYPE <t>|LIKE <f>]... ] [CHANGING... [VALUE(]<pi>[)] [TYPE <t>|LIKE <f>]... ]. ... ENDFORM.
<subr> ist der Name des Unterprogramms. Die optionalen Zustze USING und CHANGING definieren die Parameterschnittstelle. Wie alle Verarbeitungsblcke knnen Unterprogramme nicht geschachtelt werden. Es empfiehlt sich insbesondere bei ausfhrbaren Programmen vom Typ 1 die Definition aller Unterprogramme am Ende des Programmtextes anzuordnen, damit nicht versehentlich unausfhrbare Anweisungen dadurch entstehen, da ein Unterprogramm einen Ereignisblock an der falschen Stelle abschliet.

Datenbehandlung in Unterprogrammen
Globale Daten des Rahmenprogramms [Seite 471] Lokale Daten des Unterprogramms [Seite 473] Die Parameterschnittstelle [Seite 477]

Unterprogramme beenden
Unterprogramme beenden [Seite 483]

470

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Globale Daten des Rahmenprogramms

Globale Daten des Rahmenprogramms


Unterprogramme haben Zugriff auf alle globalen Daten des definierenden Programms (Rahmenprogramm). Die Definition einer Parameterschnittstelle ist also nicht unbedingt notwendig, wenn im Unterprogramm keine Daten gendert werden oder wenn nur sehr wenige Daten involviert sind.

FORM header. WRITE: / 'Program started by', sy-uname, / 'on host', sy-host, 'date:', sy-datum, 'time:', sy-uzeit. ULINE. ENDFORM.
Ein Unterprogramm HEADER wird angelegt, mit dem z.B. ein Kopf auf einer Liste erstellt werden kann (siehe auch das Beispiel in INCLUDE-Programme [Seite 465]). Wenn Unterprogramme aber komplexere Operationen auf Daten ausfhren sollen, ohne die globalen Daten des Programms zu beieinflussen, sollte eine Parameterschnittstelle fr die gezielte Datenbernahme und -bergabe definiert werden. Im Hinblick auf einen sauberen Programmierstil und den Kapselungseffekt wird die Verwendung einer Parameterschnittstelle immer empfohlen, wenn ein Unterprogramm Daten bentigt, zumindest aber wenn Daten verndert werden.

Globale Datenobjekte vor nderung schtzen


Um den Wert eines globalen Datenobjekts gegen nderungen im Unterprogramm zu schtzen, verwendet man die Anweisung

LOCAL <f>.
Diese Anweisung darf nur zwischen den Anweisungen FORM und ENDFORM stehen. Mit LOCAL knnen Sie die Werte globaler Datenobjekte bewahren, die nicht durch eine Datendeklaration im Unterprogramm verborgen werden knnen. Sie knnen z.B. einen mit TABLES definierten globalen Tabellenarbeitsbereich nicht nochmals lokal mit einer weiteren TABLES-Anweisung in einem Unterprogramm deklarieren. Mchten Sie den Tabellenarbeitsbereich lokal verwenden, jedoch den Inhalt auerhalb des Unterprogramms erhalten, mssen Sie LOCAL verwenden.

REPORT demo_mod_tech_local. TABLES sflight. PERFORM tabtest1. WRITE: / sflight-planetype, sflight-price currency sflightcurrency. PERFORM tabtest2. WRITE: / sflight-planetype, sflight-price currency sflightcurrency.

April 2001

471

ABAP Programmierung (BC-ABA) Globale Daten des Rahmenprogramms

SAP AG

FORM tabtest1. sflight-planetype = 'A310'. sflight-price = '150.00'. WRITE: / sflight-planetype, sflight-price currency sflightcurrency. ENDFORM. FORM tabtest2. LOCAL sflight. sflight-planetype = 'B747'. sflight-price = '500.00'. WRITE: / sflight-planetype, sflight-price currency sflightcurrency. ENDFORM.
Nach der Ausfhrung sieht die Ausgabe so aus:

A310 A310 B747 A310

150.00 150.00 500.00 150.00

In diesem Beispiel wird ein Tabellenarbeitsbereich SFLIGHT fr die Datenbanktabelle SFLIGHT angelegt. Dem Tabellenarbeitsbereich SFLIGHT werden in TABTEST1 und TABTEST2 verschiedene Werte zugewiesen. Whrend die in TABTEST1 zugewiesenen Werte global gelten, gelten die in TABTEST2 nur lokal.

472

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Lokale Daten des Unterprogramms

Lokale Daten des Unterprogramms


Datendeklarationen in Prozeduren erzeugen lokale Datentypen und -objekte, die nur in der Prozedur sichtbar sind. Wir unterscheiden zwischen dynamischen Datentypen und -objekten, die nur whrend der Ausfhrung des Unterprogramms existieren, und statischen Datenobjekten, die ber den Aufruf eines Unterprogramms hinaus existieren und ihren Wert bis zum nchsten Aufruf des gleichen Unterprogramms behalten. Auch Feldsymbole knnen lokal deklariert werden. Eine besondere Art von Datenobjekten in Unterprogrammen sind Kopien von globalen Daten auf einem lokalen Datenstack. Sie werden ber Feldsymbole definiert und angesprochen.

Dynamische lokale Datentypen und -objekte


Lokale Datentypen und Datenobjekte die innerhalb von Unterprogrammen mit TYPES und DATA deklariert werden, werden fr jeden Unterprogrammaufruf neu definiert und nach dem Verlassen des Unterprogramms wieder gelscht. Jedes Unterprogramm hat seinen eigenen lokalen Namensraum. Wird ein lokaler Datentyp oder ein lokales Datenobjekt mit dem gleichen Namen wie ein globaler Datentyp oder ein globales Datenobjekt deklariert, ist der globale Datentyp oder das globale Datenobjekt innerhalb des Unterprogramms nicht ansprechbar. Lokale Datentypen oder Datenobjekte verbergen gleichnamige globale Datentypen oder -objekte. Mit anderen Worten, wird der Name eines Datentyps oder -objekts im Unterprogramm verwendet, wird, falls vorhanden, immer ein lokal deklariertes Objekt angesprochen, ansonsten ein global deklariertes. Um zu verhindern, da globale Datentypen oder -objekte verborgen werden, mssen lokalen Typen und Objekten andere Namen zuwgewiesen werdn. Z.B. knnten alle lokalen Namen in Unterprogrammen mit 'F_' beginnen.

REPORT demo_mod_tech_data_types . TYPES word(10) TYPE c. DATA text TYPE word. text = '1234567890'. WRITE / text. PERFORM datatest. WRITE / text. FORM datatest. TYPES word(5) TYPE c. DATA text TYPE word. text = 'ABCDEFGHJK'. WRITE / text. ENDFORM.
Nach der Ausfhrung sieht die Ausgabe so aus:

1234567890 ABCDE 1234567890


In diesem Beispiel werden ein globaler Datentyp WORD und ein globales Datenobjekt TEXT mit dem Typ WORD im Hauptprogramm deklariert. Nachdem TEXT ein Wert zugewiesen und auf der Liste ausgegeben wurde, wird das Unterprogramm DATATEST aufgerufen. Innerhalb des Unterprogramms ist ein lokaler Datentyp

April 2001

473

ABAP Programmierung (BC-ABA) Lokale Daten des Unterprogramms

SAP AG

WORD und ein lokaler Datenobjekt TEXT mit dem Typ WORD lokal deklariert. Sie verbergen den globalen Typ und das globale Objekt. Erst nach dem Verlassen des Unterprogramms gelten wieder die globalen Definitionen.

Statische lokale Datenobjekte


Um den Wert eines lokalen Datenobjekts nach dem Verlassen des Unterprogramms zu bewahren, mu die Anweisung STATICS anstatt DATA fr die Deklaration des lokalen Datenobjekts verwendet werden. STATICS deklariert ein global definiertes Datenobjekt, das jedoch nur lokal von dem Unterprogramm aus sichtbar ist, in dem es definiert wurde.

REPORT demo_mod_tech_statics. PERFORM datatest1. PERFORM datatest1. SKIP. PERFORM datatest2. PERFORM datatest2. FORM datatest1. TYPES f_word(5) TYPE c. DATA f_text TYPE f_word VALUE 'INIT'. WRITE f_text. f_text = '12345'. WRITE f_text. ENDFORM. FORM datatest2. TYPES f_word(5) TYPE c. STATICS f_text TYPE f_word VALUE 'INIT'. WRITE f_text. f_text = 'ABCDE'. WRITE f_text. ENDFORM.
Nach der Ausfhrung sieht die Ausgabe so aus:

INIT INIT

12345 INIT

12345

ABCDE ABCDE ABCDE

In diesem Beispiel werden die beiden hnlichen Unterprogramme DATATEST1 und DATATEST2 definiert. In DATATEST2 wird STATICS anstatt DATA zur Deklaration des Datenobjekts F_TEXT verwendet. Bei jedem Aufruf von DATATEST1 wird F_TEXT neu initialisiert, behlt jedoch seinen Wert in DATATEST2. Der Zusatz VALUE der Anweisung STATICS funktioniert nur whrend des ersten Aufrufs von DATATEST2.

Lokale Feldsymbole
Alle in Unterprogrammen mit der Anweisung FIELD-SYMBOLS [Seite 211] deklarierten Feldsymbole sind lokal. Fr lokale Feldsymbole gelten folgende Regeln:

Lokale Feldsymbole knnen auerhalb des Unterprogramms nicht angesprochen werden.

474

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Lokale Daten des Unterprogramms

Bei jedem Aufruf des Unterprogramms ist einem lokalen Feldsymbol kein Feld zugewiesen, auch dann nicht, wenn im letzten Durchlauf ein ASSIGN ausgefhrt wurde. Lokale Feldsymbole knnen die gleichen Namen haben wie global deklarierte Feldsymbole. Lokale Feldsymbole verbergen globale Feldsymbole. Feldsymbole mit aufgeprgten Strukturen knnen ebenfalls lokal sein. Sie knnen lokale Strukturen haben und ihnen knnen lokale Felder zugewiesen werden.

Lokale Kopien globaler Felder


In einem Unterprogramm knnen lokale Kopien globaler Daten auf dem lokalen Datenstack des Unterprogramms angelegt werden. Man verwendet hierzu lokale Feldsymbole und folgende Variante der ASSIGN-Anweisung:

ASSIGN LOCAL COPY OF <f> TO <FS>.


Das System stellt eine Kopie des globalen Felds <f> auf den Stack. Innerhalb des Unterprogramms kann man durch Ansprechen des Feldsymbols <FS> auf diese Kopie zugreifen und sie ndern, ohne das globale Feld zu ndern. Der Zusatz LOCAL COPY OF kann mit allen Varianten der ASSIGN-Anweisung auer ASSIGN COMPONENT verwendet werden. Weitere Varianten der ASSIGN-Anweisung zum Gebrauch in Unterprogrammen sind:

ASSIGN LOCAL COPY OF INITIAL <f> TO <FS>.


Diese Anweisung legt eine initiale Kopie des globalen Felds <f> auf den Stack ohne die Feldinhalte zu transportieren.

ASSIGN LOCAL COPY OF INITIAL LINE OF <itab> TO <FS>.


Diese Anweisung legt eine initiale Kopie der Zeilen einer globalen internen Tabelle <itab> auf den Stack.

ASSIGN LOCAL COPY OF INITIAL LINE OF (<f>) TO <FS>.


Diese Anweisung legt eine initiale Kopie der Zeilen einer globalen internen Tabelle <itab> auf den Stack. Die interne Tabelle wird dynamisch als Inhalt des Felds <f> angegeben.

REPORT demo_mod_tech_assign_local_cop. DATA text(5) TYPE c VALUE 'Text1'. PERFORM routine. WRITE text. FORM routine. FIELD-SYMBOLS <fs> TYPE ANY. ASSIGN LOCAL COPY OF text TO <fs>. WRITE <fs>. <fs> = 'Text2'. WRITE <fs>. ASSIGN text TO <fs>. WRITE <fs>. <fs> = 'Text3'. ENDFORM.

April 2001

475

ABAP Programmierung (BC-ABA) Lokale Daten des Unterprogramms


Die Listenausgabe ist:
Text1 Text2 Text1 Text3

SAP AG

Durch Zuweisung des Felds TEXT zum lokalen Feldsymbol <FS> im Unterprogramm ROUTINE wird eine Kopie von TEXT auf den lokalen Datenstack gestellt. Durch Ansprechen von <FS> kann diese Kopie gelesen und gendert werden. Das globale Feld TEXT ist von den Operationen auf der lokalen Kopie nicht betroffen. Nach der Zuweisung des Felds an das Feldsymbol ohne den Zusatz LOCAL COPY OF, zeigt das Feldsymbol direkt auf das globale Feld und Operationen mit dem Feldsymbol werden auf dem globalen Feld durchgefhrt.

476

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Die Parameterschnittstelle

Die Parameterschnittstelle
Die Zustze USING und CHANGING der FORM-Anweisung definieren die Formalparameter eines Unterprogramms. Die Reihenfolge der Zustze ist fest vorgegeben. Hinter jedem Zusatz kann eine beliebig lange Liste von Formalparametern aufgefhrt sein. Beim Aufruf eines Unterprogramms mssen alle Formalparameter mit den Werten aus Aktualparametern gefllt werden und knnen nach der Beendigung des Unterprogramms ihre Werte an die entsprechenden Aktualparameter zurckgeben. Formalparameter verhalten sich innerhalb des Unterprogramms wie dynamische lokale Daten. Sie knnen also wie normale, mit DATA deklarierte, lokale Datenobjekte verwendet werden und verdecken geichnamige globale Datenobjekte. Der Startwert zu Beginn der Ausfhrung des Unterprogramms ist der bergebene Wert des zugehrigen Aktualparameters. Wir unterscheiden folgende Formalparameter:

Parameter mit Referenzbergabe


Diese Parameter werden ohne die Angabe VALUE hinter USING oder CHANGING aufgefhrt:

FORM <subr> USING ... <pi> [TYPE <t>|LIKE <f>] ... CHANGING ... <pi> [TYPE <t>|LIKE <f>] ...
Der Formalparameter hat keinen eigenen Speicherplatz. Beim Aufruf des Unterprogramms wird nur die Adresse des Aktualparameters an den Formalparameter bergeben. Das Unterprogramms arbeitet mit dem Feld des aufrufenden Programms. ndert sich der Wert des Formalparameters, ndert sich auch der Inhalt des Aktualparameters im aufrufenden Programm. Bei der Referenzbergabe sind USING und CHANGING vllig gleichwertig. Fr Dokumentationszwecke sollte USING fr Formalparameter verwendet werden, die nicht im Unterprogramm gendert werden, und CHANGING fr Formalparameter, die im Unterprogramm gendert werden. Um zu verhindern, da sich der Wert eines Aktualparameters automatisch ndert, mu er als Wert bergeben werden.

Eingabeparameter mit Wertbergabe


Diese Parameter werden mit der Angabe VALUE hinter USING aufgefhrt:

FORM <subr> USING

... VALUE(<pi>) [TYPE <t>|LIKE <f>] ...

Der Formalparameter belegt eigenen Speicherplatz. Beim Aufruf des Unterprogramms wird der Wert des Aktualparameters an den Formalparameter bergeben. ndert sich der Wert des Formalparameters hat dies keine Auswirkung auf den Aktualparameter.

Ausgabeparameter mit Wertbergabe


Diese Parameter werden mit der Angabe VALUE hinter CHANGING aufgefhrt:

FORM <subr> CHANGING ... VALUE(<pi>) [TYPE <t>|LIKE <f>] ...


Der Formalparameter belegt eigenen Speicherplatz. Beim Aufruf des Unterprogramms wird der Wert des Aktualparameters an den Formalparameter bergeben. Nach erfolgreicher Beendigung des Unterprogramms, d.h bei Erreichen der ENDFORM-Anweisung oder bei Verlassen des Unterprogramms durch die Anweisungen CHECK oder EXIT, wird der aktuelle Wert des Formalparameters in den Aktualparameter kopiert.

April 2001

477

ABAP Programmierung (BC-ABA) Die Parameterschnittstelle

SAP AG

Wenn das Unterprogramm durch eine Fehlermeldung vorzeitig beendet wird, wird kein Wert zurckgegeben. Die Beendigung eines Unterprogramms durch eine Fehlermeldung ist nur dann sinnvoll, wenn es whrend der PAI-Verarbeitung eines Bildschirmbilds aufgerufen wird, also aus PAI-Modulen, aus dem Ereignisblock AT SELECTION-SCREEN oder nach einem interaktiven Listenereignis.

Typisierung von Formalparametern


Formalparameter knnen alle gltigen ABAP-Datentypen haben. Zum Typisieren von Formalparameter dient der TYPE- bzw. LIKE-Zusatz . Die Typangabe kann generisch oder vollstndig sein. Bei generischer Typangabe wird ein Formalparameter gar nicht oder nur teilweise typisiert und bernimmt die restlichen Eigenschaften beim Aufruf des Unterprogramms vom entsprechenden Aktualparameter. Bei vollstndiger Typangabe werden alle technischen Eigenschaften eines Formalparameters schon bei der Unterprogrammdefinition festgelegt. Die folgenden Aussagen zur Typisierung gelten im bertragenen Sinn auch fr die Parameterschnittstellen der anderen Prozeduren, also Funktionsbausteinen und Methoden. Bei typisierten Formalparametern wird berprft, ob beim Aufruf des Unterprogramms ein vertrglicher Aktualparameter verwendet wird. Bei programminternen Unterprogrammaufrufen erfolgt diese berprfung schon bei der Syntax-Prfung, bei externen Unterprogrammaufrufen aber erst zur Laufzeit. Die Typisierung stellt sicher, da ein Unterprogramm immer mit den Datentypen arbeitet, die es bentigt. Generische Formalparameter erlauben eine groe Freiheit beim Aufruf von Unterprogrammen, da beliebige Daten bergeben werden knnen. Entsprechend eingeschrnkt sind die Mglichkeiten der Datenverarbeitung im Unterprogramm, da nur Operationen durchgefhrt werden knnen, die fr alle Datentypen mglich sind. Schon allein die Zuordnung zweier Datenobjekte funktioniert nicht zwischen allen Datentypen. Umgekehrt sorgt eine strenge Typisierung dafr, da in einem Unterprogramm nur erlaubte Operationen stattfinden. Dafr knnen nur noch die passenden Daten beim Aufruf bergeben werden. Falls ein Unterprogramm strukturierte Daten komponentenweise behandeln soll, ist die entsprechende Typisierung zwingend vorgeschrieben.

Generische Typangaben
Folgende Typisierungen erlauben Freiheiten bei der Verwendung von Aktualparametern. Der Aktualparameter mu nur die spezifizierten Teileigenschaften des Formalparameters haben und der Formalparameter bernimmt seine unspezifizierten Eigenschaften vom Aktualparameter.

Typisierung
keine Typangabe TYPE ANY TYPE C, N, P oder X

Prfung fr die Aktualparameter


Das Unterprogramm akzeptiert alle Typen von Aktualparametern. Alle technischen Eigenschaften des Aktualparameters werden an den Formalparameter bergeben. Das Unterprogramm akzeptiert nur Aktualparameter vom Typ C, N, P bzw. X . Die Feldlnge und DECIMALS-Angabe (fr Typ P) werden vom Aktualparameter an den Formalparameter bergeben. Das System prft, ob der Aktualparameter eine interne Standardtabelle ist. Diese Typisierung ist eine Kurzform von TYPE STANDARD TABLE (siehe unten).

TYPE TABLE

478

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Die Parameterschnittstelle

TYPE ANY TABLE

Das System prft, ob der Aktualparameter eine interne Tabelle ist. Alle Eigenschaften der internen Tabelle (Zeilentyp, Tabellenart, Schlssel) werden vom Aktualparameter an den Formalparameter bergeben. Das System prft, ob der Aktualparameter eine interne IndexTabelle (also eine Standard- oder sortierte Tabelle aber keine Hash-Tabelle) ist. Die Eigenschaften der internen Tabelle (Zeilentyp, Tabellenart, Schlssel) werden vom Aktualparameter an den Formalparameter bergeben.

TYPE INDEX TABLE

TYPE STANDARD TABLE Das System prft, ob der Aktualparameter eine interne StandardTabelle ist. Die restlichen Eigenschaften der internen Tabelle (Zeilentyp, Schlssel) werden vom Aktualparameter an den Formalparameter bergeben. TYPE SORTED TABLE Das System prft, ob der Aktualparameter eine sortierte interne Tabelle ist. Die restlichen Eigenschaften der internen Tabelle (Zeilentyp, Schlssel) werden vom Aktualparameter an den Formalparameter bergeben. Das System prft, ob der Aktualparameter eine interne HASHTabelle ist. Die restlichen Eigenschaften der internen Tabelle (Zeilentyp, Schlssel) werden vom Aktualparameter an den Formalparameter bergeben.

TYPE HASHED TABLE

Bei der generischen bergabe von Eigenschaften von Aktual- an Formalparameter ist zu beachten, da die bergabe dynamisch zur Laufzeit erfolgt und daher nicht statisch im Programmtext erkennbar ist. Beispielsweise kann ein bernommener Tabellenschlssel nicht statisch im Unterprogramm angesprochen werden, sehr wohl aber dynamisch.

TYPES: BEGIN OF line, col1(1) TYPE c, col2(1) TYPE c, END OF line. DATA: wa TYPE line, itab TYPE HASHED TABLE OF line WITH UNIQUE KEY col1, key(4) TYPE c VALUE 'col1'. wa-col1 = 'X'. INSERT wa INTO TABLE itab. wa-col1 = 'Y'. INSERT wa INTO TABLE itab. PERFORM demo USING itab. FORM demo USING p TYPE ANY TABLE. ... READ TABLE p WITH TABLE KEY (key) = 'X' INTO wa. ... ENDFORM.
Im Unterprogramm wird der Tabellenschlssel dynamisch angesprochen. Eine statische Ansprache

READ TABLE p WITH TABLE KEY col1 = 'X' INTO wa.

April 2001

479

ABAP Programmierung (BC-ABA) Die Parameterschnittstelle

SAP AG

ist dagegen syntaktisch nicht mglich, da der Formalparameter P erst zur Laufzeit den Schlssel der Tabelle ITAB bernimmt.

Vollstndige Typangabe
Bei folgenden Typisierungen werden die technischen Eigenschaften des Formalparameters vollstndig bestimmt und die technischen Eigenschaften des Aktualparameters mssen mit den Eigenschaften des Formalparameters bereinstimmen.

Typisierung
TYPE D, F, I oder T TYPE <type>

Technische Eigenschaften des Formalparameters


Der Formalparameter hat die technischen Eigenschaften dieser vollstndig vordefinierten elementaren Typen. Der Formalparameter hat den Typ <type>. Dieser ist ein durch TYPES definierter programminterner Datentyp oder ein Datentyp aus dem ABAP Dictionary.

TYPE REF TO <cif>|DATA Der Formalparameter ist eine Referenzvariable fr die Klasse bzw. das Interface <cif> oder ein Datenobjekt. TYPE LINE OF <itab> Der Formalparameter hat den gleichen Typ wie eine Zeile der ber TYPES oder im ABAP Dictionary deklarierten internen Tabelle <itab>. Der Formalparameter hat den gleichen Typ wie eine programminternes Datenobjekt <f> oder eine Struktur bzw. eine Datenbanktabelle aus dem ABAP Dictionary.

LIKE <f>

Bei der vollstndigen Typisierung von Formalparametern kann statisch auf smtliche Eigenschaften des Formalparameters zugegriffen werden, da sie im Programmtext bekannt sind.

Strukturierte Formalparameter
Da Formalparameter jeden gltigen ABAP-Datentyp haben knnen ist die Behandlung strukturierter Formalparameter, also Strukturen und interne Tabellen mit strukturiertem Zeilentyp kein Problem wenn der Formalparameter entsprechend vollstndig typisiert ist. Die Komponenten der Struktur sind im Unterprogramm statisch ansprechbar.

Generische Strukturen
Wenn ein strukturierter Aktualparameter generisch an einen nicht entsprechend strukturierten Formalparameter bergeben wird, kann im Unterprogramm nicht statisch auf die einzelnen Komponenten zugegriffen werden. Bei internen Tabellen knnen dann nur Zeilenoperationen durchgefhrt werden. Um dynamisch auf die Komponenten einer generisch bergebenen Struktur zuzugreifen, mu man mit Feldsymbolen und der Zuweisung ASSIGN COMPONENT <idx>|<name> OF STRUCTURE <s> TO <FS>. [Seite 223] arbeiten. <idx> wird als Komponentennummer, der Inhalt von <name> als Komponentenname der generischen Struktur <s> aufgefat.

REPORT demo_mod_tech_assign_component.

480

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Die Parameterschnittstelle

DATA: BEGIN OF line, col1 TYPE c VALUE 'X', col2 TYPE c VALUE 'Y', END OF line. DATA comp(4) TYPE c VALUE 'COL1'. PERFORM demo USING line. FORM demo USING p TYPE any. FIELD-SYMBOLS <fs> TYPE ANY. ASSIGN COMPONENT comp OF STRUCTURE p TO <fs>. WRITE <fs>. ASSIGN COMPONENT 2 OF STRUCTURE p TO <fs>. WRITE <fs>. ENDFORM.
Die Listenausgabe ist:
X Y

Die Komponenten COL1 und COL2 der generisch bergebenen Struktur von P werden dem Feldsymbol <FS> zugewiesen. Eine direkte Ansprache der Komponenten ist weder statisch noch dynamisch mglich.

Aufgeprgte Strukturen
Statt eine Typisierung mit TYPE oder LIKE durchzufhren, kann fr Strukturen auch die Typangabe

... <pi> [STRUCTURE <s>] ...


gemacht werden. Dabei ist <s> eine programmlokale Struktur (Datenobjekt, kein Datentyp) oder eine flache Struktur aus dem ABAP Dictionary. Der Formalparameter wird entsprechend <s> strukturiert und es kann im Unterprogramm auf die einzelnen Komponenten zugegriffen werden. Bei der bergabe eines Aktualparameters wird lediglich berprft, ob die Lnge des Aktualparameters mindestens die Lnge der Struktur ist. Mit STRUCTURE lassen sich also strukturierte Sichten auf beliebige Aktualparameter aufprgen.

REPORT demo_mod_tech_structure. DATA: BEGIN OF line, col1(1) TYPE c, col2(1) TYPE c, END OF line. DATA text(2) TYPE c VALUE 'XY'. PERFORM demo USING text. FORM demo USING p STRUCTURE line. WRITE: p-col1, p-col2. ENDFORM.
Die Listenausgabe ist:
X Y

Hier wird der Zeichenkette TEXT die Struktur LINE aufgeprgt.

April 2001

481

ABAP Programmierung (BC-ABA) Die Parameterschnittstelle

SAP AG

Der TABLES-Zusatz
Aus Kompatibilittsgrnden zu vorhergehenden Releases ist in der Parameterschnittstelle folgender Zusatz vor den Zustzen USING und CHANGING erlaubt:

FORM <subr> TABLES

... <itabi> [TYPE <t>|LIKE <f>] ...

Die Formalparameter <itabi> werden als interne Standard-Tabellen mit Kopfzeile definiert. Wenn eine interne Tabelle ohne Kopfzeile als Aktualparameter fr solche einen Formalparameter verwendet wird, wird im Unterprogramm eine lokale Kopfzeile fr den Formalparameter generiert. Wird eine interne Tabelle mit Kopfzeile als Aktualparameter verwendet, werden der Tabellenkrper und der Tabellenarbeitsbereich an das Unterprogramm bergeben. Bei mit TABLES definierten Formalparametern ist keine Wertbergabe mglich. Um auf die Komponenten strukturierter Zeilen zuzugreifen mssen auch TABLES-Parameter entsprechend typisiert werden. Seit Release 3.0 sollte statt des TABLES-Zusatzes immer USING oder CHANGING mit der entsprechenden Typisierung fr interne Tabellen verwendet werden, wobei aus PerformanceGrnden bei internen Tabellen mglichst keine Wertbergabe definiert werden sollte.

482

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Unterprogramme beenden

Unterprogramme beenden
Ein Unterprogramm endet normalerweise bei Erreichen der ENDFORM-Anweisung. Ein Unterprogramm kann aber auch vorher durch die Anweisungen EXIT oder CHECK beendet werden. Auch bei Beendigung durch EXIT oder CHECK wird der aktuelle Wert der Ausgabeparameter des Unterprogramms (CHANGING-Parameter mit Wertbergabe) an die entsprechenden Aktualparameter bergeben. EXIT beendet ein Unterprogramm ohne Bedingungen. Das aufrufende Programm nimmt die Verarbeitung nach der Anweisung PERFORM wieder auf.

REPORT demo_mod_tech_exit. PERFORM terminate. WRITE 'Ende'. FORM terminate. WRITE '1'. WRITE '2'. WRITE '3'. EXIT. WRITE '4'. ENDFORM.
Die Ausgabe sieht so aus:

1 2 3 Ende
Das Unterprogramm TERMINATE wird nach der dritten WRITE-Anweisung beendet. CHECK beendet ein Unterprogramm unter Bedingungen. Ist der logische Ausdruck der CHECKAnweisung unwahr, wird das Unterprogramm beendet und das aufrufende Programm nimmt die Verarbeitung nach der Anweisung PERFORM wieder auf.

REPORT demo_mod_tech_check. DATA: num1 TYPE i, num2 TYPE i, res TYPE p DECIMALS 2. num1 = 3. num2 = 4. PERFORM divide USING num1 num2 CHANGING res. num1 = 5. num2 = 0. PERFORM divide USING num1 num2 CHANGING res. num1 = 2. num2 = 3. PERFORM divide USING num1 num2 CHANGING res. FORM divide USING n1 TYPE any n2 TYPE any CHANGING r TYPE any. CHECK n2 NE 0. r = n1 / n2.

April 2001

483

ABAP Programmierung (BC-ABA) Unterprogramme beenden


WRITE: / n1, '/', n2, '=', r. ENDFORM.
Die Ausgabe sieht so aus:
3 / 2 / 4 = 3 = 0.75 0.67

SAP AG

In diesem Beispiel wird das Unterprogramm DIVIDE whrend des zweiten Aufrufs durch CHECK verlassen, da der Wert von N2 gleich 0 ist. Wenn die Anweisungen EXIT oder CHECK innerhalb von Unterprogrammen in Schleifen stehen gelten sie fr die Schleifen und nicht fr das Unterprogramm. EXIT und CHECK brechen Schleifen unterschiedlich ab (siehe Schleifen [Seite 259]), verhalten sich beim Beenden von Unterprogrammen aber identisch.

484

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Aufruf von Unterprogrammen

Aufruf von Unterprogrammen


Unterprogramme werden ber

PERFORM... [USING ... <pi>... ] [CHANGING... <pi>... ].


aufgerufen. Unterprogramme lassen sich aus Unterprogrammen aufrufen (geschachtelte Aufrufe) und Unterprogramme knnen auch sich selbst aufrufen (rekursive Aufrufe). Nach erfolgreicher Beendigung des aufgerufenen Unterprogramms wird die Ausfhrung des aufrufenden Programms nach der PERFORM-Anweisung fortgesetzt. Mit den Zustzen USING und CHANGING wird die Parameterschnittstelle des aufgerufenen Unterprogramms mit Werten versorgt. Benennung des Unterprogramms [Seite 486] Parameterbergabe an Unterprogramme [Seite 490]

April 2001

485

ABAP Programmierung (BC-ABA) Benennung des Unterprogramms

SAP AG

Benennung des Unterprogramms


Mit der Anweisung PERFORM lassen sich sowohl Unterprogramme aufrufen, die im gleichen ABAP-Programm kodiert sind (interne Aufrufe), als auch Unterprogramme, die in anderen ABAPProgrammen kodiert sind (externe Aufrufe). Der Name des Unterprogramms kann auch dynamisch zur Laufzeit angegeben werden und man kann ein Unterprogramm aus einer Liste aufrufen.

Interne Unterprogrammaufrufe
Fr den Aufruf eines im gleichen Programm definierten Unterprogramms gengt die statische Angabe des Unterprogrammnamens in der Anweisung PERFORM:

PERFORM <subr> [USING ... <pi>... ] [CHANGING... <pi>... ].


Das interne Unterprogramm hat Zugriff auf alle globalen Daten des Aufrufers.

REPORT demo_mod_tech_perform_int. DATA: num1 TYPE i, num2 TYPE i, sum TYPE i. num1 = 2. num2 = 4. PERFORM addit. num1 = 7. num2 = 11. PERFORM addit. FORM addit. sum = num1 + num2. PERFORM out. ENDFORM. FORM out. WRITE: / 'Sum of', num1, 'and', num2, 'is', sum. ENDFORM.
Die Ausgabe sieht so aus:

Sum of Sum of

2 and 7 and

4 is 11 is

6 18

In diesem Beispiel werden die beiden internen Unterprogramm ADDIT und OUT am Ende des Programms definiert. ADDIT wird vom Programm aus aufgerufen und OUT wird von ADDIT aus aufgerufen. Die Unterprogramm haben Zugriff auf die globalen Felder NUM1, NUM2 und SUM. Externe Unterprogrammaufrufe Das Hauptanwendungsgebiet von Unterprogrammen ist die Modularisierung und Strukturierung lokaler Programme. Jedes Unterprogramm kann aber auch extern von einem anderen ABAP-Programm aufgerufen werden. Im Extremfall knnen ABAPProgramme angelegt werden, die keine anderen Verarbeitungsbcke enthalten

486

April 2001

SAP AG

ABAP Programmierung (BC-ABA) Benennung des Unterprogramms

auer Unterprogrammen. Solche Programme sind nicht ausfhrbar, sondern dienen anderen ABAP-Programmen als Subroutine-Pool fr externe Unterprogramme. Um Funktionalitt global zur Verfgung zu stellen sollten statt externer Unterprogra