当勾选任意一行数据时,同CARRID字段都打钩。当再点击来取消勾选时,相同CARRID数据同时取消勾选。
效果图:
除了常用的全选,取消全选。这个功能有时候会用到。
直接上干货。
主要逻辑都可以直接复用,把画红框的结构换成自己的就行了。
ALV需要显示的,都可以copy过去稍微改改即可。
DEMO:
*&---------------------------------------------------------------------*
*& Report ZLM_ALV_CHECKBOX
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT ZLM_ALV_CHECKBOX.
DATA:LS_LAYOUT TYPE SLIS_LAYOUT_ALV.
DATA:CT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV.
DATA:GT_FIELDCATALOG TYPE SLIS_T_FIELDCAT_ALV .
DATA:LS_CT_FIELDCAT LIKE LINE OF CT_FIELDCAT.
DATA:LS_IT_FIELDCATALOG LIKE LINE OF GT_FIELDCATALOG.
DATA:LV_GRID_TITLE TYPE LVC_TITLE .
DATA:LV_ALV_STRUCTURE TYPE DD02L-TABNAME VALUE 'ZLM_SPFLI'.
DATA:GT_ALV TYPE TABLE OF ZLM_SPFLI.
DATA:GS_ALV TYPE ZLM_SPFLI.
FIELD-SYMBOLS <GS_ALV> LIKE LINE OF GT_ALV.
START-OF-SELECTION.
"get data
PERFORM FRM_GET_DATA.
"alv show
PERFORM FRM_ALV_SHOW.
*&---------------------------------------------------------------------*
*& Form ZFORM_SET_PF_STATUS_FC
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->RT_EXTAB text
*----------------------------------------------------------------------*
FORM ZFORM_SET_PF_STATUS USING RT_EXTAB TYPE SLIS_T_EXTAB.
SET PF-STATUS 'STATUS' .
ENDFORM. "zform_set_PF_STATUS
*&---------------------------------------------------------------------*
*& Form alv_user_command
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->R_UCOMM text
* -->RS_SELFIELD text
*----------------------------------------------------------------------*
FORM ALV_USER_COMMAND USING R_UCOMM LIKE SY-UCOMM
RS_SELFIELD TYPE SLIS_SELFIELD.
DATA: L_GRID TYPE REF TO CL_GUI_ALV_GRID.
DATA: LV_VALUE TYPE CHAR20.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
E_GRID = L_GRID.
CALL METHOD L_GRID->CHECK_CHANGED_DATA.
CALL METHOD L_GRID->REFRESH_TABLE_DISPLAY.
RS_SELFIELD-REFRESH = 'X'.
RS_SELFIELD-COL_STABLE = 'X'.
RS_SELFIELD-ROW_STABLE = 'X'.
CASE R_UCOMM.
WHEN '&IC1'."热键
CASE RS_SELFIELD-FIELDNAME.
WHEN 'CHECKBOX' .
PERFORM FRM_CHECK_BOX USING RS_SELFIELD.
WHEN OTHERS.
ENDCASE.
WHEN 'BACK'.
LEAVE TO SCREEN 0.
WHEN 'LEAVE'.
LEAVE PROGRAM.
ENDCASE .
CALL METHOD L_GRID->CHECK_CHANGED_DATA.
CALL METHOD L_GRID->REFRESH_TABLE_DISPLAY.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CHECK_BOX
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM FRM_CHECK_BOX USING RS_SELFIELD TYPE SLIS_SELFIELD. .
READ TABLE GT_ALV INTO GS_ALV INDEX RS_SELFIELD-TABINDEX.
CHECK SY-SUBRC = 0.
LOOP AT GT_ALV ASSIGNING <GS_ALV>
WHERE
CARRID = GS_ALV-CARRID .
IF <GS_ALV>-CHECKBOX = 'X'.
CLEAR <GS_ALV>-CHECKBOX.
ELSE.
<GS_ALV>-CHECKBOX = 'X'.
ENDIF.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_GET_DATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM FRM_GET_DATA .
"get data
SELECT * FROM SPFLI INTO CORRESPONDING FIELDS OF TABLE GT_ALV.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_ALV_SHOW
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM FRM_ALV_SHOW .
CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
EXPORTING
I_STRUCTURE_NAME = LV_ALV_STRUCTURE
CHANGING
CT_FIELDCAT = CT_FIELDCAT
EXCEPTIONS
INCONSISTENT_INTERFACE = 1
PROGRAM_ERROR = 2
OTHERS = 3.
CLEAR GT_FIELDCATALOG[].
LOOP AT CT_FIELDCAT INTO LS_CT_FIELDCAT .
MOVE-CORRESPONDING LS_CT_FIELDCAT TO LS_IT_FIELDCATALOG.
LS_IT_FIELDCATALOG-SELTEXT_L = LS_CT_FIELDCAT-SELTEXT_L.
LS_IT_FIELDCATALOG-SELTEXT_M = LS_CT_FIELDCAT-SELTEXT_M.
LS_IT_FIELDCATALOG-SELTEXT_S = LS_CT_FIELDCAT-SELTEXT_S.
CASE LS_IT_FIELDCATALOG-FIELDNAME .
"如果有复选框
WHEN 'CHECKBOX'.
LS_IT_FIELDCATALOG-OUTPUTLEN = 8.
LS_IT_FIELDCATALOG-DDICTXT = '选择'.
LS_IT_FIELDCATALOG-SELTEXT_L = '选择'.
LS_IT_FIELDCATALOG-SELTEXT_M = '选择'.
LS_IT_FIELDCATALOG-SELTEXT_S = '选择'.
LS_IT_FIELDCATALOG-REPTEXT_DDIC = '选择'.
LS_IT_FIELDCATALOG-CHECKBOX = 'X'.
LS_IT_FIELDCATALOG-EDIT = 'X'.
LS_IT_FIELDCATALOG-HOTSPOT = 'X'.
WHEN OTHERS.
ENDCASE.
LS_IT_FIELDCATALOG-DDICTXT ='L'.
APPEND LS_IT_FIELDCATALOG TO GT_FIELDCATALOG.
ENDLOOP.
LS_LAYOUT-COLWIDTH_OPTIMIZE = 'X'.
LS_LAYOUT-ZEBRA = 'X'.
LS_LAYOUT-DETAIL_INITIAL_LINES = 'X'.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
I_GRID_TITLE = LV_GRID_TITLE
IS_LAYOUT = LS_LAYOUT
IT_FIELDCAT = GT_FIELDCATALOG
I_CALLBACK_PROGRAM = SY-REPID "
* I_CALLBACK_PF_STATUS_SET = 'ZFORM_SET_PF_STATUS'
I_CALLBACK_USER_COMMAND = 'ALV_USER_COMMAND'
TABLES
T_OUTTAB = GT_ALV
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. " FRM_SHOW_FC
ENDFORM.