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 grid abort processing, if wrong value

Former Member
0 Likes
1,874

Hello,

i've a editable alv grid.

Is it possible to abort at event data_changed/data_changed_finished, if an value is wrong (f.e. to high < 500), and write the old value back.

Best regards,

TomSd

3 REPLIES 3
Read only

Former Member
0 Likes
997

Hi,

The ABAP runtime environment handles messages according to the type declared in the MESSAGE statement and the context in which the message was sent.

The behaviour of message type 'W' in a dialog is different from a report program.

Run demo program DEMO_MESSAGES, select Main Program, Type 'W' and execute. You will get an error message instead of warning message.

This behaviour is well documeneted in the on-line help for MESSAGE statement.

Reward points if found helpful...

Cheers,

Chandra Sekhar.

Read only

0 Likes
997

Hi,

i need an other way, not the message statement.

Best regards,

TomSd

Read only

uwe_schieferstein
Active Contributor
0 Likes
997

Hello Thomas

The sample report <b>ZUS_SDN_ALVGRID_EDITABLE_10</b> provides a possible (perhaps not the most elegant) solution for your problem.

*&---------------------------------------------------------------------*
*& Report  ZUS_SDN_ALVGRID_EDITABLE_10
*&
*& Description: Reset false values entered in editable ALV list
*&              to original values
*& Example:     Column SORT_KEY allows values from '000'-'150'
*               -> reset if value > '010'
*&
*& Thread: ALV grid abort processing, if wrong value
*& Link: https:||<a class="jive_macro jive_macro_thread" href="" __jive_macro_name="thread" modifiedtitle="true" __default_attr="669430"></a>
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  zus_sdn_alvgrid_editable_10.


TYPE-POOLS: abap.

INCLUDE <icon>.  " NOTE: replace by TYPE-POOLS: icon. on >= 6.20

DATA:
  gd_repid         TYPE syrepid,
  gd_okcode        TYPE sy-ucomm,
*
  gs_layout        TYPE lvc_s_layo,
  gt_fcat          TYPE lvc_t_fcat,
  go_docking       TYPE REF TO cl_gui_docking_container,
  go_grid          TYPE REF TO cl_gui_alv_grid.


TYPES: BEGIN OF ty_s_outtab.
INCLUDE TYPE knb1.
TYPES: END OF ty_s_outtab.
TYPES: ty_t_outtab    TYPE STANDARD TABLE OF ty_s_outtab
                      WITH DEFAULT KEY.

DATA:
  gt_outtab        TYPE ty_t_outtab,
  gt_outtab_pbo    TYPE ty_t_outtab.



*---------------------------------------------------------------------*
*       CLASS lcl_eventhandler DEFINITION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS lcl_eventhandler DEFINITION.

  PUBLIC SECTION.
    CLASS-DATA:
      mo_data_changed    TYPE REF TO cl_alv_changed_data_protocol.


    CLASS-METHODS:
      handle_data_changed
        FOR EVENT data_changed OF cl_gui_alv_grid
        IMPORTING
          er_data_changed
          e_onf4
          e_onf4_before
          e_onf4_after
          e_ucomm
          sender,

      handle_data_changed_finished
        FOR EVENT data_changed_finished OF cl_gui_alv_grid
        IMPORTING
          e_modified
          et_good_cells,

      handle_user_command
        FOR EVENT user_command OF cl_gui_alv_grid
        IMPORTING
          e_ucomm,


      handle_toolbar
        FOR EVENT toolbar OF cl_gui_alv_grid
        IMPORTING
          e_object
          e_interactive.


ENDCLASS.                    "lcl_eventhandler DEFINITION


*---------------------------------------------------------------------*
*       CLASS lcl_eventhandler IMPLEMENTATION
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
CLASS lcl_eventhandler IMPLEMENTATION.

  METHOD handle_data_changed.
*   define local data
    DATA:
      ld_idx     TYPE i,
      ls_cell    TYPE lvc_s_modi,
      ls_msg     TYPE symsg.


    FIELD-SYMBOLS:
      <lt_outtab>  TYPE ty_t_outtab,
      <ls_outtab>  TYPE ty_s_outtab.


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


    LOOP AT er_data_changed->mt_mod_cells INTO ls_cell
            WHERE ( fieldname = 'ZUAWA' ).
      ld_idx = syst-tabix.

      IF ( ls_cell-value <= '010' ).
        READ TABLE <lt_outtab> ASSIGNING <ls_outtab> INDEX ld_idx.

        MODIFY gt_outtab FROM <ls_outtab> INDEX ls_cell-row_id. " !!!

      ELSE.
        CLEAR: ls_msg.
        ls_msg-msgv1 = 'Value'.
        ls_msg-msgv2 = ls_cell-value.
        ls_msg-msgv3 = 'too high (> 010)'.

        CALL METHOD er_data_changed->add_protocol_entry
          EXPORTING
             i_msgid     = '00'
             i_msgty     = 'E'
             i_msgno     = '398'
             i_msgv1     = ls_msg-msgv1
             i_msgv2     = ls_msg-msgv2
             i_msgv3     = ls_msg-msgv3
*             I_MSGV4     =
             i_fieldname = ls_cell-fieldname
             i_row_id    = ls_cell-row_id
             i_tabix     = ls_cell-tabix.



        DELETE er_data_changed->mt_mod_cells  INDEX ld_idx.
        DELETE er_data_changed->mt_good_cells INDEX ld_idx.
      ENDIF.
    ENDLOOP.

    IF ( syst-subrc = 0 ).
      er_data_changed->display_protocol( ).
    ENDIF.



**    cl_gui_cfw=>set_new_ok_code( 'REFRESH' ). " not possible on 4.6c
    CALL METHOD cl_gui_cfw=>set_new_ok_code
      EXPORTING
        new_code = 'DUMMY'
*      IMPORTING
*        RC       =
        .


  ENDMETHOD.                    "handle_data_changed

  METHOD handle_data_changed_finished.
*   define local data
    DATA:
      ls_outtab      TYPE ty_s_outtab,
      ls_cell        TYPE lvc_s_modi.

  ENDMETHOD.                    "handle_data_changed_finished

  METHOD handle_user_command.

  ENDMETHOD.                    "handle_user_command

  METHOD handle_toolbar.
*   define local data
    DATA:
      ls_button    TYPE stb_button.

    ls_button-function  = 'DEFAULT'.
    ls_button-icon      = icon_mass_change.
    ls_button-quickinfo = 'Set default value for column'.
    APPEND ls_button TO e_object->mt_toolbar.

  ENDMETHOD.                    "handle_toolbar

ENDCLASS.                    "lcl_eventhandler IMPLEMENTATION




START-OF-SELECTION.


  SELECT * FROM knb1 INTO TABLE gt_outtab UP TO 20 ROWS
    WHERE bukrs = '1000'.

  gt_outtab_pbo = gt_outtab.  " store PBO data



* Create docking container
  CREATE OBJECT go_docking
    EXPORTING
      parent                      = cl_gui_container=>screen0
      ratio                       = 90
    EXCEPTIONS
      OTHERS                      = 6.
  IF sy-subrc <> 0.
*   MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*              WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.


* Create ALV grid
  CREATE OBJECT go_grid
    EXPORTING
      i_parent          = go_docking
    EXCEPTIONS
      OTHERS            = 5.
  IF sy-subrc <> 0.
*   MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*              WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.



* Build fieldcatalog
  PERFORM build_fieldcatalog.

  PERFORM set_layout.

  SET HANDLER:
    lcl_eventhandler=>handle_toolbar               FOR go_grid,
    lcl_eventhandler=>handle_data_changed          FOR go_grid,
    lcl_eventhandler=>handle_data_changed_finished FOR go_grid.



* Display data
  CALL METHOD go_grid->set_table_for_first_display
    EXPORTING
      is_layout       = gs_layout
    CHANGING
      it_outtab       = gt_outtab
      it_fieldcatalog = gt_fcat
    EXCEPTIONS
      OTHERS          = 4.
  IF sy-subrc <> 0.
*   MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*              WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.

  go_grid->set_toolbar_interactive( ).

  CALL METHOD go_grid->register_edit_event
    EXPORTING
      i_event_id = cl_gui_alv_grid=>mc_evt_enter
    EXCEPTIONS
      error      = 1
      OTHERS     = 2.
  IF sy-subrc <> 0.
*   MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*              WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.


* Link the docking container to the target dynpro
  gd_repid = syst-repid.
  CALL METHOD go_docking->link
    EXPORTING
      repid                       = gd_repid
      dynnr                       = '0100'
*      CONTAINER                   =
    EXCEPTIONS
      OTHERS                      = 4.
  IF sy-subrc <> 0.
*   MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*              WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.


* ok-code field = GD_OKCODE
  CALL SCREEN '0100'.
* Flow logic (no elements on screen):
*  PROCESS BEFORE OUTPUT.
*    MODULE STATUS_0100.
**
*  PROCESS AFTER INPUT.
*    MODULE USER_COMMAND_0100.


END-OF-SELECTION.

*&---------------------------------------------------------------------*
*&      Module  STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
  SET PF-STATUS 'STATUS_0100'.
*  SET TITLEBAR 'xxx'.

  CALL METHOD go_grid->refresh_table_display
*      EXPORTING
*        IS_STABLE      =
*        I_SOFT_REFRESH =
    EXCEPTIONS
      finished       = 1
      OTHERS         = 2.
  IF sy-subrc <> 0.
*     MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*                WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.

ENDMODULE.                 " STATUS_0100  OUTPUT

*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.

  TRANSLATE gd_okcode TO UPPER CASE.

* Fetch changes on ALV grid
  go_grid->check_changed_data( ).

  CASE gd_okcode.
    WHEN 'BACK' OR
         'END'  OR
         'CANC'.
      SET SCREEN 0. LEAVE SCREEN.

    WHEN 'DUMMY'. " do nothing but pass PAI -> list refresh at PBO

    WHEN OTHERS.
  ENDCASE.





  CLEAR: gd_okcode.

ENDMODULE.                 " USER_COMMAND_0100  INPUT


*&---------------------------------------------------------------------*
*&      Form  BUILD_FIELDCATALOG_KNB1
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM build_fieldcatalog .
* define local data
  DATA:
    ls_fcat        TYPE lvc_s_fcat.



  CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
    EXPORTING
*     I_BUFFER_ACTIVE              =
      i_structure_name             = 'KNB1'
*     I_CLIENT_NEVER_DISPLAY       = 'X'
*     I_BYPASSING_BUFFER           =
*     I_INTERNAL_TABNAME           =
    CHANGING
      ct_fieldcat                  = gt_fcat
    EXCEPTIONS
      inconsistent_interface       = 1
      program_error                = 2
      OTHERS                       = 3.
  IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.




  " Set required fields editable
  LOOP AT gt_fcat INTO ls_fcat
                  WHERE ( fieldname = 'ZUAWA'  OR
                          fieldname = 'BUSAB' ).
    ls_fcat-edit    = abap_true.

    MODIFY gt_fcat FROM ls_fcat.
  ENDLOOP.

  DELETE gt_fcat WHERE ( fieldname = 'ZINRT' ).


ENDFORM.                    " BUILD_FIELDCATALOG


*&---------------------------------------------------------------------*
*&      Form  SET_LAYOUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM set_layout .

  CLEAR: gs_layout.

  gs_layout-cwidth_opt = abap_true.
  gs_layout-zebra      = abap_true.

**  gs_layout-stylefname = 'CELLTAB'.

ENDFORM.                    " SET_LAYOUT

Regards,

Uwe