ABAP modify screen:修改屏幕,实现隐藏、禁止输入字段

本文介绍如何使用SAP ABAP编程语言通过单选按钮动态控制屏幕块的显示与隐藏,包括使用LOOP AT SCREEN及如何设置SCREEN结构来实现屏幕元素的动态更新。

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

Loop at screenloop处理屏幕上的每一个组件,并对其做相应的处理。

SELECTION-SCREENBEGIN OF BLOCK B1 WITH FRAME.
PARAMETERS S_DATE TYPE DATUM   DEFAULT SY-DATUM MODIF ID OO.
SELECTION-SCREENEND OF BLOCK B1.

SELECTION-SCREENBEGIN OF BLOCK B2 WITH FRAME.
SELECT-OPTIONSS_DATE2 FOR SY-DATUM  MODIF ID PP.
SELECTION-SCREENEND OF BLOCK B2.

SELECTION-SCREENBEGIN OF BLOCK B3 WITH FRAME.
PARAMETERS R1 RADIOBUTTON GROUP D1 DEFAULT 'X' USER-COMMAND SINGLECLICK,   

             R2 RADIOBUTTON GROUP D1 .
SELECTION-SCREENEND OF BLOCK B3.

 

选择r1 的时候只显示B1r2时候只显示B2

AT SELECTION-SCREEN OUTPUT.
  IF R1 'X'.
    LOOP AT SCREEN.
      IF SCREEN-GROUP1 'PP'.
        SCREEN-ACTIVE '0'.
      ENDIF.
      MODIFY SCREEN.
    ENDLOOP.
  ELSEIF R2 'X'.
    LOOP AT SCREEN.
      IF SCREEN-GROUP1 'OO'.
        SCREEN-ACTIVE '0'.
      ENDIF.
      MODIFY SCREEN.
    ENDLOOP.
  ENDIF.

  • Modiy屏幕的时候,如果屏幕有必输字段则不能修改,只有把必输项输入值后才能修改屏幕,需要有所取舍;
  • 注意:

PARAMETERS R1 RADIOBUTTON GROUP D1 DEFAULT 'X' USER-COMMAND SINGLECLICK,  红色这一段话必须有,否则不能动态修改屏幕;选择一次单选框就会触发一次atselection-screen output,实现动态修改屏幕.

  • SCREEN结构解释:

SAP屏幕中,一个字段就像.NET中的一个控件,这个 字段对应一个SCREEN结构,就像控件的多个属性。

SE11可以查看SCREEN结构中的字段,只是没有备注。

名称                  长度       说明

NAME               30          屏幕字段的名称

GROUP1            3            属于字段组1的字段

GROUP2            3            属于字段组2的字段

GROUP3            3            属于字段组3的字段

GROUP4            3            属于字段组4的字段

ACTIVE             1            可见并准备输入的字段

REQUIRED          1            字段输入是强制的,即该值为X是表示该字段必须输入

INPUT               1            字段准备输入

OUTPUT            1            字段仅用于显示

INTENSIFIED      1           高亮显示字段

INVISIBLE          1           禁用字段

LENGTH             1           减少字段输出长度

DISPLAY_3D       1           以三维框架显示字段

VALUE_HELP       1           显示有值帮助的字段  

上述长度为1的字段,=1表示有效,=0则相反。 

<think>好的,我现在需要帮助用户了解在ABAP中如何通过设置变式来隐藏选择屏幕输入项。首先,我得回忆一下ABAP中选择屏幕变式的基本概念。变式(Variants)允许用户保存一组预定义的输入值,方便重复使用。但用户的问题是关于隐藏输入项,这可能需要更深入的操作。 首先,我应该确认是否通过变式本身可以直接隐藏字段根据我的知识,标准的变式设置主要是保存值,而不是控制UI元素的显示或隐藏。不过,可能存在通过变式结合ABAP代码动态控制选择屏幕字段的方法。例如,在程序初始化事件(INITIALIZATION)或选择屏幕输出事件(AT SELECTION-SCREEN OUTPUT)中,根据变式中的某个字段值来设置其他字段的可见性。 接下来,我需要考虑如何将变式中的某个参数作为标志,用来决定是否显示其他字段。例如,用户可能在变式中设置一个复选框,如果勾选,则在运行程序时隐藏某些输入项。这需要动态修改选择屏幕字段的属性,如将其设置为不可见(INVISIBLE)或激活(ACTIVE)。 另外,用户可能需要创建自定义变式,并在程序中使用这些变式参数来控制字段的显示。例如,在变式中定义一个参数HIDE_FIELD,然后在AT SELECTION-SCREEN OUTPUT事件中检查该参数的值,如果为真,则将目标字段设置为不可见。 我还需要考虑到权限的问题,是否有权限创建和修改变式,以及如何在代码中正确读取变式中的参数值。此外,可能需要使用系统变量sy-slset来获取当前使用的变式名称,然后根据该变式名称获取对应的参数设置。 可能的步骤包括: 1. 创建变式,并在变式中定义控制字段(如复选框)。 2. 在ABAP程序中,使用GET VARIANT和GET参数方法来读取变式中的控制字段值。 3. 在AT SELECTION-SCREEN OUTPUT事件中,根据控制字段的值使用LOOP AT SCREEN修改字段属性,如设置ACTIVE或INVISIBLE。 需要注意的是,标准的变式功能可能不足以直接隐藏字段,因此可能需要结合动态屏幕修改的技术。这需要确保在适当的事件中处理屏幕元素的属性,并且正确地从变式中读取参数值。 另外,是否有其他方法?比如在程序逻辑中根据变式名称直接判断,但这样可能不够灵活,因为变式的名称可能会变化。而使用变式中的特定参数作为开关会更可靠。 还要验证是否在变式保存时,控制字段的值会被正确保存,并且在程序运行时能够正确读取。可能需要使用SUBMIT语句或调用变式的方式,确保参数传递正确。 最后,我应该整理这些思路,分步骤说明如何实现,并给出示例代码,帮助用户理解具体操作。同时提醒用户权限和测试的重要性,确保变式被正确应用,并且动态修改屏幕属性的代码没有错误。</think>在ABAP中,通过变式(Variant)隐藏选择屏幕输入项需结合**动态屏幕控制**技术。以下是具体实现步骤: --- ### **步骤1:创建选择屏幕及变式** 1. 在程序中定义选择屏幕字段: ```abap SELECTION-SCREEN BEGIN OF SCREEN 1000. PARAMETERS: p_hide TYPE c AS CHECKBOX, "控制隐藏的开关字段 p_data TYPE d. "需要隐藏字段 SELECTION-SCREEN END OF SCREEN 1000. ``` 2. **保存变式**: 在事务码SE38执行程序时,输入`p_hide = 'X'`并保存为变式(如`Z_HIDE_FIELD`)。变式会记录该复选框的状态。 --- ### **步骤2:动态控制字段可见性** 在`AT SELECTION-SCREEN OUTPUT`事件中修改字段属性: ```abap AT SELECTION-SCREEN OUTPUT. LOOP AT SCREEN. IF screen-name = 'P_DATA' AND p_hide = 'X'. screen-active = 0. "设为非激活(隐藏MODIFY SCREEN. ENDIF. ENDLOOP. ``` --- ### **步骤3:读取变式参数** 通过`SUBMIT`语句或变式自动加载: ```abap SUBMIT your_program USING SELECTION-SET 'Z_HIDE_FIELD' VIA SELECTION-SCREEN. ``` 程序运行时,变式中的`p_hide`值会自动填充,触发字段隐藏逻辑。 --- ### **关键注意事项** 1. **权限**:用户需有权限使用和创建变式。 2. **动态修改时机**:必须在`AT SELECTION-SCREEN OUTPUT`事件中修改屏幕属性。 3. **字段命名**:确保`screen-name`与参数名完全匹配(区分大小写)。 --- ### **扩展方案:基于变式名称控制** 若需根据不同变式名称隐藏字段: ```abap AT SELECTION-SCREEN OUTPUT. IF sy-slset = 'Z_HIDE_FIELD'. "sy-slset存储当前变式名 LOOP AT SCREEN. IF screen-name = 'P_DATA'. screen-active = 0. MODIFY SCREEN. ENDIF. ENDLOOP. ENDIF. ``` --- ### **总结** - **核心逻辑**:变式保存参数值 → 程序读取值 → 动态隐藏字段。 - **优势**:无需修改代码即可通过配置控制界面,提升灵活性。 - **测试建议**:使用事务码SA38执行程序并应用变式,验证字段是否隐藏
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ChampaignWolf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值