Erste Schritte
Grundlegende Methoden und Konzepte anwenden
Mit lokalen Klassen arbeiten
Daten aus der Datenbank lesen
Mit strukturierten Datenobjekten arbeiten
Mit komplexen internen Tabellen arbeiten
Datenbankänderungen mit Business Objects implementieren
Das ABAP-RESTful-Anwendungsprogrammiermodell beschreiben

Mit einfachen internen Tabellen arbeiten

Objectives

After completing this lesson, you will be able to:
  • Definieren Sie einfache interne Tabellen.
  • Daten mit einfachen internen Tabellen verarbeiten.

Definition von einfachen internen Tabellen

Interne Tabellen

Interne Tabellen sind variable Datenobjekte, in denen mehrere typgleiche Werte gespeichert werden können. Dieser Typ muss in der Deklaration angegeben werden und wird als Zeilentyp der internen Tabelle bezeichnet.

Jeder Wert belegt eine Zeile der internen Tabelle. Die Anzahl der Zeilen ist nicht beschränkt. Theoretisch können Sie beliebig viele Werte in einer internen Tabelle speichern. Einschränkungen ergeben sich nur aus technischen Grenzen wie verfügbarem Speicher oder der Systemkonfiguration.

Der Initialwert einer internen Tabelle ist eine leere Tabelle, d.h. eine Tabelle mit 0 Zeilen. Es gibt verschiedene Methoden zum Füllen einer internen Tabelle. Im Beispiel wird mit der Anweisung APPEND am Ende der internen Tabelle eine neue Zeile hinzugefügt und diese mit einem Wert gefüllt.

Tabellentypen

Der Typ einer internen Tabelle heißt Tabellentyp.

Im vorherigen Beispiel wurde TYPE TABLE OF direkt in der DATA-Anweisung verwendet. Der Tabellentyp wurde an die deklarierte Variable gebunden.

Alternativ können Sie TYPE TABLE OF in einer TYPES-Anweisung verwenden, um einen Tabellentyp mit einem Namen zu definieren. Diesen Tabellentyp können Sie dann z.B. in einer DATA-Anweisung verwenden. Die Sichtbarkeit dieser Typen hängt von der Position der TYPES-Anweisung ab.

Es gibt auch Tabellentypen im ABAP Dictionary. Diese Tabellentypen werden mit einem dedizierten Editor gepflegt. Sie werden als globale Tabellentypen bezeichnet, da sie überall im System sichtbar sind.

Datenverarbeitung mit einfachen internen Tabellen

In diesem Video erfahren Sie, wie Sie eine interne Tabelle mit der APPEND-Anweisung füllen können.

Der Initialwert einer internen Tabelle ist eine leere Tabelle, d.h. eine interne Tabelle mit null Zeilen.

Sie haben bereits gelernt, dass Sie mit der Anweisung CLEAR eine ABAP-Variable auf ihren typgerechten Initialwert zurücksetzen können.

Wenn Sie CLEAR für eine interne Tabelle verwenden, löschen Sie ihren gesamten Inhalt und setzen die Anzahl der Zeilen auf null.

Es gibt verschiedene Möglichkeiten, Daten aus einer internen Tabelle abzurufen. In diesem Beispiel wird der Inhalt einer einzelnen Zeile über einen internen Tabellenausdruck abgerufen. Im Tabellenausdruck folgt unmittelbar auf den Namen der internen Tabelle ein Paar eckiger Klammern. Ein Integer-Ausdruck innerhalb der Klammern gibt die Position der zu lesenden Zeile an.

Hinweis:

Die korrekte Syntax erfordert mindestens ein Leerzeichen nach der öffnenden Klammer und vor der schließenden Klammer.

In einer Schleife aus einer internen Tabelle lesen

Das folgende Video veranschaulicht, wie Sie in einer Schleife aus einer internen Tabelle lesen können.

Bei der Implementierung einer Schleife über eine interne Tabelle kann anstelle der expliziten Deklaration des Arbeitsbereichs mit einer DATA-Anweisung eine Inline-Deklaration nach dem Zusatz INTO verwendet werden.

Dadurch reduzieren Sie nicht nur die Menge des zu typisierenden Quelltexts, sondern stellen auch sicher, dass der Typ des Arbeitsbereichs zum Zeilentyp der internen Tabelle passt, da der Typ des inline deklarierten Datenobjekts aus dem Kontext abgeleitet wird, der in diesem Fall die interne Tabelle ist.

Probieren Sie es aus: Einfache interne Tabellen

  1. Legen Sie wie in der ersten Übung dieser Schulung eine neue globale Klasse an, die das Interface IF_OO_ADT_CLASSRUN implementiert.
  2. Kopieren Sie das folgende Code-Snippet in den Implementierungsteil der Methode if_oo_adt_classrun~main( ):
    Code Snippet
    12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
    * Declarations ********************************************************************** " Internal tables DATA numbers TYPE TABLE OF i. "Table type (local) TYPES tt_strings TYPE TABLE OF string. DATA texts1 TYPE tt_strings. " Table type (global) DATA texts2 TYPE string_table. " work areas DATA number TYPE i VALUE 1234. DATA text TYPE string. * Example 1: APPEND ********************************************************************** APPEND 4711 TO numbers. APPEND number TO numbers. APPEND 2 * number TO numbers. out->write( `-----------------` ). out->write( `Example 1: APPEND` ). out->write( `-----------------` ). out->write( numbers ). * Example 2: CLEAR ********************************************************************** CLEAR numbers. out->write( `----------------` ). out->write( `Example 2: CLEAR` ). out->write( `----------------` ). out->write( numbers ). * Example 3: table expression ********************************************************************** APPEND 4711 TO numbers. APPEND number TO numbers. APPEND 2 * number TO numbers. out->write( `---------------------------` ). out->write( `Example 3: Table Expression` ). out->write( `---------------------------` ). number = numbers[ 2 ] . out->write( |Content of row 2: { number }| ). "Direct use of expression in string template out->write( |Content of row 1: { numbers[ 1 ] }| ). * Example 4: LOOP ... ENDLOOP ********************************************************************** out->write( `---------------------------` ). out->write( `Example 4: LOOP ... ENDLOOP` ). out->write( `---------------------------` ). LOOP AT numbers INTO number. out->write( |Row: { sy-tabix } Content { number }| ). ENDLOOP. * Example 5: Inline declaration in LOOP ... ENDLOOP ********************************************************************** out->write( `-----------------------------` ). out->write( `Example 5: Inline Declaration` ). out->write( `-----------------------------` ). LOOP AT numbers INTO DATA(number_inline). out->write( |Row: { sy-tabix } Content { number_inline }| ). ENDLOOP.
  3. Drücken Sie STRG + F3, um die Klasse zu aktivieren, und F9, um sie als Konsolen-App auszuführen.
  4. Analysieren Sie die Konsolenausgabe. Probieren Sie mit dem Quelltext Verschiedenes aus, um sich mit den Konzepten vertraut zu machen.

Mit einfachen internen Tabellen arbeiten

In dieser Übung verwenden Sie Iterationen und einfache interne Tabellen, um die Fibonacci-Zahlen zu berechnen und anzuzeigen.

Notiz

Die Fibonacci-Zahlen sind eine Zahlenfolge, in der jede Zahl die Summe der beiden vorhergehenden Zahlen ist. Die Folge beginnt mit 0 und 1, und jede nachfolgende Zahl ist die Summe der beiden vorherigen Zahlen. Die Folge hat verschiedene mathematische Eigenschaften, Muster und Anwendungen in Bereichen wie Mathematik, Informatik, Natur und Kunst.

Vorlage:

  • keine

Lösung:

  • /LRN/CL_S4D400_BTS_ITERATE (globale Klasse)

Aufgabe 1: Die Zahlen berechnen

Legen Sie in Ihrem eigenen Paket eine neue globale Klasse an. Definieren Sie eine Konstante für die Anzahl der Iterationen und eine interne Tabelle für die Fibonacci-Zahlen. Berechnen Sie dann die Fibonacci-Zahlen in einer Iteration, und speichern Sie sie in der internen Tabelle.

Schritte

  1. Legen Sie eine neue globale Klasse an, die das Interface IF_OO_ADT_CLASSRUN implementiert (Namensvorschlag: ZCL_##_ITERATE, wobei ## für Ihre Gruppennummer steht).

    1. Wählen Sie FileNewABAP Class.

    2. Geben Sie den Namen Ihres Pakets in das Feld Package ein. Geben Sie im Feld Name den Namen ZCL_##_ITERATE ein, wobei ## für Ihre Gruppennummer steht.

    3. Geben Sie eine Beschreibung ein.

    4. Wählen Sie im Gruppenrahmen Interfaces die Option Add.

    5. Geben Sie IF_OO_ADT_CLASSRUN ein. Wenn das Interface in der Trefferliste angezeigt wird, fügen Sie es mit Doppelklick zur Klassendefinition hinzu.

    6. Wählen Sie Next.

    7. Wählen Sie Ihren Transportauftrag aus, und wählen Sie Finish.

  2. Definieren Sie in der Methode IF_OO_ADT_CLASSRUN~MAIN eine Konstante für die Anzahl der Iterationen (Namensvorschlag: max_count) mit einem kleinen Wert, z.B. 20.

    1. Fügen Sie folgenden Code hinzu:

      Code Snippet
      123
      CONSTANTS max_count TYPE i VALUE 20.
  3. Deklarieren Sie eine einfache interne Tabelle zum Speichern der Fibonacci-Nummern (Namensvorschlag: Zahlen).

    1. Fügen Sie folgenden Code hinzu:

      Code Snippet
      123
      DATA numbers TYPE TABLE OF i.
  4. Implementieren Sie eine Iteration, die max_count mal ausgeführt wird.

    1. Fügen Sie nach den Deklarationen den folgenden Quelltext hinzu:

      Code Snippet
      12345
      DO max_count TIMES. ENDDO.
  5. Implementieren Sie innerhalb der Iteration eine Fallunterscheidung basierend auf dem eingebauten Iterationszähler: In der ersten Iteration fügen Sie der internen Tabelle numbers den Wert 0 hinzu. Fügen Sie in der zweiten Iteration den Wert 1 am Ende der internen Tabelle numbers hinzu.

    Hinweis

    Der eingebaute Iterationszähler ist das Systemfeld sy-index.
    1. Fügen Sie zwischen DO und ENDDO folgenden Code hinzu:

      Code Snippet
      12345678
      CASE sy-index. WHEN 1. APPEND 0 TO numbers. WHEN 2. APPEND 1 TO numbers. ENDCASE.
  6. Fügen Sie eine Verzweigung hinzu, die für alle anderen Werte ausgeführt wird. Berechnen Sie in dieser Verzweigung den neuen Eintrag als Summe der beiden vorherigen Einträge in numbers.

    Hinweis

    Greifen Sie über den Index sy-index - 1 und sy-index - 2 auf die vorherigen Einträge zu.
    1. Passen Sie den Quelltext wie folgt an:

      Code Snippet
      123456789101112
      CASE sy-index. WHEN 1. APPEND 0 TO numbers. WHEN 2. APPEND 1 TO numbers. WHEN OTHERS. APPEND numbers[ sy-index - 2 ] + numbers[ sy-index - 1 ] TO numbers. ENDCASE.

Aufgabe 2: Eine formatierte Ausgabe vorbereiten

Bereiten Sie in einer Schleife über der internen Tabelle eine formatierte Ausgabe vor, in der jede Fibonacci-Zahl mit der jeweiligen Folgenummer aufgeführt ist. Bereiten Sie die Ausgabe in einer anderen internen Tabelle mit dem Zeilentyp string vor.

Schritte

  1. Deklarieren Sie am Anfang der Methode if_oo_adt_classrun~main eine interne Tabelle vom Zeilentyp string (Namensvorschlag: output).

  2. Implementieren Sie eine Schleife über die interne Tabelle numbers, um die Fibonacci-Zahlen nacheinander in eine Variable number zu lesen.

    Hinweis

    Verwenden Sie eine Inline-Deklaration für number.
    1. Fügen Sie am Ende der Methode den folgenden Code hinzu:

      Code Snippet
      12345
      LOOP AT numbers INTO DATA(number). ENDLOOP.
  3. Deklarieren Sie eine Ganzzahlvariable (vorgeschlagener Name: counter), die Sie vor der Schleife auf null setzen und in jeder Iteration um 1 erhöhen.

    Hinweis

    Sie können eine Inline-Deklaration für counter verwenden.
    1. Passen Sie den Quelltext wie folgt an:

      Code Snippet
      12345678
      DATA(counter) = 0. LOOP AT numbers INTO DATA(number). counter = counter + 1. ENDLOOP.
  4. Fügen Sie in jeder Iteration der internen Tabelle output eine neue Zeile hinzu, die den Inhalt von counter (4 Zeichen breit, linksbündig), einen Doppelpunkt (:) und den Inhalt von number (10 Zeichen breit, rechtsbündig) enthält.

    Hinweis

    Verwenden Sie ein Zeichenketten-Template mit geeigneten Formatoptionen, um das Format anzupassen.
    1. Passen Sie den Quelltext wie folgt an:

      Code Snippet
      1234567891011
      DATA(counter) = 0. LOOP AT numbers INTO DATA(number). counter = counter + 1. APPEND |{ counter WIDTH = 4 ALIGN = LEFT }: { number WIDTH = 10 ALIGN = RIGHT }| TO output. ENDLOOP.

Aufgabe 3: Ausgabe und Test

Schreiben Sie das Ergebnis in die Konsole. Anschließend aktivieren und testen Sie Ihre Klasse als Konsolen-App.

Schritte

  1. Rufen Sie am Ende der Methode die Methode out->write auf, um den Inhalt von output in die Konsole zu schreiben. Geben Sie dem Importing-Parameter name eine geeignete Beschriftung.

    1. Fügen Sie nach ENDLOOP. den folgenden Code hinzu:

      Code Snippet
      123456
      out->write( data = output name = |The first { max_count } Fibonacci Numbers| ) .
  2. Aktivieren Sie die Klasse.

    1. Drücken Sie Strg + F3, um die Klasse zu aktivieren.

  3. Führen Sie Ihre Klasse als Konsolen-App aus.

    1. Drücken Sie F9, um die Klasse als Konsolen-App auszuführen.