Application Development Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 

ALV -------- editable column

Former Member
0 Kudos

Hi expert,

Have any idea 'how do i make any column of an ALV report editable?

I donot have any idea.tell me possible or not.

Thanks in advance

Debjani Lahiri

1 ACCEPTED SOLUTION

Former Member
0 Kudos

Hi Debjani,

kindly dont use those old function modules any more -- they've all been "deprecated" or in other words made obsolete by the new OO class cl_gui_alv_grid.

Using classes you can easily define dynamic tables, dynamic fcats, have editable grids for data entry etc etc.

Here's a program using OO which gives you all the functionality.



PROGRAM zdynfieldcat.
class zcltest definition deferred. "For field symbol reference.

* The ultimate ALV program

* this program demos the following
* 1) Build Dynamic ITAB with fields NOT defined in DDIC
* 2) Build Dynamic FieldCat. Table structure is obtained *via
* the new RTTI functionality
* 3) Add the CELL colour table as a deep structure to our dynamic table
* so we can colour individual cells.
* 4) Inherit a class so protected attributes
* of class cl_gui_alv_grid
* can be accessed
* 5) Add events so we can can program functionality when * the user presses 
* the ENTER key,
* or selects an action from the toolbar.
* 6) Display one line of a grid from our dynamic table with some cells coloured.
* 6) Set the Grid editable.
* 7) if user enters data then colou
* cells of entered data.
* 😎 show contents of new table 
* after all data has been entered.

* To use program copy the source and
* Create a blank screen 100 with a
* custom container called CCONTAINER1.
* with the screen logic shown below
* As we are using EVENTS we actually
* don't need a PAI module so it
* doesn't contain any code.

*PROCESS BEFORE OUTPUT.
* MODULE STATUS_0100.
*
*PROCESS AFTER INPUT.
* MODULE USER_COMMAND_0100
*
* James Hawthorne

* Define field symbols as these can't be defined in classes

field-symbols: <dyn_table> type standard table,
<g2> type ref to zcltest,
<g1> type ref to cl_gui_custom_container,
<data_changed> type ref to cl_alv_changed_data_protocol,
<actual_tab> type standard table,
<outtab> type table,
<fs1> type ANY,
<FS2> TYPE TABLE,
<fs3> type table,
<fs4> type table,
<fs5> type table,
<wa_dyn_table> TYPE ANY,
<w_field1> type any,
<w_field2> type any,
<w_field3> type any,
<w_field4> type any,
<w_field5> type any,
<t_colours> type any,
<t_clrs> type line of lvc_t_scol,
<t_cellcolors> TYPE lvc_t_scol,
<t_cellcolors1> type lvc_t_scol.


class zcltest definition inheriting from cl_gui_alv_grid.

public section.

types: g4 type ref to cl_gui_custom_container.
types: g3 type ref to cl_alv_changed_data_protocol.
data: i_parent type g4,
lr_rtti_struc TYPE REF TO cl_abap_structdescr, "RTTI
zog like line of lr_rtti_struc->components. "RTTI
types: struc like zog.
types: struc1 type table of struc.

methods:
constructor
importing i_parent type g4,
disp_tab
importing p_er_data_changed type g3,

create_dynamic_fcat
importing zogt type struc1
exporting it_fldcat type lvc_t_fcat.
Protected section.

private section.
data: stab type ref to data,
wa_it_fldcat type lvc_s_fcat,
c_index type sy-index,
lt_good_cells type lvc_t_modi,
ls_good type lvc_s_modi,
ls_good_cells type lvc_s_modi,
et_good_cells type LVC_T_MODI,
e_row type i,
e_value type c,
e_col type i,
es_row_id type lvc_s_row,
es_col_id type lvc_s_col,
es_row_no type LVC_S_ROID,
wa_cellcolors TYPE LINE OF lvc_t_scol,
wa_modified_cells type line of LVC_T_MODI,
es_layout type LVC_S_LAYO.

endclass.

class zcltest implementation.
METHOD constructor.

CALL METHOD super->constructor
EXPORTING
i_appl_events = 'X'
i_parent = i_parent.

endmethod.

method disp_tab.
* mt_outtab is the data table held 
* as a protected attribute
* in class cl_gui_alv_grid.
assign me->mt_outtab->* TO <outtab>. "Original data
assign p_er_data_changed->mp_mod_rows TO <FS1>.
stab = p_er_data_changed->mp_mod_rows.
assign p_er_data_changed->mt_inserted_rows to <fs3>.
assign p_er_data_changed->mt_deleted_rows to <fs4>.
assign p_er_data_changed->mt_mod_cells to <fs5>.
assign stab->* TO <fs2>.


* some functions --chose what you want

* This method gets the last (or current cell)
call method me->get_current_cell
importing e_row = e_row
e_value = e_value
e_col = e_col
es_row_id = es_row_id
es_col_id = es_col_id
es_row_no = es_row_no.

* For an example let's change the colour
* of any data entered including
* inserted rows.
*
* Proceed as follows
*

* read table <fs5> which gives us the
* row number and field name of
* the modified cell(s) including inserted rows
*
* For deleted rows we don't have to do anything
*
* Update the cell's colour characteristic table

* remember we added a colour table
* to the dynamic data table we built
* note that it's a DEEP structure.

* On REFRESH the alv will look at the
* updated colour table for the cells.
* we don't actually have to modify the data table but just the colour
* table

* recapping

* 1) Create your Field catalog WITHOUT 
* the colour table for the ALV grid display
* 2) Add the colour table to a 2nd field catalog
* which you use to build the actual data
* dynamic table
* 3) add the name of the colour table to the layout
* (struct_grid_lset-ctab_fname 
* = 'T_CELLCOLORS')

* Refresh Grid and new cell colours will work


* now let's change the colour of the selected cells.

ASSIGN COMPONENT 'T_CELLCOLORS'
OF STRUCTURE <wa_dyn_table> TO <t_cellcolors1>.
loop at <fs5> into wa_modified_cells.


read table <dyn_table> into <wa_dyn_table> index wa_modified_cells-row_id.
case sy-subrc.
when 0.
read table <t_cellcolors1> into wa_cellcolors
with key fname = wa_modified_cells-fieldname.
if sy-subrc = 0.
if not wa_modified_cells-value is initial.
wa_cellcolors-fname = wa_modified_cells-fieldname.

wa_cellcolors-color-col = '5'.
MODIFY <t_cellcolors1> from wa_cellcolors .
endif.
else.
if not wa_modified_cells-value is initial.
wa_cellcolors-fname = wa_modified_cells-fieldname.

wa_cellcolors-color-col = '5'.
append wa_cellcolors to <t_cellcolors1>.
endif.
endif.

when others.
loop at <fs2> into <wa_dyn_table>.
append <wa_dyn_table> to <dyn_table>.
endloop.
read table <dyn_table> into <wa_dyn_table> index wa_modified_cells-row_id.
clear wa_cellcolors.
if not wa_modified_cells-value is initial.

wa_cellcolors-fname = wa_modified_cells-fieldname.

wa_cellcolors-color-col = 5.
append wa_cellcolors to <t_cellcolors1>.
endif.
endcase.


MODIFY <dyn_table> FROM <wa_dyn_table> index wa_modified_cells-row_id.


endloop.


endmethod.

method create_dynamic_fcat.
loop at zogt into zog.
c_index = c_index + 1.
clear wa_it_fldcat.

wa_it_fldcat-fieldname = zog-name .
wa_it_fldcat-datatype = zog-type_kind.
wa_it_fldcat-inttype = zog-type_kind.
wa_it_fldcat-intlen = zog-length.
wa_it_fldcat-decimals = zog-decimals.
wa_it_fldcat-coltext = zog-name.
wa_it_fldcat-lowercase = 'X'.
append wa_it_fldcat to it_fldcat .
endloop.
endmethod. "create_dynamic_fcat

endclass. "zcltest IMPLEMENTATION

class lcl_grid_event_receiver definition.

public section.
data: data_c type ref to cl_alv_changed_data_protocol.

methods:
handle_data_changed
for event data_changed of zcltest
importing er_data_changed,

handle_data_changed_finished
for event data_changed_finished of zcltest
importing E_MODIFIED
ET_GOOD_CELLS,


toolbar
for event toolbar of zcltest
importing e_object
e_interactive,

user_command
for event user_command of zcltest
importing e_ucomm.

endclass.


class lcl_grid_event_receiver implementation.
method handle_data_changed.

call method <g2>->disp_tab
EXPORTING
p_er_data_changed = er_data_changed.

endmethod. "handle_data_changed



method handle_data_changed_finished.

* at this point our data dynamic table
* <dyn_table> now contains the actual updated values from
* the grid including the cell color info create in the on data changed
* event method call AND IN THE CORRECT ORDER.
* use this method to update say SAP data bases or other
* data from the GRID entered data.
*
* Data entry validation can be done here as well.
*
* Enter your own code here.
.
endmethod.

method toolbar.


data : ls_toolbar type stb_button.
clear ls_toolbar.
<b>move 0 to ls_toolbar-butn_type.
<b>move 'EDIT' to ls_toolbar-function.
move space to ls_toolbar-disabled.
move 'Edit' to ls_toolbar-text.</b>
move icon_change_text to ls_toolbar-icon.
move 'Click2Edit' to ls_toolbar-quickinfo.
append ls_toolbar to e_object->mt_toolbar.</b>

clear ls_toolbar.
move 0 to ls_toolbar-butn_type.
move 'UPDA' to ls_toolbar-function.
move space to ls_toolbar-disabled.
move 'Update' to ls_toolbar-text.
move icon_system_save to ls_toolbar-icon.
move 'Click2Update' to ls_toolbar-quickinfo.
append ls_toolbar to e_object->mt_toolbar.

clear ls_toolbar.
move 0 to ls_toolbar-butn_type.
move 'EXIT' to ls_toolbar-function.
move space to ls_toolbar-disabled.
move 'Exit' to ls_toolbar-text.
move icon_system_end to ls_toolbar-icon.
move 'Click2Exit' to ls_toolbar-quickinfo.
append ls_toolbar to e_object->mt_toolbar.


endmethod. "toolbar

method user_command.

case e_ucomm .
when 'EDIT'. "From Tool bar
perform set_input.
perform refresh_disp.

when 'UPDA'. "From Tool bar
perform refresh_disp.

when 'EXIT'. "From Tool bar
leave program.

endcase.

endmethod. "user_command
endclass. "lcl_grid_event_receiver IMPLEMENTATION


* program data
*
include <icon>.
* define any old internal structure NOT in DDIC
types: begin of s_elements,
anyfield1(20) type c,
anyfield2(20) type c,
anyfield3(20) type c,
anyfield4(20) type c,
anyfield5(11) type n,
end of s_elements.

data: wa_element type s_elements,
wa_cellcolors TYPE LINE OF lvc_t_scol,

wa_data type s_elements,
wa_dyn_table TYPE REF TO data.


* Note new RTTI functionality allows field detail retrieval
* at runtime for dynamic tables.
data:
grid1 type ref to zcltest,
grid_handler type ref to lcl_grid_event_receiver,
c_dec2 type s_elements-anyfield5,
wa_it_fldcat type lvc_s_fcat,
it_fldcat type lvc_t_fcat,
it_fldcat1 type lvc_t_fcat,
lr_rtti_struc TYPE REF TO cl_abap_structdescr, "RTTI
lt_comp TYPE cl_abap_structdescr=>component_table,"RTTI
ls_comp LIKE LINE OF lt_comp, "RTTI
zog like line of lr_rtti_struc->components, "RTTI
struct_grid_lset type lvc_s_layo,
l_valid type c,
new_table type ref to data.
types: struc like zog,
col_tab type lvc_t_scol.


data: zogt type table of struc,
grid_container1 type ref to cl_gui_custom_container,
g_event_receiver type ref to lcl_grid_event_receiver,
ok_code like sy-ucomm,
t_colours type table of col_tab,
i4 type int4.

start-of-selection.
call screen 100.
module status_0100 output.

if grid_container1 is initial.

create object grid_container1
exporting
container_name = 'CCONTAINER1'.
assign grid_container1 to <g1>.
create object grid1
exporting i_parent = grid_container1.

* we need reference to this instance so we can use
* Methods etc of zcltest class and alv (superclass)
* in our event receiver class.

assign grid1 to <g2>.
create object grid_handler.

* set handler for events

set handler:
grid_handler->user_command for grid1,
grid_handler->toolbar for grid1,
grid_handler->handle_data_changed_finished for grid1.
perform register_enter_event. "For ENTER key press


* Get the Internal table structure
lr_rtti_struc ?= cl_abap_structdescr=>describe_by_data( wa_data ).

* Build field catalog just use basic data here
* colour specific columns as well
zogt[] = lr_rtti_struc->components.

call method grid1->create_dynamic_fcat
EXPORTING
zogt = zogt
IMPORTING
it_fldcat = it_fldcat.
* Save field cat without cell info deep structure for Grid
it_fldcat1[] = it_fldcat.
* now add deep structure for cell colour to field catalog
* for dynamic table creation
assign t_colours to <t_colours>.
wa_it_fldcat-fieldname = 'T_CELLCOLORS'.
wa_it_fldcat-ref_field = 'COLTAB'.
wa_it_fldcat-ref_table = 'CALENDAR_TYPE'.
* use this table as it has a DDIC built in ref structure for cell colour info

APPEND wa_it_fldcat TO it_fldcat1.
* Create dynamic internal table and assign to field symbol.
* Use dynamic field catalog just built.

call method cl_alv_table_create=>create_dynamic_table
EXPORTING
it_fieldcatalog = it_fldcat1
IMPORTING
ep_table = new_table.

perform populate_dynamic_itab.
perform init_grid.
i4 = 0.
call method grid1->set_ready_for_input
EXPORTING
i_ready_for_input = i4.
endif.
.
perform refresh_disp.

endmodule. "status_0100 OUTPUT

module user_command_0100 input.
*
*PAI not needed in OO ALV anymore as User Commands are handled as events
*in method user_command.
*
*we can also get control if the Data entered and the ENTER is pressed by
*raising an event.
* Control then returns to method handle_data_changed.
endmodule. "user_command_0100 INPUT

form populate_dynamic_itab.
* load up a line of the dynamic table
c_dec2 = c_dec2 + 11.
assign new_table->* to <dyn_table>.

create data wa_dyn_table like line of <dyn_table>.
assign wa_dyn_table->* to <wa_dyn_table>.

assign component 'ANYFIELD1' of structure <wa_dyn_table> to <w_field1>
.
<w_field1> = 'Tabbies'.
assign component 'ANYFIELD2' of structure <wa_dyn_table> to
<w_field2>.
<w_field2> = 'Ger Shepards'.
assign component 'ANYFIELD3' of structure <wa_dyn_table> to <w_field3>.
<w_field3> = 'White Mice'.

assign component 'ANYFIELD4' of structure <wa_dyn_table> to <w_field4>.
<w_field4> = 'Any old Text'.

assign component 'ANYFIELD5' of structure <wa_dyn_table> to <w_field5>.
<w_field5> = c_dec2..
APPEND <wa_dyn_table> TO <dyn_table>.


loop at <dyn_table> into <wa_dyn_table>.
clear wa_cellcolors.

ASSIGN COMPONENT 'T_CELLCOLORS'
OF STRUCTURE <wa_dyn_table> TO <t_cellcolors>.
wa_cellcolors-fname = 'ANYFIELD2'.
wa_cellcolors-color-col = '1'.
APPEND wa_cellcolors TO <t_cellcolors>.
clear wa_cellcolors.
wa_cellcolors-fname = 'ANYFIELD3'.
wa_cellcolors-color-col = '2'.
APPEND wa_cellcolors TO <t_cellcolors>.

clear wa_cellcolors.

wa_cellcolors-fname = 'ANYFIELD4'.

wa_cellcolors-color-col = '6'.
APPEND wa_cellcolors TO <t_cellcolors>.
MODIFY <dyn_table> FROM <wa_dyn_table>.


endloop.
endform. "populate_dynamic_itab
form exit_program.

call method grid_container1->free.
call method cl_gui_cfw=>flush.
leave program.

endform. "exit_program

form refresh_disp.

call method grid1->refresh_table_display.

endform. "refresh_disp

form set_input.
i4 = 1.
call method grid1->set_ready_for_input
EXPORTING
i_ready_for_input = i4.

endform. "set_input
form switch_input.
if i4 = 1.
i4 = 0.
else.
i4 = 1.
endif.
call method grid1->set_ready_for_input
EXPORTING
i_ready_for_input = i4.
endform. "switch_input
form init_grid.

* Enabling the grid to edit mode,
* Set ALV controls for cell coloring table.

struct_grid_lset-edit = 'X'. "To enable editing in ALV
struct_grid_lset-grid_title = 'Jimbos Test'.
struct_grid_lset-ctab_fname = 'T_CELLCOLORS'.
* struct_grid_lset-sel_mode = 'D'.

call method grid1->set_table_for_first_display
EXPORTING
is_layout = struct_grid_lset
CHANGING
it_outtab = <dyn_table>
it_fieldcatalog = it_fldcat.
endform. "init_grid
form register_enter_event.
call method grid1->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_enter.
* Instantiate the event or it won't work.
create object g_event_receiver.
set handler g_event_receiver->handle_data_changed for grid1.

endform. "register_enter_event 

Reward pts if found usefull

Regards

Sathish

7 REPLIES 7

Former Member
0 Kudos

hi Debjani,

chk my blog

/people/community.user/blog/2007/01/10/displaychange-mode-of-editable-fields-in-alv-using-function-modules-but-not-custom-containers

Former Member
0 Kudos

Hi,

ls_fcat-edit = 'X'.

is correct only.

have a look into this code

struct_grid_lset TYPE lvc_s_layo,

i_grid_fcat TYPE lvc_t_fcat

DATA ls_fcat TYPE lvc_s_fcat.

CLEAR ls_fcat.

ls_fcat-fieldname = 'MONTH'.

ls_fcat-ref_table = 'TYPE'.

ls_fcat-ref_field = 'C'.

<b>ls_fcat-edit = 'X'.</b>

ls_fcat-coltext = text-030."Month

ls_fcat-seltext = text-030.

APPEND ls_fcat TO p_i_grid_fcat.

CLEAR ls_fcat.

ls_fcat-fieldname = 'YEAR'.

ls_fcat-ref_table = 'TYPE'.

ls_fcat-ref_field = 'C'.

ls_fcat-coltext = text-031."Year

ls_fcat-seltext = text-031.

APPEND ls_fcat TO p_i_grid_fcat.

CALL METHOD o_grid->set_table_for_first_display

EXPORTING

i_bypassing_buffer = space

is_variant = ws_f_grid_disvar

i_save = ws_c_grid_save

is_layout = struct_grid_lset

CHANGING

it_outtab = i_grid_outs[]

it_<b>fieldcatalog = i_grid_fcat[]</b>

it_sort = i_sort_fcat. " Period

Also Check this code.Another way using field symbols.

i_fieldcat TYPE lvc_t_fcat,

w_layout TYPE lvc_s_layo ,

w_variant TYPE disvariant.

FIELD-SYMBOLS : <lfs_fieldcat> TYPE lvc_s_fcat.

*Default display

LOOP AT p_fieldcat ASSIGNING <lfs_fieldcat>.

CASE <lfs_fieldcat>-fieldname.

WHEN 'GL_ACCT'.

<lfs_fieldcat>-coltext = text-050.

<lfs_fieldcat>-no_out = ' '.

<lfs_fieldcat>-scrtext_l = text-050.

<b><lfs_fieldcat>-edit = 'X'.</b>

WHEN OTHERS.

ENDCASE.

ENDLOOP

https://forums.sdn.sap.com/click.jspa?searchID=3964981&messageID=551808

Have a look at the Demo Program <b>BCALV_EDIT_04</b>

Please refer the link,

<b>Reward points</b>

Regards

jayanthi_jayaraman
Active Contributor
0 Kudos

Hi,

Make the particular column in fieldcatalog edit = 'X' as below.

  • Making the column as ediable

LOOP AT i_fieldcat ASSIGNING <fs_fieldcat>.

CASE <fs_fieldcat>-fieldname.

WHEN 'MAKTX'.

  • Making a column as Editable

<fs_fieldcat>-edit = 'X'.

ENDCASE.

ENDLOOP.

Former Member
0 Kudos

Hi Debjani ,

In the feild catalog there is a field called EDIT , you can use that to make the column editable.

Regards

Arun

Former Member
0 Kudos

Hi Debjani,

kindly dont use those old function modules any more -- they've all been "deprecated" or in other words made obsolete by the new OO class cl_gui_alv_grid.

Using classes you can easily define dynamic tables, dynamic fcats, have editable grids for data entry etc etc.

Here's a program using OO which gives you all the functionality.



PROGRAM zdynfieldcat.
class zcltest definition deferred. "For field symbol reference.

* The ultimate ALV program

* this program demos the following
* 1) Build Dynamic ITAB with fields NOT defined in DDIC
* 2) Build Dynamic FieldCat. Table structure is obtained *via
* the new RTTI functionality
* 3) Add the CELL colour table as a deep structure to our dynamic table
* so we can colour individual cells.
* 4) Inherit a class so protected attributes
* of class cl_gui_alv_grid
* can be accessed
* 5) Add events so we can can program functionality when * the user presses 
* the ENTER key,
* or selects an action from the toolbar.
* 6) Display one line of a grid from our dynamic table with some cells coloured.
* 6) Set the Grid editable.
* 7) if user enters data then colou
* cells of entered data.
* 😎 show contents of new table 
* after all data has been entered.

* To use program copy the source and
* Create a blank screen 100 with a
* custom container called CCONTAINER1.
* with the screen logic shown below
* As we are using EVENTS we actually
* don't need a PAI module so it
* doesn't contain any code.

*PROCESS BEFORE OUTPUT.
* MODULE STATUS_0100.
*
*PROCESS AFTER INPUT.
* MODULE USER_COMMAND_0100
*
* James Hawthorne

* Define field symbols as these can't be defined in classes

field-symbols: <dyn_table> type standard table,
<g2> type ref to zcltest,
<g1> type ref to cl_gui_custom_container,
<data_changed> type ref to cl_alv_changed_data_protocol,
<actual_tab> type standard table,
<outtab> type table,
<fs1> type ANY,
<FS2> TYPE TABLE,
<fs3> type table,
<fs4> type table,
<fs5> type table,
<wa_dyn_table> TYPE ANY,
<w_field1> type any,
<w_field2> type any,
<w_field3> type any,
<w_field4> type any,
<w_field5> type any,
<t_colours> type any,
<t_clrs> type line of lvc_t_scol,
<t_cellcolors> TYPE lvc_t_scol,
<t_cellcolors1> type lvc_t_scol.


class zcltest definition inheriting from cl_gui_alv_grid.

public section.

types: g4 type ref to cl_gui_custom_container.
types: g3 type ref to cl_alv_changed_data_protocol.
data: i_parent type g4,
lr_rtti_struc TYPE REF TO cl_abap_structdescr, "RTTI
zog like line of lr_rtti_struc->components. "RTTI
types: struc like zog.
types: struc1 type table of struc.

methods:
constructor
importing i_parent type g4,
disp_tab
importing p_er_data_changed type g3,

create_dynamic_fcat
importing zogt type struc1
exporting it_fldcat type lvc_t_fcat.
Protected section.

private section.
data: stab type ref to data,
wa_it_fldcat type lvc_s_fcat,
c_index type sy-index,
lt_good_cells type lvc_t_modi,
ls_good type lvc_s_modi,
ls_good_cells type lvc_s_modi,
et_good_cells type LVC_T_MODI,
e_row type i,
e_value type c,
e_col type i,
es_row_id type lvc_s_row,
es_col_id type lvc_s_col,
es_row_no type LVC_S_ROID,
wa_cellcolors TYPE LINE OF lvc_t_scol,
wa_modified_cells type line of LVC_T_MODI,
es_layout type LVC_S_LAYO.

endclass.

class zcltest implementation.
METHOD constructor.

CALL METHOD super->constructor
EXPORTING
i_appl_events = 'X'
i_parent = i_parent.

endmethod.

method disp_tab.
* mt_outtab is the data table held 
* as a protected attribute
* in class cl_gui_alv_grid.
assign me->mt_outtab->* TO <outtab>. "Original data
assign p_er_data_changed->mp_mod_rows TO <FS1>.
stab = p_er_data_changed->mp_mod_rows.
assign p_er_data_changed->mt_inserted_rows to <fs3>.
assign p_er_data_changed->mt_deleted_rows to <fs4>.
assign p_er_data_changed->mt_mod_cells to <fs5>.
assign stab->* TO <fs2>.


* some functions --chose what you want

* This method gets the last (or current cell)
call method me->get_current_cell
importing e_row = e_row
e_value = e_value
e_col = e_col
es_row_id = es_row_id
es_col_id = es_col_id
es_row_no = es_row_no.

* For an example let's change the colour
* of any data entered including
* inserted rows.
*
* Proceed as follows
*

* read table <fs5> which gives us the
* row number and field name of
* the modified cell(s) including inserted rows
*
* For deleted rows we don't have to do anything
*
* Update the cell's colour characteristic table

* remember we added a colour table
* to the dynamic data table we built
* note that it's a DEEP structure.

* On REFRESH the alv will look at the
* updated colour table for the cells.
* we don't actually have to modify the data table but just the colour
* table

* recapping

* 1) Create your Field catalog WITHOUT 
* the colour table for the ALV grid display
* 2) Add the colour table to a 2nd field catalog
* which you use to build the actual data
* dynamic table
* 3) add the name of the colour table to the layout
* (struct_grid_lset-ctab_fname 
* = 'T_CELLCOLORS')

* Refresh Grid and new cell colours will work


* now let's change the colour of the selected cells.

ASSIGN COMPONENT 'T_CELLCOLORS'
OF STRUCTURE <wa_dyn_table> TO <t_cellcolors1>.
loop at <fs5> into wa_modified_cells.


read table <dyn_table> into <wa_dyn_table> index wa_modified_cells-row_id.
case sy-subrc.
when 0.
read table <t_cellcolors1> into wa_cellcolors
with key fname = wa_modified_cells-fieldname.
if sy-subrc = 0.
if not wa_modified_cells-value is initial.
wa_cellcolors-fname = wa_modified_cells-fieldname.

wa_cellcolors-color-col = '5'.
MODIFY <t_cellcolors1> from wa_cellcolors .
endif.
else.
if not wa_modified_cells-value is initial.
wa_cellcolors-fname = wa_modified_cells-fieldname.

wa_cellcolors-color-col = '5'.
append wa_cellcolors to <t_cellcolors1>.
endif.
endif.

when others.
loop at <fs2> into <wa_dyn_table>.
append <wa_dyn_table> to <dyn_table>.
endloop.
read table <dyn_table> into <wa_dyn_table> index wa_modified_cells-row_id.
clear wa_cellcolors.
if not wa_modified_cells-value is initial.

wa_cellcolors-fname = wa_modified_cells-fieldname.

wa_cellcolors-color-col = 5.
append wa_cellcolors to <t_cellcolors1>.
endif.
endcase.


MODIFY <dyn_table> FROM <wa_dyn_table> index wa_modified_cells-row_id.


endloop.


endmethod.

method create_dynamic_fcat.
loop at zogt into zog.
c_index = c_index + 1.
clear wa_it_fldcat.

wa_it_fldcat-fieldname = zog-name .
wa_it_fldcat-datatype = zog-type_kind.
wa_it_fldcat-inttype = zog-type_kind.
wa_it_fldcat-intlen = zog-length.
wa_it_fldcat-decimals = zog-decimals.
wa_it_fldcat-coltext = zog-name.
wa_it_fldcat-lowercase = 'X'.
append wa_it_fldcat to it_fldcat .
endloop.
endmethod. "create_dynamic_fcat

endclass. "zcltest IMPLEMENTATION

class lcl_grid_event_receiver definition.

public section.
data: data_c type ref to cl_alv_changed_data_protocol.

methods:
handle_data_changed
for event data_changed of zcltest
importing er_data_changed,

handle_data_changed_finished
for event data_changed_finished of zcltest
importing E_MODIFIED
ET_GOOD_CELLS,


toolbar
for event toolbar of zcltest
importing e_object
e_interactive,

user_command
for event user_command of zcltest
importing e_ucomm.

endclass.


class lcl_grid_event_receiver implementation.
method handle_data_changed.

call method <g2>->disp_tab
EXPORTING
p_er_data_changed = er_data_changed.

endmethod. "handle_data_changed



method handle_data_changed_finished.

* at this point our data dynamic table
* <dyn_table> now contains the actual updated values from
* the grid including the cell color info create in the on data changed
* event method call AND IN THE CORRECT ORDER.
* use this method to update say SAP data bases or other
* data from the GRID entered data.
*
* Data entry validation can be done here as well.
*
* Enter your own code here.
.
endmethod.

method toolbar.


data : ls_toolbar type stb_button.
clear ls_toolbar.
<b>move 0 to ls_toolbar-butn_type.
<b>move 'EDIT' to ls_toolbar-function.
move space to ls_toolbar-disabled.
move 'Edit' to ls_toolbar-text.</b>
move icon_change_text to ls_toolbar-icon.
move 'Click2Edit' to ls_toolbar-quickinfo.
append ls_toolbar to e_object->mt_toolbar.</b>

clear ls_toolbar.
move 0 to ls_toolbar-butn_type.
move 'UPDA' to ls_toolbar-function.
move space to ls_toolbar-disabled.
move 'Update' to ls_toolbar-text.
move icon_system_save to ls_toolbar-icon.
move 'Click2Update' to ls_toolbar-quickinfo.
append ls_toolbar to e_object->mt_toolbar.

clear ls_toolbar.
move 0 to ls_toolbar-butn_type.
move 'EXIT' to ls_toolbar-function.
move space to ls_toolbar-disabled.
move 'Exit' to ls_toolbar-text.
move icon_system_end to ls_toolbar-icon.
move 'Click2Exit' to ls_toolbar-quickinfo.
append ls_toolbar to e_object->mt_toolbar.


endmethod. "toolbar

method user_command.

case e_ucomm .
when 'EDIT'. "From Tool bar
perform set_input.
perform refresh_disp.

when 'UPDA'. "From Tool bar
perform refresh_disp.

when 'EXIT'. "From Tool bar
leave program.

endcase.

endmethod. "user_command
endclass. "lcl_grid_event_receiver IMPLEMENTATION


* program data
*
include <icon>.
* define any old internal structure NOT in DDIC
types: begin of s_elements,
anyfield1(20) type c,
anyfield2(20) type c,
anyfield3(20) type c,
anyfield4(20) type c,
anyfield5(11) type n,
end of s_elements.

data: wa_element type s_elements,
wa_cellcolors TYPE LINE OF lvc_t_scol,

wa_data type s_elements,
wa_dyn_table TYPE REF TO data.


* Note new RTTI functionality allows field detail retrieval
* at runtime for dynamic tables.
data:
grid1 type ref to zcltest,
grid_handler type ref to lcl_grid_event_receiver,
c_dec2 type s_elements-anyfield5,
wa_it_fldcat type lvc_s_fcat,
it_fldcat type lvc_t_fcat,
it_fldcat1 type lvc_t_fcat,
lr_rtti_struc TYPE REF TO cl_abap_structdescr, "RTTI
lt_comp TYPE cl_abap_structdescr=>component_table,"RTTI
ls_comp LIKE LINE OF lt_comp, "RTTI
zog like line of lr_rtti_struc->components, "RTTI
struct_grid_lset type lvc_s_layo,
l_valid type c,
new_table type ref to data.
types: struc like zog,
col_tab type lvc_t_scol.


data: zogt type table of struc,
grid_container1 type ref to cl_gui_custom_container,
g_event_receiver type ref to lcl_grid_event_receiver,
ok_code like sy-ucomm,
t_colours type table of col_tab,
i4 type int4.

start-of-selection.
call screen 100.
module status_0100 output.

if grid_container1 is initial.

create object grid_container1
exporting
container_name = 'CCONTAINER1'.
assign grid_container1 to <g1>.
create object grid1
exporting i_parent = grid_container1.

* we need reference to this instance so we can use
* Methods etc of zcltest class and alv (superclass)
* in our event receiver class.

assign grid1 to <g2>.
create object grid_handler.

* set handler for events

set handler:
grid_handler->user_command for grid1,
grid_handler->toolbar for grid1,
grid_handler->handle_data_changed_finished for grid1.
perform register_enter_event. "For ENTER key press


* Get the Internal table structure
lr_rtti_struc ?= cl_abap_structdescr=>describe_by_data( wa_data ).

* Build field catalog just use basic data here
* colour specific columns as well
zogt[] = lr_rtti_struc->components.

call method grid1->create_dynamic_fcat
EXPORTING
zogt = zogt
IMPORTING
it_fldcat = it_fldcat.
* Save field cat without cell info deep structure for Grid
it_fldcat1[] = it_fldcat.
* now add deep structure for cell colour to field catalog
* for dynamic table creation
assign t_colours to <t_colours>.
wa_it_fldcat-fieldname = 'T_CELLCOLORS'.
wa_it_fldcat-ref_field = 'COLTAB'.
wa_it_fldcat-ref_table = 'CALENDAR_TYPE'.
* use this table as it has a DDIC built in ref structure for cell colour info

APPEND wa_it_fldcat TO it_fldcat1.
* Create dynamic internal table and assign to field symbol.
* Use dynamic field catalog just built.

call method cl_alv_table_create=>create_dynamic_table
EXPORTING
it_fieldcatalog = it_fldcat1
IMPORTING
ep_table = new_table.

perform populate_dynamic_itab.
perform init_grid.
i4 = 0.
call method grid1->set_ready_for_input
EXPORTING
i_ready_for_input = i4.
endif.
.
perform refresh_disp.

endmodule. "status_0100 OUTPUT

module user_command_0100 input.
*
*PAI not needed in OO ALV anymore as User Commands are handled as events
*in method user_command.
*
*we can also get control if the Data entered and the ENTER is pressed by
*raising an event.
* Control then returns to method handle_data_changed.
endmodule. "user_command_0100 INPUT

form populate_dynamic_itab.
* load up a line of the dynamic table
c_dec2 = c_dec2 + 11.
assign new_table->* to <dyn_table>.

create data wa_dyn_table like line of <dyn_table>.
assign wa_dyn_table->* to <wa_dyn_table>.

assign component 'ANYFIELD1' of structure <wa_dyn_table> to <w_field1>
.
<w_field1> = 'Tabbies'.
assign component 'ANYFIELD2' of structure <wa_dyn_table> to
<w_field2>.
<w_field2> = 'Ger Shepards'.
assign component 'ANYFIELD3' of structure <wa_dyn_table> to <w_field3>.
<w_field3> = 'White Mice'.

assign component 'ANYFIELD4' of structure <wa_dyn_table> to <w_field4>.
<w_field4> = 'Any old Text'.

assign component 'ANYFIELD5' of structure <wa_dyn_table> to <w_field5>.
<w_field5> = c_dec2..
APPEND <wa_dyn_table> TO <dyn_table>.


loop at <dyn_table> into <wa_dyn_table>.
clear wa_cellcolors.

ASSIGN COMPONENT 'T_CELLCOLORS'
OF STRUCTURE <wa_dyn_table> TO <t_cellcolors>.
wa_cellcolors-fname = 'ANYFIELD2'.
wa_cellcolors-color-col = '1'.
APPEND wa_cellcolors TO <t_cellcolors>.
clear wa_cellcolors.
wa_cellcolors-fname = 'ANYFIELD3'.
wa_cellcolors-color-col = '2'.
APPEND wa_cellcolors TO <t_cellcolors>.

clear wa_cellcolors.

wa_cellcolors-fname = 'ANYFIELD4'.

wa_cellcolors-color-col = '6'.
APPEND wa_cellcolors TO <t_cellcolors>.
MODIFY <dyn_table> FROM <wa_dyn_table>.


endloop.
endform. "populate_dynamic_itab
form exit_program.

call method grid_container1->free.
call method cl_gui_cfw=>flush.
leave program.

endform. "exit_program

form refresh_disp.

call method grid1->refresh_table_display.

endform. "refresh_disp

form set_input.
i4 = 1.
call method grid1->set_ready_for_input
EXPORTING
i_ready_for_input = i4.

endform. "set_input
form switch_input.
if i4 = 1.
i4 = 0.
else.
i4 = 1.
endif.
call method grid1->set_ready_for_input
EXPORTING
i_ready_for_input = i4.
endform. "switch_input
form init_grid.

* Enabling the grid to edit mode,
* Set ALV controls for cell coloring table.

struct_grid_lset-edit = 'X'. "To enable editing in ALV
struct_grid_lset-grid_title = 'Jimbos Test'.
struct_grid_lset-ctab_fname = 'T_CELLCOLORS'.
* struct_grid_lset-sel_mode = 'D'.

call method grid1->set_table_for_first_display
EXPORTING
is_layout = struct_grid_lset
CHANGING
it_outtab = <dyn_table>
it_fieldcatalog = it_fldcat.
endform. "init_grid
form register_enter_event.
call method grid1->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_enter.
* Instantiate the event or it won't work.
create object g_event_receiver.
set handler g_event_receiver->handle_data_changed for grid1.

endform. "register_enter_event 

Reward pts if found usefull

Regards

Sathish

Former Member
0 Kudos

problem solved.

Former Member
0 Kudos

<b>Make individual fields of an ALV grid editable</b>

The follow program demonstrates how to make individual fields of an ALV grid editable (NetPR greater than 10). Changes required from a basic ALV grid include adding a new field to ALV grid data table(it_ekko), Populating this field with style attribute and adding an entry to layout control table. Also from the previous examples used on this website you will also need to change the data type of the fieldcatalog, the layout and use a different function module for displaying the report.

*& Report  ZDEMO_ALVGRID_EDIT                                          *
*&                                                                     *
*&---------------------------------------------------------------------*
*&                                                                     *
*& Example of a simple ALV Grid Report                                 *
*& ...................................                                 *
*&                                                                     *
*& The basic ALV grid, Enhanced to display specific fields as          *
*& editable depending on field value                                   *
*&---------------------------------------------------------------------*

REPORT  ZDEMO_ALVGRID_EDIT                 .

TABLES:     ekko.

TYPE-POOLS: slis.                                 "ALV Declarations
*Data Declaration
*----------------
TYPES: BEGIN OF t_ekko,
  ebeln TYPE ekpo-ebeln,
  ebelp TYPE ekpo-ebelp,
  statu TYPE ekpo-statu,
  aedat TYPE ekpo-aedat,
  matnr TYPE ekpo-matnr,
  menge TYPE ekpo-menge,
  meins TYPE ekpo-meins,
  netpr TYPE ekpo-netpr,
  peinh TYPE ekpo-peinh,
  field_style  TYPE lvc_t_styl, "FOR DISABLE
 END OF t_ekko.

DATA: it_ekko TYPE STANDARD TABLE OF t_ekko INITIAL SIZE 0,
      wa_ekko TYPE t_ekko.

*ALV data declarations
DATA: fieldcatalog TYPE slis_t_fieldcat_alv WITH HEADER LINE.
DATA: it_fieldcat TYPE lvc_t_fcat,     "slis_t_fieldcat_alv WITH HEADER LINE,
      wa_fieldcat TYPE lvc_s_fcat,

      gd_tab_group TYPE slis_t_sp_group_alv,
      gd_layout    TYPE lvc_s_layo,     "slis_layout_alv,
      gd_repid     LIKE sy-repid.


************************************************************************
*Start-of-selection.
START-OF-SELECTION.

  PERFORM data_retrieval.
  PERFORM set_specific_field_attributes.
  PERFORM build_fieldcatalog.
  PERFORM build_layout.
  PERFORM display_alv_report.


*&---------------------------------------------------------------------*
*&      Form  BUILD_FIELDCATALOG
*&---------------------------------------------------------------------*
*       Build Fieldcatalog for ALV Report
*----------------------------------------------------------------------*
FORM build_fieldcatalog.

  wa_fieldcat-fieldname   = 'EBELN'.
  wa_fieldcat-scrtext_m   = 'Purchase Order'.
  wa_fieldcat-col_pos     = 0.
  wa_fieldcat-outputlen   = 10.
  wa_fieldcat-emphasize   = 'X'.
  wa_fieldcat-key         = 'X'.
  APPEND wa_fieldcat TO it_fieldcat.
  CLEAR  wa_fieldcat.

  wa_fieldcat-fieldname   = 'EBELP'.
  wa_fieldcat-scrtext_m   = 'PO Item'.
  wa_fieldcat-col_pos     = 1.
  APPEND wa_fieldcat TO it_fieldcat.
  CLEAR  wa_fieldcat.

  wa_fieldcat-fieldname   = 'STATU'.
  wa_fieldcat-scrtext_m   = 'Status'.
  wa_fieldcat-col_pos     = 2.
  APPEND wa_fieldcat TO it_fieldcat.
  CLEAR  wa_fieldcat.

  wa_fieldcat-fieldname   = 'AEDAT'.
  wa_fieldcat-scrtext_m   = 'Item change date'.
  wa_fieldcat-col_pos     = 3.
  APPEND wa_fieldcat TO it_fieldcat.
  CLEAR  wa_fieldcat.

  wa_fieldcat-fieldname   = 'MATNR'.
  wa_fieldcat-scrtext_m   = 'Material Number'.
  wa_fieldcat-col_pos     = 4.
  APPEND wa_fieldcat TO it_fieldcat.
  CLEAR  wa_fieldcat.

  wa_fieldcat-fieldname   = 'MENGE'.
  wa_fieldcat-scrtext_m   = 'PO quantity'.
  wa_fieldcat-col_pos     = 5.
  APPEND wa_fieldcat TO it_fieldcat.
  CLEAR  wa_fieldcat.

  wa_fieldcat-fieldname   = 'MEINS'.
  wa_fieldcat-scrtext_m   = 'Order Unit'.
  wa_fieldcat-col_pos     = 6.
  APPEND wa_fieldcat TO it_fieldcat.
  CLEAR  wa_fieldcat.

  wa_fieldcat-fieldname   = 'NETPR'.
  wa_fieldcat-scrtext_m   = 'Net Price'.
  wa_fieldcat-edit        = 'X'. "sets whole column to be editable
  wa_fieldcat-col_pos     = 7.
  wa_fieldcat-outputlen   = 15.
  wa_fieldcat-datatype     = 'CURR'.
  APPEND wa_fieldcat TO it_fieldcat.
  CLEAR  wa_fieldcat.

  wa_fieldcat-fieldname   = 'PEINH'.
  wa_fieldcat-scrtext_m   = 'Price Unit'.
  wa_fieldcat-col_pos     = 8.
  APPEND wa_fieldcat TO it_fieldcat.
  CLEAR  wa_fieldcat.
ENDFORM.                    " BUILD_FIELDCATALOG


*&---------------------------------------------------------------------*
*&      Form  BUILD_LAYOUT
*&---------------------------------------------------------------------*
*       Build layout for ALV grid report
*----------------------------------------------------------------------*
FORM build_layout.
* Set layout field for field attributes(i.e. input/output)
  gd_layout-stylefname = 'FIELD_STYLE'.
  gd_layout-zebra             = 'X'.
ENDFORM.                    " BUILD_LAYOUT


*&---------------------------------------------------------------------*
*&      Form  DISPLAY_ALV_REPORT
*&---------------------------------------------------------------------*
*       Display report using ALV grid
*----------------------------------------------------------------------*
FORM display_alv_report.
  gd_repid = sy-repid.

*  call function 'REUSE_ALV_GRID_DISPLAY'
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
       EXPORTING
            i_callback_program      = gd_repid
*            i_callback_user_command = 'USER_COMMAND'
            is_layout_lvc               = gd_layout
            it_fieldcat_lvc             = it_fieldcat
            i_save                  = 'X'
       TABLES
            t_outtab                = it_ekko
       EXCEPTIONS
            program_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.
ENDFORM.                    " DISPLAY_ALV_REPORT


*&---------------------------------------------------------------------*
*&      Form  DATA_RETRIEVAL
*&---------------------------------------------------------------------*
*       Retrieve data form EKPO table and populate itab it_ekko
*----------------------------------------------------------------------*
FORM data_retrieval.
  SELECT ebeln ebelp statu aedat matnr menge meins netpr peinh
   UP TO 10 ROWS
    FROM ekpo
    INTO  CORRESPONDING FIELDS OF TABLE it_ekko.

ENDFORM.                    " DATA_RETRIEVAL


*&---------------------------------------------------------------------*
*&      Form  set_specific_field_attributes
*&---------------------------------------------------------------------*
*       populate FIELD_STYLE table with specific field attributes
*----------------------------------------------------------------------*
form set_specific_field_attributes .
  DATA ls_stylerow TYPE lvc_s_styl .
  DATA lt_styletab TYPE lvc_t_styl .

* Populate style variable (FIELD_STYLE) with style properties
*
* The NETPR field/column has been set to editable in the fieldcatalog...
* The following code sets it to be disabled(display only) if 'NETPR'
* is gt than 10.
  LOOP AT it_ekko INTO wa_ekko.
    IF wa_ekko-netpr GT 10.
      ls_stylerow-fieldname = 'NETPR' .
      ls_stylerow-style = cl_gui_alv_grid=>mc_style_disabled. 
                                             "set field to disabled
      APPEND ls_stylerow  TO wa_ekko-field_style.
      MODIFY it_ekko FROM wa_ekko.
    ENDIF.
  ENDLOOP.

endform.                    " set_specific_field_attributes

reward points if it is usefull...

Girish