Application Development and Automation 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: 
Read only

ALV - access to protected method

Former Member
0 Likes
1,114

Hello,

I have a object from class "CL_GUI_ALV_GRID" and want to change the protected attribute "EVT_DELAYED_CHANGE_SELECTION Constant Protected" with the method

CALL METHOD alv_grid->SET_DELAY_CHANGE_SELECTION

EXPORTING

time = lv_delay.

How can I access this protected attribute?

Thanks in advance,

Holger

Hello,

I have a object from class "CL_GUI_ALV_GRID" and want to change the protected attribute "EVT_DELAYED_CHANGE_SELECTION Constant Protected" with the method

CALL METHOD alv_grid->SET_DELAY_CHANGE_SELECTION

EXPORTING

time = lv_delay.

How can I access this protected attribute?

Thanks in advance,

Holger

4 REPLIES 4
Read only

uwe_schieferstein
Active Contributor
0 Likes
870

Hello Holger

You could try to sub-class CL_GUI_ALV_GRID and add a public method (e.g. SET_DELAY_CHANGE_SELECTION_PUBL) to your sub-class which does nothing else but calling the protected method.

Regards

Uwe

Read only

Former Member
0 Likes
870

Hi Holger,

The attribute EVT_DELAYED_CHANGE_SELECTION is a CONSTANT with value 7, so i think we can not change the value.

Regards

Kesava

Read only

0 Likes
870

This will do what you want

Trick is to define a sub class inheriting the super class where the protected attributes and methods exist in - then you can access the protected methods and attributes.

If you do this don't forget to call the SUPER CONSTRUCTOR (of the class you are inheriting from) in your constructor method. Code example shown below.

Here I want the original and modified table of an alv grid but you can adapt this code to whatever you need.

Hope it helps.

create blank screen (100) with a custom container CCONTAINER1 and the following scren logic in it

PROCESS BEFORE OUTPUT.

MODULE STATUS_0100.

*

PROCESS AFTER INPUT.

MODULE USER_COMMAND_0100.

now look at the code here. Note text in Bold

PROGRAM zdynfieldcat.

class zcltest definition deferred. "For field symbol reference.

  • Simple test of dynamic ITAB with user defined (not ddic) fields

  • Build dynamic fcat

  • Table structure obtained via new RTTI functionality

  • use ALV grid to display and edit.

  • Create a blank screen 100 with a custom container called CCONTAINER1.

*

  • 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,

<actual_tab> type standard table,

<outtab> type table,

<fs1> type ANY,

<FS2> TYPE TABLE,

<fs3> type table,

<fs4> type table,

<fs5> type table.

<b>class zcltest definition inheriting from cl_gui_alv_grid.

*

  • define this as a subclass so we can access the protected attributes

  • of the superclass cl_gui_alv_grid</b>

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.

data: stab type ref to data,

wa_it_fldcat type lvc_s_fcat,

c_index type sy-index.

endclass.

<b>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>.

  • do whatever you want with <outtab>

  • contains data BEFORE changes each time.

*

  • Note that NEW (Changed) table has been obtained already by

  • call to form check_data USING P_ER_DATA_CHANGED

  • TYPE REF TO CL_ALV_CHANGED_DATA_PROTOCOL.

  • Entered data is in table defined by <fs2>

  • In this method you can compare original and changed data.

*

  • Easier than messing around with individual cells.

  • do what you want with data in <fs2> validate / update / merge etc

*

endmethod.</b>

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'.

if c_index eq 2.

wa_it_fldcat-emphasize = 'C411'.

endif.

if c_index eq 3.

wa_it_fldcat-emphasize = 'C511'.

endif.

append wa_it_fldcat to it_fldcat .

endloop.

endmethod. "create_dynamic_fcat

endclass. "zcltest IMPLEMENTATION

class lcl_grid_event_receiver definition.

public section.

methods:

handle_data_changed

for event data_changed of zcltest

  • for event data_changed of cl_gui_alv_grid

importing er_data_changed,

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.

  • code whatever required after data entry.

  • various possibilites here as you can get back Cell(s) changed

  • columns or the entire updated table.

  • Data validation is also possible here.

call method <g2>->disp_tab

EXPORTING

p_er_data_changed = er_data_changed.

endmethod. "handle_data_changed

method toolbar.

data : ls_toolbar type stb_button.

clear ls_toolbar.

move 0 to ls_toolbar-butn_type.

move 'EDIT' to ls_toolbar-function.

move space to ls_toolbar-disabled.

move 'Edit' to ls_toolbar-text.

move icon_change_text to ls_toolbar-icon.

move 'Click2Edit' to ls_toolbar-quickinfo.

append ls_toolbar to e_object->mt_toolbar.

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 init_grid.

when 'UPDA'. "From Tool bar

perform refresh_disp.

perform update_table.

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_data type s_elements.

  • 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,

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.

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,

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:

grid_handler->user_command for grid1,

grid_handler->toolbar for grid1,

grid_handler->handle_data_changed for grid1.

  • 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.

  • 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_fldcat

IMPORTING

ep_table = new_table.

assign new_table->* to <dyn_table>.

perform populate_dynamic_itab.

perform init_grid.

perform register_enter_event.

  • set off ready for input initially

i4 = 0.

call method grid1->set_ready_for_input

EXPORTING

i_ready_for_input = i4.

endif.

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.

wa_element-anyfield1 = 'Tabbies'.

wa_element-anyfield2 = 'ger.shepards'.

wa_element-anyfield3 = 'White mice'.

wa_element-anyfield4 = 'Any old text'.

wa_element-anyfield5 = c_dec2.

append wa_element to <dyn_table>.

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 update_table.

  • The dynamic table here is the changed table read from the grid

  • after user has changed it

  • Data can be saved to DB or whatever.

loop at <dyn_table> into wa_element.

  • do what you want with the data here

*

endloop.

  • switch off edit mode again for next function

i4 = 0.

call method grid1->set_ready_for_input

EXPORTING

i_ready_for_input = i4.

endform. "update_table

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,

struct_grid_lset-edit = 'X'. "To enable editing in ALV

struct_grid_lset-grid_title = 'Jimbos Test'.

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

Read only

0 Likes
870

Hi all,

thanks a lot. I did it with an inherited class in dictionary and a new method which called the original protected message. Works fine.

Regards

Holger