ABAP多标签选择屏幕的使用

这篇博客介绍了如何在ABAP中创建并使用多标签选择屏幕。通过示例代码展示了如何定义子屏幕,并将它们合并到一个TAB块中,以及处理用户命令在不同屏幕间切换。在初始化和屏幕输出事件中,进行了屏幕状态的管理和消息显示。

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

REPORT zzzzz.

DATA: g_dynnr LIKE sy-dynnr.  "当前屏幕的编号

"定义两个子屏幕
SELECTION-SCREEN BEGIN OF SCREEN 100 AS SUBSCREEN.
PARAMETERS p_file TYPE tabname.
SELECTION-SCREEN END OF SCREEN  100.

SELECTION-SCREEN BEGIN OF SCREEN 300 AS SUBSCREEN.
PARAMETERS p_file2 TYPE tabname.
SELECTION-SCREEN END OF SCREEN 300.

"将两个屏幕合并到TAB里面
"类似于通常的BEGIN OF BLOCK
"SELECTION-SCREEN BEGIN OF BLOCK block1 WITH FRAME TITLE title1.

SELECTION-SCREEN  BEGIN OF TABBED BLOCK mytab FOR 11 LINES.
SELECTION-SCREEN  TAB (20) text1 USER-COMMAND but1.
SELECTION-SCREEN  TAB (20) text2 USER-COMMAND but2.
SELECTION-SCREEN END OF BLOCK mytab.

INITIALIZATION .
  text1 ='ONE'.
  text2 ='TWO'.

  mytab-prog = sy-repid.

"初始化屏幕0100
IF g_dynnr = space.
    mytab-dynnr =100.
    mytab-activetab ='BUT1'.
ENDIF.

AT SELECTION-SCREEN.          "PAI
  CASE sy-dynnr.
    WHEN 1000.
      CASE sy-ucomm.
        WHEN 'BUT1'.
          mytab-dynnr =100.
        WHEN 'BUT2'.
          mytab-dynnr =300.
   
<think>我们参考用户提供的引用内容,特别是引用[2]和引用[4]中关于选择屏幕(SELECTION-SCREEN)的页签实现方法。 在ABAP中,选择屏幕的分页签可以通过TABBED BLOCK来实现。具体步骤如下: 1. 定义子屏幕(Subscreens): 使用`SELECTION-SCREEN BEGIN OF SCREEN ... AS SUBSCREEN`和`SELECTION-SCREEN END OF SCREEN`定义多个子屏幕,每个子屏幕对应一个标签页的内容。 2. 定义标签块(Tabbed Block): 使用`SELECTION-SCREEN BEGIN OF TABBED BLOCK ...`定义标签块,并在其中定义多个标签(TAB)。每个标签需要指定宽度和功能码(USER-COMMAND)。 3. 初始化标签(INITIALIZATION): 在INITIALIZATION事件中,设置标签的显示文本,并初始化标签块(设置程序名、初始屏幕号、激活的标签)。 4. 处理用户交互(AT SELECTION-SCREEN): 在AT SELECTION-SCREEN事件中,根据用户点击的标签(sy-ucomm)切换标签块中显示的屏幕号(dynnr)和激活的标签(activetab)。 5. 在程序逻辑中根据当前激活的标签处理数据(START-OF-SELECTION等): 在程序开始执行时,可以根据标签块中当前的屏幕号(mytab-dynnr)来判断用户当前在哪个标签页,从而执行相应的逻辑。 下面是一个具体的示例代码,结合了引用[2]和引用[4]中的方法: ```abap REPORT zselection_screen_tabs. * 定义子屏幕1:包含一个参数 SELECTION-SCREEN BEGIN OF SCREEN 400 AS SUBSCREEN. PARAMETERS: p_carrid TYPE spfli-carrid. SELECTION-SCREEN END OF SCREEN 400. * 定义子屏幕2:包含一个选择选项 SELECTION-SCREEN BEGIN OF SCREEN 500 AS SUBSCREEN. SELECT-OPTIONS: s_connid FOR spfli-connid. SELECTION-SCREEN END OF SCREEN 500. * 定义标签块,包含两个标签,并指定功能码 SELECTION-SCREEN BEGIN OF TABBED BLOCK mytab FOR 10 LINES. SELECTION-SCREEN TAB (20) tab1 USER-COMMAND fc1. SELECTION-SCREEN TAB (20) tab2 USER-COMMAND fc2. SELECTION-SCREEN END OF BLOCK mytab. * 初始化 INITIALIZATION. tab1 = '航班公司'. " 第一个标签的文本 tab2 = '航班编号'. " 第二个标签的文本 " 设置标签块属性:程序名、初始屏幕号、激活的标签 mytab-prog = sy-repid. mytab-dynnr = 400. " 初始显示屏幕400 mytab-activetab = 'FC1'. " 初始激活标签FC1 * 处理标签切换 AT SELECTION-SCREEN. CASE sy-ucomm. WHEN 'FC1'. " 用户点击第一个标签 mytab-prog = sy-repid. mytab-dynnr = 400. mytab-activetab = 'FC1'. WHEN 'FC2'. " 用户点击第二个标签 mytab-prog = sy-repid. mytab-dynnr = 500. mytab-activetab = 'FC2'. ENDCASE. START-OF-SELECTION. " 根据当前激活的标签页执行不同的逻辑 CASE mytab-dynnr. WHEN 400. WRITE: / '您选择了航班公司:', p_carrid. WHEN 500. WRITE: / '您选择了航班编号范围:'. LOOP AT s_connid. WRITE: / s_connid-low, ' - ', s_connid-high. ENDLOOP. ENDCASE. ``` ### 关键点说明: 1. **子屏幕定义**:每个子屏幕独立定义,可以包含参数(PARAMETERS)、选择选项(SELECT-OPTIONS)等。 2. **标签块定义**:`TABBED BLOCK`用于在选择屏幕上创建标签页,其中`FOR 10 LINES`指定了标签块的高度(行数)。 3. **标签切换处理**:在`AT SELECTION-SCREEN`事件中,根据用户操作的功能码(sy-ucomm)来切换当前显示的屏幕(mytab-dynnr)和激活的标签(mytab-activetab)。 4. **程序逻辑**:在`START-OF-SELECTION`事件中,通过判断`mytab-dynnr`的值来执行对应标签页的逻辑。 ### 注意事项: - 标签块中每个标签的`USER-COMMAND`必须唯一,且会作为功能码在`AT SELECTION-SCREEN`事件中捕获。 - 标签块的高度(`FOR n LINES`)应足够容纳子屏幕的内容,否则会出现显示不全的问题。 - 子屏幕屏幕号(如400,500)必须在程序内唯一。 通过以上方法,我们可以在ABAP选择屏幕上实现分页签功能,使选择屏幕更加清晰和易于操作[^2][^4]。 --- §§相关问题§§ 1. 如何在ABAP选择屏幕的分页签中实现动态标签(根据条件增减标签)? 2. 选择屏幕分页签与普通屏幕分页签(TABSTRIP控件)有何主要区别? 3. 如何在选择屏幕分页签切换时进行输入验证? 4. 如何在不同标签页之间共享数据?</think>### ABAP 选择屏幕分页签实现方法 在 ABAP 中实现选择屏幕(Selection Screen)的分页签功能,主要通过 **`TABBED BLOCK`** 语法实现。以下是完整实现步骤和代码示例: #### 1. **基本结构** ```abap REPORT ztabbed_selection_screen. * 定义子屏幕 1 SELECTION-SCREEN BEGIN OF SCREEN 100 AS SUBSCREEN. PARAMETERS: p_matnr TYPE matnr. " 物料号 SELECTION-SCREEN END OF SCREEN 100. * 定义子屏幕 2 SELECTION-SCREEN BEGIN OF SCREEN 200 AS SUBSCREEN. SELECT-OPTIONS: s_werks FOR ekpo-werks. " 工厂 SELECTION-SCREEN END OF SCREEN 200. * 定义标签块 SELECTION-SCREEN: BEGIN OF TABBED BLOCK mytab FOR 15 LINES, " 标签高度 TAB (20) tab1 USER-COMMAND fc1, " 标签1 TAB (20) tab2 USER-COMMAND fc2, " 标签2 END OF BLOCK mytab. ``` #### 2. **初始化标签页** ```abap INITIALIZATION. tab1 = '物料信息'. " 标签1文本 tab2 = '工厂信息'. " 标签2文本 mytab-prog = sy-repid. " 当前程序 mytab-dynnr = 100. " 默认显示屏幕100 mytab-activetab = 'FC1'. " 默认激活标签1 ``` #### 3. **处理标签切换** ```abap AT SELECTION-SCREEN. CASE sy-ucomm. WHEN 'FC1'. " 点击标签1 mytab-dynnr = 100. mytab-activetab = 'FC1'. WHEN 'FC2'. " 点击标签2 mytab-dynnr = 200. mytab-activetab = 'FC2'. ENDCASE. ``` #### 4. **执行数据处理** ```abap START-OF-SELECTION. CASE mytab-dynnr. WHEN 100. WRITE: / '物料号:', p_matnr. " 处理标签1数据 WHEN 200. WRITE: / '工厂范围:'. " 处理标签2数据 LOOP AT s_werks. WRITE: / s_werks-low, '至', s_werks-high. ENDLOOP. ENDCASE. ``` #### 关键配置说明: 1. **子屏幕定义**: - 每个 `AS SUBSCREEN` 定义独立标签页内容 - 屏幕号(100/200)必须在程序中唯一 2. **标签块属性**: ```abap FOR n LINES " 标签区域高度(行数) TAB (w) text " 标签宽度(w)和显示文本 USER-COMMAND " 必须唯一,用于事件处理 ``` 3. **状态管理**: - `mytab-dynnr` 存储当前显示的子屏幕 - `mytab-activetab` 存储当前激活标签的 USER-COMMAND #### 高级功能实现: **动态标签页**: ```abap DATA: gt_tabs TYPE TABLE OF vrm_value, gv_tabname(20). INITIALIZATION. " 动态添加标签 gt_tabs = VALUE #( ( key = 'FC1' text = '动态标签1' ) ( key = 'FC2' text = '动态标签2' ) ). CALL FUNCTION 'VRM_SET_VALUES' EXPORTING id = 'MYTAB' values = gt_tabs. ``` **标签页权限控制**: ```abap AT SELECTION-SCREEN OUTPUT. LOOP AT SCREEN. IF screen-group1 = 'ADMIN' AND sy-uname NE 'ADMIN'. screen-active = 0. " 隐藏管理员标签 MODIFY SCREEN. ENDIF. ENDLOOP. ``` > **注意事项** > 1. 标签块高度需≥子屏幕内容高度,否则显示不全 > 2. `USER-COMMAND` 值必须与事件处理中的 `sy-ucomm` 匹配 > 3. 子屏幕中避免使用 `AT SELECTION-SCREEN ON VALUE-REQUEST` 事件[^2][^4] 通过此方法实现的分页签选择屏幕,用户可在不同标签页输入筛选条件,系统会根据激活的标签页处理对应数据[^2][^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值