【ABAP】ABAP官方参考指南学习笔记(01)—— 指定操作数
【ABAP】ABAP官方参考指南学习笔记(02)—— 数据对象在运算中的位置
【ABAP】ABAP官方参考指南学习笔记(03)—— 命名规则、链式语句、注释
【ABAP】ABAP官方参考指南学习笔记(04)—— 程序引入语句
【ABAP】ABAP官方参考指南学习笔记(05)—— 程序引入语句详解Executable Program
【ABAP】ABAP官方参考指南学习笔记(06)—— official ABAP reference 模块化语句
【ABAP】ABAP官方参考指南学习笔记(07)—— official ABAP reference subroutines 子程序
【ABAP】ABAP官方参考指南学习笔记(08)—— official ABAP reference Dialog Modules Event Overview
【ABAP】ABAP官方参考指南学习笔记(09)—— official ABAP reference event block
【ABAP】ABAP官方参考指南学习笔记(10)——official ABAP reference event block
【ABAP】ABAP官方参考指南学习笔记(01)—— 指定操作数
关键字:ABAP 参考 学习笔记 指定操作数
操作数的指定
1. 静态指定操作数
就是关键字后面直接操作数,
例如:SUBMITreport。
2. 通过括号动态指定操作数
有些时候,语句后面的操作数不能变,必须是个确定的值.但是实际情况是我们必须在运行时才能确定这些值,而不是一开始就能确定的,所以使用把包含被操作数的变量放到括号中这种机制,保证了实际运行时,括号中的变量能够携带被操作数的名字,以便实现动态替换。
例如: SUBMIT (dobj).
有时候,操作数传递有多个,形成一个列表。这个时候可以用一个字符类型的内表来传参,还是通过括号包起内表变量的名字来完成。内表中每个行包含的是变量的标识符。
例如:SELECT... WHERE (where_tab)
3. 直接动态指定操作数
针对多数情况下可以接,在系统运行的时候,需要指定一个包含实际被操作数名字的变量就可以.因为这种情况下, 语句后接的操作数允许变化,所以直接写包含被操作数的变量的变量名. 如果是想针对这种语句使用静态指定, 那么就是用字面值.
例如:
CALL FUNCTION func_name. " 这里使用了包含被调用function名字的变量的变量名
CALL FUNCTION 'ztest_function'. " 这里直接使用了被调用function module的名字
【ABAP】ABAP官方参考指南学习笔记(02)—— 数据对象在运算中的位置
数据对象在操作数中的位置,就分为两种:读和写。
所谓读位置,所出现的操作数在此位置上是不能被修改的;所谓写职位,操作数在此位置上是可以被修改的。
此外,在操作数应该出现的位置上,数据类型和特定数据对象的内容,必须对应。
读,即只读位置或数据对象处于此位置时值不能被修改的有:
1。字面值(废话,一个字符串'abcd'本身,也不可能是可写变量)
2。使用变量标识符(例如dobj)、field symbols的(例如<fs>)、解引用(例如dref->*,C和CPP程序员熟悉)、文本符号(例如text-000)、多个引用变量的连接。注意,如果是使用field symbol或者引用变量,在只读位置出现的话,必须不为空!
3。另外一种直接通过文字字面值+三位数字编号指定文本符号的方式也是只读的。例如'text_body'(001).这是一种在文本符号没有加载到文本池时给文本赋值的一种方式。(补充,文本符号,好比Java中预定义的资源,一般用来输出个报警或者错误以及提示信息啥的)
4。只读位置的数据对象是内表,那么使用dobj[], <fs>[], dref->*[]的方式,得到的结果直接就是表体而不是表头。如果内表本身没有表头,那么他的名字(不带[])在所有操作数的位置都表示表体。反之,则表示表头(仅仅出现这个内表名字的时候),并且在所有操作数出现的位置“不一定”都是表示表头。如果单提一个内表,一般而言(即此内表不一定有表头),那么只有在如下情况,表名(不带中括号)才表示表体:
使用EXPORT和IMPORT来保存和读取数据集群,使用语句FREE和SEARCH的时候,使用OPEN SQL时语句部分中所有动态指定的内容。
5。给一个标识符、字段符号或者一个解引用直接追加offset/length长度的字符型或byte型数据对象的子区域的分配,例如:
dobj[+off][(len)]
<fs>[+off][(len)]
dref->*[+off][(len)]
(上述三个语句的意思是,对前面的变量,从off位置起,截取len长度的子区域,off和len都是i类型。好比说是字符串,就是从off起,截取len长度的子串. 如果off小于子串实际长度,len可以用*代替)
如果使用ASSIGN 语句的时候,字段限制以外的区域时访问不到的。如果只有off,没有len,那么就取从off开始到结束的子区域。如果只有len,没有off,那么只寻址前len个字符。
如果直接使用'leteral'这样的字符串值或者文本符号,就不能使用off和len。另外,如果是在字符类型的数据对象中使用二者,则剂量是按照字符来进行的,否则就是按照byte类型来走。在非uni-code系统中,一个字符等同于一个byte。如果是Unicode的程序,则off和len只允许是数据对象的字符类型和byte类型的区域。而对于结构来说,二者只允许是unicode程序中使用,当结构是扁平的,而且只在结构的第一个unicode片段上有效,而且还必须是字符类型的片段。
6。对预定义function。可以作为:
MOVE语句的源字段
COMPUTE语句算术表达式的操作数
CASE和WHEN语句的操作数
逻辑表达式的操作数
6.10版之前,预定义function只能是在COMPUTE语句中使用
7。对于特定的Functional Methods
同predefined functions
也可以用在bit(位)表达式中
对于无输入参数、一个输入参数和多个输入参数的语法如下
meth( ) " 注意括号、运算符和操作数之间是有空格的!!!有些类似shell脚本,下同
meth( a )
meth( p1 = a1 p2 = a2 ... )
其中meth是方法名,可以通过CALL METHOD语句调用,此方法返回值被操作数所使用。语法同CALL METHOD调用 short form(包含进来的一个子程序,后面会有介绍)。如果function method与predefined function同名。那么meth( a ) 表达式,总是调用的是functional method。
注意,如果系统字段(后有介绍,先记着)的值不是通过同一个系字段设定的,那么在操作数的读位置,就只输入一个系统系统字段。否则,可能导致未定义系统操作。
写,数据对象的值可被修改的位置
语句执行后,操作数的值有变化。只有可变的数据对象可以放到这些位置。
1。对于数据对象的指定必须是可见的,可以使用标识符、字段符号、解引用。对于内表和其使用[]的读位置都是寻址到表体并且可以修改的。
2。对于直接对标识符,fs和解引用使用off和len划定出来的扁平的、字符或者byte类型的子区域。对于像string和xstring这种纵深类型的数据对象,就不能在写位置上直接使用。
操作数类型
根据操作数所处的语句中的位置,可以使完整型(类型、长度具备 )和通用型(类型相容的)。执行语句的时候,总是使用所需的类型,如果类型不符,则系统尝试自动转换(根据转换规则)。但是类型转换增大运行时成本。如果没有相应的转换规则可以使用或者是错误的类型,就会导致系统错误。
主意,要在运行时优化程序,就尽可能的使用正确的类型,而不是使用可以相容的得通过转换才能使用的类型。
结构在操作数中的位置
非Unicode程序中,扁平结构可以使用在所有需要基本字段操作数位置。Unicode中,则只能是扁平且为字符类型的结构成员,才能被当成type c类型的数据对象进行使用(隐式转换)
【ABAP】ABAP官方参考指南学习笔记(03)—— 命名规则、链式语句、注释.
命名规约
针对所有变量名有效:
1。名字最长30个字符
2。可使用字符A-Z,数字0-9,还有下划线(_)。
为了保证安全,咱们还是永远不要用这些之外的字符。
3。必须字母开头。
4。可以带有名字空间前缀,命名空间前缀至少包含三个字符(因为是用/.../的结构么),并且前缀的完整长度不能超过30个字符
5。对于数据类型和数据对象,不能使用ABAP预定义类型和预定义对象
6。坚决反对使用ABAP语言元素的名字(相当于关键字,尽管这样的用法在ABAP中是可以的)
7。字段符号的变量名外面必须用<>括起来
因为有了命名空间,所以可以出现不同的上下文(命名空间或者所处的集合中)变量名重名的现象。但是在同一个上下文中,变量的名字无论是什么(包括类啊,接口,fm等等),名字必须唯一!
特别注意!
ABAP中所有的类型都是用相同的命名空间。所以,数据类型和对象类型(的名字)就没有各自的命名空间。意味着,例如,一个全局类不能使用一个已经在ABAP字典中存在的某数据类型的名字。
链式语句
两种,一种是:分割,一种是缩短关键字调用。
冒号分割
对于多个具有相同起始语句的表达式,可以使用:分割。例如:
Data:
col1(1) type c,
col2(2) type c,
col3(3) type c.
这个等同于:
Data col1(1) type c.
Data col2(2) type c.
Data col3(3) type c.
被合并的部分,彼此之间用,分割,最后整个语句结束还是使用.标志。
关键字调用的链式语句,例如:
CALL METHOD oref->m1 EXPORT para =:'1', '2', '3'.
等同于
CALL METHOD oref->m1 EXPORT para = '1'.
CALL METHOD oref->m1 EXPORT para = '2'.
CALL METHOD oref->m1 EXPORT para = '3'.
注释
行注释,使用*,必须在一行开始的第一个字符就用它才有效,其后所有内容都是注释
而"开头的注释可以使用在任何位置,其后的内容都将成为注释 相当于java和C的//
在语句后使用"#EC定义了其后的内容为伪注释,用来进行扩展的程序检查(t-code: SLIN)
尽量不要使用SAP不支持的字符作注释(汉字还是可以的)
原书第二章,完
【ABAP】ABAP官方参考指南学习笔记(04)—— 程序引入语句
程序引入语句
SAP的程序有很多种,每种都需要程序引入语句(Introductory Program Statements),语句随程序类型不同而异。引入语句是放在程序的最开始,而且每个ABAP程序只能包含一个引入语句。除了INCLUDE语句可以替代它出现在第一句以外,其他的语句都不允许出现在程序最开始的位置,并且在这种情况下,引入语句必须紧接着INCLUDE。所有紧接其后的代码和作为 include包括进来的程序都被ABAP编译器当成单独的单元。
下面,按照如下格式,简要的介绍程序的类型和它的导入语句。
程序类型(program type)
引入语句(introductory statement)
全局声明(global declarations)
处理块(processing blocks)
Dynpro支持(dynpros)
程序类型,是下图中标注出来的部分,前面一位字符时该种程序在系统中的标志。引入语句,表明程序使用何种引入语句,详细的用法稍后有介绍。全局声明,是指在特定类型的程序中,那些声明可以放到程序的全局声明段落中。处理快,是指该种类型的程序可以包含哪些类型的处理块。最后Dynpro是sap一种针对网络web ui的技术,是指这种类型的程序是否支持自身的dynpro。以下,是针对各种类型程序的介绍。目前XSLT的,在我看到的这个版本中是没有介绍的。
程序类型:Executable Program
引入语句:REPORT
全局声明:本地接口和类,所有其他声明性语句
处理块:除了function module以外皆可
Dynpro:是
程序类型:Class Pool
引入语句:CLASS-POOL
全局声明:类库的全局类,本地接口和类,TYPES和TYPE-POOLS语句
处理块:只有方法
Dynpro:否
程序类型:Function group或function pool
引入语句:FUNCTION-POOL
全局声明:本地接口和类,所有其他声明性语句
处理块:除了reporting事件的事件处理块以外皆可
Dynpro:是
程序类型:Interface pool
引入语句:INTERFACE-POOL
全局声明:类库的全局接口,TYPE-POOLS语句
处理块:没有
Dynpro:否
程序类型:Module Pool
引入语句:PROGRAM
全局声明:本地接口和类,所有声明性语句
处理块:LOAD-OF-PROGRAM事件块,sub-routines,方法
Dynpro:是
程序类型:Subroutine Pool
引入语句:PROGRAM
全局声明:本地接口和类,所有其他声明性语句
处理块:LOAD-OF-PROGRAM事件块,sub-routines,方法
Dynpro:否
程序类型:Type group或type pool
引入语句:TYPE-POOL
全局声明:TYPES, TYPE-POOLS和CONSTANTS语句
处理块:没有
Dynpro:否
实际上,虽然所谓的引入语句从语法上不是限定于具体的某个程序类型,但是永远是用上述程序类型,并且永远别手工改。
【ABAP】ABAP官方参考指南学习笔记(05)—— 程序引入语句详解Executable Program
程序引入语句详解Executable Program
这种类型的程序使用如下引入语句
REPORT repname
[NO STANDARD PAGE HEADING | LINE-SIZE width |LINE-COUNT page_lines [(footer_lines)] ]
[MESSAGE-ID mid]
[DEFINING DATABASE
其中repname必须直接给定,一般ABAP程序同名。
以下三者为列表选项:
NO STANDARD PAGE HEADING
在程序输出的列表中不输出页眉(如果页面分栏的话,不输出每栏的header),并且把系统变量sy-wtitl设置为“N”。在(程序中)可以通过给NEW-PAGE语句追加NO-TITLE|WITH-TITLE,NO-HEADING|WITH-HEADING来覆盖此项设置。
LINE-SIZE width
指定了程序中基础列表和明细列表的行宽,即将每行的字符数限制为width指定的值,同时影响系统变量sy-linsz的值(同width)。进而影响到页面上一次能显示的列的数目,另外width必须为正整数,最大值为1023。
如果不指定此选项,则设置为基于当前dynpro窗口的默认宽度,但是最少是一个标准SAP窗口的宽度。这个语句在有SUBMIT的语句出现时覆盖其LINE-SIZE值,并且在列表创建的时候可以被NEW-PAGE语句的LINE-SIZE给覆盖。
注意:当前最大的行宽值,存储在名为SLIST的类型组中的常量slist_max_linesize中。其中也定义了类型为c的slist_max_listline的类型。
LINE-COUNT page_lines [(footer_lines)]
[(footer_lines)],这个语句为程序中基本列表指定了页面长度为page_lines,并且给sy-linct这个系统变量赋值。如果不指定这个属性,或者page_lines的值小于等于0或者大于6w,那么页面长度就被内置为6W。这个语句在有SUBMIT的语句出现时覆盖其LINE-SIZE值,并且在列表创建的时候可以被NEW-PAGE语句的LINE-COUNT给覆盖。如果给footer_lines赋值了,那么就为页脚保留指定值的行数,以便可以在事件处理快END-OF-PAGE中处理。二者必须都为数字类型。
MESSAGE-IDmid
通过指定mid,使得可以在仅有消息类型和消息编号在程序中被指定的时候,使用MESSAGE语句的简短形式。消息在程序中必须直接指定,并且出现在数据表T100中的ARBGB列。当在MESSAGE中制定了消息类的时候,就覆盖了MESSAGE-ID给出的值。
例:
REPORT z_myreportMESSAGE-IDsabapdocu.
上例,为程序z_myreport指定SABAPDOCU作为默认的消息类。
DEFINING DATABASE ldb
表明当前的程序是逻辑数据库ldb的数据库程序。逻辑数据库的名字最长20字符。ldb都是在ABAP工作台中的逻辑数据库构建器中维护的,因此程序框架是自动生成的,并且包括了Report语句。框架程序的名字是SAPDBldb(注意名字的后三个字母)。
例如:引入的逻辑数据库是FlS,那么
REPORT sapdbfls DEFINING DATABASE fls.
Module Pools 和 Subroutine Pools
PROGRAM progname [list_options] [MESSAGE-ID mid].
整体来说,用法和用量同Executable Program。只不过在Module Pools中PROGRAM义同REPORT。
在子程序中只有MESSAGE-ID有效,列表选项被忽略。因为子程序没有自己的列表缓冲区,而且输出也是写入到调用它的程序的当前列表中。
Function Groups
FUNCTION-POOLfpool [list_options]MESSAGE-ID mid].
用法用量同上。总体来说Function Group是ABAP workbench中可以创建的(t-code:Se80),创建的时候,总是自动生成一个主程序,再起顶层包含语句中有这条引入语句。完整的 function group在Repository中包含了一个有SAPL作为前缀和fpool作为后缀的名字。
Class pools
CLASS-POOL [MESSAGE-IDmid].
用法用量同Report
Interface Pools
INTERFACE-POOL.
用法用量同Report。
Type Groups
TYPE-POOL
用法用量同上。类型组其实是定影在ABAP数据词典中的,其中包括了一个自动生成的程序中叶包含了TYPE-POOL语句。类型组中只能包含如下语句:
INCLUDE
TYPES
TYPE-POOLS
CONSTANTS
DEFINE和END-OF-DEFINITION
使用DEFERRED PUBLIC或 LOAD 的 CLASS DEFINITION
其中声明数据类型、常量和宏,必须使用tpool作为其名字的前缀。通过TYPE-POOLS语句,类型组可以被集成到其他的ABAP程序中。
注意:
类型组的名字最长5个字符
类型组中的类型都是ABAP数据字典中定义的通用类型的predecessors
6.40以后,数据类型和常量,必须定义在全局类中的公共可见字段,在那里,类型组是完全可以替换的。
为了防止使用LIKE关键字造成的类型引用冲突,类型组中的常量,不能与ABAP数据字典中早已经定义的扁平结构和数据表重名。
例,一个组,带有表定义
TYPE-POOL mytgr.
TYPES mytgr_spfli_tab TYPE HASHED TABLE OF spfli WITH UNIQUE KEY carrid connid.
【ABAP】ABAP官方参考指南学习笔记(06)—— official ABAP reference 模块化语句
Ver: 20100.01.14
关键字:official ABAP reference 模块化语句
4.1 总揽
基本上,ABAP程序中的语句,只要不属于全局声明部分,那就一定属于一个处理块,可能是:
Procedures
用ABAP程序调用其他的处理,有:方法,function modules和子程序Dialog modules
用dynpro的流逻辑来调用其他处理过程Event Block
ABAP运行时环境中触发的事件。例如屏幕事件、列表事件等等
处理块在ABAP程序中出现的位置是任意的。在处理块之间和之后的费声明性语句是不能被访问和执行的,语法上讲是“死的”。但是,声明性语句(属于程序全局数据声明的)则是对后续所有处理块可见的。
也同样可以用宏(macro)和包含(include)来模块化源码的处理块。
常见的模块化语句有:
METHOD, ENDMETHOD
FUNCTION, ENDFUNCTION
FORM, END FORM
MODULE, ENDMODULE
LOAD-OF-PROGRAM
INITIALIZATION, START-OF-SELECTION,GET,END-OF-SELECTION
AT SELECTION-SCREEN
TOP-OF-PAGE, END-OF-PAGE, AT LINE-SELECTION, AT USER-COMMAND, AT PFnn
INCLUDE
DEFINE, END-OF-DEFINITION
另外,本章所有内容都是针对这些模块化语句的简介!详细介绍,会在以后的章节中,逐步进行。
4.2 过程 Procedures4.2.1 方法 Methods
其实是类的方法,可以参加Java和C++,声明用关键字:
METHOD
语法:
METHOD methname.
...
ENDMETHOD
方法,在类声明中,也只是声明。实现部分要放到类的实现部分。其内部也可以声明数据类型和数据对象,总体来说跟Java和Cpp的方法一样。你比方说实例方法的概念,通过 实例->方法名
方法的调用:CALL METHOD
4.2.2 功能模块 Function Module
FM是跨程序的、可重用的过程,可以被组织到功能组中。
关键字:FUNCTION
声明语法:
FUNCTION funcname.
...
ENDFUNCTION.
FM都是属于功能组的,内部定义的东西跟Method一样,内部可以写的内容也是处理过程。
调用方式:CALL FUNCTION
4.2.3 子函数 Subroutine
可以参见Basic中的子函数,基本上就是用来机型本地化的模块过程,但是也可以被外部调用。
关键字:FORM
声明语法:
FOMR subr [parameters] [rasising exc1 exc2]
...
ENDFORM.
命名遵循命名规则,parameters列表中有很多东西下次再说。RAISING是声明了基于类的异常,可以传递给子程序的调用者。其内部可以声明本地数据类型和数据对象。此外,内部程序,还可以访问其本身的形参,和其所在程序的全局数据类型和数据对象。
调用方式:PERFORM
【ABAP】ABAP官方参考指南学习笔记(07)—— official ABAP reference subroutines 子程序
关键字:official ABAP reference subroutines 子程序
子程序详解
先回顾一下子程序的基本语法:
FORM subr [parameters [RAISING exc1 exc2 ...]].
...
ENDFORM.
形参定义
其中[parameters]部分的具体语法为:
[USING { {VALUE(u1) | u1 } [typing|structure] {VALUE(u2) | u2 } [typing|structure] ... }]
[CHANGING { {VALUE(c1) | c1 } [typing|structure] {VALUE(c2) | c2 } [typing|structure] ... }]
上述两个语句都定义了形参,这些定义后来都可以在子程序内部使用。CHANING和USING的位置先后随意。参数传递有两种,变参和值参。
变参——传引用
C和C++的人都好理解。定义的形参实际传值时是实参的引用,在子程序中改变形参的值,同时也改变了形参的值。这时候,调用子程序是不会为之按照形参创建本地变量的。
语法:
USING u1 u2 ...
CHANGING c1 c2 ...
使用引用传递的时候,USING和CHANGING效果一样,都是子程序内部修改形参的同时修改了实参的值。但是,对于要值要变化的参数,我们不推荐把它放到USING列表中,而是放到CHANGING的参数列表中。
值参——传递值
同C和C++,只是个纯形参,因为调用的时候拷贝了原来参数的值,同时为子程序创建了本地变量。子程序内部的操作就是对本地变量——形参的操作。所以不会改变原来实参的值。
语法:
USING VALUE(u1) VALUE(u2) ...
CHANGING VALUE(u1) VALUE(u2) ...
使用USING的时候,无论子程序正常结束与否,在子程序内部对u1和u2的修改,都不会影响到原来的实参。
使用CHANGING的时候,如果子程序正常结束后(遇到ENDFORM, RETURN, CHECK或EXIT),会把子程序中对形参的修改传递给实参,而不是在程序执行中进行修改。如果子程序遇到异常,或者抛出消息,那么实参的值不会被改变。
由此可见,USING和CHANGING的不同。
类型定义
就是上文书中的typing,实际上就是正常的数据定义,例如
FORM test_form USING ua TYPE any
CHANGING cb TYPE INDEX TABLE.
ENDFORM.
上面定义了一个执行体为空的子程序,其中对两个形参做了类型定义,这个没啥好说的。
废弃类型声明——结构
就是通过STRUCTURE声明的子程序形参类型那个语句,语法:
STRUCTURE struc ...
要求,这其中的struc必须是一个数据对象,而非数据类型,或者是一个来自ABAP数据字典的扁平的结构。这个语句标记了它所修饰的形参实际上是一个非空的实参,以便子程序中语句可以访问其内部成员。
实际检查的时候,在非Unicode程序中只是实参长度是否至少等于结构的长度。Unicode程序中,结构类型的实参的每一部分必须与struc规定的对应部分相匹配,而普通实参必须是数字类型的,而且是扁平结构的(感觉就像一个字符数组)。
最后之所以说它被废弃了,是因为可以用TYPE或LIKE来代替了。如果真的想用这东西,建议使用泛型形参,并且把他们通过ASSIGN语句分配给一个字段符号(相当于C和C++中的引用,不是指针),之后在进行CASTING(类型转换)。
废弃形参列表——内表
声明子程序类型为内表的
语法:
TABLES t1 [{TYPE table_type} | {LIKE itab} | {STRUCTURE struc}] ....
被 声明的形参都是带有表头的标准表,TABLES只能放在USING或CHANGING前面。后面的type接一个内表类型,like接一个内表对 象,structure接内表行结构。这种定义形式不支持值参。另外,如果实参传递过来有表头,正常用;没表头,子程序会给创建一个空的本地表头。
现在这些都可以用USING和CHANGING来做。工作区就直接用LIKE LINE OF itab来做了。如果在USING和CHANGING之后使用TABLES,就是实际创建的是一个叫做TABLES的形参,注意这点。
异常传播
语法:
RASING exc1 exc2 ....
ABAP 的异常,都是基于异常类的,子程序可以通过这个语句来告知其调用者我这里可能出了啥事儿。对于异常机制来说,exc1和exc2等后续异常参数,所有的异 常类在他们的位置都是可以访问的。也可以用CX_STATIC_CHECK和CX_DYNAMIC_CHECK的子类。考虑到异常类的继承的层次结构关 系,要把他们按照升序排列。举例来说,好比Java里,你把catch Exception放到最前面,后面无论指定了多少其异常子类就都没用了。
来自CX_STATIC_CHECK和CX_DYNAMIC_CHECK的异常要显式指定,否则会在抛出时候,与接口冲突,会导致CX_SY_NO_HANDLER异常(没有异常处理器)。另外,来自CX_NO_CHECK的异常,总是隐式声明的,不用显式写出来。
注意:
来 自CX_STATIC_CHECK的异常时静态的语法检查,CX_DYNAMIC_CHECK则是动态运行时产生的。另外,除了在子程序中通过 RAISING写出来的基于类的异常以外,子程序中CATCH SYSTEM-EXCEPTIONS语句也不能用来捕捉运行时错误。相对的,可以被处理的异常则必须用TRY语句块捕捉。
具体的异常处理,以后会继续深入讲。
【ABAP】ABAP官方参考指南学习笔记(08)—— official ABAP reference Dialog Modules Event Overview
关键字:official ABAP reference Dialog Modules Event Overview
4.3 对话模块(dialog module)
所谓对话模块(Dialog Modules)就是准备和处理dynpro的屏幕的程序。这里不能声明本地类型和数据对象。所以,所有所谓的对话模块的声明性语句,其实都是ABAP程序的全局数据声明,并且对其后续所有处理模块可见。它本什么就不包含任何自身的声明。
引入语句:MODULE
定义和实现dialog module,语法:
MODULE mod { OUTPUT | [ INPUT ]}.
"实现语句
ENDMODULE.
ABAP程序通过MODULE语句在流落集中调用对话模块,其中OUTPUT和INPUT指明了一个Dialog Module是可以在PBO事件中调用还是在PAI事件中调用。INPUT是默认的,所以一般省略,但是考虑到可读性,不推荐这样。在同一个程序中分别带有OUTPUT和INPUT的两个同名程序是允许定义的,但是同理,为了可读性,不推荐。
另外,考虑到数据封装性,不推荐在对话模块中实现功能代码,应该通过过程调用来完成。
4.4 事件模块(event blocks)
事件模块(或者说处理块)起始于一个事件关键字,并且终止于下一个事件的开始。由于本身没有关闭语句,所以在事件结束后,最好加个注释行。
事件模块内部,不允许声明数据类型和数据对象。所以,你看到其内部有声明的话,那么这些声明都是全局性的。考虑到数据封装性,最好在事件处理快中加入较少的功能代码,其他的走过程调用吧。
Event Blocks概览
程序构造报表事件
初始化事件、标准事件、逻辑数据库事件、可执行程序关闭事件选择屏幕事件列表事件
页眉、页脚事件、交互列表处理、行选择、用户行为
ABAP官方参考指南学习笔记(09)official ABAP reference event block
关键字:official ABAP reference event block
4.4.1 Program Constructor
用来初始化程序的全局数据。
引入语句:LOAD-OF-PROGRAM
语法:LOAD-OF-PROGRAM
当可执行程序、模块池、函数组或者子程序池加载到内部会话的时候,ABAP运行时环境会触发此程序。每次通过SUBMIT语句或者通过t-code 开启一个新的内部绘画,就会调用这个事件块,而且每次会话仅在每次调用中执行一次。如果此事件块没有完整执行,就会报运行时错误。
当一个外部程序第一次被调用的时候,会触发被调用过程码的此事件,之后调用者对其的调用就不会触发此事件了。
注意,此事件当调用外部过程或者事务时,建议只是初始化全局变量。如果是使用SUBMIT调用可执行程序,则建议使用INITIALIZATION,因为参数值和选择条件都是在LOAD-OF-PROGRAM之后进行设置的。
4.4.2 Reproting Events
此事件发生在一个预定义的序列和只有在用SUBMIT启动的可执行程序中才会发生。如果可执行程序使用逻辑数据库,被分配的子程序在数据库程序中执行,也会触发此事件。
一般来讲,每个可执行程序隐式上都是使用SUBMIT启动的。只有当常规t-code(非报表事务)使用在开始或者他们的子程序的外部调用的时候,SUBMIT才不会被触发。
4.4.2.1 Initialization
引入语句:INITIALIZATION
语法:INITIALIZATION
作用:为标准选择屏幕准备处理块,初始化选择屏幕的输入字段,包括与程序相关联的在逻辑数据库中定义的字段
触发者:ABAP运行时环境
时机&位置:可执行程序运行时,LOAD-OF-PROGRAM之后,任何潜在的标准选择屏幕处理之前。
注意:此事件虽然会多次随着程序运行重复执行,但是只有第一次的时候其代码内部的初始化语句有效。因为这个时候是由AT SELECTION-SCREEN OUTPUT时间提供来自用户的选择条件和初始化的值。所以要在每次调用显式初始化选择屏幕,就必须使用AT SELECTION-SCREEN OUTPUT事件。
4.4.2.2 Standar Event
引入语句:START-OF-SELECTION
语法:START-OF-SELECTION
作用:可执行程序中,所有非声明的并且在第一个显式处理块之前的语句都是归属于这个事件模块。可以说它几乎是默认的时间模块。如果说,一个程序没有对此事件进行任何显式定义,那么它的语句就形成了完整的此事件的模块。如果一个程序没有任何显式定义的处理块,那么它的所有非声明和定义的语句都是属于此事件模块。如果一个程序包含此事件的定义,那么从此事件引入语句开始到下一个事件语句结束后的代码都属于此事件处理模块——之前的不是。
触发者:ABAP运行时环境
时机&位置:可执行程序运行时,潜在的标准选择屏幕处理之后。
注 意:如果程序与一个逻辑数据库相关联,那么可以在逻辑数据库读取数据之前做些处理。如果程序没有连接到逻辑数据库,那么此事件模块就是一个来自被调用过程或者屏幕布局的主程序。
4.4.2.3 Logical Database Event
引入语句:GET
语法:GET node [LATE] [FIELDS f1 f2 ...]
作用:为逻辑数据库的数据处理引入处理块。此事件有两个作用方式。
作用1:GET node [FIELDS f1 f2 ...]
逻辑数据库的读取事件。
出发后可以对node做数据处理。GET此时会影响数据库的访问行为。(node就想象成表的一行行记录,每一行都是一个结构,带有若干字段)
当逻辑数据从所有节点读取那些没有在数据库中使用SELECTION-SCREEN FIELD SELECTION定义的字段时,并且此读取语句在访问顺序上先于node。这就要看GET事件是否为这些节点定义过。但只只有那些用NODES或者 TABLES声明过的节点才可以访问数据。
假设有的节点变量先于node变量被访问了,或者说对于那些没有为其定义GET事件块、没有在数据库中定义字段度西安则的节点,那么,仅对这些节点中有NODES或者TABLES定义过的节点读取全部的表数据。因为,否则,程序只为其读取key字段,程序需要key来构建访问路径。
在逻辑数据库的结尾,所有的node中的字段都被置成16进制的null。
如果在逻辑数据库中用SELECTION-SECREEN FIELD SELECTION定义过字段,那么当你使用FIELDS这个附加项的时候,数据库就会为node加载f1,f2等这些字段,还有键字段。其他的没有列出来的字段还是十六进制0.
触发者1:ABAP运行时环境
时机&位置1:可执行程序运行时,与程序关联的逻辑数据给node工作区提供数据的时候。node工作区必须使是用NODES或者TABLES语句定义的。
-------------
作用2:GET node LATE [FIELDS f1 f2 ...]
逻辑数据库层次结构的结束。FILEDS用法同前。在此做节点层次结构的最后处理工作。
触发者2:ABAP运行时环境
时机&位置2:可执行程序运行时,逻辑数据库已经把所有的数据记录读入到node中。
注 意:GET后面实现的语句实际上被当成一个过程,所以其中声明性语句都会产生本地数据。
4.4.2.4 Closing Event of an Executable Program
引入语句:END-OF-SELECTION
语法:END-OF-SELECTION
作用:为使用逻辑数据库之后的任务引入处理块。
触发者:ABAP运行时环境
时机&位置:可执行程序运行时,在与程序相关联的数据库完全完成其任务之后使用,就是GET所使用的数据没用了之后用。
注意:此事件内所有读取自逻辑书库的数据会被总结性的处理。如果程序没有用到逻辑数据库,那就不需要此事件处理块。
【ABAP】ABAP官方参考指南学习笔记(10)—— official ABAP reference event block
关键字:official ABAP reference event block
4.4.3 选择屏幕事件
引入语句:AS SELECTION-SCREEN
语法:AS SELECTION-SCREEN selscreen_event.
作用:方便在ABAP程序中进行一些选择屏幕的处理。由一个屏幕的子屏幕所触发出来的事件,带来的选择屏幕有两次,一次是被进程进来的选择屏幕,另外一次是包含选择屏幕。
触发者:ABAP运行时环境
时机&位置:可执行程序运行时,在选择屏幕处理的过程中。
注意:此事件之后的语句,会被当成过程来走。所以其中声明性的语句都会产生本地变量。
选择屏幕语法详解
语法中selscreen_event,有如下选择:
{OUTPUT} | {ON {par | selcrit}} | {ON END OFselcrit} | {ON BLOCKblock} | {ON RADIO BUTTONGROUP radi} | { } |
{ ON {HELP-REQUEST | VALUE-REQUEST} FOR { par | selcrit-low | selcrit-high } } | { ON EXIT-COMMAND
sy-dynnr中包含了触发选择屏幕事件的相关信息。
其中:
1. OUTPUT,在PBO(Process Before Output)之时触发,主要就是用来准备输出时候要用到的各种参数和数据对象。
注意的是,此语句中的输入字段,总是影响输出屏幕,并且,会覆盖之前屏幕的值(如果修改的话)。相反,在前面介绍的程序读入和初始化事件中,只是在程序开始的时候执行一次就没事儿了。
2.ON {par | selcrit},PAI(Process After Input)事件中可以触发,在输入字段参数par或者选择一行选择条件表selcrit传递给ABAP程序的时候。这里主要是用来验证用户输入,保证以后数据正确的。但是对于radio按钮,就不用这个来处理了。
注意的是,如果是多选情况下,那么选择内容表中的内容就会一行行传给程序,当然,此时事件会对每行都触发。
3.ON END OFselcrit.,当选择条件表selcrit中的内容(多行)完全传给程序的时候,就会触发这个事件。方便来验证数据。
4.ON BLOCKblock,PAI中可以触发,当选择屏幕中block的所有参数都传进来给ABAP的时候。验证数据用。
5.ON RADIO BUTTONGROUP
6.{ },当所有的字段都传入的时候,AT SELECTION-SCREEN,就被当成最后一个事件被触发,说白了,就是直接写个AT SELECTION-SCREEN这个事件块。此时所有的参数都已经传入了。可以验证用。
7.ON {HELP-REQUEST | VALUE-REQUEST} FOR { par | selcrit-low | selcrit-high },在POH和POV两个事件的时候触发,说白了就是处理按F1时候帮助事件(参数par)和按F4时候value补齐的事件(参数selcrit)。这里不会触发其他事件。这里可以自定义输入字段和处理方式。
注意的是,只能处理在同一个ABAP程序中选择屏幕定义的字段,处理不了定义在任何关联在逻辑数据库中的字段。在帮助事件中,ABAP程序和选择屏幕没有参数传输。对于大多数dynpro控件必须通过特定的函数才能做。而通过F4,POV补齐候选值的时候,变更的参数值才是可以传递给选择屏幕的。因为帮助屏幕只是提供信息,候选值不仅要选值,还要传回才有意义。
8.ON EXIT-COMMAND,在调用Back、Exit和Cancel的时候触发,可以用来做清理工作。
程序引入语句详解Executable Program
这种类型的程序使用如下引入语句
REPORT repname
[NO STANDARD PAGE HEADING | LINE-SIZE width |LINE-COUNT page_lines [(footer_lines)] ]
[MESSAGE-ID mid]
[DEFINING DATABASE
其中repname必须直接给定,一般ABAP程序同名。
以下三者为列表选项:
NO STANDARD PAGE HEADING
在程序输出的列表中不输出页眉(如果页面分栏的话,不输出每栏的header),并且把系统变量sy-wtitl设置为“N”。在(程序中)可以通过给NEW-PAGE语句追加NO-TITLE|WITH-TITLE,NO-HEADING|WITH-HEADING来覆盖此项设置。
LINE-SIZE width
指定了程序中基础列表和明细列表的行宽,即将每行的字符数限制为width指定的值,同时影响系统变量sy-linsz的值(同width)。进而影响到页面上一次能显示的列的数目,另外width必须为正整数,最大值为1023。
如果不指定此选项,则设置为基于当前dynpro窗口的默认宽度,但是最少是一个标准SAP窗口的宽度。这个语句在有SUBMIT的语句出现时覆盖其LINE-SIZE值,并且在列表创建的时候可以被NEW-PAGE语句的LINE-SIZE给覆盖。
注意:当前最大的行宽值,存储在名为SLIST的类型组中的常量slist_max_linesize中。其中也定义了类型为c的slist_max_listline的类型。
LINE-COUNT page_lines [(footer_lines)]
[(footer_lines)],这个语句为程序中基本列表指定了页面长度为page_lines,并且给sy-linct这个系统变量赋值。如果不指定这个属性,或者page_lines的值小于等于0或者大于6w,那么页面长度就被内置为6W。这个语句在有SUBMIT的语句出现时覆盖其LINE-SIZE值,并且在列表创建的时候可以被NEW-PAGE语句的LINE-COUNT给覆盖。如果给footer_lines赋值了,那么就为页脚保留指定值的行数,以便可以在事件处理快END-OF-PAGE中处理。二者必须都为数字类型。
MESSAGE-IDmid
通过指定mid,使得可以在仅有消息类型和消息编号在程序中被指定的时候,使用MESSAGE语句的简短形式。消息在程序中必须直接指定,并且出现在数据表T100中的ARBGB列。当在MESSAGE中制定了消息类的时候,就覆盖了MESSAGE-ID给出的值。
例:
REPORT z_myreportMESSAGE-IDsabapdocu.
上例,为程序z_myreport指定SABAPDOCU作为默认的消息类。
DEFINING DATABASE ldb
表明当前的程序是逻辑数据库ldb的数据库程序。逻辑数据库的名字最长20字符。ldb都是在ABAP工作台中的逻辑数据库构建器中维护的,因此程序框架是自动生成的,并且包括了Report语句。框架程序的名字是SAPDBldb(注意名字的后三个字母)。
例如:引入的逻辑数据库是FlS,那么
REPORT sapdbfls DEFINING DATABASE fls.
Module Pools 和 Subroutine Pools
PROGRAM progname [list_options] [MESSAGE-ID mid].
整体来说,用法和用量同Executable Program。只不过在Module Pools中PROGRAM义同REPORT。
在子程序中只有MESSAGE-ID有效,列表选项被忽略。因为子程序没有自己的列表缓冲区,而且输出也是写入到调用它的程序的当前列表中。
Function Groups
FUNCTION-POOLfpool [list_options]MESSAGE-ID mid].
用法用量同上。总体来说Function Group是ABAP workbench中可以创建的(t-code:Se80),创建的时候,总是自动生成一个主程序,再起顶层包含语句中有这条引入语句。完整的 function group在Repository中包含了一个有SAPL作为前缀和fpool作为后缀的名字。
Class pools
CLASS-POOL [MESSAGE-IDmid].
用法用量同Report
Interface Pools
INTERFACE-POOL.
用法用量同Report。
Type Groups
TYPE-POOL
用法用量同上。类型组其实是定影在ABAP数据词典中的,其中包括了一个自动生成的程序中叶包含了TYPE-POOL语句。类型组中只能包含如下语句:
INCLUDE
TYPES
TYPE-POOLS
CONSTANTS
DEFINE和END-OF-DEFINITION
使用DEFERRED PUBLIC或 LOAD 的 CLASS DEFINITION
其中声明数据类型、常量和宏,必须使用tpool作为其名字的前缀。通过TYPE-POOLS语句,类型组可以被集成到其他的ABAP程序中。
注意:
类型组的名字最长5个字符
类型组中的类型都是ABAP数据字典中定义的通用类型的predecessors
6.40以后,数据类型和常量,必须定义在全局类中的公共可见字段,在那里,类型组是完全可以替换的。
为了防止使用LIKE关键字造成的类型引用冲突,类型组中的常量,不能与ABAP数据字典中早已经定义的扁平结构和数据表重名。
例,一个组,带有表定义
TYPE-POOL mytgr.
TYPES mytgr_spfli_tab TYPE HASHED TABLE OF spfli WITH UNIQUE KEY carrid connid.
关键字:official ABAP reference Dialog Modules Event Overview
4.3 对话模块(dialog module)
所谓对话模块(Dialog Modules)就是准备和处理dynpro的屏幕的程序。这里不能声明本地类型和数据对象。所以,所有所谓的对话模块的声明性语句,其实都是ABAP程序的全局数据声明,并且对其后续所有处理模块可见。它本什么就不包含任何自身的声明。
引入语句:MODULE
定义和实现dialog module,语法:
MODULE mod { OUTPUT | [ INPUT ]}.
"实现语句
ENDMODULE.
ABAP程序通过MODULE语句在流落集中调用对话模块,其中OUTPUT和INPUT指明了一个Dialog Module是可以在PBO事件中调用还是在PAI事件中调用。INPUT是默认的,所以一般省略,但是考虑到可读性,不推荐这样。在同一个程序中分别带有OUTPUT和INPUT的两个同名程序是允许定义的,但是同理,为了可读性,不推荐。
另外,考虑到数据封装性,不推荐在对话模块中实现功能代码,应该通过过程调用来完成。
4.4 事件模块(event blocks)
事件模块(或者说处理块)起始于一个事件关键字,并且终止于下一个事件的开始。由于本身没有关闭语句,所以在事件结束后,最好加个注释行。
事件模块内部,不允许声明数据类型和数据对象。所以,你看到其内部有声明的话,那么这些声明都是全局性的。考虑到数据封装性,最好在事件处理快中加入较少的功能代码,其他的走过程调用吧。
Event Blocks概览
程序构造报表事件
初始化事件、标准事件、逻辑数据库事件、可执行程序关闭事件选择屏幕事件列表事件
页眉、页脚事件、交互列表处理、行选择、用户行为
ABAP官方参考指南学习笔记(09)official ABAP reference event block
关键字:official ABAP reference event block
4.4.1 Program Constructor
用来初始化程序的全局数据。
引入语句:LOAD-OF-PROGRAM
语法:LOAD-OF-PROGRAM
当可执行程序、模块池、函数组或者子程序池加载到内部会话的时候,ABAP运行时环境会触发此程序。每次通过SUBMIT语句或者通过t-code 开启一个新的内部绘画,就会调用这个事件块,而且每次会话仅在每次调用中执行一次。如果此事件块没有完整执行,就会报运行时错误。
当一个外部程序第一次被调用的时候,会触发被调用过程码的此事件,之后调用者对其的调用就不会触发此事件了。
注意,此事件当调用外部过程或者事务时,建议只是初始化全局变量。如果是使用SUBMIT调用可执行程序,则建议使用INITIALIZATION,因为参数值和选择条件都是在LOAD-OF-PROGRAM之后进行设置的。
4.4.2 Reproting Events
此事件发生在一个预定义的序列和只有在用SUBMIT启动的可执行程序中才会发生。如果可执行程序使用逻辑数据库,被分配的子程序在数据库程序中执行,也会触发此事件。
一般来讲,每个可执行程序隐式上都是使用SUBMIT启动的。只有当常规t-code(非报表事务)使用在开始或者他们的子程序的外部调用的时候,SUBMIT才不会被触发。
4.4.2.1 Initialization
引入语句:INITIALIZATION
语法:INITIALIZATION
作用:为标准选择屏幕准备处理块,初始化选择屏幕的输入字段,包括与程序相关联的在逻辑数据库中定义的字段
触发者:ABAP运行时环境
时机&位置:可执行程序运行时,LOAD-OF-PROGRAM之后,任何潜在的标准选择屏幕处理之前。
注意:此事件虽然会多次随着程序运行重复执行,但是只有第一次的时候其代码内部的初始化语句有效。因为这个时候是由AT SELECTION-SCREEN OUTPUT时间提供来自用户的选择条件和初始化的值。所以要在每次调用显式初始化选择屏幕,就必须使用AT SELECTION-SCREEN OUTPUT事件。
4.4.2.2 Standar Event
引入语句:START-OF-SELECTION
语法:START-OF-SELECTION
作用:可执行程序中,所有非声明的并且在第一个显式处理块之前的语句都是归属于这个事件模块。可以说它几乎是默认的时间模块。如果说,一个程序没有对此事件进行任何显式定义,那么它的语句就形成了完整的此事件的模块。如果一个程序没有任何显式定义的处理块,那么它的所有非声明和定义的语句都是属于此事件模块。如果一个程序包含此事件的定义,那么从此事件引入语句开始到下一个事件语句结束后的代码都属于此事件处理模块——之前的不是。
触发者:ABAP运行时环境
时机&位置:可执行程序运行时,潜在的标准选择屏幕处理之后。
注 意:如果程序与一个逻辑数据库相关联,那么可以在逻辑数据库读取数据之前做些处理。如果程序没有连接到逻辑数据库,那么此事件模块就是一个来自被调用过程或者屏幕布局的主程序。
4.4.2.3 Logical Database Event
引入语句:GET
语法:GET node [LATE] [FIELDS f1 f2 ...]
作用:为逻辑数据库的数据处理引入处理块。此事件有两个作用方式。
作用1:GET node [FIELDS f1 f2 ...]
逻辑数据库的读取事件。
出发后可以对node做数据处理。GET此时会影响数据库的访问行为。(node就想象成表的一行行记录,每一行都是一个结构,带有若干字段)
当逻辑数据从所有节点读取那些没有在数据库中使用SELECTION-SCREEN FIELD SELECTION定义的字段时,并且此读取语句在访问顺序上先于node。这就要看GET事件是否为这些节点定义过。但只只有那些用NODES或者 TABLES声明过的节点才可以访问数据。
假设有的节点变量先于node变量被访问了,或者说对于那些没有为其定义GET事件块、没有在数据库中定义字段度西安则的节点,那么,仅对这些节点中有NODES或者TABLES定义过的节点读取全部的表数据。因为,否则,程序只为其读取key字段,程序需要key来构建访问路径。
在逻辑数据库的结尾,所有的node中的字段都被置成16进制的null。
如果在逻辑数据库中用SELECTION-SECREEN FIELD SELECTION定义过字段,那么当你使用FIELDS这个附加项的时候,数据库就会为node加载f1,f2等这些字段,还有键字段。其他的没有列出来的字段还是十六进制0.
触发者1:ABAP运行时环境
时机&位置1:可执行程序运行时,与程序关联的逻辑数据给node工作区提供数据的时候。node工作区必须使是用NODES或者TABLES语句定义的。
-------------
作用2:GET node LATE [FIELDS f1 f2 ...]
逻辑数据库层次结构的结束。FILEDS用法同前。在此做节点层次结构的最后处理工作。
触发者2:ABAP运行时环境
时机&位置2:可执行程序运行时,逻辑数据库已经把所有的数据记录读入到node中。
注 意:GET后面实现的语句实际上被当成一个过程,所以其中声明性语句都会产生本地数据。
4.4.2.4 Closing Event of an Executable Program
引入语句:END-OF-SELECTION
语法:END-OF-SELECTION
作用:为使用逻辑数据库之后的任务引入处理块。
触发者:ABAP运行时环境
时机&位置:可执行程序运行时,在与程序相关联的数据库完全完成其任务之后使用,就是GET所使用的数据没用了之后用。
注意:此事件内所有读取自逻辑书库的数据会被总结性的处理。如果程序没有用到逻辑数据库,那就不需要此事件处理块。
关键字:official ABAP reference event block
4.4.3 选择屏幕事件
引入语句:AS SELECTION-SCREEN
语法:AS SELECTION-SCREEN selscreen_event.
作用:方便在ABAP程序中进行一些选择屏幕的处理。由一个屏幕的子屏幕所触发出来的事件,带来的选择屏幕有两次,一次是被进程进来的选择屏幕,另外一次是包含选择屏幕。
触发者:ABAP运行时环境
时机&位置:可执行程序运行时,在选择屏幕处理的过程中。
注意:此事件之后的语句,会被当成过程来走。所以其中声明性的语句都会产生本地变量。
选择屏幕语法详解
语法中selscreen_event,有如下选择:
{OUTPUT} | {ON {par | selcrit}} | {ON END OFselcrit} | {ON BLOCKblock} | {ON RADIO BUTTONGROUP radi} | { } |
{ ON {HELP-REQUEST | VALUE-REQUEST} FOR { par | selcrit-low | selcrit-high } } | { ON EXIT-COMMAND
sy-dynnr中包含了触发选择屏幕事件的相关信息。
其中:
1. OUTPUT,在PBO(Process Before Output)之时触发,主要就是用来准备输出时候要用到的各种参数和数据对象。
注意的是,此语句中的输入字段,总是影响输出屏幕,并且,会覆盖之前屏幕的值(如果修改的话)。相反,在前面介绍的程序读入和初始化事件中,只是在程序开始的时候执行一次就没事儿了。
2.ON {par | selcrit},PAI(Process After Input)事件中可以触发,在输入字段参数par或者选择一行选择条件表selcrit传递给ABAP程序的时候。这里主要是用来验证用户输入,保证以后数据正确的。但是对于radio按钮,就不用这个来处理了。
注意的是,如果是多选情况下,那么选择内容表中的内容就会一行行传给程序,当然,此时事件会对每行都触发。
3.ON END OFselcrit.,当选择条件表selcrit中的内容(多行)完全传给程序的时候,就会触发这个事件。方便来验证数据。
4.ON BLOCKblock,PAI中可以触发,当选择屏幕中block的所有参数都传进来给ABAP的时候。验证数据用。
5.ON RADIO BUTTONGROUP
6.{ },当所有的字段都传入的时候,AT SELECTION-SCREEN,就被当成最后一个事件被触发,说白了,就是直接写个AT SELECTION-SCREEN这个事件块。此时所有的参数都已经传入了。可以验证用。
7.ON {HELP-REQUEST | VALUE-REQUEST} FOR { par | selcrit-low | selcrit-high },在POH和POV两个事件的时候触发,说白了就是处理按F1时候帮助事件(参数par)和按F4时候value补齐的事件(参数selcrit)。这里不会触发其他事件。这里可以自定义输入字段和处理方式。
注意的是,只能处理在同一个ABAP程序中选择屏幕定义的字段,处理不了定义在任何关联在逻辑数据库中的字段。在帮助事件中,ABAP程序和选择屏幕没有参数传输。对于大多数dynpro控件必须通过特定的函数才能做。而通过F4,POV补齐候选值的时候,变更的参数值才是可以传递给选择屏幕的。因为帮助屏幕只是提供信息,候选值不仅要选值,还要传回才有意义。
8.ON EXIT-COMMAND,在调用Back、Exit和Cancel的时候触发,可以用来做清理工作。