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

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

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

直接上代码:

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 . 

### 如何在ABAP中实现ALV选中行功能 为了实现在ABAP中的ALV表格内选中特定行的功能,通常会采用如下方式: #### 使用SALV框架处理选择事件 当使用SALV(Simple ALV)显示列表时,可以通过定义`ON_DOUBLE_CLICK`或类似的交互事件来捕获用户的点击行为。对于希望仅捕捉单击选中某一行的情况,则需关注于设置合适的参数以及编写相应的逻辑。 ```abap DATA: lo_salv TYPE REF TO cl_salv_table. CALL METHOD cl_salv_table=>factory IMPORTING r_salv_table = lo_salv TABLES t_table = it_data. lo_salv->get_event( )->set_handler( me, 'ON_USER_COMMAND' ). METHOD on_user_command. DATA: lv_row_no TYPE i, ls_entry TYPE lvc_s_layclm. * 获取当前选中的行号 CALL FUNCTION 'LVC_GET_ENTRIES' EXPORTING row = sy-index " 当前行编号 CHANGING entries = lt_selected_rows. " 存储被选中的行的信息 ENDMETHOD. ``` 上述代码片段展示了如何利用SALV对象模型创建一个简单的ALV网格视图,并注册了一个自定义的方法用于监听用户命令事件[^1]。 #### 处理传统ALV的选择操作 如果是在较为传统的场景下工作,比如调用了`REUSE_ALV_GRID_DISPLAY`函数模块展示数据,则可能需要依赖其他机制来跟踪哪几项已被勾选或是处于激活状态。此时往往涉及到对内部表的操作,例如通过字段控制字典属性指定哪些列允许作为复选框呈现给最终使用者查看;另外还需要注意调整程序流程以便能够响应这些变化。 ```abap FIELD-SYMBOLS: <fs_fcat> LIKE LINE OF gt_fieldcatalog. SELECT-OPTIONS s_matnr FOR mara-matnr OBLIGATORY. PERFORM build_field_catalog USING gt_fieldcatalog. LOOP AT gt_fieldcatalog INTO wa_fieldcatalog WHERE fieldname EQ 'MATNR'. CLEAR wa_fieldcatalog-checkbox. ASSIGN COMPONENT 'CHECKBOX' OF STRUCTURE wa_fieldcatalog TO <fs_fcat>. IF sy-subrc = 0. <fs_fcat> = abap_true. ENDIF. MODIFY gt_fieldcatalog FROM wa_fieldcatalog INDEX sy-tabix. CLEAR wa_fieldcatalog. ENDLOOP. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING i_callback_program = g_repid is_layout = gs_layout it_fieldcat = gt_fieldcatalog[] TABLES t_outtab = gt_materials 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. ``` 此部分代码说明了怎样向标准的ALV控件添加额外选项——即让某些特定列支持多选模式下的复选标记[^2]。 #### 结合实际业务需求定制化开发 考虑到具体应用场景的不同,在设计阶段就应该充分考虑后续可能会遇到的各种情况。例如,在涉及复杂查询条件或者动态更新界面内容的情况下,应当提前规划好接口的设计思路和技术路线。特别是针对那些频繁发生增删改查动作的对象而言,更应该注重用户体验方面的优化措施,像即时反馈提示信息、简化输入过程等都是值得深入探讨的话题[^3]。
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值