加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

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

(2023-09-18 13:51:03)
标签:

abap

sap

工具

娱乐

分类: ABAP屏幕相关
ABAP辨析ONINPUT|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语句时,对应的字段值会传递到程序中。

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

ABAP辨析ONINPUT|REQUEST|CHAIN-INPUT|CHAIN-REQUEST
 逻辑流如下:

 


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查询到物料描述

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

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

 


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

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

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查询到物料描述

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

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

 


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

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

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则始终会被调用

 

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

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


但是在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.


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有