定义屏幕:
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)
...
当用户按下查询帮助按钮时(F4)被触发, 事件结束后交继续处理当前屏幕.
流逻辑语句.
流控制语言不同于普通的ABAP语言.
PROCESS 流逻辑事件块关键字
MODULE 调用ABAP程序中定义的对话模块
FIELD 定义屏幕字段赋给程序中相应字段的逻辑点
ON FIELD 关键字语句选项
VALUES FIELD 关键字语句选项
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模块调用结束之后, 屏幕及其中所有元素显示给用户, 此后系统将控制权由应用服务器转交给显示服务器, 以接受用户的输入, 直至用户行为触发PAI事件. PAI事件触发后, 控制权又交给应用服务器, 并按次序调用其中的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模块也要定义), 均将在系统的应用服务器中进行该数据传递.
语句控制传递:
如果在流控制逻辑中使用了Field语句, 在Field语句中指定的字段的数据传输被延迟, 数据不是在PAI的起点被传输至ABAP程序, 而是直到实际执行该语句时, 指定字段的值才被传输到程序中. 如果屏幕字段出现在多条Field语句中, 则在出现该字段的第一条Field语句执行时传送字段值.
增加了Field语句之后(不论Field语句的位置), 只有位于该语句后面的模块才可以得到屏幕中被更新的数据值.
模块的条件调用:
有时, 同一个屏幕的PBO和PAI将反复循环出现, 如果每一次均将执行所有的ABAP模块并不十分必要. 使用Field语句的ON选项, 并结合CHAIN和MODULE等关键字语句, 可以实现模块的条件调用. 防止不必要的模块调用, 以提高系统的性能.
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事件执行顺序.