Das kann ich so nicht stehen lassen... 😉a-dead-trousers hat geschrieben: ↑22.02.2023 18:26Im ALV ist das über die Sortierung und Zwischensummen gelöst. Die "Überschrift" ist dabei fix über den Feldinhalt der sortierten Spalte(n) vorgegeben und kann nicht geändert werden.
Code: Alles auswählen.
REPORT zdemo_alv_summenzeilen.
*----------------------------------------------------------------------*
* CLASS lcl_helper DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_helper DEFINITION FINAL.
PUBLIC SECTION.
TYPES:
BEGIN OF ts_data,
city TYPE string,
member TYPE string,
count TYPE i,
END OF ts_data,
tt_data TYPE STANDARD TABLE OF ts_data WITH DEFAULT KEY.
CLASS-METHODS: read_data,
display,
handle_after_user_command FOR EVENT after_user_command OF cl_gui_alv_grid,
summenzeilen_anpassen.
CLASS-DATA: mo_grid TYPE REF TO cl_gui_alv_grid,
mt_data TYPE tt_data.
ENDCLASS. "lcl_helper DEFINITION
START-OF-SELECTION.
lcl_helper=>read_data( ).
END-OF-SELECTION.
lcl_helper=>display( ).
*----------------------------------------------------------------------*
* CLASS lcl_helper IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_helper IMPLEMENTATION.
METHOD read_data.
mt_data = VALUE #( count = 1
( city = 'München' member = 'Hans' )
( city = 'Hamburg' member = 'Friedhelm' )
( city = 'Hamburg' member = 'Maria' )
( city = 'München' member = 'John' )
( city = 'Kiel' member = 'Alexandra' )
( city = 'Kiel' member = 'Wayne' )
( city = 'Dresden' member = 'Martina' )
( city = 'München' member = 'Volker ' )
( city = 'Hamburg' member = 'Sylvia' )
).
ENDMETHOD. "read_data
METHOD display.
DATA: ls_variant TYPE disvariant.
WRITE:/ 'Wenn man das hier liest, ist ein interner Fehler aufgetreten'. "#EC NOTEXT
*--------------------------------------------------------------------*
* ALV erzeugen
*--------------------------------------------------------------------*
mo_grid = NEW #( i_parent = cl_gui_container=>screen0 ).
*--------------------------------------------------------------------*
* Event AFTER_USER_COMMAND nutzbar machen
* Da sehr viele Usercommands ( auch SAP-Usercommands ) implizit einen
* full-refresh des Grid durchführen, müssen wir uns stets dahinter klemmen
* um unsere eigene Zwischensummenzeilengenerierung zu erhalten
*--------------------------------------------------------------------*
SET HANDLER handle_after_user_command FOR mo_grid.
*--------------------------------------------------------------------*
* Defaultlayouts ermöglichen, um Zwischensummen ohne Userinteraktion zu demonstrieren
*--------------------------------------------------------------------*
ls_variant-handle = '0001'.
ls_variant-report = sy-repid.
*--------------------------------------------------------------------*
* Anzeigen des grid
*--------------------------------------------------------------------*
DATA(lt_fcat) = VALUE lvc_t_fcat(
( fieldname = 'CITY' rollname = 'AD_CITY1' outputlen = 20 )
( fieldname = 'MEMBER' rollname = 'TEXT20' coltext = 'Name' outputlen = 20 )
( fieldname = 'COUNT' rollname = 'INT4' coltext = 'Counter' outputlen = 1 do_sum = abap_true )
).
DATA(lt_sort) = VALUE lvc_t_sort(
( spos = 1
fieldname = 'CITY'
up = abap_true
group = abap_true
subtot = abap_true
expa = abap_true
level = 1 )
).
mo_grid->set_table_for_first_display(
EXPORTING
is_variant = ls_variant
i_save = 'A'
i_default = 'X'
CHANGING
it_outtab = mt_data
it_fieldcatalog = lt_fcat
it_sort = lt_sort
EXCEPTIONS
OTHERS = 1 ).
*--------------------------------------------------------------------*
* Summen- oder Zwischensummenzeilen manipulieren
*--------------------------------------------------------------------*
summenzeilen_anpassen( ).
ENDMETHOD. "display
METHOD handle_after_user_command.
*--------------------------------------------------------------------*
* SAP hat evtl. noch keinen Refresh gemacht.
* Daher würden Änderungen, die in der Methode summenzeilen_anpassen
* gemacht und dann mit soft-refresh an den Grid gereicht würden im
* Nachgang durch den ausstehenden full-refresh zunichte gemacht, da
* der Grid beim full refresh auch die Summen- und Zwischensummenzeilen
* neu generiert
* Daher wird der full-refresh jetzt explizit vor unserer Anpassung
* ausgeführt und der nachfolgende soft_refresh lässt unsere
* Summenzeilen stehen.
*--------------------------------------------------------------------*
mo_grid->refresh_table_display( i_soft_refresh = ' ' ).
*--------------------------------------------------------------------*
* Summen- oder Zwischensummenzeilen manipulieren
*--------------------------------------------------------------------*
summenzeilen_anpassen( ).
ENDMETHOD. "handle_AFTER_USER_COMMAND
METHOD summenzeilen_anpassen.
DATA: lr_data_summe TYPE REF TO data,
lr_data_zwischensumme TYPE REF TO data,
lt_grouplevels TYPE lvc_t_grpl, "#EC NEEDED Normalerweise braucht man das um gezielt die Zwischensummen zu manipulieren
lv_tabix TYPE numc2.
FIELD-SYMBOLS: <lt_data> TYPE tt_data,
<ls_data> TYPE ts_data.
*--------------------------------------------------------------------*
* Zwischensummenzeilen holen -
*--------------------------------------------------------------------*
mo_grid->get_subtotals( IMPORTING
ep_collect00 = lr_data_summe " Summenzeile
ep_collect01 = lr_data_zwischensumme " Zwischensummenzeile - Stufe 1
* EP_COLLECT02 - EP_COLLECT09 Zwischensummenzeilen - Stufe 2-9
et_grouplevels = lt_grouplevels ). " Informationen welche Zwischensummenzeile(n) zu welchen Gridzeilen gehören
*--------------------------------------------------------------------*
* Hier kann das jetzt hinreichend komplex werden
* Zur Demo werde ich in alle Summen und Zwischensummen im Feld
* "CITY" etwas einfüllen
*--------------------------------------------------------------------*
IF lr_data_summe IS BOUND.
ASSIGN lr_data_summe->* TO <lt_data>.
LOOP AT <lt_data> ASSIGNING <ls_data>.
lv_tabix = sy-tabix.
<ls_data>-city = 'Total'.
<ls_data>-member = |{ <ls_data>-count } member{ cond #( when <ls_Data>-count > 1 then 's' ) }|. "#EC NOTEXT
ENDLOOP.
ENDIF.
IF lr_data_zwischensumme IS BOUND.
ASSIGN lr_data_zwischensumme->* TO <lt_data>.
LOOP AT <lt_data> ASSIGNING <ls_data>.
lv_tabix = sy-tabix.
<ls_data>-member = |{ <ls_data>-count } member{ cond #( when <ls_Data>-count > 1 then 's' ) }|. "#EC NOTEXT
ENDLOOP.
ENDIF.
*--------------------------------------------------------------------*
* ALV-Anzeige neu aufbauen lassen, ohne Zwischensummen vom ALV generieren zu lassen
*--------------------------------------------------------------------*
mo_grid->refresh_table_display( i_soft_refresh = 'X' ).
ENDMETHOD. "summenzeilen_anpassen
ENDCLASS. "lcl_helper IMPLEMENTATION
Folgende Benutzer bedankten sich beim Autor ewx für den Beitrag (Insgesamt 2):
a-dead-trousers • Lukas Sanders