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: 

Modify Column Value Automatically In Editable ALV Report

former_member510894
Participant
0 Kudos

Hi,

I am using  FM REUSE_ALV_GRID_DISPLAY_LVC for an editable ALV Report. There are five editable amount columns.

Last one non editable column is subtotal of all five editable columns. I want to update subtotal column automatically when user edit editable amount columns for a particular row. 

Thanks,

Sunil

1 ACCEPTED SOLUTION

former_member184569
Active Contributor
0 Kudos

Hi Sunil,

I have implemented something similar to your requirement.

There are two amount fields and the third field is the total.

When the user changes the amount fields and clicks enter, the total field changes automatically to reflect the new total.

TYPE-POOLS: slis.
TYPES: BEGIN OF t_data,
    item TYPE i,
      bukrs TYPE bukrs,
      gjahr TYPE gjahr,
    dmbtr2 TYPE dmbtr,
      dmbtr3 TYPE dmbtr,
      dmbtr4 TYPE dmbtr,
        END   OF t_data.
DATA: gt_data TYPE TABLE OF t_data,
       gs_data TYPE          t_data.
DATA:  gt_fieldcatalog      TYPE lvc_t_fcat,
        gs_fieldcatalog      TYPE lvc_s_fcat,
        gt_events            TYPE slis_t_event,
        gs_events            TYPE slis_alv_event.

START-OF-SELECTION.
*    * Add same data
   gs_data-item = 1.
   gs_data-bukrs = '1000'.
   gs_data-gjahr = '2012'.
   gs_data-dmbtr2 = '100.00' .
   gs_data-dmbtr3 = '1020.00' .
   APPEND gs_data TO gt_data.

   gs_data-item = 2.
   gs_data-bukrs = '1000'.
   gs_data-gjahr = '2013'.
   gs_data-dmbtr2 = '200.00' .
   gs_data-dmbtr3 = '4020.00' .
   APPEND gs_data TO gt_data.

   gs_data-item = 3.
   gs_data-bukrs = '1000'.
   gs_data-gjahr = '2012'.
   gs_data-dmbtr2 = '100.00' .
   gs_data-dmbtr3 = '1120.00' .
   APPEND gs_data TO gt_data.

   SORT gt_data BY bukrs.
   CLEAR gs_data.
   LOOP AT gt_data INTO gs_data.
     gs_data-dmbtr4 = gs_data-dmbtr2 + gs_data-dmbtr3.
     MODIFY gt_data FROM gs_data INDEX sy-tabix.
     CLEAR gs_data.
   ENDLOOP.

   DATA: lv_pos TYPE i.

   lv_pos = lv_pos + 1.
   CLEAR gs_fieldcatalog.
   gs_fieldcatalog-fieldname = 'ITEM'.
   gs_fieldcatalog-tabname   = 'GT_DATA'.
   gs_fieldcatalog-scrtext_m = 'Item'.
   gs_fieldcatalog-col_pos   = lv_pos.
   gs_fieldcatalog-outputlen = 7.
   gs_fieldcatalog-key = 'X'.
   APPEND gs_fieldcatalog TO gt_fieldcatalog.
*
   lv_pos = lv_pos + 1.
   CLEAR gs_fieldcatalog.
   gs_fieldcatalog-fieldname = 'BUKRS'.
   gs_fieldcatalog-tabname   = 'GT_DATA'.
   gs_fieldcatalog-scrtext_m = 'Company'.
   gs_fieldcatalog-col_pos   = lv_pos.
   gs_fieldcatalog-outputlen = 7.
   gs_fieldcatalog-key = 'X'.
   APPEND gs_fieldcatalog TO gt_fieldcatalog.

   lv_pos = lv_pos + 1.
   CLEAR gs_fieldcatalog.
   gs_fieldcatalog-fieldname = 'GJAHR'.
   gs_fieldcatalog-tabname   = 'GT_DATA'.
   gs_fieldcatalog-scrtext_m = 'YEAR'.
   gs_fieldcatalog-col_pos   = lv_pos.
   gs_fieldcatalog-outputlen = 7.
   gs_fieldcatalog-key = 'X'.
   APPEND gs_fieldcatalog TO gt_fieldcatalog.
*

   lv_pos = lv_pos + 1.
   CLEAR gs_fieldcatalog.
   gs_fieldcatalog-fieldname = 'DMBTR2'.
   gs_fieldcatalog-tabname   = 'GT_DATA'.
   gs_fieldcatalog-scrtext_m = 'AMT1'.
   gs_fieldcatalog-col_pos   = lv_pos.
   gs_fieldcatalog-outputlen = 10.
   gs_fieldcatalog-edit = 'X'.
   gs_fieldcatalog-decimals = 2.
   APPEND gs_fieldcatalog TO gt_fieldcatalog.
*
   lv_pos = lv_pos + 1.
   CLEAR gs_fieldcatalog.
   gs_fieldcatalog-fieldname = 'DMBTR3'.
   gs_fieldcatalog-tabname   = 'GT_DATA'.
   gs_fieldcatalog-scrtext_m = 'AMT2'.
   gs_fieldcatalog-col_pos   = lv_pos.
   gs_fieldcatalog-outputlen = 10.
   gs_fieldcatalog-edit = 'X'.
   gs_fieldcatalog-decimals = 2.
   APPEND gs_fieldcatalog TO gt_fieldcatalog.

   lv_pos = lv_pos + 1.
   CLEAR gs_fieldcatalog.
   gs_fieldcatalog-fieldname = 'DMBTR4'.
   gs_fieldcatalog-tabname   = 'GT_DATA'.
   gs_fieldcatalog-scrtext_m = 'TOT'.
   gs_fieldcatalog-col_pos   = lv_pos.
   gs_fieldcatalog-outputlen = 10.
   gs_fieldcatalog-decimals = 2.
   APPEND gs_fieldcatalog TO gt_fieldcatalog.

*  Trigger ENTER Event
   gs_events-name = 'CALLER_EXIT'.
   gs_events-form = 'CALLER_EXIT'.
   APPEND gs_events TO gt_events.

* To capture changed data
   gs_events-name = 'DATA_CHANGED'.
   gs_events-form = 'DATA_CHANGED'.
   APPEND gs_events TO gt_events.

*  Call ALV Grid
   CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
     EXPORTING
       i_callback_program = sy-repid
       it_fieldcat_lvc    = gt_fieldcatalog
       it_events          = gt_events
     TABLES
       t_outtab           = gt_data
     EXCEPTIONS
       program_error      = 1
       OTHERS             = 2.
*    *&---------------------------------------------------------------------*
*    *&      Form  data_changed
*    *&---------------------------------------------------------------------*
FORM data_changed USING ir_data_changed TYPE REF TO cl_alv_changed_data_protocol.
   DATA ls_modi TYPE lvc_s_modi.
*    * Check each modification:
   LOOP AT ir_data_changed->mt_mod_cells INTO ls_modi.
     CASE ls_modi-fieldname.

       WHEN 'DMBTR2' .
         CLEAR gs_data.
         READ TABLE gt_data INTO gs_data INDEX ls_modi-row_id.
         gs_data-dmbtr2 = ls_modi-value.
         gs_data-dmbtr4 = gs_data-dmbtr2 + gs_data-dmbtr3.
         MODIFY gt_data FROM gs_data INDEX ls_modi-row_id.

       WHEN 'DMBTR3' .
         CLEAR gs_data.
         READ TABLE gt_data INTO gs_data INDEX ls_modi-row_id.
         gs_data-dmbtr3 = ls_modi-value.
         gs_data-dmbtr4 = gs_data-dmbtr2 + gs_data-dmbtr3.
         MODIFY gt_data FROM gs_data INDEX ls_modi-row_id.

     ENDCASE.
   ENDLOOP.

* Refresh ALV Grid
   DATA: g_alv TYPE REF TO cl_gui_alv_grid.
   CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
     IMPORTING
       e_grid = g_alv.
   CALL METHOD g_alv->refresh_table_display.
ENDFORM.                    "data_changed
*    *&---------------------------------------------------------------------*
*    *&      Form  caller_exit
*    *&---------------------------------------------------------------------*
FORM caller_exit USING is_data TYPE slis_data_caller_exit.

   DATA: lr_alv TYPE REF TO cl_gui_alv_grid.
   CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
     IMPORTING
       e_grid = lr_alv.
*    * Register ENTER as edit event:
   CALL METHOD lr_alv->register_edit_event
     EXPORTING
       i_event_id = cl_gui_alv_grid=>mc_evt_enter.

ENDFORM. "CALLER_EXIT

9 REPLIES 9

former_member458055
Participant
0 Kudos

Hi,

You can achieve the same. Use enter event and trigger the sum logic on it.

0 Kudos

Can you please share the code.  I am new to event in editable ALV.

former_member206650
Active Participant
0 Kudos

you should write codes in PAI on the event enter key pressing...

Former Member
0 Kudos

Hi Sunil,

You can acheive the given requirement easily by writing code logic using ALV OOPs concept(Class-CL_GUI_ALV_GRID. Refer below thread for guidance.

http://www.sdn.sap.com/irj/scn/go/portal/prtroot/docs/library/uuid/e8a1d690-0201-0010-b7ad-d9719a415...

Refer event-handle_data_changed_finished which will be triggered after finishing of ALV cell changes so you can populate the subtotal field in ALV output table after population of 5th field and refresh the ALV Grid display.

Regards,

Sudeesh Soni


former_member184569
Active Contributor
0 Kudos

Hi Sunil,

I have implemented something similar to your requirement.

There are two amount fields and the third field is the total.

When the user changes the amount fields and clicks enter, the total field changes automatically to reflect the new total.

TYPE-POOLS: slis.
TYPES: BEGIN OF t_data,
    item TYPE i,
      bukrs TYPE bukrs,
      gjahr TYPE gjahr,
    dmbtr2 TYPE dmbtr,
      dmbtr3 TYPE dmbtr,
      dmbtr4 TYPE dmbtr,
        END   OF t_data.
DATA: gt_data TYPE TABLE OF t_data,
       gs_data TYPE          t_data.
DATA:  gt_fieldcatalog      TYPE lvc_t_fcat,
        gs_fieldcatalog      TYPE lvc_s_fcat,
        gt_events            TYPE slis_t_event,
        gs_events            TYPE slis_alv_event.

START-OF-SELECTION.
*    * Add same data
   gs_data-item = 1.
   gs_data-bukrs = '1000'.
   gs_data-gjahr = '2012'.
   gs_data-dmbtr2 = '100.00' .
   gs_data-dmbtr3 = '1020.00' .
   APPEND gs_data TO gt_data.

   gs_data-item = 2.
   gs_data-bukrs = '1000'.
   gs_data-gjahr = '2013'.
   gs_data-dmbtr2 = '200.00' .
   gs_data-dmbtr3 = '4020.00' .
   APPEND gs_data TO gt_data.

   gs_data-item = 3.
   gs_data-bukrs = '1000'.
   gs_data-gjahr = '2012'.
   gs_data-dmbtr2 = '100.00' .
   gs_data-dmbtr3 = '1120.00' .
   APPEND gs_data TO gt_data.

   SORT gt_data BY bukrs.
   CLEAR gs_data.
   LOOP AT gt_data INTO gs_data.
     gs_data-dmbtr4 = gs_data-dmbtr2 + gs_data-dmbtr3.
     MODIFY gt_data FROM gs_data INDEX sy-tabix.
     CLEAR gs_data.
   ENDLOOP.

   DATA: lv_pos TYPE i.

   lv_pos = lv_pos + 1.
   CLEAR gs_fieldcatalog.
   gs_fieldcatalog-fieldname = 'ITEM'.
   gs_fieldcatalog-tabname   = 'GT_DATA'.
   gs_fieldcatalog-scrtext_m = 'Item'.
   gs_fieldcatalog-col_pos   = lv_pos.
   gs_fieldcatalog-outputlen = 7.
   gs_fieldcatalog-key = 'X'.
   APPEND gs_fieldcatalog TO gt_fieldcatalog.
*
   lv_pos = lv_pos + 1.
   CLEAR gs_fieldcatalog.
   gs_fieldcatalog-fieldname = 'BUKRS'.
   gs_fieldcatalog-tabname   = 'GT_DATA'.
   gs_fieldcatalog-scrtext_m = 'Company'.
   gs_fieldcatalog-col_pos   = lv_pos.
   gs_fieldcatalog-outputlen = 7.
   gs_fieldcatalog-key = 'X'.
   APPEND gs_fieldcatalog TO gt_fieldcatalog.

   lv_pos = lv_pos + 1.
   CLEAR gs_fieldcatalog.
   gs_fieldcatalog-fieldname = 'GJAHR'.
   gs_fieldcatalog-tabname   = 'GT_DATA'.
   gs_fieldcatalog-scrtext_m = 'YEAR'.
   gs_fieldcatalog-col_pos   = lv_pos.
   gs_fieldcatalog-outputlen = 7.
   gs_fieldcatalog-key = 'X'.
   APPEND gs_fieldcatalog TO gt_fieldcatalog.
*

   lv_pos = lv_pos + 1.
   CLEAR gs_fieldcatalog.
   gs_fieldcatalog-fieldname = 'DMBTR2'.
   gs_fieldcatalog-tabname   = 'GT_DATA'.
   gs_fieldcatalog-scrtext_m = 'AMT1'.
   gs_fieldcatalog-col_pos   = lv_pos.
   gs_fieldcatalog-outputlen = 10.
   gs_fieldcatalog-edit = 'X'.
   gs_fieldcatalog-decimals = 2.
   APPEND gs_fieldcatalog TO gt_fieldcatalog.
*
   lv_pos = lv_pos + 1.
   CLEAR gs_fieldcatalog.
   gs_fieldcatalog-fieldname = 'DMBTR3'.
   gs_fieldcatalog-tabname   = 'GT_DATA'.
   gs_fieldcatalog-scrtext_m = 'AMT2'.
   gs_fieldcatalog-col_pos   = lv_pos.
   gs_fieldcatalog-outputlen = 10.
   gs_fieldcatalog-edit = 'X'.
   gs_fieldcatalog-decimals = 2.
   APPEND gs_fieldcatalog TO gt_fieldcatalog.

   lv_pos = lv_pos + 1.
   CLEAR gs_fieldcatalog.
   gs_fieldcatalog-fieldname = 'DMBTR4'.
   gs_fieldcatalog-tabname   = 'GT_DATA'.
   gs_fieldcatalog-scrtext_m = 'TOT'.
   gs_fieldcatalog-col_pos   = lv_pos.
   gs_fieldcatalog-outputlen = 10.
   gs_fieldcatalog-decimals = 2.
   APPEND gs_fieldcatalog TO gt_fieldcatalog.

*  Trigger ENTER Event
   gs_events-name = 'CALLER_EXIT'.
   gs_events-form = 'CALLER_EXIT'.
   APPEND gs_events TO gt_events.

* To capture changed data
   gs_events-name = 'DATA_CHANGED'.
   gs_events-form = 'DATA_CHANGED'.
   APPEND gs_events TO gt_events.

*  Call ALV Grid
   CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
     EXPORTING
       i_callback_program = sy-repid
       it_fieldcat_lvc    = gt_fieldcatalog
       it_events          = gt_events
     TABLES
       t_outtab           = gt_data
     EXCEPTIONS
       program_error      = 1
       OTHERS             = 2.
*    *&---------------------------------------------------------------------*
*    *&      Form  data_changed
*    *&---------------------------------------------------------------------*
FORM data_changed USING ir_data_changed TYPE REF TO cl_alv_changed_data_protocol.
   DATA ls_modi TYPE lvc_s_modi.
*    * Check each modification:
   LOOP AT ir_data_changed->mt_mod_cells INTO ls_modi.
     CASE ls_modi-fieldname.

       WHEN 'DMBTR2' .
         CLEAR gs_data.
         READ TABLE gt_data INTO gs_data INDEX ls_modi-row_id.
         gs_data-dmbtr2 = ls_modi-value.
         gs_data-dmbtr4 = gs_data-dmbtr2 + gs_data-dmbtr3.
         MODIFY gt_data FROM gs_data INDEX ls_modi-row_id.

       WHEN 'DMBTR3' .
         CLEAR gs_data.
         READ TABLE gt_data INTO gs_data INDEX ls_modi-row_id.
         gs_data-dmbtr3 = ls_modi-value.
         gs_data-dmbtr4 = gs_data-dmbtr2 + gs_data-dmbtr3.
         MODIFY gt_data FROM gs_data INDEX ls_modi-row_id.

     ENDCASE.
   ENDLOOP.

* Refresh ALV Grid
   DATA: g_alv TYPE REF TO cl_gui_alv_grid.
   CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
     IMPORTING
       e_grid = g_alv.
   CALL METHOD g_alv->refresh_table_display.
ENDFORM.                    "data_changed
*    *&---------------------------------------------------------------------*
*    *&      Form  caller_exit
*    *&---------------------------------------------------------------------*
FORM caller_exit USING is_data TYPE slis_data_caller_exit.

   DATA: lr_alv TYPE REF TO cl_gui_alv_grid.
   CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
     IMPORTING
       e_grid = lr_alv.
*    * Register ENTER as edit event:
   CALL METHOD lr_alv->register_edit_event
     EXPORTING
       i_event_id = cl_gui_alv_grid=>mc_evt_enter.

ENDFORM. "CALLER_EXIT

0 Kudos

Dear Susmitha,

Thanks. It is working fine. But after Refresh ALV Grid the screen became initial. It is difficult to find edited row  again and again.  Can we make it stable in editable line.

Thanks,

Sunil

0 Kudos

Share your code. It did not become initial for me.

Also, you dont have to find the edited rows again and again.. All the edited rows would be there in the table ir_data_changed, till the enter key is pressed. All these rows would be modified together.

0 Kudos

Thanks. I solved bu using

   LS_STABLE-ROW = 'X'.

   LS_STABLE-COL = 'X'.

former_member228804
Participant
0 Kudos

Hello Sunil,

     You can use methods get_selected_rows and check_changed_data of class cl_gui_alv_grid. on event PAI.

Thanks,

Dnyanesh.