
ABAP - Step
Heute einmal ein neuer Zusatz für die Schleifen und wie du ihn verwenden kannst. Mit Step hast du die Möglichkeiten Schritte in einer Schleife zu überspringen.
Inhaltsverzeichnis
Heute mal eine Erweiterung von verschiedenen Ausdrücken in ABAP um eine Schrittgröße und Reihenfolge zu beeinflussen. Step gilt nicht nur für ein Statement, sondern funktioniert nun mittlerweile für mehrere Ausdrücke in ABAP. In diesem Artikel werden wir auf einige Regeln eingehen. Die neuen Statements sind ab ABAP 7.56 möglich oder S/4 HANA 2021.
Vorbereitung
Für unsere Beispiele befüllen wir noch entsprechend Tabellen und bereiten die Daten vor, um sie in den Beispielen nutzen zu können. Dabei befüllen wir die Tabelle mit einer einfachen DO Schleife mit den Zahlen 1 bis 20.
DO 20 TIMES.
INSERT sy-index INTO TABLE mt_data.
ENDDO.
Loop
Im Artikel werden wir vor allem auf die einfache Schleife mit LOOP eingehen, da es hier einige Besonderheiten zu beachten gilt. Wird der STEP nicht angegeben bei einem Loop, dann steht dieser auf 1 als Standardwert, das heißt wir Loopen nach vorn mit einer Schrittlänge von 1. Der Step kann niemals auf 0 stehen, da dies keinen Sinn machen würde und der Compiler dies sofort als Fehler ausgeben würde.
Vorwärts
Geben wir nun einen positiven Wert von 2 an und geben in der Schleife die Zahlen aus, die in der Schleife verarbeitet werden:
io_out->write( 'Loop with Step 2' ).
LOOP AT mt_data INTO DATA(ld_data) STEP 2.
io_out->write( |{ ld_data }| ).
ENDLOOP.
Die Ausgabe der Schleife sieht nun wie folgt aus:
Rückwärts
Im nächsten Loop geben wir nun einen negative Schrittweite von -3 an und geben das Ergebnis wieder in die Console aus:
io_out->write( 'Loop with Step -3' ).
LOOP AT mt_data INTO DATA(ld_data) STEP -3.
io_out->write( |{ ld_data }| ).
ENDLOOP.
Die Consolenausgabe sieht nun wie folgt aus, dabei beginnt der Loop mit dem ersten Eintrag von hinten:
WHERE
Im nächsten Schritt kombinieren wir den Step mit der Where Bedingung beim Loop. Dabei kann hier nur ein Step von 1 oder -1 angegeben werden, etwas anderes führt beim Compiler zu einer Fehlermeldung. Entsprechend würden wir über das eingegrenzte Ergebnis, entweder vorwärts oder rückwärts iterieren.
io_out->write( 'Loop with Where' ).
LOOP AT mt_data INTO DATA(ld_data) STEP -1 WHERE table_line >= 10 AND table_line <= 15.
io_out->write( |{ ld_data }| ).
ENDLOOP.
Das Ergebnis nach Abgrenzung und Loop sieht nun wie folgt aus:
FROM/TO
Das letzte Beispiel bezieht sich auf die Abgrenzung über den Index mit FROM und TO. Dabei ist zu beachten, wenn ein Bereich mit beiden Statements abgegrenzt wird, dass die Reihenfolge von/bis sich ändert, wenn eine negative Schrittweite verwendet wird. Im folgenden Beispiel beginnen wir bei 5 und gehen rückwärts bis 1 (nicht angegeben).
io_out->write( 'Loop with From/To' ).
LOOP AT mt_data INTO DATA(ld_data) FROM 5 STEP -2.
io_out->write( |{ ld_data }| ).
ENDLOOP.
Dazu noch das entsprechende Ergebnis der Console nach dem Loop:
Vollständiges Beispiel
An dieser Stelle noch einmal das vollständige Beispiel in Form einer ausführbaren Klasse zum Kopieren oder Lesen:
CLASS zcl_bs_demo_loop_step DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES if_oo_adt_classrun.
TYPES:
tt_int TYPE STANDARD TABLE OF i WITH EMPTY KEY.
DATA:
mt_data TYPE tt_int.
PROTECTED SECTION.
PRIVATE SECTION.
METHODS:
prepare_table_with_data,
loop_forward
IMPORTING
io_out TYPE REF TO if_oo_adt_classrun_out,
loop_backward
IMPORTING
io_out TYPE REF TO if_oo_adt_classrun_out,
loop_with_where
IMPORTING
io_out TYPE REF TO if_oo_adt_classrun_out,
loop_with_from_to
IMPORTING
io_out TYPE REF TO if_oo_adt_classrun_out.
ENDCLASS.
CLASS zcl_bs_demo_loop_step IMPLEMENTATION.
METHOD if_oo_adt_classrun~main.
prepare_table_with_data( ).
loop_forward( out ).
out->write( '*****' ).
loop_backward( out ).
out->write( '*****' ).
loop_with_where( out ).
out->write( '*****' ).
loop_with_from_to( out ).
out->write( '*****' ).
ENDMETHOD.
METHOD prepare_table_with_data.
DO 20 TIMES.
INSERT sy-index INTO TABLE mt_data.
ENDDO.
ENDMETHOD.
METHOD loop_forward.
io_out->write( 'Loop with Step 2' ).
LOOP AT mt_data INTO DATA(ld_data) STEP 2.
io_out->write( |{ ld_data }| ).
ENDLOOP.
ENDMETHOD.
METHOD loop_backward.
io_out->write( 'Loop with Step -3' ).
LOOP AT mt_data INTO DATA(ld_data) STEP -3.
io_out->write( |{ ld_data }| ).
ENDLOOP.
ENDMETHOD.
METHOD loop_with_where.
io_out->write( 'Loop with Where' ).
LOOP AT mt_data INTO DATA(ld_data) STEP -1 WHERE table_line >= 10 AND table_line <= 15.
io_out->write( |{ ld_data }| ).
ENDLOOP.
ENDMETHOD.
METHOD loop_with_from_to.
io_out->write( 'Loop with From/To' ).
LOOP AT mt_data INTO DATA(ld_data) FROM 5 STEP -2.
io_out->write( |{ ld_data }| ).
ENDLOOP.
ENDMETHOD.
ENDCLASS.
Fazit
Inwieweit die neue Erweiterung der Ausdrücke Sinn macht, darüber kann man sich sicherlich streiten. Doch am Ende erhalten wir weiter Möglichkeiten, die es auch schon in anderen Sprachen gibt und es erweitert das Spektrum in der Sprache ABAP.