当勾选任意一行数据时,同CARRID字段都打钩。当再点击来取消勾选时,相同CARRID数据同时取消勾选。


效果图:

ALV checkbox 相关数据同时勾选或者同时取消_java

除了常用的全选,取消全选。这个功能有时候会用到。


直接上干货。

主要逻辑都可以直接复用,把画红框的结构换成自己的就行了。

ALV需要显示的,都可以copy过去稍微改改即可。

ALV checkbox 相关数据同时勾选或者同时取消_java_02

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.

  DATAL_GRID TYPE REF TO CL_GUI_ALV_GRID.
  DATALV_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.