以下程式兩組radion 只能兩擇一,請修正。report zt . type-pools: vrm, slis, soi,ole2. *--------------------------------------------------------------------- * 1. 內表結構 *--------------------------------------------------------------------- TYPES: BEGIN OF ty_data, lifnr TYPE char10, " 供應商編號 check1(1) TYPE c, bank1_text TYPE char40, check2(1) TYPE c, bank2_text TYPE char40, END OF ty_data. DATA: gt_data TYPE STANDARD TABLE OF ty_data, gs_data TYPE ty_data. *--------------------------------------------------------------------- * 2. LVC 欄位目錄 / Layout *--------------------------------------------------------------------- DATA: gt_fieldcat TYPE lvc_t_fcat, gs_fieldcat TYPE lvc_s_fcat, gs_layout TYPE lvc_s_layo. DATA: gt_dropdown TYPE lvc_t_drop, gs_drop TYPE lvc_s_drop. *--------------------------------------------------------------------- * 3. 從 ZVBANK 撈資料並組合 BANK TEXT *--------------------------------------------------------------------- FORM get_data_from_zvbank. DATA: lt_zvbank TYPE TABLE OF zvbank, ls_zvbank TYPE zvbank. " 直接抓 ZVBANK SELECT * FROM zvbank INTO TABLE lt_zvbank UP TO 50 ROWS. LOOP AT lt_zvbank INTO ls_zvbank. CLEAR gs_data. " LIFNR 用 BANKL 當範例顯示 gs_data-lifnr = ls_zvbank-bankl. " BANK1_TEXT / BANK2_TEXT 都用 BANKL + BANKN 組合 CONCATENATE ls_zvbank-bankl ls_zvbank-bankn INTO gs_data-bank1_text SEPARATED BY space. CONCATENATE ls_zvbank-bankl ls_zvbank-bankn INTO gs_data-bank2_text SEPARATED BY space. APPEND gs_data TO gt_data. ENDLOOP. ENDFORM. *--------------------------------------------------------------------- * 4. 建立欄位目錄 *--------------------------------------------------------------------- FORM build_fieldcat. CLEAR gt_fieldcat. CLEAR gs_fieldcat. gs_fieldcat-fieldname = 'LIFNR'. gs_fieldcat-scrtext_m = '供應商'. APPEND gs_fieldcat TO gt_fieldcat. CLEAR gs_fieldcat. gs_fieldcat-fieldname = 'CHECK1'. gs_fieldcat-checkbox = 'X'. gs_fieldcat-edit = 'X'. gs_fieldcat-scrtext_m = '選項 1'. APPEND gs_fieldcat TO gt_fieldcat. CLEAR gs_fieldcat. gs_fieldcat-fieldname = 'BANK1_TEXT'. gs_fieldcat-scrtext_m = '銀行1說明'. APPEND gs_fieldcat TO gt_fieldcat. CLEAR gs_fieldcat. gs_fieldcat-fieldname = 'CHECK2'. gs_fieldcat-checkbox = 'X'. gs_fieldcat-edit = 'X'. gs_fieldcat-scrtext_m = '選項 2'. APPEND gs_fieldcat TO gt_fieldcat. CLEAR gs_fieldcat. gs_fieldcat-fieldname = 'BANK2_TEXT'. gs_fieldcat-scrtext_m = '銀行2說明'. APPEND gs_fieldcat TO gt_fieldcat. ENDFORM. *--------------------------------------------------------------------- * 5. Layout 設定 *--------------------------------------------------------------------- FORM set_layout. CLEAR gs_layout. gs_layout-zebra = 'X'. " 交錯底色 gs_layout-cwidth_opt = 'X'. " 欄寬最佳化 ENDFORM. *--------------------------------------------------------------------- * 7. USER_COMMAND:兩組互斥 *--------------------------------------------------------------------- FORM user_command USING r_ucomm LIKE sy-ucomm rs_selfield TYPE slis_selfield. DATA lv_index TYPE sy-tabix. IF r_ucomm = 'ENTER' OR r_ucomm = '&IC1'. " --- CHECK1 互斥 CLEAR lv_index. LOOP AT gt_data INTO gs_data. IF gs_data-check1 = 'X' AND lv_index IS INITIAL. lv_index = sy-tabix. ELSEIF gs_data-check1 = 'X' AND NOT lv_index IS INITIAL. gs_data-check1 = space. MODIFY gt_data FROM gs_data INDEX sy-tabix. ENDIF. ENDLOOP. " --- CHECK2 互斥 CLEAR lv_index. LOOP AT gt_data INTO gs_data. IF gs_data-check2 = 'X' AND lv_index IS INITIAL. lv_index = sy-tabix. ELSEIF gs_data-check2 = 'X' AND NOT lv_index IS INITIAL. gs_data-check2 = space. MODIFY gt_data FROM gs_data INDEX sy-tabix. ENDIF. ENDLOOP. " --- 同列不能雙選 LOOP AT gt_data INTO gs_data. IF gs_data-check1 = 'X' AND gs_data-check2 = 'X'. " 清掉另一個 gs_data-check2 = space. MODIFY gt_data FROM gs_data INDEX sy-tabix. ENDIF. ENDLOOP. rs_selfield-refresh = 'X'. ENDIF. ENDFORM. *--------------------------------------------------------------------- * 8. 主程式 *--------------------------------------------------------------------- START-OF-SELECTION. PERFORM get_data_from_zvbank. PERFORM build_fieldcat. PERFORM set_layout. data : gd_repid like sy-repid. gd_repid = sy-repid. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC' EXPORTING i_callback_program = gd_repid i_callback_user_command = 'USER_COMMAND' i_callback_pf_status_set = 'FRM_SET_STATUS' is_layout_lvc = gs_layout it_fieldcat_lvc = gt_fieldcat it_drop_down_list = gt_dropdown TABLES t_outtab = gt_data. if sy-subrc <> 0. message id sy-msgid type sy-msgty number sy-msgno with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. endif. *&---------------------------------------------------------------------* *& Form frm_set_status *&---------------------------------------------------------------------* form frm_set_status using rt_extab type slis_t_extab. clear: rt_extab. refresh: rt_extab. set pf-status 'ALV_STATUS'. endform.
时间: 2025-08-03 11:52:36 AIGC 浏览: 19
在ABAP ALV Grid中,如果使用了多组单选按钮(Radio Button),默认情况下所有单选按钮都属于同一个组,这意味着它们之间是互斥的,只能选择一个。如果希望实现多组单选按钮,每组内部互斥,而不同组之间不互斥,则需要对单选按钮的逻辑进行特殊处理。
通常情况下,ALV Grid通过字段的 `SELFLAG` 属性来控制单选按钮的显示和行为。要实现多组单选按钮互不影响,可以通过以下方法进行修正:
1. **使用不同的字段标识单选按钮组**
在数据结构中定义多个字段来表示不同的单选按钮组。例如,可以定义 `RADIO_GROUP1` 和 `RADIO_GROUP2` 两个字段,分别用于标识两个不同的单选按钮组。在ALV Grid的字段目录(`LVC_FIELDCATALOG`)中,为这两个字段设置 `SELFLAG` 属性,并指定不同的 `SELGROUP` 值[^3]。
2. **设置 SELGROUP 属性**
在字段目录中,对于每个需要作为单选按钮的字段,设置 `SELFLAG` 为 `X`,并为每个字段分配不同的 `SELGROUP` 值。这样,ALV Grid会根据 `SELGROUP` 的值将单选按钮分组,每组内部保持互斥关系。例如,可以将 `RADIO_GROUP1` 的 `SELGROUP` 设置为 `1`,将 `RADIO_GROUP2` 的 `SELGROUP` 设置为 `2`[^3]。
3. **更新数据模型以支持多组选择**
在数据模型中,确保每个单选按钮组都有独立的字段来存储选中状态。这样,当用户在一组中选择一个选项时,不会影响到其他组的选择状态。
4. **处理用户交互事件**
如果需要进一步自定义单选按钮的行为,可以考虑在ALV Grid的事件处理中捕获用户的选择动作,并手动更新数据模型。这可以通过实现 `CL_GUI_ALV_GRID` 类的事件处理方法来完成,例如 `HANDLE_DATA_CHANGED` 或 `HANDLE_CELL_MODIFIED` 事件[^2]。
### 示例代码
以下是一个简单的示例代码,展示如何在ALV Grid中设置两个互不干扰的单选按钮组:
```abap
TYPES: BEGIN OF ty_data,
radio_group1 TYPE c LENGTH 1,
radio_group2 TYPE c LENGTH 1,
text TYPE string,
END OF ty_data.
DATA: lt_data TYPE TABLE OF ty_data,
ls_data TYPE ty_data.
" 填充数据
DO 5 TIMES.
ls_data-radio_group1 = 'X'.
ls_data-radio_group2 = 'X'.
ls_data-text = 'Row ' && sy-index.
APPEND ls_data TO lt_data.
ENDDO.
" 定义字段目录
DATA: lt_fieldcat TYPE lvc_t_fcat,
ls_fieldcat TYPE lvc_s_fcat.
ls_fieldcat-fieldname = 'RADIO_GROUP1'.
ls_fieldcat-selgroup = '1'.
ls_fieldcat-seltitle = 'Group 1'.
ls_fieldcat-edit = 'X'.
ls_fieldcat-emphasize = 'X'.
APPEND ls_fieldcat TO lt_fieldcat.
CLEAR ls_fieldcat.
ls_fieldcat-fieldname = 'RADIO_GROUP2'.
ls_fieldcat-selgroup = '2'.
ls_fieldcat-seltitle = 'Group 2'.
ls_fieldcat-edit = 'X'.
ls_fieldcat-emphasize = 'X'.
APPEND ls_fieldcat TO lt_fieldcat.
CLEAR ls_fieldcat.
ls_fieldcat-fieldname = 'TEXT'.
ls_fieldcat-outputlen = 20.
APPEND ls_fieldcat TO lt_fieldcat.
" 创建ALV Grid
DATA: go_alv TYPE REF TO cl_gui_alv_grid.
CREATE OBJECT go_alv
EXPORTING
i_parent = cl_gui_container=>screen0.
CALL METHOD go_alv->set_table_for_first_display
EXPORTING
i_structure_name = 'TY_DATA'
CHANGING
it_outtab = lt_data
it_fieldcatalog = lt_fieldcat.
```
通过上述方法,可以在ABAP ALV Grid中实现多组单选按钮的互斥逻辑修正,确保每组单选按钮独立工作,互不影响。
---
阅读全文
相关推荐















