‎2008 Dec 15 12:13 PM
Hi
How do one edit a alvgrid?
I have 3 cell in one row.
cell 1 = 20
cell 2 = 40
cell 3 = cell 1 + cell 2.
After ive executed the program, the alvgrid shows that cell 3 = 60
I now want to be able to change the content of cell 1 and cell 2 and it must then update cell 3 automatically.
Tx
‎2008 Dec 15 12:54 PM
Hi Giovanni,
Check the below code...
*----------------------------------------------------------------------*
* CLASS lcl_event_responder DEFINITION *
*----------------------------------------------------------------------*
CLASS lcl_event_responder DEFINITION.
PUBLIC SECTION.
METHODS refresh_changed_data FOR EVENT data_changed
OF cl_gui_alv_grid
IMPORTING er_data_changed
e_ucomm.
ENDCLASS. "event_responder DEFINITION
TYPES : BEGIN OF ty_line,
field1 TYPE i,
field2 TYPE i,
sum TYPE i,
END OF ty_line.
TYPES ty_table TYPE STANDARD TABLE OF ty_line.
DATA: go_container TYPE REF TO cl_gui_custom_container,
go_handler TYPE REF TO lcl_event_responder,
go_grid TYPE REF TO cl_gui_alv_grid,
gt_fieldcat TYPE lvc_t_fcat,
gt_outtab TYPE ty_table WITH HEADER LINE.
FIELD-SYMBOLS : <field>.
CALL SCREEN 100.
*---------------------------------------------------------------------*
* MODULE PBO OUTPUT *
*---------------------------------------------------------------------*
MODULE pbo OUTPUT.
SET PF-STATUS 'BASIC'.
PERFORM create_and_init_alv CHANGING gt_outtab[]
gt_fieldcat.
ENDMODULE. "pbo OUTPUT
*---------------------------------------------------------------------*
* MODULE PAI INPUT *
*---------------------------------------------------------------------*
MODULE pai INPUT.
LEAVE PROGRAM.
ENDMODULE. "pai INPUT
*&---------------------------------------------------------------------*
FORM create_and_init_alv CHANGING pt_outtab LIKE gt_outtab[]
pt_fieldcat TYPE lvc_t_fcat.
CHECK go_container IS NOT BOUND.
CREATE OBJECT go_container
EXPORTING
container_name = 'CUSTOM'.
CREATE OBJECT go_grid
EXPORTING
i_parent = go_container.
PERFORM build_display_table.
PERFORM build_fieldcat CHANGING pt_fieldcat.
go_grid->set_table_for_first_display( CHANGING it_fieldcatalog = pt_fieldcat
it_outtab = pt_outtab ).
go_grid->set_ready_for_input( 1 ).
* raises the 'data_changed' event when we select another cell/any action after changing the data
go_grid->register_edit_event( EXPORTING i_event_id = cl_gui_alv_grid=>mc_evt_modified ).
CREATE OBJECT go_handler.
SET HANDLER go_handler->refresh_changed_data FOR go_grid.
ENDFORM. "CREATE_AND_INIT_ALV
*&---------------------------------------------------------------------*
FORM build_display_table.
FREE gt_outtab.
DO 10 TIMES.
gt_outtab-field1 = sy-index.
gt_outtab-field2 = sy-index * 2.
gt_outtab-sum = gt_outtab-field1 + gt_outtab-field2.
APPEND gt_outtab.
ENDDO.
ENDFORM. "build_display_table
*&---------------------------------------------------------------------*
FORM build_fieldcat CHANGING pt_fieldcat TYPE lvc_t_fcat.
DATA ls_fcat TYPE lvc_s_fcat.
ls_fcat-fieldname = ls_fcat-reptext = 'FIELD1'.
ls_fcat-edit = abap_true.
APPEND ls_fcat TO pt_fieldcat.
ls_fcat-fieldname = ls_fcat-reptext = 'FIELD2'.
ls_fcat-edit = abap_true.
APPEND ls_fcat TO pt_fieldcat.
ls_fcat-fieldname = ls_fcat-reptext = 'SUM'.
ls_fcat-edit = abap_false.
APPEND ls_fcat TO pt_fieldcat.
ENDFORM. "build_fieldcat
*---------------------------------------------------------------------*
* CLASS event_responder IMPLEMENTATION *
*---------------------------------------------------------------------*
CLASS lcl_event_responder IMPLEMENTATION.
METHOD refresh_changed_data.
DATA : ls_modified TYPE lvc_s_modi,
ls_line TYPE ty_line.
READ TABLE er_data_changed->mt_mod_cells INTO ls_modified INDEX 1.
CHECK sy-subrc EQ 0.
READ TABLE gt_outtab INTO ls_line INDEX ls_modified-row_id.
CHECK sy-subrc EQ 0.
ASSIGN COMPONENT ls_modified-fieldname OF STRUCTURE ls_line TO <field>.
MOVE ls_modified-value TO <field>.
ls_line-sum = ls_line-field1 + ls_line-field2.
MODIFY gt_outtab FROM ls_line INDEX ls_modified-row_id.
go_grid->refresh_table_display( ).
ENDMETHOD. "refresh_changed_data
ENDCLASS. "event_responder IMPLEMENTATIONScreen 100 has a custom control 'CUSTOM'.
screen flow logic..
PROCESS BEFORE OUTPUT.
MODULE pbo.
PROCESS AFTER INPUT.
MODULE pai.Cheers,
Jose.
‎2008 Dec 15 12:54 PM
Hi Giovanni,
Check the below code...
*----------------------------------------------------------------------*
* CLASS lcl_event_responder DEFINITION *
*----------------------------------------------------------------------*
CLASS lcl_event_responder DEFINITION.
PUBLIC SECTION.
METHODS refresh_changed_data FOR EVENT data_changed
OF cl_gui_alv_grid
IMPORTING er_data_changed
e_ucomm.
ENDCLASS. "event_responder DEFINITION
TYPES : BEGIN OF ty_line,
field1 TYPE i,
field2 TYPE i,
sum TYPE i,
END OF ty_line.
TYPES ty_table TYPE STANDARD TABLE OF ty_line.
DATA: go_container TYPE REF TO cl_gui_custom_container,
go_handler TYPE REF TO lcl_event_responder,
go_grid TYPE REF TO cl_gui_alv_grid,
gt_fieldcat TYPE lvc_t_fcat,
gt_outtab TYPE ty_table WITH HEADER LINE.
FIELD-SYMBOLS : <field>.
CALL SCREEN 100.
*---------------------------------------------------------------------*
* MODULE PBO OUTPUT *
*---------------------------------------------------------------------*
MODULE pbo OUTPUT.
SET PF-STATUS 'BASIC'.
PERFORM create_and_init_alv CHANGING gt_outtab[]
gt_fieldcat.
ENDMODULE. "pbo OUTPUT
*---------------------------------------------------------------------*
* MODULE PAI INPUT *
*---------------------------------------------------------------------*
MODULE pai INPUT.
LEAVE PROGRAM.
ENDMODULE. "pai INPUT
*&---------------------------------------------------------------------*
FORM create_and_init_alv CHANGING pt_outtab LIKE gt_outtab[]
pt_fieldcat TYPE lvc_t_fcat.
CHECK go_container IS NOT BOUND.
CREATE OBJECT go_container
EXPORTING
container_name = 'CUSTOM'.
CREATE OBJECT go_grid
EXPORTING
i_parent = go_container.
PERFORM build_display_table.
PERFORM build_fieldcat CHANGING pt_fieldcat.
go_grid->set_table_for_first_display( CHANGING it_fieldcatalog = pt_fieldcat
it_outtab = pt_outtab ).
go_grid->set_ready_for_input( 1 ).
* raises the 'data_changed' event when we select another cell/any action after changing the data
go_grid->register_edit_event( EXPORTING i_event_id = cl_gui_alv_grid=>mc_evt_modified ).
CREATE OBJECT go_handler.
SET HANDLER go_handler->refresh_changed_data FOR go_grid.
ENDFORM. "CREATE_AND_INIT_ALV
*&---------------------------------------------------------------------*
FORM build_display_table.
FREE gt_outtab.
DO 10 TIMES.
gt_outtab-field1 = sy-index.
gt_outtab-field2 = sy-index * 2.
gt_outtab-sum = gt_outtab-field1 + gt_outtab-field2.
APPEND gt_outtab.
ENDDO.
ENDFORM. "build_display_table
*&---------------------------------------------------------------------*
FORM build_fieldcat CHANGING pt_fieldcat TYPE lvc_t_fcat.
DATA ls_fcat TYPE lvc_s_fcat.
ls_fcat-fieldname = ls_fcat-reptext = 'FIELD1'.
ls_fcat-edit = abap_true.
APPEND ls_fcat TO pt_fieldcat.
ls_fcat-fieldname = ls_fcat-reptext = 'FIELD2'.
ls_fcat-edit = abap_true.
APPEND ls_fcat TO pt_fieldcat.
ls_fcat-fieldname = ls_fcat-reptext = 'SUM'.
ls_fcat-edit = abap_false.
APPEND ls_fcat TO pt_fieldcat.
ENDFORM. "build_fieldcat
*---------------------------------------------------------------------*
* CLASS event_responder IMPLEMENTATION *
*---------------------------------------------------------------------*
CLASS lcl_event_responder IMPLEMENTATION.
METHOD refresh_changed_data.
DATA : ls_modified TYPE lvc_s_modi,
ls_line TYPE ty_line.
READ TABLE er_data_changed->mt_mod_cells INTO ls_modified INDEX 1.
CHECK sy-subrc EQ 0.
READ TABLE gt_outtab INTO ls_line INDEX ls_modified-row_id.
CHECK sy-subrc EQ 0.
ASSIGN COMPONENT ls_modified-fieldname OF STRUCTURE ls_line TO <field>.
MOVE ls_modified-value TO <field>.
ls_line-sum = ls_line-field1 + ls_line-field2.
MODIFY gt_outtab FROM ls_line INDEX ls_modified-row_id.
go_grid->refresh_table_display( ).
ENDMETHOD. "refresh_changed_data
ENDCLASS. "event_responder IMPLEMENTATIONScreen 100 has a custom control 'CUSTOM'.
screen flow logic..
PROCESS BEFORE OUTPUT.
MODULE pbo.
PROCESS AFTER INPUT.
MODULE pai.Cheers,
Jose.
‎2009 Feb 02 2:15 PM
Hi Jose
Worked perfectly.
I now have a problem that when the line items in the alvgrid is more
that the screen size and you scroll down to edit the last row, the
cursor or screen jumps to the first screen when you use
go_grid->refresh_table_display( ).
How can i ensure that the cursor jumps back to the cell/row that i've modified?
‎2009 Feb 02 4:20 PM
Hello Giovanni
You need to use IMPORTING parameter IS_STABLE:
ls_stable-row = 'X'
ls_stable-col = 'X'This way you maintain the current positioning of the ALV list.
Regards
Uwe
‎2009 Feb 03 10:12 AM
Thanks Uwe
CLASS lcl_event_responder IMPLEMENTATION.
METHOD refresh_changed_data.
DATA : ls_modified TYPE lvc_s_modi,
ls_line TYPE ty_line.
DATA: ls_stable TYPE lvc_s_stbl. "Added this line
READ TABLE er_data_changed->mt_mod_cells INTO ls_modified INDEX 1.
CHECK sy-subrc EQ 0.
READ TABLE gt_outtab INTO ls_line INDEX ls_modified-row_id.
CHECK sy-subrc EQ 0.
ASSIGN COMPONENT ls_modified-fieldname OF STRUCTURE ls_line TO <fs>.
MOVE ls_modified-value TO <fs>.
ls_line-sum = ls_line-field1 + ls_line-field2.
MODIFY gt_outtab FROM ls_line INDEX ls_modified-row_id.
ls_stable-row = 'X'.
ls_stable-col = 'X'.
go_grid->refresh_table_display( exporting is_stable = ls_stable ). "Changed this line
ENDMETHOD. "refresh_changed_data
ENDCLASS. "event_responder IMPLEMENTATION
‎2008 Dec 15 1:43 PM
Hi,
Use:
getting current cell:
DATA: ld_row TYPE i.
CALL METHOD go_grid1->get_current_cell
IMPORTING
e_row = ld_row.
Thanks & Regards,
Krishna...
‎2009 Feb 02 2:24 PM