ABAP ALV DATA_CHANGED 函数使用说明 (ALV备忘二)

这篇博客介绍了如何在ABAP中使用REUSE_ALV_GRID_DISPLAY函数显示表格,并处理DATA_CHANGED事件。用户在ALV网格中更改CHECKBOX后,数据并未立即更新到内表。在DATA_CHANGED事件中,通过读取用户修改的数据并更新内表,确保数据同步。博客还展示了如何定义字段分类、布局和排序,以及调用ALV显示数据的完整过程。

这里使用的ALV函数是:REUSE_ALV_GRID_DISPLAY

我有一个FUNCTION ALV,用户点击CHECKBOX后,会触发DATA_CHANGED事件函数,在这个函数中,可以检查用户的输入和数据及时更新到内表中。

 

注意这个函数的特点:DATA_CHANGED函数中,用户点击的CHECKBOX界面后,内表的数据并没有及时更新,所以这里还可以检查一下数据或者做一下数据处理,代码中我帮它及时更新了数据到内表中。
 

*&---------------------------------------------------------------------*
*& Report ZJAMES002
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZJAMES002.
TABLES: USR21,adrp.


TYPES: BEGIN OF ty_1,

         SEL(1) TYPE C,
         BNAME TYPE XUBNAME,
         NAME_FIRST TYPE AD_NAMEFIR,
         NAME_LAST TYPE  AD_NAMELAS,
         NAME_TEXT TYPE AD_NAMTEXT,
         CHECKBOX(1) TYPE C,

       END OF ty_1.

DATA gs_user TYPE  ty_1.
DATA gt_user TYPE TABLE OF ty_1.


SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-000.

SELECT-OPTIONS:
  r_BNAME   FOR USR21-BNAME ,
  r_NAME_F  FOR adrp-NAME_FIRST,
  r_NAME_L   FOR adrp-NAME_LAST ,
  r_NAME_T   FOR adrp-NAME_TEXT.

SELECTION-SCREEN END OF BLOCK b1.



INITIALIZATION.



START-OF-SELECTION.
  PERFORM GET_DATA.

END-OF-SELECTION.
  PERFORM SHOW_DATA.



*---------------------------------------------------------------------
*      Form  GET_DATA
*---------------------------------------------------------------------

FORM GET_DATA .

  SELECT T0~BNAME T1~NAME_FIRST T1~NAME_LAST T1~NAME_TEXT

  INTO  TABLE GT_user


  FROM USR21 AS T0 INNER JOIN adrp AS T1
  ON T0~PERSNUMBER = T1~PERSNUMBER

  WHERE BNAME  IN r_BNAME  AND
        NAME_FIRST IN r_NAME_F AND
        NAME_LAST  IN r_NAME_L AND
        NAME_TEXT  IN r_NAME_T.

ENDFORM.



*---------------------------------------------------------------------
*      Form  SHOW_DATA
*---------------------------------------------------------------------

FORM SHOW_DATA .

  DATA: WS_FIELDCAT        TYPE SLIS_T_FIELDCAT_ALV WITH HEADER LINE,
        WS_FIELDGROUPS_TAB TYPE SLIS_T_SP_GROUP_ALV,
        WS_LAYOUT          TYPE SLIS_LAYOUT_ALV,
        WS_SORTFIELDS_TAB  TYPE SLIS_T_SORTINFO_ALV WITH HEADER LINE,

        GT_EVENTS          TYPE SLIS_T_EVENT,
        GS_EVENT          TYPE SLIS_ALV_EVENT,
        GS_GLAY           TYPE lvc_s_glay.


  DATA: NN TYPE I VALUE 0.
  DATA: TITLE TYPE LVC_TITLE.
  DATA: COLOR TYPE SLIS_T_SPECIALCOL_ALV WITH HEADER LINE.
*
  DEFINE HOUT.
    NN = NN + 1.
    WS_FIELDCAT-COL_POS       =  NN.
    WS_FIELDCAT-TABNAME       = 'GT_user'.
    WS_FIELDCAT-KEY           = &1.
    WS_FIELDCAT-FIELDNAME     = &2.
    WS_FIELDCAT-SELTEXT_M     = &3.
    WS_FIELDCAT-CFIELDNAME    = &4.
    WS_FIELDCAT-DATATYPE      = &5.
    WS_FIELDCAT-REF_TABNAME   = &6.
    WS_FIELDCAT-REF_FIELDNAME = &7.
    WS_FIELDCAT-CHECKBOX      = &8.
    WS_FIELDCAT-EDIT           = &9.
    APPEND WS_FIELDCAT.
    CLEAR WS_FIELDCAT.
  END-OF-DEFINITION.

  HOUT:

''  'BNAME' '帐号'  ''  ''  ''  ''  ''  '',
''  'NAME_FIRST' '名字1'  ''  ''  ''  ''  ''  '',
''  'NAME_LAST' '名字2'  ''  ''  ''  ''  ''  '',

''  'NAME_TEXT' '名字3'  ''  ''  ''  ''  ''  'X',
''  'CHECKBOX' '选择'  ''  ''  ''  ''  'X'  'X'.


  WS_LAYOUT-ZEBRA             = 'X'.
  WS_LAYOUT-GET_SELINFOS      = 'X'.
  WS_LAYOUT-COLWIDTH_OPTIMIZE = 'X'.
  WS_LAYOUT-DETAIL_POPUP      = 'X'.

  "排序这个字段
  WS_SORTFIELDS_TAB-FIELDNAME = 'NAME_FIRST'.
  WS_SORTFIELDS_TAB-DOWN = 'X'.
  APPEND WS_SORTFIELDS_TAB.
  CLEAR WS_SORTFIELDS_TAB.



  GS_EVENT-NAME = GS_EVENT-FORM = 'DATA_CHANGED'.
  APPEND GS_EVENT TO GT_EVENTS.


  GS_GLAY-EDT_CLL_CB = 'X'.


  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      I_CALLBACK_PROGRAM      = SY-REPID
      IS_LAYOUT               = WS_LAYOUT
      IT_FIELDCAT             = WS_FIELDCAT[]
      IT_SPECIAL_GROUPS       = WS_FIELDGROUPS_TAB[]
      IT_SORT                 = WS_SORTFIELDS_TAB[]
      IT_EVENTS               = gt_EVENTS
      I_GRID_TITLE            = TITLE
      I_GRID_settings         = gs_glay
      I_DEFAULT               = 'X'
      I_SAVE                  = 'A'
    TABLES
      T_OUTTAB                = GT_user
    EXCEPTIONS
      PROGRAM_ERROR           = 1
      OTHERS                  = 2.

ENDFORM.


*---------------------------------------------------------------------
*      Form  DATA_CHANGED
*---------------------------------------------------------------------


FORM DATA_CHANGED USING pcl_data TYPE REF TO cl_alv_changed_data_protocol.


"如果把断点下在MESSAGE上,可以看到DATA_CHANGED函数中,用户点击的CHECKBOX界面后,内表的数据还没更新,所以这里还可以检查一下数据

MESSAGE '数据还未更新内表' TYPE 'I'.



*data: lt_mod_cell TYPE lvc_t_modi,
*      ls_mod_cell TYPE lvc_s_modi.


      DATA(lt_mod_cell) = pcl_data->mt_mod_cells .


  LOOP AT lt_mod_cell INTO  DATA(ls_mod_cell) WHERE fieldname = 'CHECKBOX'.


    READ TABLE GT_user INTO gs_user INDEX ls_mod_cell-row_id." 读内表中将要被修改的一行

    gs_user-CHECKBOX = ls_mod_cell-value. " ALV界面已经改了,现在把这个修改内容赋值给内表工作区

    modify gt_user FROM gs_user INDEX ls_mod_cell-row_id . "更新内表


  ENDLOOP.




MESSAGE '已经更新内表' TYPE 'I'.





ENDFORM.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘欣的博客

你将成为第一个打赏博主的人!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值