ABAP Obsolet - Range und Kopfzeilen
Eine ordentliche Range zur Übergabe erzeugen? Tabellen mit oder ohne Kopfzeilen? Wir zeigen dir was noch geht und was du lieber sein lassen solltest.
Inhaltsverzeichnis
In dem heutigen Artikel geht es um einige Befehle die mit internen Tabellen zu tun haben. Deshalb haben wir die verschiedenen Varianten in einem Artikel zusammengefasst. Vor allem in vielen älteren Reports und Funktionnen der SAP wird man diese Funktionnen noch finden, sollte aber slbst auf die Nutzung verzichten.
WITH HEADER LINE
Der Zusatz erzeugt zusammen mit der Tabelle eine Kopfzeile, die unter dem gleichen Namen angesprochen werden kann. Das spart beim Loop den INTO Zusatz, bei einer Übergabe muss aber expliziet auf die Tabelle verwiesen werden, indem ein "[]" am Ende angehangen wird.
Im Beispiel einmal die Schleife und die Übergabe:
DATA:
lt_bkpf TYPE STANDARD TABLE OF bkpf WITH HEADER LINE.
LOOP AT lt_bkpf.
" Do Something
ENDLOOP.
lo_app->main( lt_bkpf[] ).
Diese Weise sollte nicht mehr verwendet werden, da die Kopfzeile nicht direkt ersichtlich ist und in der modernen Entwicklung andere Entwickler nur verwirren könnte, die das Konstrukt nicht kennen. Damit Tabelle und Struktur sauber voneinader getrennt sind, wird eine Zeile auch expliziet deklariert. Mittlerweile kann auch die Inline-Deklaration verwendet werden.
DATA:
lt_bkpf TYPE STANDARD TABLE OF bkpf.
LOOP AT lt_bkpf INTO DATA(ls_bkpf).
" Do Something
ENDLOOP.
lo_app->main( lt_bkpf ).
RANGES
Du benötigst mal wieder eine Range für die Selektion, als Schnittstellen-Parameter oder zur Übergabe in einem Datenobjekt? Mit dem TYPE Zusatz kannst du in der modernen ABAP Sprache eine Tabelle vom Typ Range erzeugen. Die Tabelle hat keine Kopfzeile, wie es der Fall ist bei einer mit RANGES definierten Tabelle.
RANGES:
lt_r_company_code FOR t001-bukrs.
DATA:
lt_r_company_code TYPE RANGE OF t001-bukrs.
Willst du direkt das Ergebnis der Selektion in eine Range umwandeln, kannst du dies auch direkt im SELECT und per Inline-Deklaration machen. Dazu die Felder für SIGN und OPTION im Statement erzeugen und setzen, dann das Ergebnis in LOW und HIGH übernehmen. Dies ist ein einfacher, schneller Weg und spart die Konvertierung in einer zusätzlichen Schleife.
SELECT 'I' AS sign, 'EQ' AS option, bukrs AS low, bukrs AS high
FROM t001
INTO TABLE @DATA(lt_r_company_code).
OCCURS
Das Statement erzeugt eine Tabelle und allokiert dafür eine Anzahl von Zeilen im Speicher, auch wenn noch keine 10 Zeilen enthalten sind, wie es im Beispiel erwähnt wurde. Dieser Befehl sollte nicht mehr verwendet werden, weil bei der Definition nicht genau sichtbar ist, was hier erzeugt wird. Weder der Art der Tabelle ist bekannt, noch wurde ein Schlüssel definiert. In unserem Beispiel haben wir zu Verdeutlichung den Schlüssel ebenfalls weggelassen.
DATA:
lt_bkpf LIKE t001 OCCURS 10.
DATA:
lt_bkpf TYPE STANDARD TABLE OF t001.
Fazit
Bereits im moderneren OO-Kontext funktionieren viele der alten Befehle zur Definition nicht mehr. Wir wollen dir für einen sauberen Programmierstil aber auch ein paar Neuerungen in allen Bereichen mitgeben.