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

Updating database table using ALV Grid class CL_ALV_CHANGED_DATA_PROTOCOL

Former Member
0 Likes
2,244

Hi,

I am trying to use class CL_ALV_CHANGED_DATA_PROTOCOL to update a database table from an ALV grid.

I have used program BCALV_EDIT_04 as an example.

I am able to successfully processed inserted or deleted lines using the attributes

MT_DELETED_ROWS

MT_INSERTED_ROWS

but I also want to process modified lines.

I was just wondering whether anyone out there has some example code for this.

I can see that there are the following attributes available

MT_MOD_CELLS

MP_MOD_ROWS.

I would ideally like to use MP_MOD_ROWS rather than MT_MOD_CELLS but it is not clear to me what type MP_MOD_ROWS is.

If anyone has any example code for this sort of thing, please let me know.

Thanks,

Ruby

1 ACCEPTED SOLUTION
Read only

Former Member
0 Likes
1,347

hi Ruby,

Yes we can use that *data reference variable *.

It is a variable( something comparable to a pointer ) that points to a int table( table with changed contents )

which ll be created at run-time based on the data type ot the internal table that we pass to the parameter it_outtab of method set_table_for_first_display ...

assign er_data_changed->mp_mod_rows->* to a field-symbol and use it...

Check the below code for example -> method refresh_changed_data

screen flow logic.

PROCESS BEFORE OUTPUT.
  MODULE pbo.

PROCESS AFTER INPUT.
  MODULE pai.

main program.

*----------------------------------------------------------------------*
*       CLASS lcl_event_responder DEFINITION                           *
*----------------------------------------------------------------------*
CLASS lcl_event_responder DEFINITION.
  PUBLIC SECTION.
    DATA  : ls_changed_cell TYPE  lvc_s_modi,
            lv_language     TYPE  spras..
    METHODS refresh_changed_data  FOR EVENT data_changed
                                  OF cl_gui_alv_grid
                                  IMPORTING er_data_changed
                                            e_ucomm.

ENDCLASS.                    "event_responder DEFINITION

TYPES tt_makt TYPE STANDARD TABLE OF makt.

DATA: go_handler         TYPE REF TO lcl_event_responder,
      go_grid            TYPE REF TO cl_gui_alv_grid,
      gt_fieldcat        TYPE lvc_t_fcat,
      gv_language        TYPE spras VALUE 'E',
      gt_outtab          TYPE tt_makt,
      gs_tableline       TYPE LINE OF tt_makt.


FIELD-SYMBOLS : <changed_rows> TYPE tt_makt.

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_grid IS NOT BOUND.

  CREATE OBJECT go_grid
    EXPORTING
      i_parent = cl_gui_container=>default_screen.

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

  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.
  SELECT * FROM makt UP TO 20 ROWS INTO TABLE gt_outtab WHERE spras EQ gv_language.
ENDFORM.                               "build_display_table
*&---------------------------------------------------------------------*
FORM build_fieldcat CHANGING pt_fieldcat TYPE lvc_t_fcat.

  DATA ls_fcat TYPE lvc_s_fcat.

  CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
    EXPORTING
      i_structure_name = 'MAKT'
    CHANGING
      ct_fieldcat      = pt_fieldcat.

  LOOP AT pt_fieldcat INTO ls_fcat.
    ls_fcat-edit       = abap_true.
    MODIFY pt_fieldcat FROM ls_fcat.
  ENDLOOP.
ENDFORM.                               "build_fieldcat

*---------------------------------------------------------------------*
*       CLASS event_responder IMPLEMENTATION                          *
*---------------------------------------------------------------------*
CLASS lcl_event_responder IMPLEMENTATION.
  METHOD refresh_changed_data.

    ASSIGN er_data_changed->mp_mod_rows->* TO <changed_rows>.

    LOOP AT <changed_rows> INTO gs_tableline.
      BREAK-POINT.
    ENDLOOP.

  ENDMETHOD.                    "click
ENDCLASS.                    "event_responder IMPLEMENTATION

Cheers,

Jose.

2 REPLIES 2
Read only

Former Member
0 Likes
1,348

hi Ruby,

Yes we can use that *data reference variable *.

It is a variable( something comparable to a pointer ) that points to a int table( table with changed contents )

which ll be created at run-time based on the data type ot the internal table that we pass to the parameter it_outtab of method set_table_for_first_display ...

assign er_data_changed->mp_mod_rows->* to a field-symbol and use it...

Check the below code for example -> method refresh_changed_data

screen flow logic.

PROCESS BEFORE OUTPUT.
  MODULE pbo.

PROCESS AFTER INPUT.
  MODULE pai.

main program.

*----------------------------------------------------------------------*
*       CLASS lcl_event_responder DEFINITION                           *
*----------------------------------------------------------------------*
CLASS lcl_event_responder DEFINITION.
  PUBLIC SECTION.
    DATA  : ls_changed_cell TYPE  lvc_s_modi,
            lv_language     TYPE  spras..
    METHODS refresh_changed_data  FOR EVENT data_changed
                                  OF cl_gui_alv_grid
                                  IMPORTING er_data_changed
                                            e_ucomm.

ENDCLASS.                    "event_responder DEFINITION

TYPES tt_makt TYPE STANDARD TABLE OF makt.

DATA: go_handler         TYPE REF TO lcl_event_responder,
      go_grid            TYPE REF TO cl_gui_alv_grid,
      gt_fieldcat        TYPE lvc_t_fcat,
      gv_language        TYPE spras VALUE 'E',
      gt_outtab          TYPE tt_makt,
      gs_tableline       TYPE LINE OF tt_makt.


FIELD-SYMBOLS : <changed_rows> TYPE tt_makt.

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_grid IS NOT BOUND.

  CREATE OBJECT go_grid
    EXPORTING
      i_parent = cl_gui_container=>default_screen.

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

  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.
  SELECT * FROM makt UP TO 20 ROWS INTO TABLE gt_outtab WHERE spras EQ gv_language.
ENDFORM.                               "build_display_table
*&---------------------------------------------------------------------*
FORM build_fieldcat CHANGING pt_fieldcat TYPE lvc_t_fcat.

  DATA ls_fcat TYPE lvc_s_fcat.

  CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
    EXPORTING
      i_structure_name = 'MAKT'
    CHANGING
      ct_fieldcat      = pt_fieldcat.

  LOOP AT pt_fieldcat INTO ls_fcat.
    ls_fcat-edit       = abap_true.
    MODIFY pt_fieldcat FROM ls_fcat.
  ENDLOOP.
ENDFORM.                               "build_fieldcat

*---------------------------------------------------------------------*
*       CLASS event_responder IMPLEMENTATION                          *
*---------------------------------------------------------------------*
CLASS lcl_event_responder IMPLEMENTATION.
  METHOD refresh_changed_data.

    ASSIGN er_data_changed->mp_mod_rows->* TO <changed_rows>.

    LOOP AT <changed_rows> INTO gs_tableline.
      BREAK-POINT.
    ENDLOOP.

  ENDMETHOD.                    "click
ENDCLASS.                    "event_responder IMPLEMENTATION

Cheers,

Jose.

Read only

Former Member
0 Likes
1,347

Hi,

Use MP_MOD_ROWS with care . Because this will give all the line which are modified in the sequence and it may happen you get the duplicate records in this.Say i have entered 2 lines, first i edit 1st and then 2nd . After that if i edit the first one , then this table will consists for 3 records which may lead to inconsistencies in the data. So it is better to use as per the sample program from SAP.

Hope this helps you

Raj