Mehrere ALV Grid ausgeben

Anforderung

Es sollen auf einem Dynpro mehrere ALV ausgegeben werden. Die Grids sollen sich automatisch an die Fenstergröße anpassen.

Dies gelingt nur, wenn keine Custom Container verwendet werden. Auf der folgenden Seite wird eine schlanke Lösung vorgestellt. Es werden zwei ALV Grids untereinander ausgegeben. Das Beispiel beschreibt nur die erforderlichen Komponenten und Vorgehensweise. Es stellt keine vollständige Implementation dar. Es fehlen die Programmteile zur Datenbeschaffung (GO_MODEL) sowie zum Aufruf und verarbeiten des Dynpros. Die Programmteile müssen entsprechend angepasst/ergänzt werden.

Umsetzung

Dynpro

Um mehrere ALV Grids ausgeben zu können, wird immer ein Dynpro benötigt. Es müssen keine Elemente auf dem Dynpro definiert werden, es muss lediglich existieren:

Dynpro Definition mehrere ALV auf einem Dynpro
Dynpro Definition mehrere ALV auf einem Dynpro

multi_alv2

View Klasse

Für die Anzeige der Grids verwende ich im Beispiel das MVC Design Pattern. Es gibt eine Klasse lcl_view, welche die Anzeige der Grids, deren Events usw übernimmt. Die Grids werden als Attribute go_alv1 und go_alv2 in der Klasse definiert.

Die Methode DISPLAY der Klasse LCL_VIEW dient zur Ausgabe der Daten

CLASS lcl_view DEFINITION.
  PUBLIC SECTION.
    METHODS constructor importing io_model type zc_model.

    METHODS display.

  PRIVATE SECTION.

    DATA: go_alv1  TYPE REF TO cl_salv_table,
          go_alv2  TYPE REF TO cl_salv_table,
          go_model TYPE REF TO zc_model.

ENDCLASS.               "lcl_m42_view 

CLASS lcl_m42_view IMPLEMENTATION.

  METHOD constructor.

    go_model = io_model.

  ENDMETHOD. 

*&-------------------------------------------------------*
*        Ausgabe der Daten
*--------------------------------------------------------*
  METHOD display.

    DATA: lcx_root    TYPE REF TO cx_root,
          lo_splitter TYPE REF TO cl_gui_splitter_container,
          lo_alv1_container TYPE REF TO cl_gui_container,
          lo_alv2_container TYPE REF TO cl_gui_container.

    TRY.
        CREATE OBJECT lo_splitter
          EXPORTING
            parent  = cl_gui_custom_container=>default_screen
            rows    = 2
            columns = 1.

        lo_alv1_container = lo_splitter->get_container(
           EXPORTING row = 1
                     column = 1
           ).

        lo_alv2_container = lo_splitter->get_container(
       EXPORTING row = 2
                 column = 1
       ).

        cl_salv_table=>factory(
           EXPORTING r_container = lo_alv1_container
           IMPORTING
             r_salv_table = go_alv1
           CHANGING
             t_table = go_model->gt_table1 ).

        cl_salv_table=>factory(
        EXPORTING r_container = lo_alv2_container
           IMPORTING
             r_salv_table = go_alv2
           CHANGING
             t_table = go_model->gt_table2 ).

      CATCH cx_salv_msg INTO lcx_root.
        MESSAGE lcx_root TYPE 'E'.
    ENDTRY.

      go_alv1->display( ).
      go_alv2->display( ).

  ENDMETHOD. 



ENDCLASS.

PBO Modul STATUS_0100

MODULE status_0100 OUTPUT.
   SET PF-STATUS 'STATUS_0100'.
*  SET TITLEBAR 'xxx'.

  go_view->display( ). " Instanz von LCL_VIEW

ENDMODULE.

Ergebnis

Zwei ALV auf einem Dynpro
Zwei ALV auf einem Dynpro