ABAP 辨析ON INPUT|REQUEST|CHAIN-INPUT|CHAIN-REQUEST
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.
![](https://img2023.cnblogs.com/blog/1225252/202302/1225252-20230221171602776-1022793807.png)
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
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几乎相同。
![](https://img2023.cnblogs.com/blog/1225252/202302/1225252-20230221183204648-236213137.png)
但是在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.
定期更文,欢迎关注