ALV Sortieren und Summieren

Um eine Sortierung oder Summen in der ALV Ausgabe per Code zu setzen, gibt es zwei Möglichkeiten.

  1. Vorherige Definition eines Benutzerlayouts und anschließendes Setzen des Layouts im Code (siehe diesen Beitrag)
  2. Setzen der Sortierung und der Summen per Code

Hier wird beschrieben, wie die Sortierung und die Summe per Code vorbelegt werden kann. Der Benutzer kann anschließend wie gewohnt die Ausgabe verändern. Das Setzen der Sortierung erfolgt in der Methode ADD_SORT, das Setzen der Summe in der Methode ADD_AGGREGATION der Klasse Z_TEST_VIEW.

Die Methode ADD_SORT erhält neben dem ALV die zu sortierende Spalte und eine Angabe, ob Zwischensummen gebildet werden sollen. Die Methode ADD_AGGREGATION erhält neben dem ALV die zu summierende Spalte. Die Angabe der Zwischensumme in ADD_SORT hat nur Wirkung in Kombination mit einer (per Code oder vom Benutzer) hinzugefügten Summe.

Deklaration

 CLASS z_test_view DEFINITION.
   PUBLIC SECTION.

    METHODS add_sort
          IMPORTING icl_alv TYPE REF TO cl_salv_table
                    iv_columnname TYPE lvc_fname
                    iv_subtotal TYPE boolean.
 
     METHODS add_aggregation
          IMPORTING icl_alv TYPE REF TO cl_salv_table
                    iv_columnname TYPE lvc_fname.
 
 ENDCLASS.

Implementation

 
CLASS z_test_view IMPLEMENTATION.
 *---------------------------------------------------------------------*
 *        Sortierung festlegen
 *---------------------------------------------------------------------*
METHOD add_sort.
 
     DATA: lcl_sort TYPE REF TO cl_salv_sorts.
 
     IF icl_alv IS NOT INITIAL.
      TRY.
           lcl_sort = icl_al->get_sorts( ).
           lcl_sort->add_sort( columnname = iv_columnname
                               subtotal = iv_subtotal ).
 
      CATCH cx_salv_not_found
            cx_salv_existing
            cx_salv_data_error.
     ENDTRY.
     ENDIF.
   ENDMETHOD.
 
*---------------------------------------------------------------------*
*        Summe festlegen
*---------------------------------------------------------------------*
METHOD add_aggregation.
 
    DATA: lcl_aggregat TYPE REF TO cl_salv_aggregations.
 
     IF icl_alv IS NOT INITIAL.
     TRY.
           lcl_aggregat = icl_alv->get_aggregations( ). 
           lcl_aggregat->add_aggregation( columnname = iv_columnname
                                          aggregation = if_salv_c_aggregation=>total ).
 
    CATCH cx_salv_not_found
          cx_salv_existing
          cx_salv_data_error.
    ENDTRY.
  ENDIF.
  ENDMETHOD.
ENDCLASS.

Aufruf

 DATA: gcl_alv TYPE REF TO cl_salv_table,    " Objektreferenz für ALV Grid
       gcl_view type ref to z_test_view,     " Objektreferenz auf View Objekt 

...

   create OBJECT gcl_view. 

...

   " erzeugen des ALV Objekts
   cl_salv_table=>factory(
      IMPORTING
        r_salv_table = gcl_alv       " Referenz auf ALV Grid
       CHANGING
         t_table = gcl_model->gt_flights ).  " Tabelle mit Daten für Ausgabe 
...

   " Setzen der Sortierung der Spalte CARRID mit Zwischensumme
    gcl_view->add_sort( icl_alv = gcl_alv
                       iv_columnname = 'CARRID'
                       iv_subtotal = abap_true).
 
 " Setzen der Summe für den Preis
   gcl_view->add_aggregation( icl_alv = gcl_alv
                              iv_columnname = 'PRICE' ).
 " Ausgabe der Tabelle
   gcl_alv->display( ).

Ergebnis

ALV Grid mit sortierter Spalte, ohne Summen
ALV Grid mit sortierter Spalte, ohne Summen
ALV Grid mit sortierter Spalte und Gesamtsumme
ALV Grid mit sortierter Spalte und Gesamtsumme
ALV Grid mit sortierter Spalte und Zwischensumme
ALV Grid mit sortierter Spalte und Zwischensumme