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.