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.

ABAP 辨析ON INPUT|REQUEST|CHAIN-INPUT|CHAIN-REQUEST的更多相关文章

  1. 高效开发之SASS篇 灵异留白事件——图片下方无故留白 你会用::before、::after吗 link 与 @import之对比 学习前端前必知的——HTTP协议详解 深入了解——CSS3新增属性 菜鸟进阶——grunt $(#form :input)与$(#form input)的区别

    高效开发之SASS篇   作为通往前端大神之路的普通的一只学鸟,最近接触了一样稍微高逼格一点的神器,特与大家分享~ 他是谁? 作为前端开发人员,你肯定对css很熟悉,但是你知道css可以自定义吗?大家 ...

  2. :input 匹配所有 input, textarea, select 和 button 元素

    描述: 查找所有的input元素,下面这些元素都会被匹配到. HTML 代码: <form> <input type="button" value="I ...

  3. input[type='submit']input[type='button']button等按钮在低版本的IE下面,去掉黑色边框的问题

    今天做一个tabs效果的时候,发现上面的button在低版本下会出现黑色的边框,很难看,于是我整理了下几个去掉黑色边框的办法: 1.在button的外层嵌套一个div,设置button的border: ...

  4. jquery中选择器input:hidden和input[type=hidden]的区别

    关于选择器:hidden的说明,在jquery说明文档中是这样说的:匹配所有不可见元素,或者type为hidden的元素.而[type=hidden]是查找所有type属性等于hidden的元素.两者 ...

  5. clear & file input & reset & file input

    clear & file input & reset & file input Clear <input type="file"> docume ...

  6. iphone中点击input不能选中input中的内容

    点击一个input,通过它的click事件选中这个input框中的内容,这个用jquery挺好实现的,但是有一个问题,在PC端和android手机上都可以让功能正常实现,在iphone上就没有效果了, ...

  7. JAVA基础知识(三):input.nextLine() 和input.next()

    next()方法在读取内容时,会过滤掉有效字符前面的无效字符,对输入有效字符之前遇到的空格键.Tab键或Enter键等结束符,next()方法会自动将其过滤掉:只有在读取到有效字符之后,next()方 ...

  8. input子系统四 input事件处理【转】

    转自:https://blog.csdn.net/qwaszx523/article/details/54139897 转自http://blog.csdn.net/coldsnow33/articl ...

  9. input系统——android input系统

    AndroidInput系统--JNI NativeInputManager InputManger InputReader AndroidInput系统--InputReader AndroidIn ...

  10. String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";作用!!!!!

    <%String path = request.getContextPath();String basePath = request.getScheme()+"://"+re ...

随机推荐

  1. Python异步协程(asyncio详解)

    续上篇讲解yield from博客,上篇链接:https://www.cnblogs.com/Red-Sun/p/16889182.html PS:本博客是个人笔记分享,不需要扫码加群或必须关注什么的 ...

  2. python-面向过程与函数式

    面向过程与函数式 面向过程 "面向过程"核心是"过程"二字,"过程"指的是解决问题的步骤,即先干什么再干什么......,基于面向过程开发程 ...

  3. 火山引擎 DataLeap 的 Data Catalog 系统公有云实践

      Data Catalog 通过汇总技术和业务元数据,解决大数据生产者组织梳理数据.数据消费者找数和理解数的业务场景.本篇内容源自于火山引擎大数据研发治理套件 DataLeap 中的 Data Ca ...

  4. linux学习相关资料整理

    linux常用指令记录 Python3.9.9安装 supervisor安装与监控nginx 使用supervisor监控mysql supervisor监控tomcat配置文件 nginx-1.22 ...

  5. MapStruct与lombok加载顺序问题与annotationProcessorPaths的关系?

    MapStruct是什么? MapStruct is a code generator that greatly simplifies the implementation of mappings b ...

  6. org.springframework.jdbc.BadSqlGrammarException: ### Error querying database. Cause: org.postgresql.util.PSQLException: ERROR: operator does not exist: bigint = character varying

    1.报错信息 org.springframework.jdbc.BadSqlGrammarException: ### Error querying database. Cause: org.post ...

  7. ast在爬虫上的应用

    https://astexplorer.net/ https://zhuanlan.zhihu.com/p/371710865 1.基础了解 const {parse} =require(" ...

  8. 网络工具netstat与ss

    建议使用ss命令,2001年的时候netstat 1.42版本之后就没更新了,之后取代的工具是ss.netstat命令在很多场景下比较慢.ss可以显示跟netstat类似的信息,但是速度却比netst ...

  9. Python使用pipreqs生成requirements.txt

    当一个Python完成后,若要在新环境下运行,往往需要重新安装各种包依赖,这就需要记录当前环境下所用到的包.包的版本等,非常麻烦,这里介绍一种方法,可以较为快速便捷地生成requirements.tx ...

  10. JSONObject 相关

    /** * 将json转为对应实体类 */ public static Object jsonToJavaObj(String json, Class cs) { return jsonToJavaO ...