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

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

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

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>好的,我现在需要回答用户关于ABAPCHAIN语句的用法和示例的问题。首先,我需要回忆一下自己对CHAIN语句的理解。CHAINABAP中主要用于模块化编程,特别是在处理屏幕事件时,可以将多个字段的逻辑组合在一起,避免重复代码。不过,具体的语法和使用场景可能需要进一步确认。 接下来,我应该查阅相关的ABAP文档或可靠资料来确保准确性。根据引用[1]提到的CL_DEMO_OUTPUT类,可能CHAIN语句在屏幕编程中与模块调用有关。记得在ABAP的屏幕流程逻辑中,CHAIN通常用于处理多个字段的输入验证或事件触发,比如在PAI(Process After Input)事件中,当多个字段被修改时,可以一起处理。 然后,我需要构建一个清晰的回答结构,首先解释CHAIN的基本概念,然后说明它的语法结构,接着给出一个具体的示例代码,说明在什么情况下使用CHAIN,比如在用户输入多个相关字段后统一校验或处理数据。同时,要指出CHAIN的优势,比如减少代码冗余和提高可维护性。 用户可能需要了解CHAIN和普通MODULE调用的区别,所以在回答中可以提到,当多个字段需要同时触发同一个处理逻辑时,使用CHAIN可以避免为每个字段单独编写MODULE调用,从而简化代码。 还需要注意示例代码的正确性,确保语法正确,比如使用FIELD语句列出涉及的字段,然后在CHAIN块内调用MODULE。同时,可能需要说明CHAIN语句在ABAP程序中的具体位置,通常是在屏幕的流程逻辑部分,如PAI事件中。 最后,生成相关问题时要围绕CHAIN的应用场景、与其他语句的对比、常见错误及调试方法等方面,帮助用户进一步深入学习。</think>### ABAP CHAIN语句的用法及示例 ABAP中的`CHAIN`语句主要用于**屏幕编程**,特别是在处理多个字段的联动逻辑时,能够将多个字段的输入验证或数据处理模块集中调用,避免重复代码[^1]。 #### 语法结构 ```abap CHAIN. FIELD: field1, field2, ... MODULE module_name ... ENDCHAIN. ``` #### 示例场景 假设屏幕包含三个输入字段:`MATNR`(物料号)、`WERKS`(工厂)、`LGORT`(库存地点)。当用户修改其中任意字段时,需统一校验组合有效性。 ```abap PROCESS AFTER INPUT. CHAIN. FIELD: MATNR, WERKS, LGORT. MODULE validate_material_location. ENDCHAIN. ``` #### 代码解析 1. `FIELD`指定关联字段:任一字段被修改时触发`CHAIN`内的逻辑 2. `MODULE validate_material_location`:调用校验模块检查字段组合合法性 3. 优势:避免为每个字段单独编写`MODULE`调用,提高代码复用率 #### 典型应用场景 1. 多字段联合校验(如工厂与库存地点必须匹配) 2. 动态字段控制(根据输入联动隐藏/显示其他字段) 3. 数据一致性检查(跨字段逻辑依赖)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值