ABAP 辨析ON INPUT|REQUEST|CHAIN-INPUT|CHAIN-REQUEST

文章详细阐述了ABAP中屏幕开发的逻辑流程,包括PBO(输出前处理)、PAI(输入后处理)、POH和POV事件。特别讨论了FIELD语句如何影响数据同步以及模块条件调用的语法,如ONINPUT和ONREQUEST,以及它们在单一和组合字段条件中的应用。此外,文章还提到了CHAIN语句在组合字段条件触发中的作用。
该文章已生成可运行项目,

1、逻辑流

在屏幕开发中,存在如下逻辑流:

PBO(Process Before Output):屏幕输出之前触发

PAI(Process After Input):用户在屏幕中执行操作触发

POH(Process On Help-Request):查看帮助信息触发(F1)

POV(Process On Value-Request):查询搜索帮助触发(F4)

其中PBO为输出流,PAI为输入流,POH和POV可笼统理解为输入流

2、语句控制传递FIELD

在屏幕开发中,系统会自动将屏幕的值传递到程序中与之同名的全局字段中。

但是如果使用语句控制语法FIELD,则FIELD指定的字段的值,将会出现赋值延迟,数据不是自动同步到ABAP程序,而是在执行FIELD语句时,对应的字段值会传递到程序中。

例如:在屏幕中添加物料和物料描述两个字段

 逻辑流如下:

PROCESS BEFORE OUTPUT.
  MODULE status_9000.

PROCESS AFTER INPUT.
  MODULE get_text."获取物料描述
  FIELD makt-matnr.
  MODULE get_text."获取物料描述

GET_TEXT

MODULE get_text INPUT.
  IF makt-matnr IS NOT INITIAL.
    SELECT SINGLE
      maktx
    FROM makt
    INTO makt-maktx
    WHERE matnr = makt-matnr
      AND spras = sy-langu.
  ELSE.
    CLEAR:makt-maktx.
  ENDIF.
ENDMODULE.

使用FIELD,导致屏幕中MAKT-MATNR必须执行到FIELD makt-matnr.时,makt-matnr才有值。第一个get_text查询不到物料描述,第二个get_text才能查到。

3、模块条件调用语法

3.1 单一字段条件调用

3.1.1 ON INPUT

FIELD makt-matnr MODULE get_text ON INPUT.

1.当Field语句的字段为非初始值(非空值或零)时,才调用MOD;

例如输入物料号,改变了字段非初始值状态,则会调用MOD查询到物料描述

2.用户将字段值改为初始值,则不触发MOD

例如把物料号置空,并没有执行清空物料描述的逻辑

 3.如果用户不输入,而是直接在代码中为物料赋值,也等同于改变了初始值,则会触发MOD

makt-matnr = '000000010000000002'.
CALL SCREEN '9000'.

3.1.2 ON REQUEST

FIELD makt-matnr MODULE get_text ON REQUEST.

1.只有当用户输入值时,才调用MOD。任何形式手工输入,都可以触发;

系统按照如下方式设置字段,也被视为手工输入:

  • 通过SET PARAMETER字段输入(手工和自动)
  • 通过HOLD DATA功能设置字段输入(System→User Profile→Hold data中设定)
  • 用于事务调用时的参数输入(CALL TRANSACTION...USING)
  • 用于整个定制系统的全局字段

例如输入物料号,则会调用MOD查询到物料描述

 2.如果清空物料号,也等同输入操作,则执行了清空物料描述的逻辑

 3.如果用户不输入,而是直接在代码中为物料赋值,则不会触发MOD

makt-matnr = '000000010000000002'.
CALL SCREEN '9000'.

3.2 组合字段条件调用

3.2.1 ON CHAIN-INPUT|REQUEST

如果屏幕中多个字段满足条件就要调用该MOD,则需要用CHAIN和ENDCHAIN将FIELD包裹起来,并使用ON CHAIN-INPUT|REQUEST,形成组合

PROCESS AFTER INPUT.

  CHAIN.
    FIELD:marc-werks,makt-matnr.
    MODULE check_matnr ON CHAIN-INPUT.
    MODULE get_text.
  ENDCHAIN.

  MODULE user_command_9000.

检查物料在工厂下是否存在

MODULE check_matnr INPUT.
  SELECT SINGLE
    *
  FROM marc
  INTO @DATA(ls_marc)
  WHERE werks = @marc-werks
    AND matnr = @makt-matnr.

  IF ls_marc IS INITIAL.
    MESSAGE '物料在工厂下不存在' TYPE 'E'.
  ENDIF.
ENDMODULE.

其中使用的ON CHAIN-INPUT 和 ON CHAIN-REQUEST的使用与ON INPUT和ON REQUEST几乎相同。

区别就是,组合字段中如果使用了ON CHAIN-INPUT|REQUEST,有任意字段能符合INPUT与REQUEST同理的要求,就会触发MOD。

例如按照以上代码只输入了工厂,但是已经改变了工厂的初始值,符合INPUT条件,所以就调用MOD

而get_text则始终会被调用

当出现错误时,组合字段则要求重新输入,其他非组合字段则置灰不可输入

但是在CHAIN语句中,同样可以只使用ON INPUT将条件的触发,限制在特定的字段中,

例如如下代码:此时输入工厂,并不会触发get_text,只有输入物料,才会触发get_text。

CHAIN.
    FIELD:marc-werks.
    FIELD:makt-matnr MODULE get_text ON INPUT.
  ENDCHAIN.

而下列代码:使用ON CHAIN-INPUT无论输入工厂还是物料,都会触发get_text。这就是ON INPUT|REQUEST 和 ON CHAIN-INPUT|REQUEST的区别

CHAIN.
    FIELD:marc-werks.
    FIELD:makt-matnr MODULE get_text ON CHAIN-INPUT.
  ENDCHAIN.

定期更文,欢迎关注

本文章已经生成可运行项目
<think>我们正在讨论ABAP选择屏幕事件`AT SELECTION-SCREEN ON VALUE-REQUEST FOR`的作用和原因。 根据引用[2]和引用[4]的内容,这个事件主要用于为选择屏幕上的特定字段提供自定义的搜索帮助(F4帮助)。 原因和用途: 1. 标准搜索帮助不足:当标准数据元素(data element)上附带的搜索帮助不能满足需求时,例如需要根据其他字段的值动态过滤搜索帮助,或者需要自定义搜索帮助的数据源。 2. 完全自定义搜索帮助:用户可以通过编程方式弹出自定义的对话框(如使用函数模块`F4IF_INT_TABLE_VALUE_REQUEST`)来提供搜索帮助。 3. 动态调整搜索帮助:在事件中,我们可以读取选择屏幕上其他字段的值,从而动态决定搜索帮助的内容。 使用方式: - 语法:`AT SELECTION-SCREEN ON VALUE-REQUEST FOR <field>` - 其中`<field>`是选择屏幕上定义的参数(PARAMETER)或选择标准(SELECT-OPTION)的字段。 - 在该事件块中,通常调用一个子程序(使用PERFORM)来提供自定义搜索帮助逻辑,并将用户选择的值返回给该字段。 示例(参考引用[2]): ```abap AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_bplan-low. PERFORM frm_f4_bplan CHANGING s_bplan-low. AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_bplan-high. PERFORM frm_f4_bplan CHANGING s_bplan-high. FORM frm_f4_bplan CHANGING cv_bplan. " 自定义搜索帮助逻辑,例如弹出对话框让用户选择,然后将选择的值赋给cv_bplan ENDFORM. ``` 注意事项: - 对于选择标准(SELECT-OPTION),有高(high)和低(low)两个字段,所以需要为两个字段分别提供事件处理。 - 在自定义搜索帮助中,通常使用函数模块`F4IF_INT_TABLE_VALUE_REQUEST`来显示一个值列表供用户选择,并将选择的值返回。 动态搜索帮助示例(根据其他字段过滤): 假设我们有两个字段:公司代码(p_bukrs)和会计凭证(p_belnr)。我们希望会计凭证的搜索帮助只列出该公司代码下的凭证。 我们可以这样实现: ```abap PARAMETERS: p_bukrs TYPE bukrs, p_belnr TYPE belnr_d. AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_belnr. PERFORM f4_for_belnr USING p_bukrs CHANGING p_belnr. FORM f4_for_belnr USING iv_bukrs TYPE bukrs CHANGING cv_belnr TYPE belnr_d. DATA: lt_values TYPE TABLE OF bsis, " 假设从BSIS表中获取 lt_return TYPE TABLE OF ddshretval. IF iv_bukrs IS INITIAL. MESSAGE '请输入公司代码' TYPE 'S' DISPLAY LIKE 'E'. RETURN. ENDIF. SELECT belnr, gjahr, buzei FROM bsis INTO TABLE lt_values WHERE bukrs = iv_bukrs. " 将内表lt_values中的数据显示为搜索帮助 CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST' EXPORTING retfield = 'BELNR' " 返回字段 dynpprog = sy-repid dynpnr = sy-dynnr dynprofield = 'P_BELNR' value_org = 'S' TABLES value_tab = lt_values return_tab = lt_return EXCEPTIONS parameter_error = 1 no_values_found = 2 OTHERS = 3. " 如果用户选择了值,则更新p_belnr READ TABLE lt_return INTO DATA(ls_return) WITH KEY retfield = 'BELNR'. IF sy-subrc = 0. cv_belnr = ls_return-fieldval. ENDIF. ENDFORM. ``` 总结: 使用`AT SELECTION-SCREEN ON VALUE-REQUEST FOR`事件的主要目的是为了给选择屏幕上的字段提供定制的搜索帮助(F4帮助),以满足特定的业务需求。 相关问题: 1. 如何为选择屏幕上的字段添加标准搜索帮助? 2. 在自定义搜索帮助中,如何实现多选值返回? 3. 如何为选择标准(SELECT-OPTION)的字段同时提供低值和高值的搜索帮助? 4. 在自定义搜索帮助中,如何根据其他字段的值动态过滤?</think>### ABAP选择屏幕中使用`AT SELECTION-SCREEN ON VALUE-REQUEST FOR`的原因和用途 在ABAP选择屏幕开发中,`AT SELECTION-SCREEN ON VALUE-REQUEST FOR`是一个关键事件,主要用于为字段提供**自定义搜索帮助(F4帮助)**。以下是其核心作用和必要性: --- #### 1. **提供定制化搜索帮助(F4)** 当标准数据元素自带的搜索帮助无法满足业务需求时,使用此事件可完全自定义F4帮助: ```abap AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_matnr. PERFORM f4_for_matnr USING p_werks. " 根据工厂动态过滤物料 ``` - ✅ **动态过滤**:根据其他字段值(如工厂)过滤物料清单[^2] - ✅ **多表关联**:从多个表中组合数据生成搜索帮助 - ✅ **复杂逻辑**:添加权限检查或业务规则验证 --- #### 2. **解决标准搜索帮助的局限性** 标准搜索帮助的不足场景: | 场景 | 标准F4帮助 | 自定义解决方案 | |------|------------|----------------| | 跨表数据组合 | ❌ 不支持 | ✅ 通过JOIN多表查询 | | 动态值过滤 | ❌ 固定值 | ✅ 根据其他字段实时过滤 | | 权限检查 | ❌ 无控制 | ✅ 添加权限对象检查 | | 特殊界面需求 | ❌ 固定弹窗 | ✅ 自定义ALV/树形展示 | --- #### 3. **选择范围(select-options)的特殊处理** 对于带范围的字段需分别处理高/低值: ```abap AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_date-low. PERFORM f4_date_calendar CHANGING s_date-low. AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_date-high. PERFORM f4_date_calendar CHANGING s_date-high. ``` - 必须分别捕获`-low`和`-high`字段的请求[^2] - 可共享同一逻辑子程序 --- #### 4. **实现技术流程** 典型实现步骤: 1. **事件触发**:用户按F4或点击搜索帮助图标 2. **调用函数**:使用`F4IF_INT_TABLE_VALUE_REQUEST`显示值列表 3. **返回值处理**:将用户选择值赋回原字段 ```abap FORM f4_for_matnr USING iv_werks. DATA: lt_values TYPE TABLE OF makt. SELECT matnr, maktx INTO TABLE lt_values FROM makt WHERE werks = iv_werks. " 动态过滤 CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST' EXPORTING retfield = 'MATNR' value_org = 'S' TABLES value_tab = lt_values EXCEPTIONS OTHERS = 1. ENDFORM. ``` --- #### 5. **与其他事件的对比** | 事件 | 触发时机 | 主要用途 | |------|----------|----------| | `ON VALUE-REQUEST` | 按F4时 | 自定义搜索帮助 | | `ON p_field` | 字段值变化时 | 字段级校验 | | `ON BLOCK block` | 块内字段变化时 | 块级校验 | | `OUTPUT` | 屏幕渲染前 | 动态修改元素属性 | > ⚠️ 事件触发顺序:先触发字段级事件,再触发块级事件[^1] --- **总结核心价值**: 1. **业务适配性**:突破标准搜索帮助的限制 2. **用户体验**:提供更智能的搜索建议 3. **数据完整性**:确保输入值符合业务规则 4. **开发灵活性**:完全控制搜索逻辑和界面 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值