ALV-Grid aus SALV ermitteln (ab Release 7.55)

In dem Beitrag ALV-Grid aus SALV ermitteln habe ich beschrieben, wie du bei einem SALV-Grid an das zugrundeliegende ALV-Grid (Klasse CL_GUI_ALV_GRID) heran kommst. Die Vorgehensweise funktioniert allerdings ab Release 7.55 nicht mehr. Deswegen hier ein Coding, das für SAP-Releases ab 7.55 funktioniert.

Danke an Stefan für den Hinweis!

Coding Hilfsklasse

CLASS access_salv DEFINITION INHERITING FROM cl_salv_model_base FINAL.
  PUBLIC SECTION.
    CLASS-METHODS get_grid_from_salv
      IMPORTING
        salv        TYPE REF TO cl_salv_table
      RETURNING
        VALUE(grid) TYPE REF TO cl_gui_alv_grid.

  PRIVATE SECTION.
    " We need to get to r_controller which is protected
    " --> access inherits from cl_salv_model_base where controller is defined.
    CLASS-METHODS get_cl_gui_alv_grid
      IMPORTING
        salv_base   TYPE REF TO cl_salv_model_base
        salv        TYPE REF TO cl_salv_table
      RETURNING
        VALUE(grid) TYPE REF TO cl_gui_alv_grid.
ENDCLASS.


CLASS access_salv IMPLEMENTATION.
  METHOD get_cl_gui_alv_grid.
    DATA adapter TYPE REF TO if_salv_table_display_adapter.

    " Adapter must be bound
    IF   salv_base->r_controller IS NOT BOUND
      OR salv_base->r_controller->r_adapter IS NOT BOUND.
      MESSAGE 'programming error: Call GET_GRID_FROM_SALV after SALV->DISPLAY( )!'
         TYPE 'S' DISPLAY LIKE 'W'.
      salv->display( ).
    ENDIF.
    IF   salv_base->r_controller IS NOT BOUND
      OR salv_base->r_controller->r_adapter IS NOT BOUND.
      RETURN.  " Still not bound  --> can't do anything
    ENDIF.

    " Get grid
    TRY.
        IF salv_base->r_controller->r_adapter
           IS INSTANCE OF if_salv_table_display_adapter.
          grid = CAST if_salv_table_display_adapter(
                   salv_base->r_controller->r_adapter )->get_grid( ).
        ENDIF.
      CATCH cx_root ##CATCH_ALL.
        RETURN.
    ENDTRY.
  ENDMETHOD.

  METHOD get_grid_from_salv.

    DATA extended_grid_api TYPE REF TO cl_salv_gui_om_table_info.

    " Must be bound
    IF salv IS NOT BOUND.
      RETURN.
    ENDIF.

    " Get extended API
    " Comment to API: Restricted Use (maintained dev.packages) of extended Grid API
    extended_grid_api ?= salv->if_salv_gui_om_table_info~extended_grid_api( ).
    grid = access_salv=>get_cl_gui_alv_grid(
      salv      = salv
      salv_base = extended_grid_api ).

  ENDMETHOD.
ENDCLASS.

Coding Verwendung

In folgendem Beispiel erzeuge ich ein SALV-Grid und zeige es auf dem Selektionsbildschirm an. Mit der oben genannten Hilfsklasse ermittele ich die CL_GUI_ALV_GRID-Instanz zum SALV und setze mit dieser Instanz zwei Zeilenmarkierungen.

Damit der Report funktioniert, musst du die oben gezeigte Klasse lokal in den Report einbinden, oder du definierst die Hilfsklasse global im Kundennamensraum – was sinnvoll wäre, um sie systemweit nutzen zu können – und musst dann natürlich den Aufruf anpassen.

REPORT.

PARAMETERS test.

INITIALIZATION.

  SELECT * FROM t006a INTO TABLE @DATA(demo_data)
   UP TO 20 ROWS
   WHERE spras = @sy-langu.

  TRY.
      cl_salv_table=>factory(
        EXPORTING
          r_container  = NEW cl_gui_docking_container( 
              ratio = 50 side = cl_gui_docking_container=>dock_at_right )
        IMPORTING
          r_salv_table = DATA(demo_salv)
        CHANGING
          t_table      = demo_data ).
      demo_salv->display( ).
    CATCH cx_salv_msg. " ALV: General Error Class with Message
  ENDTRY.

  "access grid
  DATA(grid) = access_salv=>get_grid_from_salv( demo_salv ).
  "use grid
  grid->set_selected_rows(
    it_row_no = VALUE #(
      ( row_id = 2 )
      ( row_id = 4 ) ) ).
Enno Wulff