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

打印 上一主题 下一主题

主题 1019|帖子 1019|积分 3057

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语句时,对应的字段值会传递到程序中。
例如:在屏幕中添加物料和物料描述两个字段

 逻辑流如下:
  1. PROCESS BEFORE OUTPUT.
  2.   MODULE status_9000.
  3. PROCESS AFTER INPUT.
  4.   MODULE get_text."获取物料描述
  5.   FIELD makt-matnr.
  6.   MODULE get_text."获取物料描述
复制代码
GET_TEXT
  1. MODULE get_text INPUT.
  2.   IF makt-matnr IS NOT INITIAL.
  3.     SELECT SINGLE
  4.       maktx
  5.     FROM makt
  6.     INTO makt-maktx
  7.     WHERE matnr = makt-matnr
  8.       AND spras = sy-langu.
  9.   ELSE.
  10.     CLEAR:makt-maktx.
  11.   ENDIF.
  12. ENDMODULE.
复制代码
使用FIELD,导致屏幕中MAKT-MATNR必须执行到FIELD makt-matnr.时,makt-matnr才有值。第一个get_text查询不到物料描述,第二个get_text才能查到。
3、模块条件调用语法

3.1 单一字段条件调用

3.1.1 ON INPUT
  1. FIELD makt-matnr MODULE get_text ON INPUT.
复制代码
1.当Field语句的字段为非初始值(非空值或零)时,才调用MOD;例如输入物料号,改变了字段非初始值状态,则会调用MOD查询到物料描述2.用户将字段值改为初始值,则不触发MOD
例如把物料号置空,并没有执行清空物料描述的逻辑

 3.如果用户不输入,而是直接在代码中为物料赋值,也等同于改变了初始值,则会触发MOD
  1. makt-matnr = '000000010000000002'.
  2. CALL SCREEN '9000'.
复制代码

3.1.2 ON REQUEST
  1. 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
  1. makt-matnr = '000000010000000002'.
  2. CALL SCREEN '9000'.
复制代码

3.2 组合字段条件调用

3.2.1 ON CHAIN-INPUT|REQUEST

如果屏幕中多个字段满足条件就要调用该MOD,则需要用CHAIN和ENDCHAIN将FIELD包裹起来,并使用ON CHAIN-INPUT|REQUEST,形成组合
  1. PROCESS AFTER INPUT.
  2.   CHAIN.
  3.     FIELD:marc-werks,makt-matnr.
  4.     MODULE check_matnr ON CHAIN-INPUT.
  5.     MODULE get_text.
  6.   ENDCHAIN.
  7.   MODULE user_command_9000.
复制代码
检查物料在工厂下是否存在
  1. MODULE check_matnr INPUT.
  2.   SELECT SINGLE
  3.     *
  4.   FROM marc
  5.   INTO @DATA(ls_marc)
  6.   WHERE werks = @marc-werks
  7.     AND matnr = @makt-matnr.
  8.   IF ls_marc IS INITIAL.
  9.     MESSAGE '物料在工厂下不存在' TYPE 'E'.
  10.   ENDIF.
  11. 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。
  1.   CHAIN.
  2.     FIELD:marc-werks.
  3.     FIELD:makt-matnr MODULE get_text ON INPUT.
  4.   ENDCHAIN.
复制代码
而下列代码:使用ON CHAIN-INPUT无论输入工厂还是物料,都会触发get_text。这就是ON INPUT|REQUEST 和 ON CHAIN-INPUT|REQUEST的区别
  1.   CHAIN.
  2.     FIELD:marc-werks.
  3.     FIELD:makt-matnr MODULE get_text ON CHAIN-INPUT.
  4.   ENDCHAIN.
复制代码
 
TRANSLATE with <img id="FloaterLogo"> x  English
ArabicHebrewPolish
BulgarianHindiPortuguese
CatalanHmong DawRomanian
Chinese SimplifiedHungarianRussian
Chinese TraditionalIndonesianSlovak
CzechItalianSlovenian
DanishJapaneseSpanish
DutchKlingonSwedish
EnglishKoreanThai
EstonianLatvianTurkish
FinnishLithuanianUkrainian
FrenchMalayUrdu
GermanMalteseVietnamese
GreekNorwegianWelsh
Haitian CreolePersian 
<img alt="" ><img id="HelpImg"> <img id="EmbedImg"> <img id="ShareImg">  TRANSLATE with <img id="CollapsedLogoImg"> COPY THE URL BELOW    <img id="EmailImg"> <img id="ShareHelpImg"> Back  EMBED THE SNIPPET BELOW IN YOUR SITE  <img id="EmbedHelpImg">Enable collaborative features and customize widget: Bing Webmaster PortalBack
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

莫张周刘王

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表