Lerne und übe ABAP mit wichtigen Aggregat-Funktionen auf interne Tabellen. Interne Tabellen sind wichtige ABAP-Objekte in der Programmiersprache ABAP. Es gibt 40 geniale ABAP Übungen auf exercism. In diesem Artikel möchte ich Dir gerne die ABAP-Übung „ITAB Aggregation“ vorstellen. Du kannst diese Übung in Deinem SAP-System ausprobieren oder Dich kostenlos auf der Plattform anmelden und die Übung absolvieren. Weitere Informationen zu internen Tabellen findest Du auf help.sap.com.
Aufgabenstellung
Lerne, wie man Daten innerhalb einer internen ABAP-Tabelle aggregiert und gruppiert.
Deine Klasse erhält eine interne Tabelle namens initial_numbers. Sie hat zwei Spalten: GROUP und NUMBER.
TYPES: BEGIN OF initial_numbers_type, group TYPE group, number TYPE i, END OF initial_numbers_type, initial_numbers TYPE STANDARD TABLE OF initial_numbers_type WITH EMPTY KEY.
Die Daten in dieser Tabelle bestehen aus drei Gruppen – A, B und C. Es gibt mehrere Datensätze in jeder Gruppe.
Gruppe | Nummer |
---|---|
A | 10 |
B | 5 |
A | 6 |
C | 22 |
A | 13 |
C | 500 |
Deine Aufgabe ist es, eine interne Tabelle mit einem Datensatz pro Gruppe zu erstellen. Dieser Satz soll die Anzahl der Sätze in der Originaltabelle pro Gruppe (COUNT), die Summe aller NUMBER-Werte in dieser Gruppe (SUM), den Minimalwert in der Gruppe (MIN), den Maximalwert in der Gruppe (MAX) und den Durchschnitt aller Werte in dieser Gruppe (AVERAGE) enthalten.
Die Tabelle der erwarteten Rendite hat die folgende Definition:
TYPES: BEGIN OF aggregated_data_type, group TYPE group, count TYPE i, sum TYPE i, min TYPE i, max TYPE i, average TYPE f, END OF aggregated_data_type, aggregated_data TYPE STANDARD TABLE OF aggregated_data_Type WITH EMPTY KEY.
Es gibt viele Möglichkeiten, diese Aufgabe in ABAP zu lösen. Wie effizient kannst Du diese Aufgabe lösen? Kannst Du dies tun, indem Du jeden Datensatz in der Tabelle nur einmal liest?
Beispiel Programmierung
CLASS zcl_itab_aggregation DEFINITION PUBLIC FINAL CREATE PUBLIC . PUBLIC SECTION. TYPES group TYPE c LENGTH 1. TYPES: BEGIN OF initial_numbers_type, group TYPE group, number TYPE i, END OF initial_numbers_type, initial_numbers TYPE STANDARD TABLE OF initial_numbers_type WITH EMPTY KEY. TYPES: BEGIN OF aggregated_data_type, group TYPE group, count TYPE i, sum TYPE i, min TYPE i, max TYPE i, average TYPE f, END OF aggregated_data_type, aggregated_data TYPE STANDARD TABLE OF aggregated_data_type WITH EMPTY KEY. METHODS perform_aggregation IMPORTING initial_numbers TYPE initial_numbers RETURNING VALUE(aggregated_data) TYPE aggregated_data. PROTECTED SECTION. PRIVATE SECTION. ENDCLASS. CLASS zcl_itab_aggregation IMPLEMENTATION. METHOD perform_aggregation. " add solution here DATA: lt_init TYPE initial_numbers, ls_aggr TYPE aggregated_data_type, lv_group TYPE group, lv_count TYPE i, lv_sum TYPE i, lv_min TYPE i, lv_max TYPE i. lt_init = initial_numbers. IF NOT lines( lt_init ). RETURN. ENDIF. SORT lt_init BY group. LOOP AT lt_init ASSIGNING FIELD-SYMBOL(<fs>). IF lv_group NE <fs>-group. CLEAR: lv_count, lv_sum, lv_max, lv_min, ls_aggr. ENDIF. lv_group = <fs>-group. lv_count = lv_count + 1. lv_sum = lv_sum + <fs>-number. IF lv_max IS INITIAL OR <fs>-number GT lv_max. lv_max = <fs>-number. ENDIF. IF lv_min IS INITIAL OR <fs>-number LT lv_min. lv_min = <fs>-number. ENDIF. ls_aggr-group = lv_group. ls_aggr-count = lv_count. ls_aggr-sum = lv_sum. ls_aggr-max = lv_max. ls_aggr-min = lv_min. ls_aggr-average = lv_sum / lv_count. IF lv_count NE 1. DELETE aggregated_data WHERE group EQ lv_group. ENDIF. APPEND ls_aggr TO aggregated_data. ENDLOOP. ENDMETHOD. ENDCLASS.
Erklärung
Dieses Beispiel implementiert die Aggregationsfunktionalität. Die Methode perform_aggregation importiert eine Tabelle „initial_numbers“ und gibt eine Tabelle „aggregated_data“ zurück. In der Methode wird eine sortierte Schleife verwendet, um die Eingabetabelle zu durchlaufen, eine Variable „lv_group“ zu verfolgen, um festzustellen, ob sich die Gruppe geändert hat, und die Aggregationsdaten (Anzahl, Summe, Minimum, Maximum) zu berechnen. Die berechneten Aggregatdaten werden in der Tabelle „aggregated_data“ gespeichert und zurückgegeben.
Über den Autor
Mein Name ist Andreas Geiger und ich bin ein erfahrener Senior SAP Berater. Mit mehr als 10 Jahren Berufserfahrung habe ich mehrere SAP-Projekte erfolgreich abgeschlossen und umfangreiche Kenntnisse in verschiedenen Bereichen wie SAP FI, SAP MM und ABAP erworben. Nun möchte ich mein Wissen mit Dir teilen, um Dir einen Mehrwert zu bieten und Dich bei Deiner täglichen Arbeit mit dem SAP-System zu unterstützen.
ERP UP unterstützen
Wenn Du mit ERP UP zufrieden bist, kannst Du mich gerne unterstützen. Dabei gibt es unzählige Möglichkeiten, wie Du mich einfach und schnell unterstützen kannst. Wie Du genau ERP UP unterstützen kannst, erfährst Du hier. Vielen Dank.
Wäre es nicht performanter, innerhalb der Tabelle die Gruppenstufenverarbeitung zu benutzen?
Also
LOOP AT lt_init ASSIGNING FIELD-SYMBOL().
lv_count = lv_count + 1.
lv_sum = lv_sum + -number.
IF lv_max IS INITIAL OR -number GT lv_max.
lv_max = -number.
ENDIF.
IF lv_min IS INITIAL OR -number LT lv_min.
lv_min = -number.
ENDIF.
ls_aggr-group = -group “ changed
ls_aggr-count = lv_count.
ls_aggr-sum = lv_sum.
ls_aggr-max = lv_max.
ls_aggr-min = lv_min.
ls_aggr-average = lv_sum / lv_count.
at last group.
APPEND ls_aggr TO aggregated_data.
CLEAR: lv_count, lv_sum, lv_max, lv_min, ls_aggr.
endat.
ENDLOOP.
Siehe auch https://help.sap.com/doc/abapdocu_751_index_htm/7.51/de-DE/abapat_itab.htm#!ABAP_ADDITION_3@3@
Ansonsten weiter so! Wenn es das Blog vor 23 Jahren gegeben hätte, hätte ich da viel gelernt 🙂
LG, Mathias Gloss
Hallo Mathias,
vielen Dank für Deine Nachricht und Dein Lob. Das freut mich sehr 🙂
Sehr guter Punkt. Hier gibt es mehrere Lösungen. Aber Dein Vorschlag ist eine peformante Lösung 🙂
Viele Grüße
Andreas