* Quelle: https://blogs.sap.com/2022/08/01/editable-cl_salv_table-after-release-756/ * ab SAP Release 756 * Achtung: das Ganze funktioniert nur für kleine Tabellen mit max. 5000 Zellen, siehe: * * Methode: CL_SALV_GUI_OM_ADAPTER_TABLE->CAN_RUN_RESTRICTED_EDIT_MODE( ) * Konstante: CV_MAX_CELLS_FOR_EDITABLE (Wert: 5000). * ab SAP Release 758 * Methode: CL_SALV_GUI_OM_EDITABLE_HNDLR->REQUEST_DATA_SET_OF_SIZE * Variable: max_cells_for_editable = 10000 (medium, auch standardmäßig im Constructor gesetzt) oder 100000 (large) * Eventhandler CLASS lcl_events DEFINITION. PUBLIC SECTION. * Bezeichner der Buttons CONSTANTS: co_btn_edit TYPE string VALUE 'BTN_EDIT'. CONSTANTS: co_btn_save TYPE string VALUE 'BTN_SAVE'. * Platzhalter für Referenz auf SALV-Grid CLASS-DATA: o_salv TYPE REF TO cl_salv_table. CLASS-DATA: it_equi TYPE STANDARD TABLE OF equi WITH DEFAULT KEY. * Eventhandler-Methode für Button-Klicks in der Toolbar des SALV-Grids CLASS-METHODS: on_toolbar_click FOR EVENT added_function OF cl_salv_events_table IMPORTING e_salv_function sender. PRIVATE SECTION. * Edit-Status des SALV-Grids CLASS-DATA: gv_edit TYPE abap_bool VALUE abap_false. ENDCLASS. CLASS lcl_events IMPLEMENTATION. METHOD on_toolbar_click. IF o_salv IS BOUND. DATA(o_api) = o_salv->extended_grid_api( ). DATA(o_edit) = o_api->editable_restricted( ). * medium = 10000 Zellen (Standard), large = 100000 Zellen o_edit->request_data_set_of_size( size = if_salv_gui_om_edit_restricted=>large ). CASE e_salv_function. WHEN co_btn_edit. * Edit-Modus umschalten IF gv_edit = abap_false. gv_edit = abap_true. ELSE. gv_edit = abap_false. ENDIF. TRY. * alle Spalte(n) (nicht) editierbar setzen * DATA(o_typedescr) = cl_abap_tabledescr=>describe_by_data( p_data = it_equi ). * DATA(o_tabledescr) = CAST cl_abap_tabledescr( o_typedescr ). * DATA(o_structdescr) = CAST cl_abap_structdescr( o_tabledescr->get_table_line_type( ) ). * LOOP AT o_structdescr->get_components( ) ASSIGNING FIELD-SYMBOL(<c>). * o_edit->set_attributes_for_columnname( EXPORTING columnname = CONV #( <c>-name ) * all_cells_input_enabled = gv_edit ). * ENDLOOP. * einzelne Spalte(n) (nicht) editierbar setzen o_edit->set_attributes_for_columnname( EXPORTING columnname = 'EKGRP' all_cells_input_enabled = gv_edit ). o_edit->set_attributes_for_columnname( EXPORTING columnname = 'SMTP_ADDR' all_cells_input_enabled = gv_edit ). CATCH cx_salv_not_found. ENDTRY. o_edit->validate_changed_data( ). o_salv->refresh( ). WHEN co_btn_save. * Daten auf Validität prüfen DATA(lv_data_is_valid) = abap_false. TRY. o_edit->validate_changed_data( IMPORTING is_input_data_valid = lv_data_is_valid ). o_salv->refresh( ). CATCH cx_salv_not_found. ENDTRY. IF lv_data_is_valid = abap_true. * Daten hier speichern / weiterverarbeiten MESSAGE co_btn_save TYPE 'I'. ENDIF. ENDCASE. ENDIF. ENDMETHOD. ENDCLASS. START-OF-SELECTION. TRY. * Beispieldaten (Equipment) holen SELECT FROM equi FIELDS * INTO TABLE @lcl_events=>it_equi. IF sy-subrc = 0. cl_salv_table=>factory( EXPORTING r_container = cl_gui_container=>default_screen IMPORTING r_salv_table = lcl_events=>o_salv CHANGING t_table = lcl_events=>it_equi ). * Standardbuttons der SALV-Table ausblenden lcl_events=>o_salv->get_functions( )->set_all( abap_false ). * Eigenen SALV-Button hinzufügen * das Hinzufügen des Buttons funktioniert nur, wenn die SALV-Table innerhalb eines Containers (z.B. cl_gui_container=>default_screen) eingebettet ist lcl_events=>o_salv->get_functions( )->add_function( name = |{ lcl_events=>co_btn_edit }| icon = |{ icon_edit_file }| text = 'Edit' tooltip = 'Daten editieren' position = if_salv_c_function_position=>right_of_salv_functions ). lcl_events=>o_salv->get_functions( )->add_function( name = |{ lcl_events=>co_btn_save }| icon = |{ icon_save_as_template }| text = 'Save' tooltip = 'Daten speichern' position = if_salv_c_function_position=>right_of_salv_functions ). * Eventhandler für Klicks in die Toolbar des SALV-Grids setzen SET HANDLER lcl_events=>on_toolbar_click FOR lcl_events=>o_salv->get_event( ). * SALV anzeigen lcl_events=>o_salv->display( ). * Toolbar der Listausgabe unterdrücken cl_abap_list_layout=>suppress_toolbar( ). * Listausgabe erzwingen für Erzeugung von cl_gui_container=>default_screen WRITE: space. ENDIF. CATCH cx_root INTO DATA(e_txt). WRITE: / e_txt->get_text( ). ENDTRY.
Kategorien
-
Neueste Beiträge
- [SAP] ABAP-Code nachgenerieren bzw. aktivieren
- [ABAP] Feldkatalog aus Tabellendefinition erstellen
- [ABAP] XML in interne Tabelle wandeln
- [ABAP] Inhalt eines Spoolauftrages auslesen
- [ABAP] User-Exits und BAdIs zu einem Programm oder einer Transaktion auflisten
- [ABAP] UTC-long-Zeitstempel nach POSIX-Standard in Datum und Zeit splitten
- [ABAP] Verwendung von Common Table Expressions (CTE)
- [ABAP] Leistungsverzeichnis lesen (MS_READ_SERVICES_FOR_BAPI)
- [ABAP] SAPConnect: Kommunikationsknoten, Routing und Parameter auslesen
- [SAP] Business Document Service (BDS)