Code-Generator für ALV-Anzeige Empfehlung

  • Mittwoch, 29. März 2017 12:13
Artikel bewerten
(2 Stimmen)

Hallo zusammen,

Wer kennt es nicht das Problem. Ich habe eine interne Tabelle und möchte diese gerne auf einfache Weise darstellen.
Am besten sollte die Selektion im ALV Grid möglich sein und ich jederzeit Zugriff für die selektierten Zeilen haben.
In diesem Beitrag möchte ich euch eine Alternative zum klassischen Funktionsbaustein "REUSE_ALV_GRID_DISPLAY_LVC" vorstellen.

Der Funktionsbaustein bietet natürlich eine Hand voll an Möglichkeiten. Für meine Verhältnisse jedoch viel zu übertrieben/mächtig. Ich habe mich nun immer mehr mit dem SALV Framework von SAP auseinandergesetzt und die Resultate hieraus können sich sehen lassen. :-) Im folgenden werde ich euch zeigen, wie ihr in nur wenigen Schritten eine interne Tabelle normal oder als popup anzeigen lassen könnt. Diese Tabelle ist selektionsfähig (einzeln oder mehrfach). Mit nur einem Methodenaufruf könnt ihr die selektierten Zeilen ermitteln.

Let´s go. ;-)

Anzeige als Popup

 REPORT z_salv_easy.
DATA mo_alv TYPE REF TO cl_salv_table.
DATA lr_message TYPE REF TO cx_salv_msg.
DATA lt_flight_schedule TYPE STANDARD TABLE OF spfli.
DATA lt_selected_rows TYPE salv_t_row.

*== get test data
SELECT * FROM spfli INTO TABLE lt_flight_schedule UP TO 100 ROWS.
*== create ALV
TRY.
    cl_salv_table=>factory(
    IMPORTING
      r_salv_table = mo_alv
    CHANGING
      t_table      = lt_flight_schedule ).
*-- set some options
    mo_alv->get_selections( )->set_selection_mode(
        value = if_salv_c_selection_mode=>multiple
    ).
*-- show as popup
    mo_alv->set_screen_popup(
      EXPORTING
        start_column = 5
        end_column   = 100
        start_line   = 1
        end_line     = 15
    ).
*-- display alv
    mo_alv->display( ).
*-- next steps after user command: CONTINUE     
    lt_selected_rows = mo_alv->get_selections( )->get_selected_rows( ).    
  CATCH cx_salv_msg INTO lr_message.
    " error handling
ENDTRY.

Anzeige im Fullscreen

Hier gilt es zu beachten, dass SAP leider nicht von Haus aus den UC "CONTINUE" zur Verfügung stellt. Ist aber auch kein Problem. Einfach nur den existierenden GUI Status "SALV_TABLE_STANDARD" von der Funktionsgruppe "SALV_METADATA_STATUS" kopieren. Das Ziel sollte bestenfalls euer Report sein.

 
 

Anschließend dem SALV Objekt nur noch den neuen GUI Status bekannt geben. Hierbei bitte beachten, dass ihr bei den Variablen report und pfstatus euren Report und GUI Status verwendet.

 *-- set your own gui status
      mo_alv->set_screen_status(
            EXPORTING
              report        = 'YSO5_SALV_GUI_STATUS'    " ABAP-Programm, aktuelles Rahmenprogramm
              pfstatus      = 'STANDARD_SAP'    " Bildschirmbilder, aktueller GUI-Status
          ).

Nun haben wir im Fullscreen einen funktionierenden "CONTINUE" Button. Damit jedoch diese Funktion ausgelöst werden kann, benötigen wir hierfür ein Event Handling. Keine Angst. Es ist nicht wirklich komplex...keep it simple.. :-)

 *== Class implementation
CLASS lcl_event_handler DEFINITION.
  PUBLIC SECTION.
    METHODS:
      on_user_command FOR EVENT added_function OF cl_salv_events
        IMPORTING e_salv_function.
ENDCLASS.
CLASS lcl_event_handler IMPLEMENTATION.
  METHOD on_user_command.
*== do some action {...
    "...}
    CASE e_salv_function.
      WHEN 'CONTINUE'.
        DATA(lt_selected_rows_uc) = mo_alv->get_selections( )->get_selected_rows( ).
        mo_alv->close_screen( ).
      WHEN 'BACK'.
        mo_alv->close_screen( ).
      WHEN 'EXIT'.
        mo_alv->close_screen( ).
      WHEN 'CANC' OR 'CANCEL'.
        mo_alv->close_screen( ).
    ENDCASE.
  ENDMETHOD.
ENDCLASS.

Nun können wir den Event Handler erzeugen und das Event on_user_command für unser SALV Objekt registrieren.

 *== Handle events
*-- create a new instance of lcl_event_handler
      DATA(oref_event_handler) = NEW lcl_event_handler( ).
      DATA(lr_events) = mo_alv->get_event( ).
      SET HANDLER oref_event_handler->on_user_command FOR lr_events.

Ihr könnt nun euer eigenes Event Handling ausprogrammieren, oder einfach nur im Event das SALV schließen und dann weiter mit eurer Logik weiterarbeiten. Anbei der vollständige Sourcecode.

 REPORT z_salv_easy.
CLASS lcl_event_handler DEFINITION DEFERRED.
DATA mo_alv TYPE REF TO cl_salv_table.
DATA lr_message TYPE REF TO cx_salv_msg.
DATA lt_flight_schedule TYPE STANDARD TABLE OF spfli.

*== Class implementation
CLASS lcl_event_handler DEFINITION.
  PUBLIC SECTION.
    METHODS:
      on_user_command FOR EVENT added_function OF cl_salv_events
        IMPORTING e_salv_function.
ENDCLASS.
CLASS lcl_event_handler IMPLEMENTATION.
  METHOD on_user_command.
*== do some action {...
    "...}
    CASE e_salv_function.
      WHEN 'CONTINUE'.
        DATA(lt_selected_rows_uc) = mo_alv->get_selections( )->get_selected_rows( ).
        mo_alv->close_screen( ).
      WHEN 'BACK'.
        mo_alv->close_screen( ).
      WHEN 'EXIT'.
        mo_alv->close_screen( ).
      WHEN 'CANC' OR 'CANCEL'.
        mo_alv->close_screen( ).
    ENDCASE.
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
*== get test data
  SELECT * FROM spfli INTO TABLE lt_flight_schedule UP TO 100 ROWS.

END-OF-SELECTION.
*== create ALV
  TRY.
      cl_salv_table=>factory(
      IMPORTING
        r_salv_table = mo_alv
      CHANGING
        t_table      = lt_flight_schedule ).
*-- set selection mode
      mo_alv->get_selections( )->set_selection_mode(
          value = if_salv_c_selection_mode=>multiple
      ).
*-- set your own gui status
      mo_alv->set_screen_status(
            EXPORTING
              report        = 'YSO5_SALV_GUI_STATUS'    " ABAP-Programm, aktuelles Rahmenprogramm
              pfstatus      = 'STANDARD_SAP'    " Bildschirmbilder, aktueller GUI-Status
          ).
*== Handle events
*-- create a new instance of lcl_event_handler
      DATA(oref_event_handler) = NEW lcl_event_handler( ).
      DATA(lr_events) = mo_alv->get_event( ).
      SET HANDLER oref_event_handler->on_user_command FOR lr_events.
*== display alv
      mo_alv->display( ).
*== next steps after closing the SALV @ user command
*-- get selected rows
      DATA(lt_selected_rows) = mo_alv->get_selections( )->get_selected_rows( ).

    CATCH cx_salv_msg INTO lr_message.
      " error handling
  ENDTRY.

Ich denke es kommt immer auf den bestimmten Anwendungsfall drauf an. Aber ich denke ich konnte euch zeigen, wie einfach es ist, ein ALV mit Hilfe des SALV Framworks zu generieren.

Solltet ihr irgendwelche Fragen haben, so lasst es mich über die Kommentar Funktion wissen.

 
In diesem Sinne

Blogging is a conversation, not a code.

Letzte Änderung am %PM, %29. %654 %2017 %14:%Mär
Kommentare einblenden

Copyright © 2017 ABAP-Workbench.de