ABAP ALV 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.
post SAP-Garson
原文链接:https://blog.csdn.net/ot512csdn/article/details/120530282文章来自于网络,如果侵犯了您的权益,请联系站长删除!