ALV OO檢查單元格更新數據

 

原文地址: http://blog.csdn.net/bobking1983/archive/2007/04/23/1575361.aspx

ALV單元格設置爲可輸入後,通常我們需要對單元格輸入的值做一個檢查,一般來說用循環內表的方法可以實現上述操作,不過如果ALV中有大量數據,而我們只更新了少量的單元格數據,這樣檢查顯得非常的麻煩,而且效率低下

ALV OO中我們可以通過DATA_CHANGE事件得到被修改的單元格的信息,利用這些信息我們可以很方便的對所填數據做檢查,別且可以給用戶相應的錯誤提示,以及自動修改單元格數據

1.       我們需要在處理事件的類中添加一個處理DATA_CHANGE事件的方法

Eg

CLASS lcl_alv_receiver DEFINITION DEFERRED.

 

CLASS lcl_alv_receiver DEFINITION.

  PUBLIC SECTION.

    ……..

    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.

ENDCLASS.                    "lcl_event_receiver DEFINITION

 

2.       初始化ALV後爲lcl_alv_receiver類註冊一個DATA_CHANGED事件

Eg

CALL METHOD g_grid->set_table_for_first_display

    EXPORTING

      i_save          = x_save

      is_variant       = ls_layout

      is_layout        = is_layout

    CHANGING

      it_fieldcatalog   = it_fieldcat

      it_outtab       = lt_zqsdmx[].

SET HANDLER g_alv_application->handle_data_changed FOR g_grid.

CALL METHOD g_grid->register_edit_event  註冊更新事件

    EXPORTING

      i_event_id = cl_gui_alv_grid=>mc_evt_enter .

其中i_event_id = cl_gui_alv_grid=>mc_evt_enter 表示在單元格修改後回車或者執行其他操作時觸發事件,此類型可用於多個單元格修改後一起檢查修改的值

i_event_id = cl_gui_alv_grid=>mc_evt_modified 表示單光標焦點移開被修改單元格後既觸發事件,此類型可用於每個每個單元個的實時更新檢查

  3.實現lcl_alv_receiver類的handle_data_changed方法,其中一些常用的一些屬性方法我會在後附表列出

Eg

CLASS lcl_alv_receiver IMPLEMENTATION.

  METHOD handle_toolbar.

    METHOD handle_data_changed.

    PERFORM handle_data_changed USING er_data_changed.

  ENDMETHOD.                    "handle_data_changed

ENDCLASS.               "lcl_ALV_event_receiver

 

*&---------------------------------------------------------------------*

*&      Form  handle_data_changed

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

*      -->P_ER_DATA_CHANGED  text

*----------------------------------------------------------------------*

FORM handle_data_changed  USING p_er_data_changed TYPE REF TO cl_alv_changed_data_protocol.

*如果更新的reason字段長度小於10爲則提示用戶填入字符數不能低於10

  DATA:mod_data TYPE lvc_t_modi,

       wa_mod_data TYPE lvc_s_modi.

  mod_data = p_er_data_changed->mt_mod_cells.

  LOOP AT mod_data INTO wa_mod_data WHERE fieldname = 'ZRESON'.

    IF STRLEN( wa_mod_data-value ) < 10.

      CALL METHOD p_er_data_changed->add_protocol_entry

        EXPORTING

          i_msgid     = '00'

          i_msgty     = 'E'

          i_msgno     = '001'

          i_msgv1     = '長度必須大於10 '

          i_fieldname = wa_mod_data-fieldname.

 

*如果長度小於10,則將字段內容更新爲長都無法確定

      CALL METHOD p_er_data_changed->modify_cell

        EXPORTING

          i_row_id    = wa_mod_data-row_id

          i_fieldname = wa_mod_data-fieldname.

    ENDIF.

  ENDLOOP.

ENDFORM.                    " handle_data_changed

附:

DATA_CHANGED 事件ER_DATA_CHANGED參數的常用方法和屬性一覽表

方法

名稱

用途

modify_cell

修改指定位置單元格的值

add_protocol_entry

彈出一個消息,必須使用系統標準的消息類

protocol_is_visible

是否顯示錯誤信息提示

refresh_protocol

刪除錯誤消息

屬性

名稱

用途

MT_MOD_CELLS

更新的單元格信息

MP_MOD_ROWS

更新的行信息

MT_GOOD_CELLS

更新的單元格信息,系統按照標準格式對字段內容轉換後的值

MT_DELETED_ROWS

被刪除的行信息

MT_INSERTED_ROWS

新插入的行信息

 

修改單元格

 

由於輸入長度限制小於10,彈出提示窗口,並且自動更新單元格內容

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章