Sie sind auf Seite 1von 4

I also tried this workaround, but it is still quite complicated...

there is another way to get acces to this functionality,


by using function module GET_GLOBALS_FROM_SLVC_FULLSCR
to get the reference to CL_GUI_ALV_GRID

In this example you just have to enter in the command field:


%_EDIT_ALL - to set the whole ALV editable
or
%_EDIT_[FIELDNAME] - to set only one column editable

in addition i added a check, so this is only available on NON-productive systems

*&---------------------------------------------------------------------*
*& Report ZTEST_ALV_EDITABLE
*&
*&---------------------------------------------------------------------*
REPORT ztest_alv_editable.
*----------------------------------------------------------------------*
*
CLASS lcl_event_handler DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_event_handler DEFINITION.
PUBLIC SECTION.
METHODS:
on_user_command
FOR EVENT added_function OF cl_salv_events
IMPORTING e_salv_function,
handle_data_changed
FOR EVENT data_changed OF cl_gui_alv_grid
IMPORTING er_data_changed sender.
ENDCLASS.

"lcl_event_handler DEFINITION

*----------------------------------------------------------------------*
*
CLASS lcl_report DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_report DEFINITION.
PUBLIC SECTION.
DATA: gt_tab TYPE REF TO data,

gr_alv TYPE REF TO cl_salv_table.


METHODS: constructor,
show_alv.
ENDCLASS.

"lcl_report DEFINITION

PARAMETERS: p_table TYPE tabname.


DATA: lr_report TYPE REF TO lcl_report.
START-OF-SELECTION.
CREATE OBJECT lr_report.
lr_report->show_alv( ).
*----------------------------------------------------------------------*
*
CLASS lcl_report IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_report IMPLEMENTATION.
METHOD constructor.
FIELD-SYMBOLS: <lt_tab> TYPE ANY TABLE.
CREATE DATA gt_tab TYPE TABLE OF (p_table).
ASSIGN gt_tab->* TO <lt_tab>.
SELECT * FROM (p_table) INTO TABLE <lt_tab>.
ENDMETHOD.

"constructor

METHOD show_alv.
DATA: lr_func TYPE REF TO cl_salv_functions_list,
lr_events
TYPE REF TO cl_salv_events_table,
lr_handler TYPE REF TO lcl_event_handler.
FIELD-SYMBOLS: <lt_tab> TYPE ANY TABLE.
ASSIGN gt_tab->* TO <lt_tab>.
TRY.
cl_salv_table=>factory(
IMPORTING
r_salv_table = gr_alv
CHANGING
t_table
= <lt_tab> ).
CATCH cx_salv_msg.
ENDTRY.
lr_func = gr_alv->get_functions( ).
lr_func->set_all( 'X' ).
lr_events = gr_alv->get_event( ).
CREATE OBJECT lr_handler.
SET HANDLER lr_handler->on_user_command FOR lr_events.
gr_alv->display( ).

ENDMETHOD.

"show_alv

ENDCLASS.

"lcl_report IMPLEMENTATION

*----------------------------------------------------------------------*
*
CLASS lcl_event_handler IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_event_handler IMPLEMENTATION.
METHOD on_user_command.
DATA: lr_grid
lv_layout
lt_fieldcat
lr_grid_events
lv_fieldname

TYPE
TYPE
TYPE
TYPE
TYPE

REF TO cl_gui_alv_grid,
lvc_s_layo,
lvc_t_fcat,
REF TO lcl_event_handler,
lvc_fname.

FIELD-SYMBOLS: <ls_fieldcat> LIKE LINE OF lt_fieldcat.


CALL FUNCTION 'PRGN_CHECK_SYSTEM_PRODUCTIVE'
EXCEPTIONS
client_is_productive = 1
OTHERS
= 2.
IF sy-subrc NE 1.
IF e_salv_function(7) EQ '%_EDIT_'.
IF e_salv_function NE '%_EDIT_ALL'.
lv_fieldname = e_salv_function+7.
ELSE.
CLEAR lv_fieldname.
ENDIF.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = lr_grid.
CALL METHOD lr_grid->get_frontend_layout
IMPORTING
es_layout = lv_layout.
IF lv_fieldname IS NOT INITIAL.
lr_grid->get_backend_fieldcatalog(
IMPORTING et_fieldcatalog = lt_fieldcat ).
READ TABLE lt_fieldcat ASSIGNING <ls_fieldcat>
WITH KEY fieldname = lv_fieldname.
IF <ls_fieldcat> IS NOT ASSIGNED.
MESSAGE w398(00)
WITH 'Fieldname'
lv_fieldname
'does not exist'.
EXIT.
ENDIF.

IF <ls_fieldcat>-edit = 'X'.
lv_layout-no_toolbar = abap_true.
<ls_fieldcat>-edit = abap_false.
ELSE.
lv_layout-no_toolbar = abap_false.
<ls_fieldcat>-edit = abap_true.
ENDIF.
lr_grid->set_frontend_fieldcatalog(
EXPORTING it_fieldcatalog = lt_fieldcat ).
ELSE.
IF lv_layout-edit = abap_true.
CLEAR lv_layout-edit.
ELSE.
lv_layout-edit = abap_true.
ENDIF.
ENDIF.
CALL METHOD lr_grid->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_enter.
CREATE OBJECT lr_grid_events.
SET HANDLER lr_grid_events->handle_data_changed FOR lr_grid.
CALL METHOD lr_grid->set_frontend_layout
EXPORTING
is_layout = lv_layout.
CALL METHOD lr_grid->refresh_table_display( ).
ENDIF.
ENDIF.
ENDMETHOD.

"on_user_command

Das könnte Ihnen auch gefallen