Anfang des Inhaltsbereichs

Zugriffe mit Offset- und Längenangaben Dokument im Navigationsbaum lokalisieren

Allgemein sind Offset/Längenangaben kritisch, weil die Länge der einzelnen Zeichen plattformabhängig ist und damit zunächst nicht geklärt ist, ob gerade bei gemischten Strukturen die Einheit Byte oder Zeichen gemeint ist. Zum Teil wurden daher erhebliche Einschränkungen erforderlich, jedoch ist ein Offset/Längenzugriff auch weiterhin in dem Umfang möglich, wie er nachfolgend dargestellt wird. Von dieser Regelung betroffen sind Zugriffe auf Einzelfelder und Strukturen, die Übergabe von Parametern an Unterprogramme und schließlich das Arbeiten mit Feldsymbolen.

Zugriffe auf Einzelfelder

Zugriffe mit Offset/Länge sind auf zeichenartige Einzelfelder, auf Strings und auf Einzelfelder der Typen X und XSTRING zulässig. Offset und Länge werden bei zeichenartigen Feldern und Feldern vom Typ STRING zeichenweise interpretiert. Nur bei den Typen X und XSTRING werden die Werte für Offset und Länge in Byte angenommen.

Zugriffe auf Strukturen

Der Zugriff mit Offset und Länge auf strukturierte Felder wird als unerwünschte Programmiertechnik angesehen. Ein solcher Zugriff führt zu Fehlern, wenn in dem mit Offset und Länge überstrichenen Bereich sowohl zeichen- als auch nicht zeichenartige Komponenten liegen.

Offset/Längenzugriffe auf Strukturen sind in UP nur zulässig, wenn sie flach sind und die Offset- und Längenangabe nur zeichenartige Felder ab dem Strukturbeginn einschließt. Das nachfolgende Beispiel zeigt eine Struktur mit zeichen- und nicht zeichenartigen Feldern. Ihre Definition im ABAP-Programm und die daraus resultierende Belegung im Hauptspeicher gestaltet sich so:

BEGIN OF STRUC,
  a(3)  TYPE C,   "Länge  3 Zeichen
  b(4)  TYPE N,   "Länge  4 Zeichen
  c     TYPE D,   "Länge  8 Zeichen
  d     TYPE T,   "Länge  6 Zeichen
  e     TYPE F,   "Länge  8 Byte
  f(26) TYPE C,   "Länge 28 Zeichen
  g(4)  TYPE X,   "Länge  2 Byte  
END OF STRUC.

Intern weist die Fragmentsicht fünf Bereiche auf, wobei hier ein Offset-Längenzugriff nur auf das erste Fragment möglich ist. Anweisungen wie struc(21) oder struc+7(14) werden seitens ABAP-Interpreter akzeptiert und wie ein Einzelfeld vom Typ C behandelt. Dagegen ist ein Zugriff struc+57(2) nur noch in NUP zulässig. Ist ein Offset/Längenzugriff auf eine Struktur erlaubt, dann werden in UP sowohl Offset- als auch Längenangaben stets als Zeichen interpretiert.

Parameterübergabe an Formroutinen

Die Parameterübergabe bei PERFORM erlaubte bisher, feldübergreifende Offset- und Längenangaben zu verwenden. Das wird zukünftig in UP verboten. Vielmehr führen hier Offset- und Längenzugriffe über Feldgrenzen hinaus zu einem Syntax- oder Laufzeitfehler. Zum Beispiel würden für ein zehnstelliges C-Feld c Zugriffe der Art c+15 oder c+5(10) einen solchen Fehler auslösen.

Wird bei einem Parameter nur ein Offset, aber keine Länge angegeben, so wurde bisher die gesamte Länge des Feldes und nicht die Restlänge als Länge für den Zugriff verwendet. Damit sind Parameterangaben nur mit Offset feldübergreifend und lösen daher in UP einen Syntaxfehler aus. Ein PERFORM test USING c+5 ist daher verboten.

Auch in UP kann weiterhin bei Parametern in der Form feld+off(*) die Restlänge ab Offset off spezifiziert werden.

Ranges für Offset- und Längenzugriffe bei Feldsymbolen

In UP wird sichergestellt, daß Offset/Längenzugriffe bei ASSIGN nur innerhalb eines vorgegebenen Bereichs (Range) zulässig sind. Im Normalfall stimmt der Range bei elementaren Feldern mit den Feldgrenzen und bei flachen Strukturen mit dem rein zeichenartigen Anfangsstück überein. Durch einen speziellen RANGE-Zusatz bei ASSIGN kann der Range auch über diese Grenzen hinaus erweitert werden.

Feldsymbolen wird ein für Offset/Längenangaben zulässiger Range zugeordnet. Wird die Quellangabe einer ASSIGN-Anweisung mit einem Feldsymbol angegeben, so übernimmt das Ziel-Feldsymbol den Range der Quelle. Sofern nicht explizit angegeben wird, bestimmt sich der RANGE wie folgt:

ASSIGN feld TO <f>.

In UP erhält <f> die Feldgrenzen von feld als Range, wobei feld kein Feldsymbol ist.

ASSIGN <g> TO <f>.

<f> übernimmt den Range von <g>.

ASSIGN elfeld+off(len) TO <f>.

In UP erhält <f> die Feldgrenzen des Elementarfeldes elfeld als Range.

ASSIGN <elfld>+off(len) TO <f>.

<f> übernimmt den Range des elemtaren Feldes elfeld.

ASSIGN struc+off(len) TO <f>.

ASSIGN <struc>+off(len) TO <f>.

In UP bestimmt das rein zeichenartige Anfangsstück der flachen Strukturen struc oder <struc> die Range-Grenzen.

Kann die Zuweisung an das Feldsymbol nicht erfolgen, weil die Offset- oder Längenangabe den zulässigen Range überschreitet, wird das Feldsymbol in UP auf UNASSIGNED gesetzt. Andere Prüfungen wie zum Beispiel Typ- oder Alignmentprüfungen führen in UP zu einem Laufzeitfehler. Generell werden Offset- und Längenangaben bei den Datentypen C, N, D und T sowie bei flachen Strukturen in Zeichen und sonst in Bytes gezählt.

Offset ohne Längenangabe bei Feldsymbolen

Bisher hatte ASSIGN feld+off TO <f> das Sonderverhalten, daß die Feldlänge und nicht die Restlänge von feld genommen wurde, wenn nur ein Offset, aber keine Länge angegeben wurde. Somit ist ein ASSIGN mit feldübergreifendem Offset unter Unicode problematisch und es gelten daher für diese Konstellation folgende Regeln:

  1. Als Länge wird wie bisher die Feldlänge von feld verwendet. Mit ASSIGN feld+off(*) ... kann weiterhin explizit die Restlänge spezifiziert werden.
  2. ASSIGN <f>+off TO <g> ist nur noch dann erlaubt, wenn der Laufzeit-Typ von < f> flach und elementar ist, also C, N, D, T (Offset in Zeichen) oder X (Offset in Bytes).
  3. ASSIGN feld+off TO <g> wird generell syntaktisch verboten, weil hier jeder Offset <> 0 eine Range-Überschreitung bewirken würde. Davon ausgenommen sind Fälle, bei denen ein RANGE-Zusatz angegeben ist.

Mit diesen Regeln ist normalerweise das Weiterschalten eines Feldsymbols mittels ASSIGN <f>+n TO <f> über ein elementares Feld, wie es zum Beispiel in einer Schleife vorkommt, auch in Zukunft möglich.

 

Hinweis Im Zusammenhang mit Strukturerweiterungen sind die im Dictionary verwendeten Kategorien zu beachten.

Ende des Inhaltsbereichs