首页 > 其他分享 >ABAP 辨析ON INPUT|REQUEST|CHAIN-INPUT|CHAIN-REQUEST

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

时间:2023-02-21 20:03:00浏览次数:49  
标签:matnr CHAIN text REQUEST FIELD INPUT makt

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.

 

TRANSLATE with x English
Arabic Hebrew Polish
Bulgarian Hindi Portuguese
Catalan Hmong Daw Romanian
Chinese Simplified Hungarian Russian
Chinese Traditional Indonesian Slovak
Czech Italian Slovenian
Danish Japanese Spanish
Dutch Klingon Swedish
English Korean Thai
Estonian Latvian Turkish
Finnish Lithuanian Ukrainian
French Malay Urdu
German Maltese Vietnamese
Greek Norwegian Welsh
Haitian Creole Persian  
  TRANSLATE with COPY THE URL BELOW Back EMBED THE SNIPPET BELOW IN YOUR SITE Enable collaborative features and customize widget: Bing Webmaster Portal Back

标签:matnr,CHAIN,text,REQUEST,FIELD,INPUT,makt
From: https://www.cnblogs.com/BinGeneral/p/17141821.html

相关文章