Ergebnis: Sie wird nicht gerufen. Wie gehe ich (in Kurzform) vor?a-dead-trousers hat geschrieben:Ja, aber der SALV verwendet für die Anzeige intern ein CL_GUI_ALV_GRID.
Du sollst (per Debugger) prüfen ob die besagte Methode aufgerufen wird oder nicht. Da steckt nämlich das Umsetzen der internen auf die externen Indizes drinnen.
Code: Alles auswählen.
DATA: h_grid TYPE REF TO cl_gui_alv_grid.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = h_grid.
h_grid->check_changed_data( ).
Code: Alles auswählen.
REPORT z_test_salv.
*----------------------------------------------------------------------*
* CLASS lcl_event DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_handler DEFINITION.
PUBLIC SECTION.
METHODS on_event FOR EVENT added_function OF cl_salv_events_table
IMPORTING e_salv_function.
ENDCLASS. "lcl_event DEFINITION
DATA:
ok_code TYPE syucomm,
lr_table TYPE REF TO cl_salv_table,
lr_handler TYPE REF TO lcl_handler,
lr_event TYPE REF TO cl_salv_events_table,
lr_container TYPE REF TO cl_gui_custom_container,
lt_data TYPE flighttab.
SELECT *
FROM sflight
INTO TABLE lt_data.
CALL SCREEN 9000.
*----------------------------------------------------------------------*
* CLASS lcl_event IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_handler IMPLEMENTATION.
METHOD on_event.
DATA:
lt_selected TYPE salv_t_row,
ld_selected TYPE i,
lr_selection TYPE REF TO cl_salv_selections.
lr_selection = lr_table->get_selections( ).
lt_selected = lr_selection->get_selected_rows( ).
* ld_selected = lr_selection->get_selected_row( ).
BREAK-POINT.
ENDMETHOD. "on_event
ENDCLASS. "lcl_event IMPLEMENTATION
*&---------------------------------------------------------------------*
*& Module STATUS_9000 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE status_9000 OUTPUT.
SET PF-STATUS 'TEST'.
SET TITLEBAR 'TEST'.
IF lr_table IS NOT BOUND.
CREATE OBJECT lr_container
EXPORTING
container_name = 'CC_GRID'
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
create_error = 3
lifetime_error = 4
lifetime_dynpro_dynpro_link = 5
OTHERS = 6.
cl_salv_table=>factory( EXPORTING r_container = lr_container
IMPORTING r_salv_table = lr_table
CHANGING t_table = lt_data ).
lr_table->get_functions( )->set_default( ).
lr_table->get_functions( )->set_detail( ).
lr_table->get_functions( )->add_function( name = 'TEST' text = 'Test' tooltip = 'Testfunktion' position = 1 ).
lr_event = lr_table->get_event( ).
CREATE OBJECT lr_handler.
SET HANDLER lr_handler->on_event FOR lr_event.
lr_table->display( ).
ENDIF.
ENDMODULE. " STATUS_9000 OUTPUT
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_9000 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_9000 INPUT.
CASE ok_code.
WHEN 'CANC'.
LEAVE PROGRAM.
ENDCASE.
ENDMODULE. " USER_COMMAND_9000 INPUT
Ich habe einen eigenen Status definiert, der bei der ALV-Anzeige aktiv ist (mit set_screen_status). Der Button, den ich verwende, ist der Sichern-Button. Den REFRESH mit FULL habe ich .uch gerade probiert, der hilft auch nicht. get_metadata auch nicht. Ich bin ziemlich ratlos, was ich sonst noch versuchen könnte.black_adept hat geschrieben:Fullscreen! Das nervige Feature am CL_SALV_TABLE, weil der sich in zig Sachen anders verhält als im Container.
Aber ok - da du den Fullscreen verwendest - wie hast du denn da die Extrabuttons hinzugefügt? ADTs Methode sollte da gar nicht untertützt werden.
Grundsätzlich - wenn die Funktionen nicht vom SALV selber getriggert werden ( wie die durch ADD_FUNCTION hinzugefügten Teile ) muss man sich beim SALV um vieles selber kümmern.
Das "GET_METADATA" hast du ja schon gefunden.
Was mir momentan einfällt woran es liegen könnte ist, dass du den Sync intern/extern noch mit dem SALV->REFRESH durchführen solltest. Und beim "Refresh" mal die "Full"-Variante verwenden statt der (Default) "Soft"-Variante