Application Development Blog Posts
Learn and share on deeper, cross technology development topics such as integration and connectivity, automation, cloud extensibility, developing at scale, and security.
cancel
Showing results for 
Search instead for 
Did you mean: 
Victor_f
Explorer
I have been looking in the forums for ways of making a CL_GUI_ALV_GRID grid editable for the user in a way that whatever value they put in the cells gets registered in the iternal table being displayed on that ALV, but most of the content I found were solutions using the FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC', but in my case I couldn't use this function module because the program I was editing was already buit with CL_GUI_ALV_GRID, so I had to find out by myself (and with a little help from ChatGPT).


This is how it looks like


Here is the code I wrote. Don't forget to add a button with code 'SWITCH' for calling the f_switch_edit_mode  subroutine.
*&---------------------------------------------------------------------*
*& Report Z_EDITABLE_ALV_GRID - Made with help of ChatGPT
*&---------------------------------------------------------------------*

REPORT z_editable_alv_grid.

* Types----------------------------------------------------------------*
TYPES BEGIN OF y_orders_c.
TYPES mu TYPE mseg-erfme.
TYPES quant TYPE mseg-lsmng.
TYPES quant2 TYPE mseg-lsmng. "make editable
TYPES mu2 TYPE mseg-lsmeh.
TYPES celltab TYPE lvc_t_styl.
TYPES END OF y_orders_c.

* Declare local variables----------------------------------------------*
DATA: lo_grid TYPE REF TO cl_gui_alv_grid,
lt_fieldcat TYPE lvc_t_fcat,
lt_data TYPE TABLE OF y_orders_c.

DATA: gs_alv_layout TYPE lvc_s_layo .

DATA: e_cell_type TYPE lvc_s_styl.

DATA e_orders_c TYPE y_orders_c.

START-OF-SELECTION.

CALL SCREEN 100.

MODULE show_orders OUTPUT.

IF NOT lo_grid IS BOUND.

* Populate field catalog-----------------------------------------------*
PERFORM f_fieldcat USING lt_data[]
CHANGING lt_fieldcat.
LOOP AT lt_fieldcat ASSIGNING FIELD-SYMBOL(<fs_fieldcat>).

CASE <fs_fieldcat>-fieldname.
WHEN 'MU'.
<fs_fieldcat>-coltext = 'MU'.
WHEN 'QUANT'.
<fs_fieldcat>-coltext = 'Original qtd.'.
WHEN 'QUANT2'.
<fs_fieldcat>-edit = 'X'. "Set field to editable
<fs_fieldcat>-coltext = 'New qtd.'.
WHEN 'MU2'.
<fs_fieldcat>-coltext = 'New MU'.
ENDCASE.
ENDLOOP.

* Layout options-------------------------------------------------------*
CLEAR gs_alv_layout.
MOVE abap_true TO: gs_alv_layout-cwidth_opt,
gs_alv_layout-zebra,
gs_alv_layout-col_opt.
gs_alv_layout-stylefname = 'CELLTAB'.


* Populate data--------------------------------------------------------*
e_orders_c-mu = 'KG'.
e_orders_c-quant = '2000'.
e_orders_c-quant2 = '2'.
e_orders_c-mu2 = 'TO'.
APPEND e_orders_c TO lt_data.

CLEAR e_orders_c-mu.
e_orders_c-mu = 'KG'.
e_orders_c-quant = '7000'.
e_orders_c-quant2 = '7'.
e_orders_c-mu2 = 'TO'.
APPEND e_orders_c TO lt_data.

CLEAR e_orders_c-mu.
e_orders_c-mu = 'KG'.
e_orders_c-quant = '15000'.
e_orders_c-quant2 = '15'.
e_orders_c-mu2 = 'TO'.
APPEND e_orders_c TO lt_data.

CLEAR e_orders_c-mu.
e_orders_c-mu = 'KG'.
e_orders_c-quant = '2500'.
e_orders_c-quant2 = '2.5'.
e_orders_c-mu2 = 'TO'.
APPEND e_orders_c TO lt_data.

CLEAR e_orders_c-mu.
e_orders_c-mu = 'KG'.
e_orders_c-quant = '1000'.
e_orders_c-quant2 = '1'.
e_orders_c-mu2 = 'TO'.
APPEND e_orders_c TO lt_data.


* Create ALV grid and display------------------------------------------*
CREATE OBJECT lo_grid
EXPORTING
i_parent = cl_gui_container=>screen0.

CALL METHOD lo_grid->set_table_for_first_display
EXPORTING
i_structure_name = 'LT_DATA'
is_layout = gs_alv_layout
CHANGING
it_outtab = lt_data
it_fieldcatalog = lt_fieldcat.

* Register event for cell editing--------------------------------------*
CALL METHOD lo_grid->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_enter
EXCEPTIONS
error = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

ELSE.
PERFORM f_update_grid USING lo_grid.
ENDIF.

ENDMODULE. " SHOW_ORDERS OUTPUT


*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
SET PF-STATUS 'STATS100'.
* SET TITLEBAR 'your title here'.
ENDMODULE. "status_0100


*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
CASE sy-ucomm.
WHEN 'BACK' OR 'EXIT' OR 'CANCEL'.
LEAVE TO SCREEN '0'.
WHEN 'SWITCH'.
PERFORM f_switch_edit_mode.
WHEN OTHERS.
* do nothing
ENDCASE.
ENDMODULE. "user_command_0100


*&---------------------------------------------------------------------*
*& Form F_FIELDCAT
*&---------------------------------------------------------------------*
FORM f_fieldcat USING pt_table TYPE ANY TABLE
CHANGING pt_fieldcat TYPE lvc_t_fcat.

DATA:
lr_tabdescr TYPE REF TO cl_abap_structdescr,
lr_data TYPE REF TO data,
lt_dfies TYPE ddfields,
ls_dfies TYPE dfies,
ls_fieldcat TYPE lvc_s_fcat.

CLEAR pt_fieldcat.

CREATE DATA lr_data LIKE LINE OF pt_table.
lr_tabdescr ?= cl_abap_structdescr=>describe_by_data_ref( lr_data ).
lt_dfies = cl_salv_data_descr=>read_structdescr( lr_tabdescr ).

LOOP AT lt_dfies INTO ls_dfies.
CLEAR ls_fieldcat.
MOVE-CORRESPONDING ls_dfies TO ls_fieldcat.
APPEND ls_fieldcat TO pt_fieldcat.
ENDLOOP.
ENDFORM. "f_fieldcat


*&---------------------------------------------------------------------*
*& Form SWITCH_EDIT_MODE
*&---------------------------------------------------------------------*
FORM f_switch_edit_mode.

IF lo_grid->is_ready_for_input( ) EQ 0.
* set edit enabled cells ready for input
CALL METHOD lo_grid->set_ready_for_input
EXPORTING
i_ready_for_input = 1.

ELSE.
* lock edit enabled cells against input
CALL METHOD lo_grid->set_ready_for_input
EXPORTING
i_ready_for_input = 0.
ENDIF.
ENDFORM. " f_switch_edit_mode


*&---------------------------------------------------------------------*
*& Form F_UPDATE_GRID
*&---------------------------------------------------------------------*
FORM f_update_grid USING p_grid TYPE REF TO cl_gui_alv_grid.

DATA vl_stable TYPE lvc_s_stbl.

CHECK p_grid IS BOUND.

CLEAR vl_stable.
MOVE abap_true TO:
vl_stable-col,
vl_stable-row.

CALL METHOD p_grid->refresh_table_display
EXPORTING
is_stable = vl_stable
EXCEPTIONS
OTHERS = 99.

IF sy-subrc NE 0.
RETURN.
ENDIF.

ENDFORM. "f_update_grid

Code for the screen being called:
PROCESS BEFORE OUTPUT.
MODULE status_0100.
MODULE show_orders.

PROCESS AFTER INPUT.
MODULE user_command_0100.

 

I hope it becomes useful for someone out there 😄

Edit: forgot to add the image lol
10 Comments