ABAP ALV中设置CHECKBOX同时选中事件

本文介绍了一个使用 ABAP 编程语言创建 ALV Grid 控件的示例程序,展示了如何设置字段目录、布局参数以及如何处理用户命令。通过此示例,读者可以了解 ALV 控件的基本配置方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自己测试内容,仅供参考。

直接上代码:

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         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 
     WHERE
      CARRID  =  GS_ALV - CARRID  .

     IF  - CHECKBOX  =  'X' .
       CLEAR  - CHECKBOX .
     ELSE .
       - 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 . 

### SAP ABAP ALV 中实现点击复选框功能 在 SAP ABAP 环境下,通过 ALV 控件可以方便地显示数据列表并提供交互操作。为了实现在 ALV 表格中加入可点击的复选框,并处理其状态变化事件,通常采用如下方式: #### 方法一:使用 Function Module (FM) 当利用函数模块创建 ALV 时,可以通过 `REUSE_ALV_GRID_DISPLAY` 或者其他类似的 FM 来初始化表格视图,在此过程中指定字段作为选择列来启用复选框。 对于监听复选框的状态改变,则需注册相应的回调接口程序,比如 `GET_EVENT` 参数中的 `ON_CHECKBOX_SELECT` 事件处理器[^2]。 ```abap DATA: lt_fieldcat TYPE lvc_t_fcat, ls_layout TYPE slis_layout_alv. " 设置布局参数允许勾选项存在 ls_layout-no_input = 'X'. APPEND INITIAL LINE TO lt_fieldcat ASSIGNING FIELD-SYMBOL(<fs>). <fs>-fieldname = 'SELECT'. <fs>-seltext_m = 'Select'. <fs>-outputlen = 1. <fs>-checkbox = 'X'. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING i_callback_program = sy-repid is_layout = ls_layout * IMPORTING * e_exit = TABLES t_outtab = it_data t_fieldcat = lt_fieldcat 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. ``` #### 方法二:面向对象的方式(OOALV) 如果选择了 OO 风格开发模式下的 CL_SALV_TABLE 类来进行 ALV 的构建工作,那么可以在实例化该类之后调用相应的方法完成同样的效果设定。同样也需要订阅特定的 UI 事件以便响应用户的输入行为。 ```abap DATA(lo_salv_table) = cl_salv_table=>factory( IMPORTING r_salv_table = DATA(lo_salv) CHANGING t_columns = DATA(lt_columns) ). lo_salv->get_functions( )->set_all( abap_true ). " 添加选择栏位 lt_columns-ref_tabname = 'ZTABLE'. " 替换成实际表名 lt_columns-fieldname = 'CHECKED'. " 复选框对应的数据库字段名称 INSERT lt_columns INTO TABLE lo_salv->columns[]. TRY. lo_salv->display( ). CATCH cx_root INTO DATA(e_text). WRITE:/ e_text->get_message( ). ENDTRY. ``` 上述两段代码展示了不同风格下如何向 ALV 加入复选框以及基本框架搭建过程;具体到捕获单击动作后的业务逻辑则依赖于各自平台所提供的机制进一步编码实现[^3].
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值