<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>Question Re: editable alv report in Technology Q&amp;A</title>
    <link>https://community.sap.com/t5/technology-q-a/editable-alv-report/qaa-p/14299718#M4934342</link>
    <description>&lt;DIV&gt;&lt;DIV&gt;&lt;H1&gt;Complete CL_SALV_TABLE Example with Editable Columns&lt;/H1&gt;&lt;P&gt;Modern ABAP 7.5+ Syntax | S/4HANA Compatible&lt;/P&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;DIV&gt;&lt;P&gt;&lt;STRONG&gt;Purpose:&lt;/STRONG&gt; Display Purchase Order Items (EKPO) with editable columns using CL_SALV_TABLE and modern ABAP 7.5+ syntax&lt;/P&gt;&lt;/DIV&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN&gt;*&amp;amp;---------------------------------------------------------------------*&lt;/SPAN&gt;
&lt;SPAN&gt;*&amp;amp; Report  Z_EKPO_EDITABLE_SALV&lt;/SPAN&gt;
&lt;SPAN&gt;*&amp;amp;---------------------------------------------------------------------*&lt;/SPAN&gt;
&lt;SPAN&gt;*&amp;amp; Purpose: Display Purchase Order Items (EKPO) with editable columns&lt;/SPAN&gt;
&lt;SPAN&gt;*&amp;amp;          using CL_SALV_TABLE and modern ABAP 7.5+ syntax&lt;/SPAN&gt;
&lt;SPAN&gt;*&amp;amp;---------------------------------------------------------------------*&lt;/SPAN&gt;
&lt;SPAN&gt;REPORT&lt;/SPAN&gt; z_ekpo_editable_salv.

&lt;SPAN&gt;*----------------------------------------------------------------------*&lt;/SPAN&gt;
&lt;SPAN&gt;* Type Definitions&lt;/SPAN&gt;
&lt;SPAN&gt;*----------------------------------------------------------------------*&lt;/SPAN&gt;
&lt;SPAN&gt;TYPES:&lt;/SPAN&gt; &lt;SPAN&gt;BEGIN OF&lt;/SPAN&gt; ty_ekpo,
         ebeln &lt;SPAN&gt;TYPE&lt;/SPAN&gt; ekpo-ebeln,  &lt;SPAN&gt;" Purchase Order Number&lt;/SPAN&gt;
         ebelp &lt;SPAN&gt;TYPE&lt;/SPAN&gt; ekpo-ebelp,  &lt;SPAN&gt;" PO Item Number&lt;/SPAN&gt;
         aedat &lt;SPAN&gt;TYPE&lt;/SPAN&gt; ekpo-aedat,  &lt;SPAN&gt;" Change Date&lt;/SPAN&gt;
         txz01 &lt;SPAN&gt;TYPE&lt;/SPAN&gt; ekpo-txz01,  &lt;SPAN&gt;" Short Text (Editable)&lt;/SPAN&gt;
         matnr &lt;SPAN&gt;TYPE&lt;/SPAN&gt; ekpo-matnr,  &lt;SPAN&gt;" Material Number&lt;/SPAN&gt;
         menge &lt;SPAN&gt;TYPE&lt;/SPAN&gt; ekpo-menge,  &lt;SPAN&gt;" Quantity (Editable)&lt;/SPAN&gt;
         netwr &lt;SPAN&gt;TYPE&lt;/SPAN&gt; ekpo-netwr,  &lt;SPAN&gt;" Net Value (Editable)&lt;/SPAN&gt;
       &lt;SPAN&gt;END OF&lt;/SPAN&gt; ty_ekpo.

&lt;SPAN&gt;*----------------------------------------------------------------------*&lt;/SPAN&gt;
&lt;SPAN&gt;* Selection Screen&lt;/SPAN&gt;
&lt;SPAN&gt;*----------------------------------------------------------------------*&lt;/SPAN&gt;
&lt;SPAN&gt;SELECT-OPTIONS:&lt;/SPAN&gt; s_ebeln &lt;SPAN&gt;FOR&lt;/SPAN&gt; ekpo-ebeln.

&lt;SPAN&gt;*----------------------------------------------------------------------*&lt;/SPAN&gt;
&lt;SPAN&gt;* Global Variables&lt;/SPAN&gt;
&lt;SPAN&gt;*----------------------------------------------------------------------*&lt;/SPAN&gt;
&lt;SPAN&gt;DATA:&lt;/SPAN&gt; gt_ekpo &lt;SPAN&gt;TYPE&lt;/SPAN&gt; &lt;SPAN&gt;STANDARD TABLE OF&lt;/SPAN&gt; ty_ekpo,
      go_salv &lt;SPAN&gt;TYPE REF TO&lt;/SPAN&gt; cl_salv_table,
      go_grid &lt;SPAN&gt;TYPE REF TO&lt;/SPAN&gt; cl_gui_alv_grid.

&lt;SPAN&gt;*----------------------------------------------------------------------*&lt;/SPAN&gt;
&lt;SPAN&gt;* Event Handler Class&lt;/SPAN&gt;
&lt;SPAN&gt;*----------------------------------------------------------------------*&lt;/SPAN&gt;
&lt;SPAN&gt;CLASS&lt;/SPAN&gt; lcl_event_handler &lt;SPAN&gt;DEFINITION&lt;/SPAN&gt;.
  &lt;SPAN&gt;PUBLIC SECTION&lt;/SPAN&gt;.
    &lt;SPAN&gt;CLASS-METHODS:&lt;/SPAN&gt;
      &lt;SPAN&gt;" Handle toolbar button events&lt;/SPAN&gt;
      on_user_command &lt;SPAN&gt;FOR EVENT&lt;/SPAN&gt; added_function &lt;SPAN&gt;OF&lt;/SPAN&gt; cl_salv_events
        &lt;SPAN&gt;IMPORTING&lt;/SPAN&gt; e_salv_function,
      
      &lt;SPAN&gt;" Handle data changes in the grid&lt;/SPAN&gt;
      on_data_changed &lt;SPAN&gt;FOR EVENT&lt;/SPAN&gt; data_changed &lt;SPAN&gt;OF&lt;/SPAN&gt; cl_gui_alv_grid
        &lt;SPAN&gt;IMPORTING&lt;/SPAN&gt; er_data_changed.
&lt;SPAN&gt;ENDCLASS&lt;/SPAN&gt;.

&lt;SPAN&gt;CLASS&lt;/SPAN&gt; lcl_event_handler &lt;SPAN&gt;IMPLEMENTATION&lt;/SPAN&gt;.
  
  &lt;SPAN&gt;METHOD&lt;/SPAN&gt; on_user_command.
    &lt;SPAN&gt;CASE&lt;/SPAN&gt; e_salv_function.
      &lt;SPAN&gt;WHEN&lt;/SPAN&gt; &lt;SPAN&gt;'SAVE'&lt;/SPAN&gt;.
        &lt;SPAN&gt;" Trigger grid to flush changes to internal table&lt;/SPAN&gt;
        &lt;SPAN&gt;CALL METHOD&lt;/SPAN&gt; go_grid-&amp;gt;check_changed_data.
        
        &lt;SPAN&gt;" Here you would implement your save logic&lt;/SPAN&gt;
        &lt;SPAN&gt;" For standard tables like EKPO, use BAPIs or RAP instead of direct MODIFY&lt;/SPAN&gt;
        &lt;SPAN&gt;MESSAGE&lt;/SPAN&gt; &lt;SPAN&gt;'Data saved successfully (use BAPI in production)'&lt;/SPAN&gt; &lt;SPAN&gt;TYPE&lt;/SPAN&gt; &lt;SPAN&gt;'S'&lt;/SPAN&gt;.
        
      &lt;SPAN&gt;WHEN OTHERS&lt;/SPAN&gt;.
    &lt;SPAN&gt;ENDCASE&lt;/SPAN&gt;.
  &lt;SPAN&gt;ENDMETHOD&lt;/SPAN&gt;.
  
  &lt;SPAN&gt;METHOD&lt;/SPAN&gt; on_data_changed.
    &lt;SPAN&gt;" This event is triggered when user modifies cells&lt;/SPAN&gt;
    &lt;SPAN&gt;" You can add custom validations here&lt;/SPAN&gt;
    &lt;SPAN&gt;DATA&lt;/SPAN&gt;(lt_modified) = er_data_changed-&amp;gt;mt_good_cells.
    
    &lt;SPAN&gt;LOOP AT&lt;/SPAN&gt; lt_modified &lt;SPAN&gt;INTO DATA&lt;/SPAN&gt;(ls_mod).
      &lt;SPAN&gt;" Add your validation logic here&lt;/SPAN&gt;
      &lt;SPAN&gt;" Example: Check if quantity is positive&lt;/SPAN&gt;
      &lt;SPAN&gt;IF&lt;/SPAN&gt; ls_mod-fieldname = &lt;SPAN&gt;'MENGE'&lt;/SPAN&gt;.
        &lt;SPAN&gt;DATA&lt;/SPAN&gt;(lv_value) = &lt;SPAN&gt;CONV&lt;/SPAN&gt; menge_d( ls_mod-value ).
        &lt;SPAN&gt;IF&lt;/SPAN&gt; lv_value &amp;lt;= 0.
          &lt;SPAN&gt;" Flag error&lt;/SPAN&gt;
          er_data_changed-&amp;gt;add_protocol_entry(
            i_msgid     = &lt;SPAN&gt;'00'&lt;/SPAN&gt;
            i_msgno     = &lt;SPAN&gt;'001'&lt;/SPAN&gt;
            i_msgty     = &lt;SPAN&gt;'E'&lt;/SPAN&gt;
            i_msgv1     = &lt;SPAN&gt;'Quantity must be positive'&lt;/SPAN&gt;
            i_fieldname = ls_mod-fieldname
            i_row_id    = ls_mod-row_id ).
        &lt;SPAN&gt;ENDIF&lt;/SPAN&gt;.
      &lt;SPAN&gt;ENDIF&lt;/SPAN&gt;.
    &lt;SPAN&gt;ENDLOOP&lt;/SPAN&gt;.
  &lt;SPAN&gt;ENDMETHOD&lt;/SPAN&gt;.
  
&lt;SPAN&gt;ENDCLASS&lt;/SPAN&gt;.

&lt;SPAN&gt;*----------------------------------------------------------------------*&lt;/SPAN&gt;
&lt;SPAN&gt;* START-OF-SELECTION&lt;/SPAN&gt;
&lt;SPAN&gt;*----------------------------------------------------------------------*&lt;/SPAN&gt;
&lt;SPAN&gt;START-OF-SELECTION&lt;/SPAN&gt;.
  &lt;SPAN&gt;PERFORM&lt;/SPAN&gt; select_data.
  &lt;SPAN&gt;PERFORM&lt;/SPAN&gt; display_alv.

&lt;SPAN&gt;*----------------------------------------------------------------------*&lt;/SPAN&gt;
&lt;SPAN&gt;* FORM select_data&lt;/SPAN&gt;
&lt;SPAN&gt;*----------------------------------------------------------------------*&lt;/SPAN&gt;
&lt;SPAN&gt;FORM&lt;/SPAN&gt; select_data.
  
  &lt;SPAN&gt;" Modern inline declaration with host variable escaping (@)&lt;/SPAN&gt;
  &lt;SPAN&gt;SELECT&lt;/SPAN&gt; ebeln, ebelp, aedat, txz01, matnr, menge, netwr
    &lt;SPAN&gt;FROM&lt;/SPAN&gt; ekpo
    &lt;SPAN&gt;WHERE&lt;/SPAN&gt; ebeln &lt;SPAN&gt;IN&lt;/SPAN&gt; &lt;SPAN&gt;@&lt;/SPAN&gt;s_ebeln
    &lt;SPAN&gt;INTO TABLE&lt;/SPAN&gt; &lt;SPAN&gt;@&lt;/SPAN&gt;gt_ekpo
    &lt;SPAN&gt;UP TO&lt;/SPAN&gt; 100 &lt;SPAN&gt;ROWS&lt;/SPAN&gt;.
  
  &lt;SPAN&gt;IF&lt;/SPAN&gt; sy-subrc &amp;lt;&amp;gt; 0.
    &lt;SPAN&gt;MESSAGE&lt;/SPAN&gt; &lt;SPAN&gt;'No data found'&lt;/SPAN&gt; &lt;SPAN&gt;TYPE&lt;/SPAN&gt; &lt;SPAN&gt;'I'&lt;/SPAN&gt;.
    &lt;SPAN&gt;LEAVE LIST-PROCESSING&lt;/SPAN&gt;.
  &lt;SPAN&gt;ENDIF&lt;/SPAN&gt;.
  
&lt;SPAN&gt;ENDFORM&lt;/SPAN&gt;.

&lt;SPAN&gt;*----------------------------------------------------------------------*&lt;/SPAN&gt;
&lt;SPAN&gt;* FORM display_alv&lt;/SPAN&gt;
&lt;SPAN&gt;*----------------------------------------------------------------------*&lt;/SPAN&gt;
&lt;SPAN&gt;FORM&lt;/SPAN&gt; display_alv.
  
  &lt;SPAN&gt;TRY&lt;/SPAN&gt;.
      &lt;SPAN&gt;" Create SALV instance using factory method&lt;/SPAN&gt;
      cl_salv_table=&amp;gt;factory(
        &lt;SPAN&gt;IMPORTING&lt;/SPAN&gt;
          r_salv_table = go_salv
        &lt;SPAN&gt;CHANGING&lt;/SPAN&gt;
          t_table      = gt_ekpo ).
      
      &lt;SPAN&gt;" Configure columns&lt;/SPAN&gt;
      &lt;SPAN&gt;DATA&lt;/SPAN&gt;(lo_columns) = go_salv-&amp;gt;get_columns( ).
      lo_columns-&amp;gt;set_optimize( abap_true ).
      
      &lt;SPAN&gt;" Set column labels&lt;/SPAN&gt;
      &lt;SPAN&gt;DATA&lt;/SPAN&gt;(lo_column) = &lt;SPAN&gt;CAST&lt;/SPAN&gt; cl_salv_column_table( lo_columns-&amp;gt;get_column( &lt;SPAN&gt;'EBELN'&lt;/SPAN&gt; ) ).
      lo_column-&amp;gt;set_long_text( &lt;SPAN&gt;'Purchase Order'&lt;/SPAN&gt; ).
      lo_column-&amp;gt;set_medium_text( &lt;SPAN&gt;'PO Number'&lt;/SPAN&gt; ).
      lo_column-&amp;gt;set_short_text( &lt;SPAN&gt;'PO'&lt;/SPAN&gt; ).
      
      lo_column = &lt;SPAN&gt;CAST&lt;/SPAN&gt; cl_salv_column_table( lo_columns-&amp;gt;get_column( &lt;SPAN&gt;'EBELP'&lt;/SPAN&gt; ) ).
      lo_column-&amp;gt;set_long_text( &lt;SPAN&gt;'Item Number'&lt;/SPAN&gt; ).
      
      lo_column = &lt;SPAN&gt;CAST&lt;/SPAN&gt; cl_salv_column_table( lo_columns-&amp;gt;get_column( &lt;SPAN&gt;'TXZ01'&lt;/SPAN&gt; ) ).
      lo_column-&amp;gt;set_long_text( &lt;SPAN&gt;'Short Text'&lt;/SPAN&gt; ).
      
      lo_column = &lt;SPAN&gt;CAST&lt;/SPAN&gt; cl_salv_column_table( lo_columns-&amp;gt;get_column( &lt;SPAN&gt;'MENGE'&lt;/SPAN&gt; ) ).
      lo_column-&amp;gt;set_long_text( &lt;SPAN&gt;'Quantity'&lt;/SPAN&gt; ).
      
      lo_column = &lt;SPAN&gt;CAST&lt;/SPAN&gt; cl_salv_column_table( lo_columns-&amp;gt;get_column( &lt;SPAN&gt;'NETWR'&lt;/SPAN&gt; ) ).
      lo_column-&amp;gt;set_long_text( &lt;SPAN&gt;'Net Value'&lt;/SPAN&gt; ).
      
      &lt;SPAN&gt;" Enable standard functions (toolbar buttons)&lt;/SPAN&gt;
      &lt;SPAN&gt;DATA&lt;/SPAN&gt;(lo_functions) = go_salv-&amp;gt;get_functions( ).
      lo_functions-&amp;gt;set_all( abap_true ).
      
      &lt;SPAN&gt;" Add custom SAVE button&lt;/SPAN&gt;
      &lt;SPAN&gt;TRY&lt;/SPAN&gt;.
          lo_functions-&amp;gt;add_function(
            name     = &lt;SPAN&gt;'SAVE'&lt;/SPAN&gt;
            icon     = &lt;SPAN&gt;'@2L@'&lt;/SPAN&gt;
            text     = &lt;SPAN&gt;'Save'&lt;/SPAN&gt;
            tooltip  = &lt;SPAN&gt;'Save changes'&lt;/SPAN&gt;
            position = if_salv_c_function_position=&amp;gt;right_of_salv_functions ).
        &lt;SPAN&gt;CATCH&lt;/SPAN&gt; cx_salv_existing cx_salv_wrong_call.
      &lt;SPAN&gt;ENDTRY&lt;/SPAN&gt;.
      
      &lt;SPAN&gt;" Register event handler for toolbar buttons&lt;/SPAN&gt;
      &lt;SPAN&gt;DATA&lt;/SPAN&gt;(lo_events) = go_salv-&amp;gt;get_event( ).
      &lt;SPAN&gt;SET HANDLER&lt;/SPAN&gt; lcl_event_handler=&amp;gt;on_user_command &lt;SPAN&gt;FOR&lt;/SPAN&gt; lo_events.
      
      &lt;SPAN&gt;" *** ENABLE EDITING - Two approaches depending on your release ***&lt;/SPAN&gt;
      
      &lt;SPAN&gt;" Approach 1: For SAP NetWeaver 7.56+ and S/4HANA (Official API)&lt;/SPAN&gt;
      &lt;SPAN&gt;TRY&lt;/SPAN&gt;.
          &lt;SPAN&gt;DATA&lt;/SPAN&gt;(lo_editable) = go_salv-&amp;gt;extended_grid_api( )-&amp;gt;editable_restricted( ).
          
          &lt;SPAN&gt;" Make specific columns editable&lt;/SPAN&gt;
          lo_editable-&amp;gt;set_attributes_for_columnname(
            columnname              = &lt;SPAN&gt;'TXZ01'&lt;/SPAN&gt;
            all_cells_input_enabled = abap_true ).
          
          lo_editable-&amp;gt;set_attributes_for_columnname(
            columnname              = &lt;SPAN&gt;'MENGE'&lt;/SPAN&gt;
            all_cells_input_enabled = abap_true ).
          
          lo_editable-&amp;gt;set_attributes_for_columnname(
            columnname              = &lt;SPAN&gt;'NETWR'&lt;/SPAN&gt;
            all_cells_input_enabled = abap_true ).
          
        &lt;SPAN&gt;CATCH&lt;/SPAN&gt; cx_salv_error &lt;SPAN&gt;INTO DATA&lt;/SPAN&gt;(lx_error).
          &lt;SPAN&gt;" If extended_grid_api is not available, use Approach 2&lt;/SPAN&gt;
          &lt;SPAN&gt;MESSAGE&lt;/SPAN&gt; lx_error-&amp;gt;get_text( ) &lt;SPAN&gt;TYPE&lt;/SPAN&gt; &lt;SPAN&gt;'I'&lt;/SPAN&gt;.
      &lt;SPAN&gt;ENDTRY&lt;/SPAN&gt;.
      
      &lt;SPAN&gt;" Display the grid&lt;/SPAN&gt;
      go_salv-&amp;gt;display( ).
      
    &lt;SPAN&gt;CATCH&lt;/SPAN&gt; cx_salv_msg &lt;SPAN&gt;INTO DATA&lt;/SPAN&gt;(lx_msg).
      &lt;SPAN&gt;MESSAGE&lt;/SPAN&gt; lx_msg-&amp;gt;get_text( ) &lt;SPAN&gt;TYPE&lt;/SPAN&gt; &lt;SPAN&gt;'E'&lt;/SPAN&gt;.
  &lt;SPAN&gt;ENDTRY&lt;/SPAN&gt;.
  
&lt;SPAN&gt;ENDFORM&lt;/SPAN&gt;.&lt;/CODE&gt;&lt;/PRE&gt;&lt;DIV&gt;&lt;H3&gt;&lt;span class="lia-unicode-emoji" title=":warning:"&gt;⚠️&lt;/span&gt; Important Note&lt;/H3&gt;&lt;P&gt;Direct modification of standard tables like &lt;STRONG&gt;EKPO&lt;/STRONG&gt; is not recommended in S/4HANA due to data integrity concerns. Use appropriate BAPIs (e.g., &lt;CODE&gt;BAPI_PO_CHANGE&lt;/CODE&gt;) or implement a RAP-based service for production scenarios.&lt;/P&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;H2&gt;Key Implementation Points&lt;/H2&gt;&lt;DIV&gt;&lt;H3&gt;✓ Modern Syntax Usage&lt;/H3&gt;&lt;UL&gt;&lt;LI&gt;Inline declarations with &lt;CODE&gt;DATA(variable)&lt;/CODE&gt; reduce code verbosity&lt;/LI&gt;&lt;LI&gt;Host variable escaping with &lt;CODE&gt;@&lt;/CODE&gt; is mandatory in S/4HANA SELECT statements&lt;/LI&gt;&lt;LI&gt;&lt;CODE&gt;CAST&lt;/CODE&gt; operator for type casting&lt;/LI&gt;&lt;/UL&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;H3&gt;✓ Editable Columns&lt;/H3&gt;&lt;UL&gt;&lt;LI&gt;Uses the official &lt;CODE&gt;extended_grid_api()&lt;/CODE&gt; method available in SAP NetWeaver 7.56+ and all S/4HANA releases&lt;/LI&gt;&lt;LI&gt;Only specific columns (&lt;STRONG&gt;TXZ01&lt;/STRONG&gt;, &lt;STRONG&gt;MENGE&lt;/STRONG&gt;, &lt;STRONG&gt;NETWR&lt;/STRONG&gt;) are set as editable&lt;/LI&gt;&lt;/UL&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;H3&gt;✓ Event Handling&lt;/H3&gt;&lt;UL&gt;&lt;LI&gt;Custom toolbar button (&lt;STRONG&gt;SAVE&lt;/STRONG&gt;) triggers the &lt;CODE&gt;on_user_command&lt;/CODE&gt; event&lt;/LI&gt;&lt;LI&gt;The &lt;CODE&gt;on_data_changed&lt;/CODE&gt; event allows validation before data is written to the internal table&lt;/LI&gt;&lt;/UL&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;</description>
    <pubDate>Tue, 30 Dec 2025 16:03:51 GMT</pubDate>
    <dc:creator>nmirandaghn</dc:creator>
    <dc:date>2025-12-30T16:03:51Z</dc:date>
    <item>
      <title>editable alv report</title>
      <link>https://community.sap.com/t5/technology-q-a/editable-alv-report/qaq-p/14298545</link>
      <description>&lt;P&gt;Hi Experts,&lt;/P&gt;&lt;P&gt;I have created editable alv report.&lt;/P&gt;&lt;P&gt;kindly check the code please let me know is this fine code or not.&lt;/P&gt;&lt;P&gt;thankyou.&lt;/P&gt;&lt;P&gt;code:&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;TYPE-POOLS: slis.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;TABLES: ekpo.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;SELECT-OPTIONS: s_ebeln FOR ekpo-ebeln.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;DATA: it_ekpo TYPE STANDARD TABLE OF ekpo,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;wa_ekpo TYPE ekpo.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;DATA: it_fcat TYPE slis_t_fieldcat_alv,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;wa_fcat TYPE slis_fieldcat_alv,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;wa_layo TYPE slis_layout_alv.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;*----------------------------------------------------------------------*&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;* START-OF-SELECTION&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;*----------------------------------------------------------------------*&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;START-OF-SELECTION.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;PERFORM get_data.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;PERFORM build_fieldcat.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;PERFORM display_alv.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;*----------------------------------------------------------------------*&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;* Get data&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;*----------------------------------------------------------------------*&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;FORM get_data.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;SELECT *&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;FROM ekpo&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;INTO TABLE it_ekpo&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;UP TO 100 ROWS&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;where ekpo~ebeln IN s_ebeln.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;ENDFORM.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;*----------------------------------------------------------------------*&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;* Build field catalog&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;*----------------------------------------------------------------------*&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;FORM build_fieldcat.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;CLEAR it_fcat.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;" EBELN - not editable (key)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;CLEAR wa_fcat.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;wa_fcat-col_pos = 1.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;wa_fcat-fieldname = 'EBELN'.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;wa_fcat-seltext_l = 'PO Number'.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;APPEND wa_fcat TO it_fcat.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;" EBELP - not editable (key)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;CLEAR wa_fcat.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;wa_fcat-col_pos = 2.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;wa_fcat-fieldname = 'EBELP'.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;wa_fcat-seltext_l = 'Item'.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;APPEND wa_fcat TO it_fcat.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;" AEDAT - display only&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;CLEAR wa_fcat.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;wa_fcat-col_pos = 3.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;wa_fcat-fieldname = 'AEDAT'.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;wa_fcat-seltext_l = 'Change Date'.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;APPEND wa_fcat TO it_fcat.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;" TXZ01 - editable&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;CLEAR wa_fcat.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;wa_fcat-col_pos = 4.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;wa_fcat-fieldname = 'TXZ01'.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;wa_fcat-seltext_l = 'Short Text'.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;wa_fcat-outputlen = 40.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;wa_fcat-edit = 'X'.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;APPEND wa_fcat TO it_fcat.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;" MATNR - display only (you can make it editable if needed)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;CLEAR wa_fcat.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;wa_fcat-col_pos = 5.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;wa_fcat-fieldname = 'MATNR'.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;wa_fcat-seltext_l = 'Material'.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;APPEND wa_fcat TO it_fcat.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;" MENGE - editable&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;CLEAR wa_fcat.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;wa_fcat-col_pos = 6.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;wa_fcat-fieldname = 'MENGE'.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;wa_fcat-seltext_l = 'Quantity'.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;wa_fcat-edit = 'X'.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;APPEND wa_fcat TO it_fcat.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;" NETWR - editable&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;CLEAR wa_fcat.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;wa_fcat-col_pos = 7.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;wa_fcat-fieldname = 'NETWR'.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;wa_fcat-seltext_l = 'Net Value'.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;wa_fcat-edit = 'X'.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;APPEND wa_fcat TO it_fcat.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;CLEAR wa_layo.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;wa_layo-colwidth_optimize = 'X'.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;ENDFORM.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;*----------------------------------------------------------------------*&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;* Display ALV&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;*----------------------------------------------------------------------*&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;FORM display_alv.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;EXPORTING&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;i_callback_program = sy-repid&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;i_callback_user_command = 'USER_COMMAND'&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;is_layout = wa_layo&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;it_fieldcat = it_fcat&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;TABLES&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;t_outtab = it_ekpo&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;EXCEPTIONS&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;program_error = 1&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;OTHERS = 2.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;IF sy-subrc &amp;lt;&amp;gt; 0.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;MESSAGE 'Error in ALV display' TYPE 'E'.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;ENDIF.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;ENDFORM.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;*----------------------------------------------------------------------*&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;* USER COMMAND&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;*----------------------------------------------------------------------*&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;FORM user_command USING r_ucomm TYPE sy-ucomm&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;r_selfield TYPE slis_selfield.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;CASE r_ucomm.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;WHEN '&amp;amp;DATA_SAVE'. " Triggered by Save (Ctrl+S) in ALV&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;PERFORM save_data.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;" Refresh ALV after save&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;r_selfield-refresh = 'X'.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;ENDCASE.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;ENDFORM.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;*----------------------------------------------------------------------*&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;* Save data: update ALL rows from internal table to EKPO&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;*----------------------------------------------------------------------*&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;FORM save_data.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;" Update all entries based on primary key (EBELN+EBELP)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;MODIFY ekpo FROM TABLE it_ekpo.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;IF sy-subrc = 0.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;COMMIT WORK.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;MESSAGE 'All changed rows saved successfully' TYPE 'S'.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;ELSE.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;ROLLBACK WORK.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;MESSAGE 'Error while updating EKPO' TYPE 'E'.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;ENDIF.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;ENDFORM.&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Mon, 29 Dec 2025 12:04:21 GMT</pubDate>
      <guid>https://community.sap.com/t5/technology-q-a/editable-alv-report/qaq-p/14298545</guid>
      <dc:creator>mohithvarma11</dc:creator>
      <dc:date>2025-12-29T12:04:21Z</dc:date>
    </item>
    <item>
      <title>Re: editable alv report</title>
      <link>https://community.sap.com/t5/technology-q-a/editable-alv-report/qaa-p/14299370#M4934307</link>
      <description>&lt;P&gt;I suggest using ABAP 7.5+ syntax:&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Instead of this:&lt;/STRONG&gt;&lt;/P&gt;&lt;PRE&gt;&lt;CODE&gt;DATA: it_ekpo TYPE TABLE OF ekpo,
      it_fcat TYPE slis_t_fieldcat_alv,
      wa_fcat LIKE LINE OF it_fcat.

SELECT * FROM ekpo INTO TABLE it_ekpo WHERE ebeln IN s_ebeln.

CLEAR wa_fcat.
wa_fcat-fieldname = 'EBELN'.
wa_fcat-seltext_l = 'PO Number'.
APPEND wa_fcat TO it_fcat.
" ...more lines&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;&lt;STRONG&gt;Try this:&lt;/STRONG&gt;&lt;/P&gt;&lt;PRE&gt;&lt;CODE&gt;SELECT ebeln, ebelp, txz01, menge, netwr
  FROM ekpo
  WHERE ebeln IN @s_ebeln
  INTO TABLE @DATA(it_ekpo).

DATA(it_fcat) = VALUE slis_t_fieldcat_alv(
  ( fieldname = 'EBELN' seltext_l = 'PO Number' )
  ( fieldname = 'TXZ01' seltext_l = 'Text' edit = 'X' )
  ( fieldname = 'MENGE' seltext_l = 'Quantity' edit = 'X' )
).&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;&lt;STRONG&gt;Or you can use CL_SALV_TABLE :&lt;/STRONG&gt;&lt;/P&gt;&lt;PRE&gt;&lt;CODE&gt;TRY.
    cl_salv_table=&amp;gt;factory(
      IMPORTING r_salv_table = DATA(lo_alv)
      CHANGING  t_table      = it_ekpo ).

    " Auto-optimize column width
    lo_alv-&amp;gt;get_columns( )-&amp;gt;set_optimize( abap_true ).

    " Make specific columns editable
    lo_alv-&amp;gt;extended_grid_api( )-&amp;gt;editable_restricted( )-&amp;gt;set_attributes_for_columnname(
      columnname = 'TXZ01'
      all_cells_input_enabled = abap_true ).

    lo_alv-&amp;gt;display( ).

  CATCH cx_salv_error INTO DATA(lx_err).
    MESSAGE lx_err-&amp;gt;get_text( ) TYPE 'E'.
ENDTRY.&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;&lt;STRONG&gt;Benefits:&lt;/STRONG&gt;&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;No manual field catalog needed (auto-detects structure)&lt;/LI&gt;&lt;LI&gt;Cleaner, more maintainable code&lt;/LI&gt;&lt;LI&gt;Better aligned with S/4HANA standards&lt;/LI&gt;&lt;/UL&gt;&lt;DIV class=""&gt;If you need complex editable grids with custom validations, &lt;CODE&gt;CL_SALV_TABLE&lt;/CODE&gt; can be limiting. For those cases, &lt;CODE&gt;CL_GUI_ALV_GRID&lt;/CODE&gt; is still more flexible.&lt;/DIV&gt;&lt;DIV class=""&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV class=""&gt;Do you have any specific requirements for the report that are giving you trouble?&lt;/DIV&gt;</description>
      <pubDate>Mon, 29 Dec 2025 22:26:39 GMT</pubDate>
      <guid>https://community.sap.com/t5/technology-q-a/editable-alv-report/qaa-p/14299370#M4934307</guid>
      <dc:creator>nmirandaghn</dc:creator>
      <dc:date>2025-12-29T22:26:39Z</dc:date>
    </item>
    <item>
      <title>Re: editable alv report</title>
      <link>https://community.sap.com/t5/technology-q-a/editable-alv-report/qaa-p/14299422#M4934314</link>
      <description>how to save this? can you send me full code.</description>
      <pubDate>Tue, 30 Dec 2025 06:24:18 GMT</pubDate>
      <guid>https://community.sap.com/t5/technology-q-a/editable-alv-report/qaa-p/14299422#M4934314</guid>
      <dc:creator>mohithvarma11</dc:creator>
      <dc:date>2025-12-30T06:24:18Z</dc:date>
    </item>
    <item>
      <title>Re: editable alv report</title>
      <link>https://community.sap.com/t5/technology-q-a/editable-alv-report/qaa-p/14299718#M4934342</link>
      <description>&lt;DIV&gt;&lt;DIV&gt;&lt;H1&gt;Complete CL_SALV_TABLE Example with Editable Columns&lt;/H1&gt;&lt;P&gt;Modern ABAP 7.5+ Syntax | S/4HANA Compatible&lt;/P&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;DIV&gt;&lt;P&gt;&lt;STRONG&gt;Purpose:&lt;/STRONG&gt; Display Purchase Order Items (EKPO) with editable columns using CL_SALV_TABLE and modern ABAP 7.5+ syntax&lt;/P&gt;&lt;/DIV&gt;&lt;PRE&gt;&lt;CODE&gt;&lt;SPAN&gt;*&amp;amp;---------------------------------------------------------------------*&lt;/SPAN&gt;
&lt;SPAN&gt;*&amp;amp; Report  Z_EKPO_EDITABLE_SALV&lt;/SPAN&gt;
&lt;SPAN&gt;*&amp;amp;---------------------------------------------------------------------*&lt;/SPAN&gt;
&lt;SPAN&gt;*&amp;amp; Purpose: Display Purchase Order Items (EKPO) with editable columns&lt;/SPAN&gt;
&lt;SPAN&gt;*&amp;amp;          using CL_SALV_TABLE and modern ABAP 7.5+ syntax&lt;/SPAN&gt;
&lt;SPAN&gt;*&amp;amp;---------------------------------------------------------------------*&lt;/SPAN&gt;
&lt;SPAN&gt;REPORT&lt;/SPAN&gt; z_ekpo_editable_salv.

&lt;SPAN&gt;*----------------------------------------------------------------------*&lt;/SPAN&gt;
&lt;SPAN&gt;* Type Definitions&lt;/SPAN&gt;
&lt;SPAN&gt;*----------------------------------------------------------------------*&lt;/SPAN&gt;
&lt;SPAN&gt;TYPES:&lt;/SPAN&gt; &lt;SPAN&gt;BEGIN OF&lt;/SPAN&gt; ty_ekpo,
         ebeln &lt;SPAN&gt;TYPE&lt;/SPAN&gt; ekpo-ebeln,  &lt;SPAN&gt;" Purchase Order Number&lt;/SPAN&gt;
         ebelp &lt;SPAN&gt;TYPE&lt;/SPAN&gt; ekpo-ebelp,  &lt;SPAN&gt;" PO Item Number&lt;/SPAN&gt;
         aedat &lt;SPAN&gt;TYPE&lt;/SPAN&gt; ekpo-aedat,  &lt;SPAN&gt;" Change Date&lt;/SPAN&gt;
         txz01 &lt;SPAN&gt;TYPE&lt;/SPAN&gt; ekpo-txz01,  &lt;SPAN&gt;" Short Text (Editable)&lt;/SPAN&gt;
         matnr &lt;SPAN&gt;TYPE&lt;/SPAN&gt; ekpo-matnr,  &lt;SPAN&gt;" Material Number&lt;/SPAN&gt;
         menge &lt;SPAN&gt;TYPE&lt;/SPAN&gt; ekpo-menge,  &lt;SPAN&gt;" Quantity (Editable)&lt;/SPAN&gt;
         netwr &lt;SPAN&gt;TYPE&lt;/SPAN&gt; ekpo-netwr,  &lt;SPAN&gt;" Net Value (Editable)&lt;/SPAN&gt;
       &lt;SPAN&gt;END OF&lt;/SPAN&gt; ty_ekpo.

&lt;SPAN&gt;*----------------------------------------------------------------------*&lt;/SPAN&gt;
&lt;SPAN&gt;* Selection Screen&lt;/SPAN&gt;
&lt;SPAN&gt;*----------------------------------------------------------------------*&lt;/SPAN&gt;
&lt;SPAN&gt;SELECT-OPTIONS:&lt;/SPAN&gt; s_ebeln &lt;SPAN&gt;FOR&lt;/SPAN&gt; ekpo-ebeln.

&lt;SPAN&gt;*----------------------------------------------------------------------*&lt;/SPAN&gt;
&lt;SPAN&gt;* Global Variables&lt;/SPAN&gt;
&lt;SPAN&gt;*----------------------------------------------------------------------*&lt;/SPAN&gt;
&lt;SPAN&gt;DATA:&lt;/SPAN&gt; gt_ekpo &lt;SPAN&gt;TYPE&lt;/SPAN&gt; &lt;SPAN&gt;STANDARD TABLE OF&lt;/SPAN&gt; ty_ekpo,
      go_salv &lt;SPAN&gt;TYPE REF TO&lt;/SPAN&gt; cl_salv_table,
      go_grid &lt;SPAN&gt;TYPE REF TO&lt;/SPAN&gt; cl_gui_alv_grid.

&lt;SPAN&gt;*----------------------------------------------------------------------*&lt;/SPAN&gt;
&lt;SPAN&gt;* Event Handler Class&lt;/SPAN&gt;
&lt;SPAN&gt;*----------------------------------------------------------------------*&lt;/SPAN&gt;
&lt;SPAN&gt;CLASS&lt;/SPAN&gt; lcl_event_handler &lt;SPAN&gt;DEFINITION&lt;/SPAN&gt;.
  &lt;SPAN&gt;PUBLIC SECTION&lt;/SPAN&gt;.
    &lt;SPAN&gt;CLASS-METHODS:&lt;/SPAN&gt;
      &lt;SPAN&gt;" Handle toolbar button events&lt;/SPAN&gt;
      on_user_command &lt;SPAN&gt;FOR EVENT&lt;/SPAN&gt; added_function &lt;SPAN&gt;OF&lt;/SPAN&gt; cl_salv_events
        &lt;SPAN&gt;IMPORTING&lt;/SPAN&gt; e_salv_function,
      
      &lt;SPAN&gt;" Handle data changes in the grid&lt;/SPAN&gt;
      on_data_changed &lt;SPAN&gt;FOR EVENT&lt;/SPAN&gt; data_changed &lt;SPAN&gt;OF&lt;/SPAN&gt; cl_gui_alv_grid
        &lt;SPAN&gt;IMPORTING&lt;/SPAN&gt; er_data_changed.
&lt;SPAN&gt;ENDCLASS&lt;/SPAN&gt;.

&lt;SPAN&gt;CLASS&lt;/SPAN&gt; lcl_event_handler &lt;SPAN&gt;IMPLEMENTATION&lt;/SPAN&gt;.
  
  &lt;SPAN&gt;METHOD&lt;/SPAN&gt; on_user_command.
    &lt;SPAN&gt;CASE&lt;/SPAN&gt; e_salv_function.
      &lt;SPAN&gt;WHEN&lt;/SPAN&gt; &lt;SPAN&gt;'SAVE'&lt;/SPAN&gt;.
        &lt;SPAN&gt;" Trigger grid to flush changes to internal table&lt;/SPAN&gt;
        &lt;SPAN&gt;CALL METHOD&lt;/SPAN&gt; go_grid-&amp;gt;check_changed_data.
        
        &lt;SPAN&gt;" Here you would implement your save logic&lt;/SPAN&gt;
        &lt;SPAN&gt;" For standard tables like EKPO, use BAPIs or RAP instead of direct MODIFY&lt;/SPAN&gt;
        &lt;SPAN&gt;MESSAGE&lt;/SPAN&gt; &lt;SPAN&gt;'Data saved successfully (use BAPI in production)'&lt;/SPAN&gt; &lt;SPAN&gt;TYPE&lt;/SPAN&gt; &lt;SPAN&gt;'S'&lt;/SPAN&gt;.
        
      &lt;SPAN&gt;WHEN OTHERS&lt;/SPAN&gt;.
    &lt;SPAN&gt;ENDCASE&lt;/SPAN&gt;.
  &lt;SPAN&gt;ENDMETHOD&lt;/SPAN&gt;.
  
  &lt;SPAN&gt;METHOD&lt;/SPAN&gt; on_data_changed.
    &lt;SPAN&gt;" This event is triggered when user modifies cells&lt;/SPAN&gt;
    &lt;SPAN&gt;" You can add custom validations here&lt;/SPAN&gt;
    &lt;SPAN&gt;DATA&lt;/SPAN&gt;(lt_modified) = er_data_changed-&amp;gt;mt_good_cells.
    
    &lt;SPAN&gt;LOOP AT&lt;/SPAN&gt; lt_modified &lt;SPAN&gt;INTO DATA&lt;/SPAN&gt;(ls_mod).
      &lt;SPAN&gt;" Add your validation logic here&lt;/SPAN&gt;
      &lt;SPAN&gt;" Example: Check if quantity is positive&lt;/SPAN&gt;
      &lt;SPAN&gt;IF&lt;/SPAN&gt; ls_mod-fieldname = &lt;SPAN&gt;'MENGE'&lt;/SPAN&gt;.
        &lt;SPAN&gt;DATA&lt;/SPAN&gt;(lv_value) = &lt;SPAN&gt;CONV&lt;/SPAN&gt; menge_d( ls_mod-value ).
        &lt;SPAN&gt;IF&lt;/SPAN&gt; lv_value &amp;lt;= 0.
          &lt;SPAN&gt;" Flag error&lt;/SPAN&gt;
          er_data_changed-&amp;gt;add_protocol_entry(
            i_msgid     = &lt;SPAN&gt;'00'&lt;/SPAN&gt;
            i_msgno     = &lt;SPAN&gt;'001'&lt;/SPAN&gt;
            i_msgty     = &lt;SPAN&gt;'E'&lt;/SPAN&gt;
            i_msgv1     = &lt;SPAN&gt;'Quantity must be positive'&lt;/SPAN&gt;
            i_fieldname = ls_mod-fieldname
            i_row_id    = ls_mod-row_id ).
        &lt;SPAN&gt;ENDIF&lt;/SPAN&gt;.
      &lt;SPAN&gt;ENDIF&lt;/SPAN&gt;.
    &lt;SPAN&gt;ENDLOOP&lt;/SPAN&gt;.
  &lt;SPAN&gt;ENDMETHOD&lt;/SPAN&gt;.
  
&lt;SPAN&gt;ENDCLASS&lt;/SPAN&gt;.

&lt;SPAN&gt;*----------------------------------------------------------------------*&lt;/SPAN&gt;
&lt;SPAN&gt;* START-OF-SELECTION&lt;/SPAN&gt;
&lt;SPAN&gt;*----------------------------------------------------------------------*&lt;/SPAN&gt;
&lt;SPAN&gt;START-OF-SELECTION&lt;/SPAN&gt;.
  &lt;SPAN&gt;PERFORM&lt;/SPAN&gt; select_data.
  &lt;SPAN&gt;PERFORM&lt;/SPAN&gt; display_alv.

&lt;SPAN&gt;*----------------------------------------------------------------------*&lt;/SPAN&gt;
&lt;SPAN&gt;* FORM select_data&lt;/SPAN&gt;
&lt;SPAN&gt;*----------------------------------------------------------------------*&lt;/SPAN&gt;
&lt;SPAN&gt;FORM&lt;/SPAN&gt; select_data.
  
  &lt;SPAN&gt;" Modern inline declaration with host variable escaping (@)&lt;/SPAN&gt;
  &lt;SPAN&gt;SELECT&lt;/SPAN&gt; ebeln, ebelp, aedat, txz01, matnr, menge, netwr
    &lt;SPAN&gt;FROM&lt;/SPAN&gt; ekpo
    &lt;SPAN&gt;WHERE&lt;/SPAN&gt; ebeln &lt;SPAN&gt;IN&lt;/SPAN&gt; &lt;SPAN&gt;@&lt;/SPAN&gt;s_ebeln
    &lt;SPAN&gt;INTO TABLE&lt;/SPAN&gt; &lt;SPAN&gt;@&lt;/SPAN&gt;gt_ekpo
    &lt;SPAN&gt;UP TO&lt;/SPAN&gt; 100 &lt;SPAN&gt;ROWS&lt;/SPAN&gt;.
  
  &lt;SPAN&gt;IF&lt;/SPAN&gt; sy-subrc &amp;lt;&amp;gt; 0.
    &lt;SPAN&gt;MESSAGE&lt;/SPAN&gt; &lt;SPAN&gt;'No data found'&lt;/SPAN&gt; &lt;SPAN&gt;TYPE&lt;/SPAN&gt; &lt;SPAN&gt;'I'&lt;/SPAN&gt;.
    &lt;SPAN&gt;LEAVE LIST-PROCESSING&lt;/SPAN&gt;.
  &lt;SPAN&gt;ENDIF&lt;/SPAN&gt;.
  
&lt;SPAN&gt;ENDFORM&lt;/SPAN&gt;.

&lt;SPAN&gt;*----------------------------------------------------------------------*&lt;/SPAN&gt;
&lt;SPAN&gt;* FORM display_alv&lt;/SPAN&gt;
&lt;SPAN&gt;*----------------------------------------------------------------------*&lt;/SPAN&gt;
&lt;SPAN&gt;FORM&lt;/SPAN&gt; display_alv.
  
  &lt;SPAN&gt;TRY&lt;/SPAN&gt;.
      &lt;SPAN&gt;" Create SALV instance using factory method&lt;/SPAN&gt;
      cl_salv_table=&amp;gt;factory(
        &lt;SPAN&gt;IMPORTING&lt;/SPAN&gt;
          r_salv_table = go_salv
        &lt;SPAN&gt;CHANGING&lt;/SPAN&gt;
          t_table      = gt_ekpo ).
      
      &lt;SPAN&gt;" Configure columns&lt;/SPAN&gt;
      &lt;SPAN&gt;DATA&lt;/SPAN&gt;(lo_columns) = go_salv-&amp;gt;get_columns( ).
      lo_columns-&amp;gt;set_optimize( abap_true ).
      
      &lt;SPAN&gt;" Set column labels&lt;/SPAN&gt;
      &lt;SPAN&gt;DATA&lt;/SPAN&gt;(lo_column) = &lt;SPAN&gt;CAST&lt;/SPAN&gt; cl_salv_column_table( lo_columns-&amp;gt;get_column( &lt;SPAN&gt;'EBELN'&lt;/SPAN&gt; ) ).
      lo_column-&amp;gt;set_long_text( &lt;SPAN&gt;'Purchase Order'&lt;/SPAN&gt; ).
      lo_column-&amp;gt;set_medium_text( &lt;SPAN&gt;'PO Number'&lt;/SPAN&gt; ).
      lo_column-&amp;gt;set_short_text( &lt;SPAN&gt;'PO'&lt;/SPAN&gt; ).
      
      lo_column = &lt;SPAN&gt;CAST&lt;/SPAN&gt; cl_salv_column_table( lo_columns-&amp;gt;get_column( &lt;SPAN&gt;'EBELP'&lt;/SPAN&gt; ) ).
      lo_column-&amp;gt;set_long_text( &lt;SPAN&gt;'Item Number'&lt;/SPAN&gt; ).
      
      lo_column = &lt;SPAN&gt;CAST&lt;/SPAN&gt; cl_salv_column_table( lo_columns-&amp;gt;get_column( &lt;SPAN&gt;'TXZ01'&lt;/SPAN&gt; ) ).
      lo_column-&amp;gt;set_long_text( &lt;SPAN&gt;'Short Text'&lt;/SPAN&gt; ).
      
      lo_column = &lt;SPAN&gt;CAST&lt;/SPAN&gt; cl_salv_column_table( lo_columns-&amp;gt;get_column( &lt;SPAN&gt;'MENGE'&lt;/SPAN&gt; ) ).
      lo_column-&amp;gt;set_long_text( &lt;SPAN&gt;'Quantity'&lt;/SPAN&gt; ).
      
      lo_column = &lt;SPAN&gt;CAST&lt;/SPAN&gt; cl_salv_column_table( lo_columns-&amp;gt;get_column( &lt;SPAN&gt;'NETWR'&lt;/SPAN&gt; ) ).
      lo_column-&amp;gt;set_long_text( &lt;SPAN&gt;'Net Value'&lt;/SPAN&gt; ).
      
      &lt;SPAN&gt;" Enable standard functions (toolbar buttons)&lt;/SPAN&gt;
      &lt;SPAN&gt;DATA&lt;/SPAN&gt;(lo_functions) = go_salv-&amp;gt;get_functions( ).
      lo_functions-&amp;gt;set_all( abap_true ).
      
      &lt;SPAN&gt;" Add custom SAVE button&lt;/SPAN&gt;
      &lt;SPAN&gt;TRY&lt;/SPAN&gt;.
          lo_functions-&amp;gt;add_function(
            name     = &lt;SPAN&gt;'SAVE'&lt;/SPAN&gt;
            icon     = &lt;SPAN&gt;'@2L@'&lt;/SPAN&gt;
            text     = &lt;SPAN&gt;'Save'&lt;/SPAN&gt;
            tooltip  = &lt;SPAN&gt;'Save changes'&lt;/SPAN&gt;
            position = if_salv_c_function_position=&amp;gt;right_of_salv_functions ).
        &lt;SPAN&gt;CATCH&lt;/SPAN&gt; cx_salv_existing cx_salv_wrong_call.
      &lt;SPAN&gt;ENDTRY&lt;/SPAN&gt;.
      
      &lt;SPAN&gt;" Register event handler for toolbar buttons&lt;/SPAN&gt;
      &lt;SPAN&gt;DATA&lt;/SPAN&gt;(lo_events) = go_salv-&amp;gt;get_event( ).
      &lt;SPAN&gt;SET HANDLER&lt;/SPAN&gt; lcl_event_handler=&amp;gt;on_user_command &lt;SPAN&gt;FOR&lt;/SPAN&gt; lo_events.
      
      &lt;SPAN&gt;" *** ENABLE EDITING - Two approaches depending on your release ***&lt;/SPAN&gt;
      
      &lt;SPAN&gt;" Approach 1: For SAP NetWeaver 7.56+ and S/4HANA (Official API)&lt;/SPAN&gt;
      &lt;SPAN&gt;TRY&lt;/SPAN&gt;.
          &lt;SPAN&gt;DATA&lt;/SPAN&gt;(lo_editable) = go_salv-&amp;gt;extended_grid_api( )-&amp;gt;editable_restricted( ).
          
          &lt;SPAN&gt;" Make specific columns editable&lt;/SPAN&gt;
          lo_editable-&amp;gt;set_attributes_for_columnname(
            columnname              = &lt;SPAN&gt;'TXZ01'&lt;/SPAN&gt;
            all_cells_input_enabled = abap_true ).
          
          lo_editable-&amp;gt;set_attributes_for_columnname(
            columnname              = &lt;SPAN&gt;'MENGE'&lt;/SPAN&gt;
            all_cells_input_enabled = abap_true ).
          
          lo_editable-&amp;gt;set_attributes_for_columnname(
            columnname              = &lt;SPAN&gt;'NETWR'&lt;/SPAN&gt;
            all_cells_input_enabled = abap_true ).
          
        &lt;SPAN&gt;CATCH&lt;/SPAN&gt; cx_salv_error &lt;SPAN&gt;INTO DATA&lt;/SPAN&gt;(lx_error).
          &lt;SPAN&gt;" If extended_grid_api is not available, use Approach 2&lt;/SPAN&gt;
          &lt;SPAN&gt;MESSAGE&lt;/SPAN&gt; lx_error-&amp;gt;get_text( ) &lt;SPAN&gt;TYPE&lt;/SPAN&gt; &lt;SPAN&gt;'I'&lt;/SPAN&gt;.
      &lt;SPAN&gt;ENDTRY&lt;/SPAN&gt;.
      
      &lt;SPAN&gt;" Display the grid&lt;/SPAN&gt;
      go_salv-&amp;gt;display( ).
      
    &lt;SPAN&gt;CATCH&lt;/SPAN&gt; cx_salv_msg &lt;SPAN&gt;INTO DATA&lt;/SPAN&gt;(lx_msg).
      &lt;SPAN&gt;MESSAGE&lt;/SPAN&gt; lx_msg-&amp;gt;get_text( ) &lt;SPAN&gt;TYPE&lt;/SPAN&gt; &lt;SPAN&gt;'E'&lt;/SPAN&gt;.
  &lt;SPAN&gt;ENDTRY&lt;/SPAN&gt;.
  
&lt;SPAN&gt;ENDFORM&lt;/SPAN&gt;.&lt;/CODE&gt;&lt;/PRE&gt;&lt;DIV&gt;&lt;H3&gt;&lt;span class="lia-unicode-emoji" title=":warning:"&gt;⚠️&lt;/span&gt; Important Note&lt;/H3&gt;&lt;P&gt;Direct modification of standard tables like &lt;STRONG&gt;EKPO&lt;/STRONG&gt; is not recommended in S/4HANA due to data integrity concerns. Use appropriate BAPIs (e.g., &lt;CODE&gt;BAPI_PO_CHANGE&lt;/CODE&gt;) or implement a RAP-based service for production scenarios.&lt;/P&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;H2&gt;Key Implementation Points&lt;/H2&gt;&lt;DIV&gt;&lt;H3&gt;✓ Modern Syntax Usage&lt;/H3&gt;&lt;UL&gt;&lt;LI&gt;Inline declarations with &lt;CODE&gt;DATA(variable)&lt;/CODE&gt; reduce code verbosity&lt;/LI&gt;&lt;LI&gt;Host variable escaping with &lt;CODE&gt;@&lt;/CODE&gt; is mandatory in S/4HANA SELECT statements&lt;/LI&gt;&lt;LI&gt;&lt;CODE&gt;CAST&lt;/CODE&gt; operator for type casting&lt;/LI&gt;&lt;/UL&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;H3&gt;✓ Editable Columns&lt;/H3&gt;&lt;UL&gt;&lt;LI&gt;Uses the official &lt;CODE&gt;extended_grid_api()&lt;/CODE&gt; method available in SAP NetWeaver 7.56+ and all S/4HANA releases&lt;/LI&gt;&lt;LI&gt;Only specific columns (&lt;STRONG&gt;TXZ01&lt;/STRONG&gt;, &lt;STRONG&gt;MENGE&lt;/STRONG&gt;, &lt;STRONG&gt;NETWR&lt;/STRONG&gt;) are set as editable&lt;/LI&gt;&lt;/UL&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;H3&gt;✓ Event Handling&lt;/H3&gt;&lt;UL&gt;&lt;LI&gt;Custom toolbar button (&lt;STRONG&gt;SAVE&lt;/STRONG&gt;) triggers the &lt;CODE&gt;on_user_command&lt;/CODE&gt; event&lt;/LI&gt;&lt;LI&gt;The &lt;CODE&gt;on_data_changed&lt;/CODE&gt; event allows validation before data is written to the internal table&lt;/LI&gt;&lt;/UL&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;</description>
      <pubDate>Tue, 30 Dec 2025 16:03:51 GMT</pubDate>
      <guid>https://community.sap.com/t5/technology-q-a/editable-alv-report/qaa-p/14299718#M4934342</guid>
      <dc:creator>nmirandaghn</dc:creator>
      <dc:date>2025-12-30T16:03:51Z</dc:date>
    </item>
    <item>
      <title>Re: editable alv report</title>
      <link>https://community.sap.com/t5/technology-q-a/editable-alv-report/qaa-p/14299719#M4934343</link>
      <description>&lt;P&gt;*&amp;amp;---------------------------------------------------------------------*&lt;BR /&gt;*&amp;amp; Report Z_EKPO_EDITABLE_SALV&lt;BR /&gt;*&amp;amp;---------------------------------------------------------------------*&lt;BR /&gt;*&amp;amp; Purpose: Display Purchase Order Items (EKPO) with editable columns&lt;BR /&gt;*&amp;amp; using CL_SALV_TABLE and modern ABAP 7.5+ syntax&lt;BR /&gt;*&amp;amp;---------------------------------------------------------------------*&lt;BR /&gt;REPORT z_ekpo_editable_salv.&lt;/P&gt;&lt;P&gt;*----------------------------------------------------------------------*&lt;BR /&gt;* Type Definitions&lt;BR /&gt;*----------------------------------------------------------------------*&lt;BR /&gt;TYPES: BEGIN OF ty_ekpo,&lt;BR /&gt;ebeln TYPE ekpo-ebeln, " Purchase Order Number&lt;BR /&gt;ebelp TYPE ekpo-ebelp, " PO Item Number&lt;BR /&gt;aedat TYPE ekpo-aedat, " Change Date&lt;BR /&gt;txz01 TYPE ekpo-txz01, " Short Text (Editable)&lt;BR /&gt;matnr TYPE ekpo-matnr, " Material Number&lt;BR /&gt;menge TYPE ekpo-menge, " Quantity (Editable)&lt;BR /&gt;netwr TYPE ekpo-netwr, " Net Value (Editable)&lt;BR /&gt;END OF ty_ekpo.&lt;/P&gt;&lt;P&gt;*----------------------------------------------------------------------*&lt;BR /&gt;* Selection Screen&lt;BR /&gt;*----------------------------------------------------------------------*&lt;BR /&gt;SELECT-OPTIONS: s_ebeln FOR ekpo-ebeln.&lt;/P&gt;&lt;P&gt;*----------------------------------------------------------------------*&lt;BR /&gt;* Global Variables&lt;BR /&gt;*----------------------------------------------------------------------*&lt;BR /&gt;DATA: gt_ekpo TYPE STANDARD TABLE OF ty_ekpo,&lt;BR /&gt;go_salv TYPE REF TO cl_salv_table,&lt;BR /&gt;go_grid TYPE REF TO cl_gui_alv_grid.&lt;/P&gt;&lt;P&gt;*----------------------------------------------------------------------*&lt;BR /&gt;* Event Handler Class&lt;BR /&gt;*----------------------------------------------------------------------*&lt;BR /&gt;CLASS lcl_event_handler DEFINITION.&lt;BR /&gt;PUBLIC SECTION.&lt;BR /&gt;CLASS-METHODS:&lt;BR /&gt;" Handle toolbar button events&lt;BR /&gt;on_user_command FOR EVENT added_function OF cl_salv_events&lt;BR /&gt;IMPORTING e_salv_function,&lt;BR /&gt;&lt;BR /&gt;" Handle data changes in the grid&lt;BR /&gt;on_data_changed FOR EVENT data_changed OF cl_gui_alv_grid&lt;BR /&gt;IMPORTING er_data_changed.&lt;BR /&gt;ENDCLASS.&lt;/P&gt;&lt;P&gt;CLASS lcl_event_handler IMPLEMENTATION.&lt;BR /&gt;&lt;BR /&gt;METHOD on_user_command.&lt;BR /&gt;CASE e_salv_function.&lt;BR /&gt;WHEN 'SAVE'.&lt;BR /&gt;" Trigger grid to flush changes to internal table&lt;BR /&gt;CALL METHOD go_grid-&amp;gt;check_changed_data.&lt;BR /&gt;&lt;BR /&gt;" Here you would implement your save logic&lt;BR /&gt;" For standard tables like EKPO, use BAPIs or RAP instead of direct MODIFY&lt;BR /&gt;MESSAGE 'Data saved successfully (use BAPI in production)' TYPE 'S'.&lt;BR /&gt;&lt;BR /&gt;WHEN OTHERS.&lt;BR /&gt;ENDCASE.&lt;BR /&gt;ENDMETHOD.&lt;BR /&gt;&lt;BR /&gt;METHOD on_data_changed.&lt;BR /&gt;" This event is triggered when user modifies cells&lt;BR /&gt;" You can add custom validations here&lt;BR /&gt;DATA(lt_modified) = er_data_changed-&amp;gt;mt_good_cells.&lt;BR /&gt;&lt;BR /&gt;LOOP AT lt_modified INTO DATA(ls_mod).&lt;BR /&gt;" Add your validation logic here&lt;BR /&gt;" Example: Check if quantity is positive&lt;BR /&gt;IF ls_mod-fieldname = 'MENGE'.&lt;BR /&gt;DATA(lv_value) = CONV menge_d( ls_mod-value ).&lt;BR /&gt;IF lv_value &amp;lt;= 0.&lt;BR /&gt;" Flag error&lt;BR /&gt;er_data_changed-&amp;gt;add_protocol_entry(&lt;BR /&gt;i_msgid = '00'&lt;BR /&gt;i_msgno = '001'&lt;BR /&gt;i_msgty = 'E'&lt;BR /&gt;i_msgv1 = 'Quantity must be positive'&lt;BR /&gt;i_fieldname = ls_mod-fieldname&lt;BR /&gt;i_row_id = ls_mod-row_id ).&lt;BR /&gt;ENDIF.&lt;BR /&gt;ENDIF.&lt;BR /&gt;ENDLOOP.&lt;BR /&gt;ENDMETHOD.&lt;BR /&gt;&lt;BR /&gt;ENDCLASS.&lt;/P&gt;&lt;P&gt;*----------------------------------------------------------------------*&lt;BR /&gt;* START-OF-SELECTION&lt;BR /&gt;*----------------------------------------------------------------------*&lt;BR /&gt;START-OF-SELECTION.&lt;BR /&gt;PERFORM select_data.&lt;BR /&gt;PERFORM display_alv.&lt;/P&gt;&lt;P&gt;*----------------------------------------------------------------------*&lt;BR /&gt;* FORM select_data&lt;BR /&gt;*----------------------------------------------------------------------*&lt;BR /&gt;FORM select_data.&lt;BR /&gt;&lt;BR /&gt;" Modern inline declaration with host variable escaping (@)&lt;BR /&gt;SELECT ebeln, ebelp, aedat, txz01, matnr, menge, netwr&lt;BR /&gt;FROM ekpo&lt;BR /&gt;WHERE ebeln IN @s_ebeln&lt;BR /&gt;INTO TABLE @gt_ekpo&lt;BR /&gt;UP TO 100 ROWS.&lt;BR /&gt;&lt;BR /&gt;IF sy-subrc &amp;lt;&amp;gt; 0.&lt;BR /&gt;MESSAGE 'No data found' TYPE 'I'.&lt;BR /&gt;LEAVE LIST-PROCESSING.&lt;BR /&gt;ENDIF.&lt;BR /&gt;&lt;BR /&gt;ENDFORM.&lt;/P&gt;&lt;P&gt;*----------------------------------------------------------------------*&lt;BR /&gt;* FORM display_alv&lt;BR /&gt;*----------------------------------------------------------------------*&lt;BR /&gt;FORM display_alv.&lt;BR /&gt;&lt;BR /&gt;TRY.&lt;BR /&gt;" Create SALV instance using factory method&lt;BR /&gt;cl_salv_table=&amp;gt;factory(&lt;BR /&gt;IMPORTING&lt;BR /&gt;r_salv_table = go_salv&lt;BR /&gt;CHANGING&lt;BR /&gt;t_table = gt_ekpo ).&lt;BR /&gt;&lt;BR /&gt;" Configure columns&lt;BR /&gt;DATA(lo_columns) = go_salv-&amp;gt;get_columns( ).&lt;BR /&gt;lo_columns-&amp;gt;set_optimize( abap_true ).&lt;BR /&gt;&lt;BR /&gt;" Set column labels&lt;BR /&gt;DATA(lo_column) = CAST cl_salv_column_table( lo_columns-&amp;gt;get_column( 'EBELN' ) ).&lt;BR /&gt;lo_column-&amp;gt;set_long_text( 'Purchase Order' ).&lt;BR /&gt;lo_column-&amp;gt;set_medium_text( 'PO Number' ).&lt;BR /&gt;lo_column-&amp;gt;set_short_text( 'PO' ).&lt;BR /&gt;&lt;BR /&gt;lo_column = CAST cl_salv_column_table( lo_columns-&amp;gt;get_column( 'EBELP' ) ).&lt;BR /&gt;lo_column-&amp;gt;set_long_text( 'Item Number' ).&lt;BR /&gt;&lt;BR /&gt;lo_column = CAST cl_salv_column_table( lo_columns-&amp;gt;get_column( 'TXZ01' ) ).&lt;BR /&gt;lo_column-&amp;gt;set_long_text( 'Short Text' ).&lt;BR /&gt;&lt;BR /&gt;lo_column = CAST cl_salv_column_table( lo_columns-&amp;gt;get_column( 'MENGE' ) ).&lt;BR /&gt;lo_column-&amp;gt;set_long_text( 'Quantity' ).&lt;BR /&gt;&lt;BR /&gt;lo_column = CAST cl_salv_column_table( lo_columns-&amp;gt;get_column( 'NETWR' ) ).&lt;BR /&gt;lo_column-&amp;gt;set_long_text( 'Net Value' ).&lt;BR /&gt;&lt;BR /&gt;" Enable standard functions (toolbar buttons)&lt;BR /&gt;DATA(lo_functions) = go_salv-&amp;gt;get_functions( ).&lt;BR /&gt;lo_functions-&amp;gt;set_all( abap_true ).&lt;BR /&gt;&lt;BR /&gt;" Add custom SAVE button&lt;BR /&gt;TRY.&lt;BR /&gt;lo_functions-&amp;gt;add_function(&lt;BR /&gt;name = 'SAVE'&lt;BR /&gt;icon = '@2L@'&lt;BR /&gt;text = 'Save'&lt;BR /&gt;tooltip = 'Save changes'&lt;BR /&gt;position = if_salv_c_function_position=&amp;gt;right_of_salv_functions ).&lt;BR /&gt;CATCH cx_salv_existing cx_salv_wrong_call.&lt;BR /&gt;ENDTRY.&lt;BR /&gt;&lt;BR /&gt;" Register event handler for toolbar buttons&lt;BR /&gt;DATA(lo_events) = go_salv-&amp;gt;get_event( ).&lt;BR /&gt;SET HANDLER lcl_event_handler=&amp;gt;on_user_command FOR lo_events.&lt;BR /&gt;&lt;BR /&gt;" *** ENABLE EDITING - Two approaches depending on your release ***&lt;BR /&gt;&lt;BR /&gt;" Approach 1: For SAP NetWeaver 7.56+ and S/4HANA (Official API)&lt;BR /&gt;TRY.&lt;BR /&gt;DATA(lo_editable) = go_salv-&amp;gt;extended_grid_api( )-&amp;gt;editable_restricted( ).&lt;BR /&gt;&lt;BR /&gt;" Make specific columns editable&lt;BR /&gt;lo_editable-&amp;gt;set_attributes_for_columnname(&lt;BR /&gt;columnname = 'TXZ01'&lt;BR /&gt;all_cells_input_enabled = abap_true ).&lt;BR /&gt;&lt;BR /&gt;lo_editable-&amp;gt;set_attributes_for_columnname(&lt;BR /&gt;columnname = 'MENGE'&lt;BR /&gt;all_cells_input_enabled = abap_true ).&lt;BR /&gt;&lt;BR /&gt;lo_editable-&amp;gt;set_attributes_for_columnname(&lt;BR /&gt;columnname = 'NETWR'&lt;BR /&gt;all_cells_input_enabled = abap_true ).&lt;BR /&gt;&lt;BR /&gt;CATCH cx_salv_error INTO DATA(lx_error).&lt;BR /&gt;" If extended_grid_api is not available, use Approach 2&lt;BR /&gt;MESSAGE lx_error-&amp;gt;get_text( ) TYPE 'I'.&lt;BR /&gt;ENDTRY.&lt;BR /&gt;&lt;BR /&gt;" Approach 2: Access underlying CL_GUI_ALV_GRID (for older releases)&lt;BR /&gt;" Uncomment if Approach 1 fails&lt;BR /&gt;* DATA: lo_grid_adapter TYPE REF TO cl_salv_gui_table_ida.&lt;BR /&gt;* go_grid ?= go_salv-&amp;gt;r_controller_r_table-&amp;gt;r_model-&amp;gt;r_grid.&lt;BR /&gt;*&lt;BR /&gt;* IF go_grid IS BOUND.&lt;BR /&gt;* " Set grid to input-ready mode&lt;BR /&gt;* go_grid-&amp;gt;set_ready_for_input( 1 ).&lt;BR /&gt;*&lt;BR /&gt;* " Register data change event&lt;BR /&gt;* go_grid-&amp;gt;register_edit_event( cl_gui_alv_grid=&amp;gt;mc_evt_modified ).&lt;BR /&gt;* SET HANDLER lcl_event_handler=&amp;gt;on_data_changed FOR go_grid.&lt;BR /&gt;*&lt;BR /&gt;* " Define which columns are editable via field catalog&lt;BR /&gt;* go_grid-&amp;gt;get_frontend_fieldcatalog( IMPORTING et_fieldcatalog = DATA(lt_fcat) ).&lt;BR /&gt;* LOOP AT lt_fcat ASSIGNING FIELD-SYMBOL(&amp;lt;fs_fcat&amp;gt;).&lt;BR /&gt;* CASE &amp;lt;fs_fcat&amp;gt;-fieldname.&lt;BR /&gt;* WHEN 'TXZ01' OR 'MENGE' OR 'NETWR'.&lt;BR /&gt;* &amp;lt;fs_fcat&amp;gt;-edit = abap_true.&lt;BR /&gt;* ENDCASE.&lt;BR /&gt;* ENDLOOP.&lt;BR /&gt;* go_grid-&amp;gt;set_frontend_fieldcatalog( lt_fcat ).&lt;BR /&gt;* ENDIF.&lt;BR /&gt;&lt;BR /&gt;" Display the grid&lt;BR /&gt;go_salv-&amp;gt;display( ).&lt;BR /&gt;&lt;BR /&gt;CATCH cx_salv_msg INTO DATA(lx_msg).&lt;BR /&gt;MESSAGE lx_msg-&amp;gt;get_text( ) TYPE 'E'.&lt;BR /&gt;ENDTRY.&lt;BR /&gt;&lt;BR /&gt;ENDFORM.&lt;/P&gt;</description>
      <pubDate>Tue, 30 Dec 2025 16:08:13 GMT</pubDate>
      <guid>https://community.sap.com/t5/technology-q-a/editable-alv-report/qaa-p/14299719#M4934343</guid>
      <dc:creator>nmirandaghn</dc:creator>
      <dc:date>2025-12-30T16:08:13Z</dc:date>
    </item>
  </channel>
</rss>

