SAP 系统中的屏幕包含:
标准屏幕:
选择屏幕:
列表输出屏幕:
1. 标准屏幕必须隶属于一个类型为 L, M 或 F 的ABAP 程序, 当中须要设计的内容包含屏幕布局以及隐含在其后的流逻辑. 流逻辑则包含ABAP代码模块, 实际控制着屏幕的交互, 功能, 各事务流程(如兴许屏幕设定), 当然还有设定屏幕的GUI状态, 包含菜单, 屏幕标题行和工具栏等.
2. 屏幕流逻辑分为两个基本处理块: PBO(process before output), 在向用户显示屏幕之前触发. PAI(process after input), 在用户进行某些屏幕行为(如回车)触发.
流逻辑模块是一种处理块, 是进行详细处理的ABAP代码, 在 MODULE/ENDMODULE之间定义.
对话屏幕中的字段则必须在ABAP程序中有相关的同名字段, 并在其间相互传输, 程序通过程序中的同名字段来控制屏幕字段的输出值, 而且接受用户在屏幕字段中的输入.
3. 屏幕调用序列.
一个ABAP事务程序能够包括一或多个屏幕, 当一个屏幕结束后,能够转向下一个屏幕,后序屏幕可通过屏幕属性或者ABAP程序来设定.
4. 屏幕属性.
兴许屏幕, 假设没有设置该项, 则默认的兴许屏幕为当前屏幕本身, 通过兴许屏幕能够把事务中的一系列屏幕链接起来, 形成一个屏幕序列, 假设某个个屏幕的兴许屏幕为 0, 则表明该屏幕是个屏幕序列的结束.
5. 布局设计.
屏幕元素的属性能够在程序中动态进行控制, 方法为在屏幕输出之前的一个PBO模块代码部分对系统内表 Screen的值进行改动. 全部的屏幕元素都存储在系统内表 screen 中, 可动态改动.
loop at screen.
if screen-name = 'MOD'.
screen-input = '0'.
modify screen.
endif.
endloop.
上面的代码应属于一个PBO模块, 并在屏幕的PBO逻辑中被调用.
Screen 结构.
Name 屏幕字段名称
GROUP1 屏幕字段组1.
GROUP2 屏幕字段组2.
GROUP3 屏幕字段组3.
GROUP4 屏幕字段组4.
ACTIVE 字段可见并用于输入
REQUIRED 必需输入字段
INPUT 输入字段
OUTPUT 字段仅用于显示
INTENSIFIED 高亮显示字段
INVISIBLE 禁用字段
LENGTH 字段输出长度
6. 屏幕字段
除系统自己主动生成屏幕字段外, 还须要由程序猿定义对应的ABAP程序字段, 二者要有同样的名称以及长度, 类型.
定义对应的ABAP字段的目的是用户屏幕和程序之间的传输数据,
在PBO处理逻辑中, 系统将程序字段的值传输给屏幕字段进行输出;
在PAI中, 系统把用户的输入数据传递给程序.
除去与屏幕输入输出元素相应的字段外, 另一个特殊的屏幕字段-----OK 代码字段, 其作用是返回在屏幕和GUI状态中用户触发的功能代码. 在交互式报表中能够通过 SY-UCOMM返回用户选择的功能代码, 程序通过功能代码来在PAI模块中接收相应的功能代码.
7. 流控制逻辑.
在流逻辑定义中, Process 语句用于说明模块何时被调用, MODULE 语句中指定模块名, 告诉系统该事件调用的详细ABAP模块, 每个流逻辑模块的内容都是由普通的ABAP代码组成的.
流逻辑中有四种典型的处理块, 由PROCESS引导, 在不同的情况下被触发.
Process before output. (PBO)
...
在当前屏幕输出之前被触发.可用于屏幕初始化工作, 比如数据库选择, 屏幕元素动态设定等. 当全部的PBO模块结束后, 系统将显示当前用户屏幕.
Process after input. (PAI)
...
该事件在用户在屏幕中运行功能后被触发, 全部的PAI模块结束后, 屏幕可能调用兴许屏幕或者回到上一个屏幕序列.
Process on help-request. (POH)
...
当用户要求查看帮助信息时(F1)被触发, 事件结束后, 返回当前屏幕.
Process on value-request. (POV)
...
当用户按下查询帮助button时(F4)被触发, 事件结束后交继续处理当前屏幕.
流逻辑语句.
流控制语言不同于普通的ABAP语言.
PROCESS 流逻辑事件块keyword
MODULE 调用ABAP程序中定义的对话模块
FIELD 定义屏幕字段赋给程序中对应字段的逻辑点
ON FIELD keyword语句选项
VALUES FIELD keyword语句选项
CHAIN 開始一个处理链
ENDCHAIN 结束一个处理链
CALL 调用子屏幕
LOOP 開始正理屏幕表格
定义和调用对话模块.
在ABAP模块池和可运行程序中, 能够在MODULE和ENDMODULE语句之间定义对话模块. 在屏幕PBO中调用的模块须要在其后加下OUTPUT. 在PAI模块则使用INPUT.
对话模块不专属于某个屏幕, 而是能够被程序中的随意多个屏幕所调用. 通过系统变量 sy-dynnr的返回值, 能够确定是哪个屏幕正在对其调用.
对话模块常常被存储在模块池中, 一个模块池中一般须要包括四个引用程序. 命名规则各自是:
programeTOP 存放全局数据
programeO01 存放PBO模块
programeI01 存放PAI模块
programeF01 存入功能模块
这样的做法能够让程序结构很清晰. 这些引用程序应该先于流逻辑模块创建, 流逻辑模块加入时, 系统将询问加入至哪个引用程序之中, 由程序猿选择正确的位置.
须要注意的地方是在模块化的结构之中, 不存在局部数据对象, 全部定义在MODULE和ENDMODULE 语句之间的数据对象将被放置到整个程序的公用数据区域, 因此最好不要在该结构中出现数据的定义和声明语句, 而应将全部的数据声明放置在TOP引用程序的相关部分.
调用对话模块:
在屏幕逻辑语言中, 使用MODULE语句对在模块池等ABAP程序中定义的模块进行调用.
须要注意的是不要将屏幕流逻辑语句MODULE和ABAP中的模块定义语句相混淆.
屏幕一旦被调用, 系统就会触发PBO事件, 当中屏幕流逻辑将依次调用对应的ABAP PBO模块并执行当中的代码. 全部的PBO模块调用结束之后, 屏幕及当中全部元素显示给用户, 此后系统将控制权由应用server转交给显示server, 以接受用户的输入, 直至用户行为触发PAI事件. PAI事件触发后, 控制权又交给应用server, 并按次序调用当中的PAI模块对输入的数据进行处理, 全部的PAI事件执行结束之后将触发兴许屏幕的PBO事件.
无条件调用:
通常情况下, 模块的调用顺序取决于在屏幕流逻辑中的出现次序. 在PAI事件块中, 系统首先将进行默认的输入正确性检查, 这意味着在调用第一个PAI模块之前, 用户在屏幕中输入时, 至少全部在属性被设为Required Filed 的字段均必须输入, 并且对于參照数据字典声明的字段, 还必须满足字典中定义的可能值列表和约束表中的限定.
但在某些情况下, 用户可能不过为了退出当前屏幕, 却要输入非常多数据, 或者不知道怎样输入正确的数据, 又无法结束该事务, 为了避免这类情况, 能够使用一种与特殊功能代码模块, 无条件调用模块, 不管用户输入满足系统检查与否, 该模块都将先被调用.
类型为E的功能代码. 在属性对话框中将 Function type 设定为'E'. 假设用户触发了E类型功能, 在PAI中系统将忽略全部自己主动的字段检查并直接调用特定的Module语句(AT EXIT-COMMAND).
类型为E的PAI模块. 不管在PAI逻辑中出如今何位置, 该语句中指定的模块都将优先被调用. 在此之前, OK代码字段被传递至ABAP程序中同名字段, 但没有其它屏幕字段被传递至对应的ABAP字段.
PROCESS AFTER INPUT.
MODULE back AT EXIT-COMMAND.
....
ABAP 模块代码:
MODULE back INPUT.
IF ok_code = 'BACK'.
CLEAR ok_code.
SET SCREEN 0.
LEAVE SCREEN.
ENDIF.
ENDMODULE.
传输数据控制:
用户在屏幕中输入的数据能够通过系统自己主动控制和使用流逻辑语句控制两种不同的方式传递给程序.
系统自己主动传递:
在SAP系统中, 从当前屏幕的PAI開始到输出下个屏幕的PBO事件结束, 称为一个对话步骤. 假设不在流逻辑语句中对数据的传输过程进行不论什么控制的话, 系统自己主动将全部屏幕数据传递给ABAP程序, 在新的屏幕PBO事件即将结束之前, 即屏幕显示给用户时, 再将ABAP数据传递给相关的屏幕字段. 整个对话程序中, 全部与屏幕字段同名的全局数据(在ABAP模块也要定义), 均将在系统的应用server中进行该数据传递.
语句控制传递:
假设在流控制逻辑中使用了Field语句, 在Field语句中指定的字段的传输数据被延迟, 数据不是在PAI的起点被传输至ABAP程序, 而是直到实际运行该语句时, 指定字段的值才被传输到程序中. 假设屏幕字段出如今多条Field语句中, 则在出现该字段的第一条Field语句运行时传送字段值.
添加了Field语句之后(不论Field语句的位置), 仅仅有位于该语句后面的模块才干够得到屏幕中被更新的数据值.
模块的条件调用:
有时, 同一个屏幕的PBO和PAI将重复循环出现, 假设每一次均将运行全部的ABAP模块并不十分必要. 使用Field语句的ON选项, 并结合CHAIN和MODULE等keyword语句, 能够实现模块的条件调用. 防止不必要的模块调用, 以提高系统的性能.
a.) 单字段条件调用.
使用FIELD语句的ON INPUT附加项, 能够指定某模块仅仅在给定字段具有非初始值时才被调用.
FIELD dynfield MODULE mod ON INPUT.
仅仅有字段 dynfield 包括非初始值时, 才调用ABAP模块mod.
另一种:
FIELD dynfield MODULE mod ON REQUEST.
仅仅有在该字段中输入值时(包含空值和原值), 才调用ABAP模块, 系统将下面设置字段的方式视为有值输入:
实际用户输入.
通过 SET PARAMETER 字段输入.
通过 HOLD DATA 功能设置.
用于事务调用时的參数输入.
用于整个定制系统的全局字段.
b.) 组合字段条件调用.
如查一个模块的条件调用与多个屏幕字段有关(即当一组屏幕字段中的随意一个满足某种条件, 则调用该模块),
须要用 CHAIN/ENDCHAIN结构将FIELD语句和字段及模块组合起来.
CHAIN.
FIELD: f1, f2,...
MODULE mod1 ON CHAIN-INPUT|CHAIN-REQUEST.
FIELD: g1, g2,...
MODULE mod2 ON CHAIN-INPUT|CHAIN-REQUEST.
...
ENDCHAIN.
Example:
CHAIN.
FIELD: a, b , c.
MODULE mod1 ON CHAIN-INPUT.
MODULE mod2.
ENDCHAIN.
假设字段 a, b, c 中不论什么一个具有不同于初始值的值, 则调用模块 mod1, 而模块 mod2 则始终被调用.
我们还能够在 CHAIN 语句链中, 将条件限制至特定字段, 能够将 MODULE 语句连接到相关 FIELD 语句.
Example:
CHAIN.
FIELD: a, b.
FIELD: c MODULE mod1 ON INPUT.
ENDCHAIN.
仅仅有当字段 c 包括非初始值时, 才调用模块 x.
Example:
CHAIN.
FIELD: a, b.
FIELD: c MODULE mod1 ON CHAIN-INPUT.
ENDCHAIN.
当字段 a, b, c 中任一字段包括非初始值时, 都调用模块 mod1.
输入检查:
使用 FIELD 语句或者 FIELD 和 CHAIN 的语句组合, 能够实如今 ABAP/4 中进行字段输入检查.
a.)单个值检查:
屏幕流逻辑.
PROCESS AFTER INPUT.
FIELD spfli-airpfrom.
MODULE check_fr_airport.
ABAP 代码例如以下:
MODULE check_fr_airport INPUT.
SELECT * FROM sairport WHERE id = spfli-airpfrom.
IF sy-subrc NE 0.
MESSAGE E003 WITH spfli-airpfrom.
ENDIF.
ENDMODLE.
当有错误时, 屏幕又一次显示, 仅仅有 spfli-airpfrom 字段可接受新的输入.
b.) 检查多个字段.
放在 CHAIN/ENDCHAIN 链中, 在 CHAIN 链中全部字段相互依赖, 链内部任一字段错误发生输入时, 会又一次显示屏幕, 并同意输入链中的随意字段.
CHAIN.
FIELD: spfli-carrid, spfli-connid.
MODULE check_flight.
ENDCHAIN.
在选择屏幕之后, 按了回车或F8会触发 At selection-screen 事件, 假设按了F8,这个事件块运行后, 继续触发start-of-selection, 假设按回车, 则又一次显示当前选择屏幕.
在处理 at selection-screen 事件前, 用户输入会自己主动传给输入变量, 因此能够在这个事件块里面处理输入检查和权限检查.
MODULE module_name AT EXIT-COMMAND:仅仅能在PAI中使用,会因为以"/E"开头或者E型的function而触发(一般就是Back、Exit、Cancel)
8. 调用屏幕.
实现屏幕动态调用的ABAP语句.
SET SCREEN next_screen_number.
为当前屏幕指定兴许屏幕.
CALL SCREEN screen_number.
CALL TRANCTION tcode.
挂起当前屏幕序列, 进入新的屏幕或事务.
LEAVE SCREEN.
假设须要未完毕当前屏幕控制流就要转入兴许屏幕.
LEAVE TO SCREEN screen_number.
LEAVE TO TRANCTION tcode.
未完毕当前屏幕就转入兴许屏幕.
LEAVE TO SCREEN 0.
SET SCREEN 0.
LEAVE SCREEN.
中止当前屏幕.
9. 调用GUI状态.
SET PF-STATUS stat.
SET TITLEBAR stat.
10. ABAP事件运行顺序.