Lerne und übe ABAP – Interne Tabelle Aggregation

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.

GruppeNummer
A10
B5
A6
C22
A13
C500

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

Andreas Geiger

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.

Mehr zu ERP UP

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.

2 Gedanken zu „Lerne und übe ABAP – Interne Tabelle Aggregation“

  1. 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

    Antworten
    • 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

      Antworten

Schreibe einen Kommentar