选中DEMO的效果:
用户在ALV 控件最左边选中一行,然后点自定义的button, 程序知道用户选中了这一行:
内存中的数据状态其实是这样的:
一、ALV控件的工具条上加一个自定义按钮:
SE38中新建一个程序ZALV_SELECT,这个程序一开始只有代码,但是我们的ALV控件工作起来,其实有一个工具条。
而且这个工具条,需要我们自己定义一个按钮。这个工具条怎么来呢?其实拷贝来改改最方便:
1、SE80中选SLVC_FULLSCREEN函数组
2、点右键复制,目前程序填上我们的程序名ZALV_SELECT,搞定。
3、我们的程序中打开工具条,加上我们的自定义按钮,完成。最后注意工具条要激活!
二、重点说明:
1、选中的状态其实是在一个仅一个字节的字段中打一个X,保留原表的结构,加一个选中字段,注意看GT_TABLE的GS_USR21是怎么申明的。
2、ALV有2个关键的参数,FILEDCAT是字段参数、LAYOUT是布局参数。
FILEDCAT字段参数是给一张数据表,而布局参数只是一行数据结构。
注意是在LAYOUT布局参数中申明存放选中的字段: GS_LOUT-BOX_FNAME = ‘SELXXX’.
3、用户在ALV控件的行选中,对应的内存中【SELXXX】字段会被打上X。 然后用户再点一下BUTTON,程序执行到我们的回调函数:ALV_USER_COMMAND;在回调函数中,我们遍历【SELXXX】字段,找到有X的行,完成对用户选中的识别。
三、完整的DEMO代码:
*&---------------------------------------------------------------------*
*& REPORT ZALV_SELECT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZALV_SELECT.
DATA: GT_FCAT TYPE LVC_T_FCAT.
DATA: GS_LOUT TYPE LVC_S_LAYO.
DATA BEGIN OF GS_USR21.
INCLUDE STRUCTURE USR21.
DATA SELXXX TYPE C. "用来记录行选择的字段
DATA END OF GS_USR21.
DATA GT_TABLE LIKE TABLE OF GS_USR21.
START-OF-SELECTION.
SELECT * INTO TABLE GT_TABLE FROM USR21.
END-OF-SELECTION.
PERFORM FM_INIT_ALV.
PERFORM FM_SHOW_ALV TABLES GT_TABLE
USING GT_FCAT
GS_LOUT.
FORM FM_INIT_ALV .
"===============FIELDCAT字段参数===================
PERFORM ADD_FIELD_LVC TABLES GT_FCAT
USING 'BNAME' '' '' '' '' '编号' '' '' '' '' ''.
PERFORM ADD_FIELD_LVC TABLES GT_FCAT
USING 'PERSNUMBER' '' '' '' '' '编号' '' '' '' '' ''.
"===============LAYOUT 布局参数===================
GS_LOUT-BOX_FNAME = 'SELXXX'.
GS_LOUT-ZEBRA = 'X'.
GS_LOUT-CWIDTH_OPT = 'X'.
GS_LOUT-STYLEFNAME = 'EDIT_T_STYLE'. "指定编辑状态的字段名,还需要把某列先打开为可编辑
ENDFORM.
FORM ADD_FIELD_LVC TABLES GT_FIELDCAT_LVC STRUCTURE LVC_S_FCAT
USING I_FIELDNAME TYPE LVC_RFNAME
I_REF_FIELD TYPE LVC_RFNAME
I_REF_TABLE TYPE LVC_TNAME
I_KEY TYPE C
I_QFIELDNAME TYPE LVC_QFNAME
I_TEXT TYPE STRING
I_EDIT TYPE C
I_NZERO TYPE C
I_F4 TYPE C
I_BOX TYPE C
I_ICON TYPE C
.
DATA GS_FIELDCAT_LVC TYPE LVC_S_FCAT.
CLEAR GS_FIELDCAT_LVC.
GS_FIELDCAT_LVC-FIELDNAME = I_FIELDNAME.
GS_FIELDCAT_LVC-REF_FIELD = I_REF_FIELD.
GS_FIELDCAT_LVC-REF_TABLE = I_REF_TABLE.
GS_FIELDCAT_LVC-KEY = I_KEY.
GS_FIELDCAT_LVC-QFIELDNAME = I_QFIELDNAME.
GS_FIELDCAT_LVC-COLDDICTXT = 'L'.
GS_FIELDCAT_LVC-SCRTEXT_L = I_TEXT.
GS_FIELDCAT_LVC-EDIT = I_EDIT.
GS_FIELDCAT_LVC-NO_ZERO = I_NZERO.
GS_FIELDCAT_LVC-F4AVAILABL = I_F4.
GS_FIELDCAT_LVC-CHECKBOX = I_BOX. "搞成CHECKBOX
GS_FIELDCAT_LVC-ICON = I_ICON.
"设置字段的颜色
IF I_FIELDNAME = 'BNAME'.
GS_FIELDCAT_LVC-EMPHASIZE = 'C700'.
ENDIF.
IF I_FIELDNAME = 'SELXXX'.
"GS_FIELDCAT_LVC-CHECKBOX = 'X'.
"GS_FIELDCAT_LVC-FIX_COLUMN = 'X'.
ENDIF.
APPEND GS_FIELDCAT_LVC TO GT_FIELDCAT_LVC.
ENDFORM. "ADD_FIELD_LVC
FORM FM_SHOW_ALV TABLES IT_OUTTAB
USING IT_FIELDCAT TYPE LVC_T_FCAT
I_LAYOUT TYPE LVC_S_LAYO.
DATA GS_EVENT TYPE SLIS_ALV_EVENT.
DATA GT_EVENT TYPE SLIS_T_EVENT.
GS_EVENT-NAME = 'PF_STATUS_SET'.
GS_EVENT-FORM = 'ALV_STATUS_SET'.
APPEND GS_EVENT TO GT_EVENT.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
I_CALLBACK_PROGRAM = SY-CPROG
" I_CALLBACK_PF_STATUS_SET = I_STATUS
IT_EVENTS = GT_EVENT "我们加了
I_CALLBACK_USER_COMMAND = 'ALV_USER_COMMAND' "我们加了
" I_CALLBACK_TOP_OF_PAGE = I_TITLE
IS_LAYOUT_LVC = I_LAYOUT
IT_FIELDCAT_LVC = IT_FIELDCAT
I_SAVE = 'A'
TABLES
T_OUTTAB = GT_TABLE
EXCEPTIONS
PROGRAM_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.
ENDFORM. "SUB_CALL_ALV
"------------加载STATUS的FORM--------------------
FORM ALV_STATUS_SET USING PT_EXTAB TYPE SLIS_T_EXTAB.
CLEAR: PT_EXTAB[].
SET PF-STATUS 'STANDARD_FULLSCREEN'.
ENDFORM.
"------------点了ALV工具条的按钮--------------------
FORM ALV_USER_COMMAND USING P_UCOMM LIKE SY-UCOMM P_SELFIELD TYPE SLIS_SELFIELD. "P_SELFIELD 用户鼠标选择的一个字段
"应用方法将修改ALV的数据保存到内表中
DATA LR_GRID TYPE REF TO CL_GUI_ALV_GRID.
DATA L_TABIX LIKE SY-TABIX. "系统参数 行号
"此处代码将用户输入读入内表(这一步不可少)
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR' "自动刷新数据
IMPORTING
E_GRID = LR_GRID.
CALL METHOD LR_GRID->CHECK_CHANGED_DATA.
P_SELFIELD-REFRESH = 'X'. "此处代码阻止'REUSE_ALV_GRID_DISPLAY创建新的屏幕,造成屏幕多层
P_SELFIELD-ROW_STABLE = 'X'. "保证行、列位置在自动刷新时不变
P_SELFIELD-COL_STABLE = 'X'.
CASE P_UCOMM.
WHEN 'B1'.
DATA:L_COUNT TYPE N,
L_MSG TYPE CHAR100.
LOOP AT GT_TABLE TRANSPORTING NO FIELDS WHERE SELXXX = 'X'.
L_COUNT = L_COUNT + 1.
ENDLOOP.
CONCATENATE 'SELECT'
L_COUNT
'ROWS'
INTO L_MSG
SEPARATED BY SPACE.
MESSAGE L_MSG TYPE 'I'.
WHEN 'B2'.
ENDCASE.
ENDFORM.
原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/18267.html