二维码

[ooalv] ooalv中编辑字段的数据检查

Twilight发表于 2014-12-17 16:06Twilight 最后回复于 2014-12-17 16:06 [复制链接] 7837 0

ALV单元格设置为可输入后,通常我们需要对单元格输入的值做一个检查,一般来说用循环内表的方法可以实现上述操作,不过如果ALV中有大量数据,而我们只更新了少量的单元格数据,这样检查显得非常的麻烦,而且效率低下,我们可以利用oo中的事件监听被修改的数据,从而达到了高效

1、程序代码:
  1. DATA: BEGIN OF itab OCCURS 0 ,
  2.         mblnr LIKE mseg-mblnr ,
  3.         kostl LIKE mseg-kostl ,
  4.       END OF itab .

  5. DATA: ok_code LIKE sy-ucomm .
  6. DATA: l_valid(1) TYPE c.

  7. DATA: go_grid             TYPE REF TO cl_gui_alv_grid,
  8.       go_custom_container TYPE REF TO cl_gui_custom_container.
  9. DATA: gt_fieldcat TYPE lvc_t_fcat,
  10.       gs_fieldcat TYPE lvc_s_fcat,
  11.       gs_variant  TYPE disvariant ,
  12.       gt_filt     TYPE lvc_t_filt,
  13.       gs_filt     TYPE lvc_s_filt,
  14.       sla         TYPE lvc_s_layo .

  15. CLASS lcl_event_receiver DEFINITION DEFERRED .
  16. DATA: event_receiver TYPE REF TO lcl_event_receiver.

  17. *---------------------------------------------------------------------*
  18. *       CLASS lcl_event_receiver DEFINITION
  19. *---------------------------------------------------------------------*
  20. CLASS lcl_event_receiver DEFINITION.
  21.   PUBLIC SECTION.
  22.     METHODS handle_data_changed
  23.         FOR EVENT data_changed OF cl_gui_alv_grid
  24.             IMPORTING er_data_changed.
  25. ENDCLASS.                    "lcl_event_receiver DEFINITION

  26. *---------------------------------------------------------------------*
  27. *       CLASS lcl_event_receiver IMPLEMENTATION
  28. *---------------------------------------------------------------------*
  29. CLASS lcl_event_receiver IMPLEMENTATION.
  30.   METHOD handle_data_changed.
  31.     PERFORM handle_data_changed USING er_data_changed.
  32.   ENDMETHOD.                    "handle_data_changed
  33. ENDCLASS.                    "lcl_event_receiver IMPLEMENTATION

  34. INITIALIZATION.
  35.   PERFORM fieldcat_init USING gt_fieldcat[].

  36. START-OF-SELECTION.
  37.   CALL SCREEN 0100 .

  38. *&---------------------------------------------------------------------*
  39. *&      Module  USER_COMMAND_0100  INPUT
  40. *&---------------------------------------------------------------------*
  41. MODULE user_command_0100 INPUT.
  42.   CASE ok_code.
  43.     WHEN 'BACK'.
  44.       LEAVE PROGRAM.
  45.     WHEN 'ENTE'.
  46.       PERFORM enter.
  47.     WHEN 'CHANGE'.
  48.       PERFORM change.
  49.   ENDCASE.
  50.   CLEAR ok_code .
  51. ENDMODULE.                 " USER_COMMAND_0100  INPUT

  52. *&---------------------------------------------------------------------*
  53. *&      Form  load_data_into_grid
  54. *&---------------------------------------------------------------------*
  55. FORM load_data_into_grid.
  56.   SELECT * FROM mseg INTO CORRESPONDING FIELDS OF TABLE itab
  57.   UP TO 20 ROWS .

  58.   sla-cwidth_opt = 'X'.
  59.   sla-zebra      = 'X'.

  60.   CALL METHOD go_grid->set_table_for_first_display
  61.     EXPORTING
  62.       is_variant                    = gs_variant
  63.       i_save                        = 'A'
  64.       is_layout                     = sla
  65.     CHANGING
  66.       it_outtab                     = itab[]
  67.       it_fieldcatalog               = gt_fieldcat[]
  68.     EXCEPTIONS
  69.       invalid_parameter_combination = 1
  70.       program_error                 = 2
  71.       too_many_lines                = 3
  72.       OTHERS                        = 4.

  73.   CALL METHOD go_grid->set_ready_for_input "处于编辑状态
  74.     EXPORTING
  75.       i_ready_for_input = 1.

  76.   CALL METHOD cl_gui_control=>set_focus    "设置焦点在go_grid 上
  77.     EXPORTING
  78.       control = go_grid .
  79. ENDFORM.                    " load_data_into_grid


  80. *&--------------------------------------------------------------------*
  81. *&      Form  fieldcat_init
  82. *&--------------------------------------------------------------------*
  83. FORM fieldcat_init USING rt_fieldcat TYPE lvc_t_fcat.
  84.   DATA: ls_fieldcat TYPE lvc_s_fcat.

  85.   PERFORM frm_catlg_set USING:
  86.   'MBLNR'  'X' '凭证'       '' 'MBLNR' 'MSEG' rt_fieldcat,
  87.   'KOSTL'  '' '成本中心'   'X'  ''      ''     rt_fieldcat.
  88. ENDFORM.   "fieldcat_init

  89. *---------------------------------------------------------------------*
  90. *       FORM frm_catlg_set                                            *
  91. *---------------------------------------------------------------------*
  92. FORM frm_catlg_set USING p_field p_key p_text p_edit ref_f ref_t
  93.                           rt_fieldcat  TYPE lvc_t_fcat .
  94.   DATA:  tmp_fieldcat TYPE lvc_s_fcat.

  95.   tmp_fieldcat-fieldname     =  p_field.
  96.   tmp_fieldcat-key           =  p_key .
  97.   tmp_fieldcat-scrtext_l     =  p_text.
  98.   tmp_fieldcat-edit          =  p_edit.
  99.   tmp_fieldcat-ref_field     = ref_f.
  100.   tmp_fieldcat-ref_table     = ref_t.

  101.   APPEND tmp_fieldcat TO rt_fieldcat .
  102.   CLEAR tmp_fieldcat .
  103. ENDFORM.                    " FRM_CATLG_SET

  104. *&---------------------------------------------------------------------*
  105. *&      Form  change
  106. *&---------------------------------------------------------------------*
  107. FORM change .
  108.   DATA: ls_stable TYPE lvc_s_stbl.
  109.   ls_stable-row = 'X'.
  110.   ls_stable-col = 'X'.

  111.   IF go_grid->is_ready_for_input( ) = 0.
  112.     CALL METHOD go_grid->set_ready_for_input
  113.       EXPORTING
  114.         i_ready_for_input = 1.
  115.   ELSE.
  116.     CALL METHOD go_grid->check_changed_data  "把修改的内容更改到内表里
  117.       IMPORTING
  118.         e_valid = l_valid.
  119.     CALL METHOD go_grid->set_ready_for_input
  120.       EXPORTING
  121.         i_ready_for_input = 0.
  122.     CALL METHOD go_grid->refresh_table_display
  123.       EXPORTING
  124.         is_stable = ls_stable
  125.       EXCEPTIONS
  126.         finished  = 1
  127.         OTHERS    = 2.
  128.   ENDIF.
  129. ENDFORM.                    " change


  130. *&---------------------------------------------------------------------*
  131. *&      Module  STATUS_0100  OUTPUT
  132. *&---------------------------------------------------------------------*
  133. MODULE status_0100 OUTPUT.
  134.   SET PF-STATUS 'MAIN100'.
  135.   gs_variant-report = sy-repid.

  136.   IF go_grid IS INITIAL.
  137.     CREATE OBJECT go_grid
  138.       EXPORTING
  139.         i_parent = cl_gui_container=>screen0.
  140.     CREATE OBJECT event_receiver.

  141.     SET HANDLER event_receiver->handle_data_changed FOR go_grid.

  142.     IF sy-batch IS INITIAL.
  143.       CALL METHOD go_grid->register_edit_event
  144.         EXPORTING
  145.           i_event_id = cl_gui_alv_grid=>mc_evt_enter. "回车时触发
  146. *        i_event_id = cl_gui_alv_grid=>mc_evt_modified. "单元格更改触发
  147.     ENDIF.

  148.     PERFORM load_data_into_grid.
  149.   ENDIF.
  150. ENDMODULE.                 " STATUS_0100  OUTPUT

  151. *&---------------------------------------------------------------------*
  152. *&      Form  ENTER
  153. *&---------------------------------------------------------------------*
  154. FORM enter .
  155.   DATA: ucomm LIKE sy-ucomm.

  156.   ucomm = '&DATA_SAVE'." '&REFRESH'.
  157.   CALL METHOD go_grid->set_function_code
  158.     CHANGING
  159.       c_ucomm = ucomm.
  160. ENDFORM.                    " ENTER

  161. *&---------------------------------------------------------------------*
  162. *&      Form  HANDLE_DATA_CHANGED
  163. *&---------------------------------------------------------------------*
  164. FORM handle_data_changed USING data_changed TYPE REF TO cl_alv_changed_data_protocol..
  165.   FIELD-SYMBOLS: <fs_mod_rows> TYPE STANDARD TABLE,
  166.                  <fs_cells> TYPE lvc_t_modi ,
  167.                  <fs_cell_wa> TYPE lvc_s_modi ,
  168.                  <fs>    LIKE LINE OF itab.

  169.   IF NOT data_changed->mp_mod_rows IS INITIAL.
  170.     ASSIGN data_changed->mp_mod_rows->* TO <fs_mod_rows>.
  171.     ASSIGN data_changed->mt_mod_cells TO <fs_cells>.
  172.     LOOP AT <fs_mod_rows> ASSIGNING <fs>.
  173.       IF <fs>-kostl = 'ABC' .
  174.         READ TABLE <fs_cells> INDEX sy-tabix ASSIGNING <fs_cell_wa>.
  175.         CALL METHOD data_changed->add_protocol_entry
  176.           EXPORTING
  177.             i_msgid     = 'OO'
  178.             i_msgty     = 'E'
  179.             i_msgno     = '000'
  180.             i_msgv1     = '不可以为ABC'
  181.             i_fieldname = 'KOSTL'
  182.             i_row_id    = <fs_cell_wa>-row_id
  183. *            i_tabix     = tabix
  184.              .
  185.       ENDIF.
  186.     ENDLOOP.
  187.   ENDIF.
  188. ENDFORM.                    " HANDLE_DATA_CHANGED
复制代码


2、创建SCREEN 0100,定义ok_code和逻辑流

3、GUI状态
可编辑ALV的数据检查模板 1.jpg

4、程序执行效果:
可编辑ALV的数据检查模板 2.jpg

5、拓展内容
*CL_ALV_CHANGED_DATA_PROTOCOL参数的常用方法和属性
*
*方法                   用途
*MODIFY_CELL            修改指定位置单元格的值
*GET_CELL_VALUE         获取单元格的值
*ADD_PROTOCOL_ENTRY     弹出一个消息,必须使用系统标准的消息类
*MODIFY_PROTOCOL_ENTRY  修改消息
*PROTOCOL_IS_VISIBLE    是否显示错误信息提示
*REFRESH_PROTOCOL       删除错误消息
*
*属性                   用途
*MT_PROTOCOL            LOGs
*MT_MOD_CELLS           更新的单元格信息
*MP_MOD_ROWS            更新了的行的信息
*MT_GOOD_CELLS          正确的CELL的值
*MT_DELETED_ROWS        被删除的行信息
*MT_INSERTED_ROWS       新插入的行信息

PS:alv编辑字段的检查,通常包括输入字段的重复性检查和存在性检查,想一想怎么实现

评分

参与人数 1雨露 +5 收起 理由
MARKJ + 5 赞一个!

查看全部评分

回复

使用道具 举报

快速回帖

本版积分规则
您需要登录后才可以回帖 登录 | 注册有礼

快速回复 返回顶部 返回列表