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

ALVGRID: Modify cell values

Former Member
0 Likes
1,102

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

1 ACCEPTED SOLUTION
Read only

Former Member
0 Likes
971

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 IMPLEMENTATION

Screen 100 has a custom control 'CUSTOM'.

screen flow logic..

PROCESS BEFORE OUTPUT.
  MODULE pbo.

PROCESS AFTER INPUT.
  MODULE pai.

Cheers,

Jose.

6 REPLIES 6
Read only

Former Member
0 Likes
972

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 IMPLEMENTATION

Screen 100 has a custom control 'CUSTOM'.

screen flow logic..

PROCESS BEFORE OUTPUT.
  MODULE pbo.

PROCESS AFTER INPUT.
  MODULE pai.

Cheers,

Jose.

Read only

0 Likes
971

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?

Read only

0 Likes
971

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

Read only

0 Likes
971

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

Read only

Former Member
0 Likes
971

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

Read only

Former Member
0 Likes
971

follow-up