ABAP WRITE-Anweisung: Syntax, Formatierungsoptionen und Beispiele für die Listausgabe

kategorie
ABAP-Statements
Veröffentlicht
autor
Johannes

Die WRITE-Anweisung ist eine der fundamentalsten Anweisungen in ABAP zur Ausgabe von Daten. Ihr Hauptzweck ist das Schreiben von Werten (Variableninhalten, Literalen, Systemfeldern etc.) in die aktuelle Ausgabeliste (auch bekannt als “klassische Liste” oder “Spool-Liste”). Diese Liste wird typischerweise angezeigt, wenn ein ausführbares Programm ( Report) im Dialog läuft, oder sie wird als Spool-Auftrag gespeichert, wenn das Programm im Hintergrund läuft.

Syntax

Die einfachste Form der Syntax lautet:

WRITE <ausgabe> [formatierungsoptionen].

<ausgabe>: Dies ist der Wert, der ausgegeben werden soll. Es kann sein:

  • Ein Datenobjekt (Variable, Konstante)
  • Ein Textliteral (z. B. 'Hallo Welt')
  • Ein Feld-Symbol
  • Ein Systemfeld (z. B. sy-datum, sy-uzeit)
  • Eine Komponente einer Struktur (z. B. struktur-feldname)
  • Ein Ausdruck

[formatierungsoptionen]: Optionale Zusätze, um die Position und das Aussehen der Ausgabe zu steuern.

Positionierung auf der Liste

Standardmäßig wird jede WRITE-Anweisung direkt hinter der vorherigen Ausgabe in der aktuellen Zeile fortgesetzt (mit einem Leerzeichen dazwischen). Man kann die Position aber genau steuern:

  1. Neue Zeile (/):

    WRITE / <ausgabe>.

    Beginnt die Ausgabe in einer neuen Zeile in der ersten Spalte (Spalte 1).

  2. Absolute Position (AT <spalte>):

    WRITE AT <spalte> <ausgabe>.
    WRITE AT /<spalte> <ausgabe>. " Kombiniert: Neue Zeile und Spalte

    Beginnt die Ausgabe in der aktuellen Zeile (oder einer neuen Zeile bei AT /) ab der angegebenen Spaltennummer <spalte>.

  3. Position mit Längenangabe (AT <spalte>(<länge>)):

    WRITE AT <spalte>(<länge>) <ausgabe>.
    WRITE AT /<spalte>(<länge>) <ausgabe>.

    Gibt <ausgabe> ab Spalte <spalte> aus, aber reserviert dafür genau <länge> Zeichen. Der Inhalt wird ggf. abgeschnitten oder aufgefüllt (Standard: rechtsbündig für Zahlen, linksbündig für Text).

Wichtige Formatierungsoptionen

Es gibt zahlreiche Optionen, um das Aussehen der Ausgabe zu beeinflussen:

Ausrichtung:

  • LEFT-JUSTIFIED: Linksbündig
  • CENTERED: Zentriert
  • RIGHT-JUSTIFIED: Rechtsbündig (Standard für numerische Typen) Keine Lücke:
  • NO-GAP: Unterdrückt das automatische Leerzeichen zwischen direkt aufeinanderfolgenden WRITE-Ausgaben in derselben Zeile. Formatierungsmasken:
  • USING EDIT MASK <maske>: Wendet eine Maske an. <maske> ist ein Literal oder eine Variable, z. B. '__:__' für Uhrzeit, 'RR__,___,___.__' für Zahlen, 'TT.MM.JJJJ' für Datum.
  • USING NO EDIT MASK: Unterdrückt die Anwendung von Standard-Konvertierungsroutinen (z. B. für Datumsformate). Zahlenformate:
  • CURRENCY <wfeld>: Formatiert einen Betrag gemäß dem Währungsschlüssel in <wfeld>. Berücksichtigt die Anzahl der Dezimalstellen und das Tausendertrennzeichen der Währung.
  • DECIMALS <anz>: Gibt den Wert mit <anz> Dezimalstellen aus.
  • NO-ZERO: Gibt nichts aus, wenn der Wert Null oder der Initialwert des Datentyps ist.
  • NO-SIGN: Unterdrückt die Ausgabe des Vorzeichens (+/-).
  • EXPONENT <exp>: Für Fließkommazahlen (Typ f), Ausgabe mit Exponent <exp>. Erscheinungsbild (Farben, etc.):
  • COLOR <farbe> | COL_<key> | <n>: Setzt die Farbe. <farbe> kann 1-7 sein, <key> kann z. B. HEADING, NORMAL, TOTAL, POSITIVE, NEGATIVE sein.
  • INTENSIFIED [ON|OFF]: Verstärkte (helle) Darstellung.
  • INVERSE [ON|OFF]: Inverse Darstellung (Hintergrund-/Vordergrundfarbe vertauscht).
  • INPUT [ON|OFF]: Macht das Feld eingabebereit (nur sinnvoll in Listen, die zur Eingabe dienen). Spezielle Ausgaben:
  • AS CHECKBOX: Gibt das Feld als Ankreuzfeld aus (Wert ‘X’ = angekreuzt, ’ ’ = nicht angekreuzt).
  • AS SYMBOL: Gibt ein vordefiniertes Symbol aus (z. B. SYM_BULLET, SYM_PHONE; siehe Typgruppe SYM).
  • AS ICON: Gibt ein Icon aus (z. B. ICON_OKAY, ICON_CANCEL; siehe Typgruppe ICON).
  • AS LINE: Zeichnet Linien (verwendet mit ULINE, VLINE).

Beispiele

1. Einfache Ausgaben und Zeilenumbrüche

DATA: text1 TYPE string VALUE 'Hallo',
text2 TYPE string VALUE 'ABAP Welt!',
count TYPE i VALUE 10,
today TYPE d.
today = sy-datum. " Heutiges Datum (z.B. 20250420)
WRITE text1. " Ausgabe: Hallo
WRITE text2. " Ausgabe: ABAP Welt! (mit Lücke)
WRITE / 'Neuer Absatz.'. " Ausgabe: Neuer Absatz. (in neuer Zeile)
WRITE / 'Anzahl:'.
WRITE count. " Ausgabe: 10 (rechtsbündig in Standardlänge)
WRITE / 'Datum:'.
WRITE today. " Ausgabe: 20.04.2025 (Standardformat aus Benutzerstamm)

2. Positionierung

WRITE: / AT 5 'Text in Spalte 5',
/ AT 10(20) 'Begrenzter Text ab Spalte 10 auf 20 Zeichen',
sy-vline, " Vertikale Linie an aktueller Position
AT 40 'Nach der Linie'.

3. Formatierungsoptionen

DATA: price TYPE p DECIMALS 2 VALUE '1234.99',
currency_code TYPE waers VALUE 'EUR',
datum TYPE d VALUE '20250420',
uhrzeit TYPE t VALUE '103000'.
WRITE: / 'Preis (Standard):', price.
WRITE: / 'Preis (Währung):', price CURRENCY currency_code.
WRITE: / 'Preis (Zentriert):', price CENTERED.
WRITE: / 'Preis (Keine Nullen):' NO-ZERO price.
WRITE: / 'Datum (Maske):', datum USING EDIT MASK '____/__/__'. " Ausgabe: 2025/04/20
WRITE: / 'Uhrzeit (Maske):', uhrzeit USING EDIT MASK '__:__:__'. " Ausgabe: 10:30:00
WRITE: / 'Wichtige Meldung' COLOR COL_NEGATIVE INTENSIFIED.
WRITE ' hier' COLOR COL_NEGATIVE INTENSIFIED NO-GAP. " Direkt dran, ohne Lücke

4. Spezielle Ausgaben

DATA: checkbox_val TYPE c LENGTH 1 VALUE 'X'.
WRITE: / 'Status:' AS ICON, icon_led_green AS ICON NO-GAP.
WRITE: / 'Option A:' AS CHECKBOX, checkbox_val AS CHECKBOX INPUT. " Eingabebereit
WRITE: / 'Bullet Point:' AS SYMBOL, sym_bullet AS SYMBOL NO-GAP, ' Text'.
ULINE AT /1(30). " Horizontale Linie über 30 Spalten in neuer Zeile

Wichtige Hinweise

  • Die WRITE-Anweisung ist fundamental für die klassische ABAP-Listverarbeitung.
  • Die Breite der Liste wird normalerweise durch den LINE-SIZE Zusatz der REPORT-Anweisung bestimmt.
  • In modernen ABAP-Anwendungen (z. B. mit ALV = ABAP List Viewer, oder Fiori Apps) wird die Darstellung der Daten meist von den UI-Frameworks übernommen. Dort wird WRITE seltener für die primäre Datenanzeige verwendet, ist aber weiterhin nützlich für einfache Protokolle, Debugging oder das Erzeugen einfacher Spool-Listen im Hintergrund.