SAP报表开发指南
目 录
1 选择屏幕 ................................................................................................................................ 3 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 1.10 1.11 1.12 1.13 1.14 1.15 1.16
屏幕输入命令 .............................................................................................................. 3 创建元素块 ................................................................................................................ 12 事件及其事件关键字 ................................................................................................. 15 分页 .......................................................................................................................... 19 通过窗口滚动窗口 ..................................................................................................... 19 按页滚动 ................................................................................................................... 20 列表中的颜色 ............................................................................................................ 20 交互式报表 ................................................................................................................ 24 次列表的页眉 ............................................................................................................ 26
列表中的消息 .................................................................................................... 26 从程序中触发事件 ............................................................................................. 28 从列表中读取行 ................................................................................................. 29 在光标位置处读列表 ......................................................................................... 30 传递列表属性 .................................................................................................... 30 将光标设置到显示列表行的特定字段 ................................................................ 31 将光标设置到输出窗口中列表的特定行 ............................................................ 31
2 报表取数 .............................................................................................................................. 31 3 数据整理 .............................................................................................................................. 32 4 WRITE输出 ......................................................................................................................... 32 5 报表编制的实例 ................................................................................................................... 32 6 扩展 ..................................................................................................................................... 32 6.1 6.2 6.3
屏幕控制 ................................................................................................................... 32 设置下拉框 ................................................................................................................ 33 自制Search Help ...................................................................................................... 34
2
1 选择屏幕
屏幕输入命令
在ABAP/4中要自屏幕输入变量数据的内容,使用的命令是 PARAMETERS 及 SELECTION-OPTIONS
PARAMETER: 输入一个变量或字段内容
SELECTION-OPTIONS: 使用条件筛选画面来输入数据
1.1.1 PARAMETERS 语句基本格式
可以按照用DATA语句声明字段的方式用PARAMETERS语句声明字段。用
PARAMETERS 语句声明的字段称为参数。通常,输入字段的所有参数都将出现在选择屏幕上。 系统处理输入屏幕时,报表用户在这些输入字段中键入的值将被分配给相应的参数。它为基本的输入命令,类似如BASIC的INPUT命令,但无法使用F格式(浮点数)。 1、要声明参数及其数据类型
语法:PARAMETERS
[( 该语句创建参数 。附加项 [DEFAULT [AS CHECKBOX]|[RADIOBUTTON GROUP Example: PARAMETERS: NAME(8) TYPE C, AGE TYPE I, BIRTH TYPE D. 执行结果,如图1-1所示。 图1-1 3 在日期的输入格式上为 MM/DD/YY 、MM/DD/YYYY、MMDDYY 或MMDDYYYY ,如输入 020165表示 1965年02月01日,与02/01/65的输入是一样的,日期输入范围为公元1950年至2049年。 2、给参数分配缺省值(使用DEFAULT 选项) 语法:PARAMETERS ...... DEFAULT Example: PARAMETERS: COMPANY(20) DEFAULT 'HAND', BIRTH TYPE D DEFAULT '19890824'. 3、禁止参数显示(使用NO-DISPLAY 选项) 语法:PARAMETERS ...... NO-DISPLAY ...... 创建参数,并通过DEFAULT选项在时间事件INITIALIZATION中内部赋值,或者,如果报表是用SUBMIT启动的,则由调用程序进行外部赋值。 如果想只在某种条件下才显示参数,例如,根据报表用户在选择屏幕的其它输入字段中输入的值决定是否显示参数,则请您不要使用NO-DISPLAY 选项。如果使用了这个选项,参数就不是选择屏幕的元素,而且您也不能用 MODIFY SCREEN语句使它可见 。 要使参数成为选择屏幕的隐藏元素,不带 NO-DISPLAY 选项声明该参数,并通过使用 MODIFY SCREEN 语句禁止显示它。 4、允许参数接受大小写( 使用LOWER CASE 选项) 语法:PARAMETERS ...... LOWER CASE ...... 如果没有 LOWER CASE选项, ABAP/4预设是将字符串输入值自动转换为大写, 加上此参数会将输入的数据转成小写。 5、必须输入字段的参数(使用OBLIGATORY 选项) 语法: PARAMETERS ...... OBLIGATORY ...... 使用该选项时,强制要求输入,在参数 的输入字段上将出现一个符号(√)。用户如果不在选择屏幕的这个字段上输入值,程序就无法继续执行。使用者必须要输入值,程序才可继续执行,如图1-2所示。 4 图1-2 6、在选择屏幕上创建复选框(使用AS CHECKBOX 选项) 语法: PARAMETERS ...... AS CHECKBOX ...... 参数 按长度为1的类型C创建。在这 种情况下,不允许使用附加选项 TYPE 和 LIKE。 的有效值是''和'X'。这些值在 用户单击选择屏幕上的复选框时赋 给参数。 Example: PARAMETERS: TAX AS CHECKBOX DEFAULT 'X', NTD AS CHECKBOX. 执行结果,如图1-3所示。 图1-3 7、在选择屏幕上创建单选按钮组(使用RADIOBUTTON GROUP 选项) 语法:PARAMETERS ...... RADIOBUTTON GROUP 参数 按类型C,长度1创建,并分配到组 必须为每个 当用户单击选择屏幕中的单选按钮时,相应的参数被激活(分配值'X'),同时同组的其它参数被设 为非活动的(赋值'')。 5 Example: PARAMETERS: BOY RADIOBUTTON GROUP SEX DEFAULT 'X', GIRL RADIOBUTTON GROUP SEX. 执行结果,如图1-4所示。 图1-4 8、PARAMETERS语句的实例: 程序代码,如图1-5所示。 图1-5 选择文本,如图1-6所示。 6 图1-6 运行结果,如图1-7所示。 图1-7 1.1.2 SELECT-OPTIONS语句的基本格式 条件筛选检查条件输入画面指令,输入条件后可配合SELECT指令自TABLE读取符合条件的数据,直接执行或放入 Internal Table中,条件有四个参数: SIGN: I表筛选条件符合的资料 E表筛选条件不符合的资料 OPTION: 比较的条件符号 7 EQ(等于)、NE(不等于)、GT(大于)、GE (大于等于)、LE(小于等于)、LT(小于)、CP(包含)、NP(不包含)、BT(介于)、NB(不介于) LOW: 最小值 HIGH: 最大值 1、要创建报表用户可以在选择屏幕中填充的选择标准,使用 SELECT-OPTIONS 语句。 语法: SELECT-OPTIONS 该语句创建选择表 可以用在选择文本中描述的文字摘要来更改选择屏幕 上输入字段左面的文本字段。 Example: TABLES BKPF SELECT-OPTIONS S_BUKRS FOR BKPF-BUKRS. 将条件的输入值存放入S_BUKRS,筛选选择为BKPF中的BUKRS字段 执行结果,如图1-8所示。 图1-8 2、给选择标准分配缺省值(请使用 SELECT-OPTIONS 语句的 DEFAULT 选项) 语法:SELECT-OPTIONS 对于每个 SELECT-OPTIONS 语句,可以 指定 DEFAULT附加部分。这意味着只能用缺省值填充选择表 要只设置 LOW 字段(单值选择),请使用 ........DEFAULT 要设置 LOW 和 HIGH 字段(间隔 选择),请增加 TO,如:......DEFAULT SELECT-OPTIONS AIRLINE FOR SPFLI-CONNID DEFAULT '2042' TO '4555'. 8 要设置OPTION字段(选择运算符),请增加OPTION ......DEFAULT 对于单值选择, ........DEFAULT SIGN 注:要给SELECT-OPTIONS多行默认值,则可在事件INITIALIZATION后添加ABAP代码,SELECT-OPTIONS定义的数据都相当于一个RANGES类型,可以手动添加条目 Example: SELECT-OPTIONS AIRLINE FOR SPFLI-CONNID. INITIALIZATION. AIRLINE-SIGN = 'I'. AIRLINE-OPTION = 'EQ'. AIRLINE-LOW = '2022'. APPEND AIRLINE. AIRLINE-SIGN = 'I'. AIRLINE-OPTION = 'EQ'. AIRLINE-LOW = '2025'. APPEND AIRLINE. “给AIRLINE两个初始值2022和2025 3、把选择表限制在一行(使用 SELECT-OPTIONS 语句的 NO-EXTENSION 选项) 语法: SELECT-OPTIONS 如果指定该选项,则选择屏幕上不出现右箭头,并且用户不能访问“复杂选择”窗口。 4、把选择表限制为单值选择(使用SELECT-OPTIONS 语句的 NO INTERVALS 选项) 语法: SELECT-OPTIONS 如果指定该选项,则“ 到”字段不出现在选择屏幕上。选择屏幕上的输入将限制为单值选择 。但是,用户可以在“复杂选择”屏幕中输入间隔选择。 5、强制要求输入(OBLIGATORY选项) 与PARAMETER的此选项一致 6、配合 SELECT 命令 条件输入完后要将符合条件的数据筛选出来, 可配合使用 SELECT 指令 ➢ 使用WHERE <条件式> 9 Example: SELECT-OPTIONS AIRLINE FOR SPFLI-CONNID. SELECT * FROM SPFLI WHERE CONNID IN AIRLINE. WRITE: / CONNID,FROMCITY,TOCITY. ENDSELECT. ➢ 使用CHECK参数 Example: SELECT-OPTIONS AIRLINE FOR SPFLI-CONNID. SELECT * FROM SPFLI. CHECK AIRLINE. WRITE: / CONNID,FROMCITY,TOCITY. ENDSELECT. ➢ 使用 IF … IN 叙述 Example: SELECT-OPTIONS AIRLINE FOR SPFLI-CONNID. SELECT * FROM SPFLI. IF SPFLI-CONNID IN AIRLINE. WRITE: / CONNID,FROMCITY,TOCITY. ENDIF ENDSELECT. 7、SELECT-OPTIONS 语句的实例: 程序代码,如图1-9所示。 10 图1-9 运行结果,如图1-10所示。 图1-10 多值选择,如图1-11所示。 11 图1-11 创建元素块 1、要在选择屏幕上创建元素逻辑块,请用SELECTION-SCREEN语句的BEGIN OF BLOCK 选项选择块的开始,然后定义各个元素并用 END OF BLOCK 选项选择块的结束. 语法: SELECTION-SCREEN BEGIN OF BLOCK [WITH FRAME [TITLE SELECTION-SCREEN END OF BLOCK 2、在选择屏幕上创建按钮(使用PUSHBUTTON 参数) 语法:SELECTION-SCREEN PUSHBUTTON [/] 参数 [/] 语法:SELECTION-SCREEN SKIP [ 语法: SELECTION-SCREEN ULINE / 语法: SELECTION-SCREEN COMMENT / 12 语法:SELECTION-SCREEN BEGIN OF LINE. …… SELECTION-SCREEN END OF LINE. Example: SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN POSITION 20. PARAMETERS NAME(10). \"在20格输入NAME内容 SELECTION-SCREEN POSITION 40. PARAMETERS BIRTH TYPE D. \"40格输入 BIRTH的内容 SELECTION-SCREEN END OF LINE. 7、绘出BLOCK PANEL 语法:SELECTION-SCREEN BEGIN OF BLOCK SELECTION-SCREEN END OF BLOCK Example: SELECTION-SCREEN BEGIN OF BLOCK RADIO WITH FRAME . PARAMETER R1 RADIOBUTTON GROUP GR1. PARAMETER R2 RADIOBUTTON GROUP GR1. PARAMETER R3 RADIOBUTTON GROUP GR1. SELECTION-SCREEN END OF BLOCK RADIO. 8、SELECTION-SCREEN语句的实例: 程序代码,如图1-12所示。 13 图1-12 文本符号,如图1-13所示。 图1-13 程序执行结果,如图1-14所示。 14 图1-14 事件及其事件关键字 逻辑数据库是典型报表程序的外部流控制的中心点。如果将逻辑数据库链接到报表程序,将导致显示选择屏幕,并决定系统如何从数据库表中读取数据。这引起在下列表中说明的事件序列 事件关键字 INITIALIZATION AT SELECTION-SCREEN START-OF-SELECTION GET 处理和显示报表程序输出列表时,出现其他没有连接到逻辑数据库的事件。可以用这些事件格式化输出列表,并使报表程序成为交互式的 处理报表程序输出列表时,出现下列事件: 事件关键字 TOP-OF-PAGE END-OF-PAGE 事件 启动新页时,列表处理中的点 结束页时,列表处理中的点 可以用这些关键字改善输出列表 的格式。 下列事件出现在报表程序输出列表的显示中: 事件关键字 事件 15 AT LINE-SELECTION AT USER-COMMAND AT PF 要允许程序对触发自定义功能代码的用户行为作出反应,请定义并编码 AT USER-COMMAND 事件的处理块 语法:AT USER-COMMAND. <语句>. 无论何时用户从自定义用户界面中选择自定义功能代码,都将发生 AT USER-COMMAND 事件。如果用户选择为系统功能预定义的功能代码,或者选择总是触发 AT LINE-SELECTION 事件的功能代码PICK, 则不发生该事件。使用 AT USER-COMMAND 事件处理块中的 SY-UCOMM 系统字段区别不同的功能代码 2、内部表第一行 语法:AT FIRST. …… ENDAT. 3、内部表最后一行 语法:AT LAST. …… ENDAT. 4、内表中某个字段及其前面的字段遇到新值 语法:AT NEW ENDAT. 5、内表中某个字段及其前面的字段同一值结束 语法:AT END OF ENDAT. 注:在上述AT语句中,进入AT语句以后,循环中的表头里面的数据都将变成'*',因此要先定义一个相同结构的数据将进入AT之前表头的数据备份出来,在AT语句块里面及其后使用 6、处理控制级 16 通过使用SORT语句给摘录数据集排序,可定义一个控制级结构。摘录数据集的控制级结构对应于HEADER 字段组中的字段的顺序。排序后, 可在LOOP-ENDLOOP循环中使用AT语句编写语句块,使系统只在控制中断时(即,控制级更改时)才处理它 语法:AT NEW ... ENDAT. 如果字段 在使用LOOP-ENDLOOP读取已排序的摘录数据集时,可以访问两个自动生成的字段 CNT( CNT( 如果 SUM( 如果 可以在控制中断产生之前,在AT END OF的过程块中访问这些字段;或在读取整个数据集后,在AT LAST后的过程块中访问这些字段 注:只能在给数据集排序后才能访问CNT( Example: REPORT ZZTEST_3750. TYPES: BEGIN OF T_C, T1(4) TYPE C, T2 TYPE I, END OF T_C. DATA IT TYPE TABLE OF T_C WITH HEADER LINE. IT-T1 = ‘AABB’.IT-T2 = 1. APPEND IT. IT-T1='AABB'. IT-T2 = 1. APPEND IT. IT-T1 ='BBCC'. IT-T2 = 2. APPEND IT. IT-T1 ='AAAA'. IT-T2 = 2. APPEND IT. IT-T1 ='AABB'. IT-T2 = 1. APPEND IT. 17 IT-T1 ='BBBB'. IT-T2 = 2. APPEND IT. IT-T1 ='BBCC'. IT-T2 = 2. APPEND IT. IT-T1 ='AAAA'. IT-T2 = 1. APPEND IT. IT-T1 ='BBBB'. IT-T2 = 1. APPEND IT. IT-T1 ='AAAA'. IT-T2 = 3. APPEND IT. IT-T1 ='AABB'. IT-T2 = 1. APPEND IT. SORT IT BY T1 T2. LOOP AT IT. AT FIRST. WRITE 'Start of LOOP'. ULINE. ENDAT. AT NEW T1. WRITE / ' New T1:'. ENDAT. AT NEW T2. WRITE / ' New T2:'. ENDAT. WRITE: /14 T1, T2. AT END OF T2. 运行结果: Start of LOOP New T1: New T2: AAAA 1 End of T2 New T2: AAAA 2 End of T2 New T2: AAAA 3 End of T2 End of T1 New T1: New T2: AABB 1 AABB 1 AABB 1 AABB 1 End of T2 End of T1 New T1: WRITE / 'End of T2'. ENDAT. AT END OF T1. WRITE / 'End of T1'. ENDAT. AT LAST. ULINE. ENDAT. ENDLOOP. New T2: BBBB 1 End of T2 New T2: BBBB 2 End of T2 End of T1 New T1: New T2: BBCC 2 BBCC 2 End of T2 End of T1 18 分页 1、无条件分页 要在页处理期间触发分页(触发END OF PAGE),请使用 NEW-PAGE 语句的基本格式 语法:NEW-PAGE. 2、条件分页定义行块 要在少于某一页剩余行数的条件下执行分页(触发END OF PAGE),请使用RESERVE 语句: 语法: RESERVE 如果当前列表页的最后输出和页脚之间剩余的自由行数少于 通过窗口滚动窗口 要以当前窗口大小垂直滚动列表并且与页长无关,请使用这条语句: 语法:SCROLL LIST FORWARD | BACKWARD [INDEX 不带INDEX 选项时,该语句以当前窗口大小向前或向后滚动当前列表 。使用 INDEX 选项时,系统以列表级 Example: REPORT ZZTEST_3750 NO STANDARD PAGE HEADING LINE-SIZE 40. TOP-OF-PAGE. WRITE: 'Top of Page', SY-PAGNO, 'SY-SROWS:', SY-SROWS. ULINE. START-OF-SELECTION. DO 100 TIMES. WRITE / SY-INDEX. ENDDO. DO 3 TIMES. SCROLL LIST FORWARD. ENDDO. 该报表创建没有结尾页的列表。在DO循环之内,系统三次SCROLL语句。如果当前窗口为12 行(存储在 SY-SROWS 中),则程序输出,如图1-15所示。 19 图1-15 按页滚动 要按页滚动列表,即按页长垂直滚动列表,SCROLL 语句提供下列选项: 1、滚动到某页 语法:SCROLL LIST TO FIRST PAGE | LAST PAGE | PAGE 不用 INDEX 选项,语句将当前列表滚动到首页 、尾页或 语法:SCROLL LIST FORWARD | BACKWARD 3、水平滚到列表的左或 右页边缘 语法:SCROLL LIST LEFT | RIGHT [INDEX 可以将 WRITE 输出定位到上一 WRITE 输出的列中 。 语法:WRITE 系统从开始输出字段 列表中的颜色 FORMAT 语句的选项 COLOR、 INTENSIFIED 和 INVERSE 影响输出列表的颜色。 1、在程序中设置颜色 语法:FORMAT COLOR 语法:FORMAT COLOR = 20 (1)COLOR 设置行背景的颜色。而且,如果设置 INVERSE ON ,则系统将更改前景颜色而不是背景颜色。 对于 (2)INTENSIFIED 确定行背景的颜色调色板。 上面指定的行背景的颜色调色板可以很浓或正常,有一个例外 (COLOR OFF)。 缺省设置为 INTENSIFIED ON。对于 COLOR OFF,系统将更改前景颜色而不是背景颜色 。而且,如果设置 INVERSE ON,则 INTENSIFIED OFF 无效(同样 ,COLOR OFF 例外)。 (3)INVERSE 影响前景颜色。 系统从背景颜色调色板获取指定 COLOR 并将其用作前景颜色, 有一个例外 (COLOR OFF)。 背景颜色保持不变。对 于 COLOR OFF,INVERSE 无效,因为这将前景和背景颜色设置为相同颜色。 例1:显示各种颜色格式化选项的不同组合情况 : REPORT ZZTEST_3750. DATA I TYPE I VALUE 0. DATA COL(15). WHILE I < 8. CASE I. WHEN 0. COL = 'COL_BACKGROUND '. WHEN 1. COL = 'COL_HEADING '. WHEN 2. COL = 'COL_NORMAL '. WHEN 3. COL = 'COL_TOTAL '. WHEN 4. COL = 'COL_KEY '. WHEN 5. COL = 'COL_POSITIVE '. WHEN 6. COL = 'COL_NEGATIVE '. WHEN 7. COL = 'COL_GROUP '. ENDCASE. FORMAT INTENSIFIED COLOR = I. WRITE: /(4) I, AT 7 SY-VLINE, 21 COL, SY-VLINE, COL INTENSIFIED OFF, SY-VLINE, COL INVERSE. I = I + 1. ENDWHILE. 在 FORMAT 语句中,在运行时设置续 WRITE 语句的COLOR选项。在程序中单独设置每条 WRTIE 语句的其他选项。 输出显示,如图1-16所示。 图1-16 例2:显示如何在列表中使用颜色以强调输出。 REPORT ZZTEST_3750 NO STANDARD PAGE HEADING LINE-SIZE 70. TABLES: SPFLI, SFLIGHT. DATA: SUM TYPE I, IT_SPFLI LIKE TABLE OF SPFLI, IT_SFLIGHT LIKE TABLE OF SFLIGHT. WRITE: ’List of Flights’ COLOR_HEADING. ULINE. SELECT * FROM SPFLI INTO TABLE IT_SPFLI. SELECT * FROM SFLIGHT INTO TABLE IT_SFLIGHT FOR ALL ENTRIES IN IT_SPFLI WHERE CARRID = IT_SPFLI-CARRID AND CONNID = IT_SPFLI-CONNID. FORMAT COLOR COL_HEADING. WRITE: ’CARRID’, 10 ’CONNID’, 20 ’FROM’, 40 ’TO’. FORMAT COLOR COL_KEY. LOOP AT IT_SPFLI INTO SPFLI. WRITE: / SPFLI-CARRID UNDER ’CARRID’, SPFLI-CONNID UNDER ’CONNID’, SPFLI-CITYFROM UNDER ’FROM’, SPFLI-CITYTO UNDER ’TO’. ULINE. FORMAT COLOR COL_HEADING. 22 WRITE: ’Date’, 20 ’Seats Occupied’, 50 ’Seats Available’. ULINE. SUM = 0. LOOP AT IT_SFLIGHT INTO SFLIGHT WHERE CARRID = SPFLI-CARRID AND CONNID = SPFLI-CONNID. IF SFLIGHT-SEATSOCC LE 10. FORMAT COLOR COL_NEGATIVE. ELSE. FORMAT COLOR COL_NORMAL. ENDIF. IF SY-TABIX = 1. WRITE: / SFLIGHT-FLDATE UNDER ’Date’. ELSE. WRITE: SFLIGHT-FLDATE UNDER ’Date’. ENDIF. WRITE: SFLIGHT-SEATSOCC UNDER ’ Seats Occupied’, SFLIGHT-SEATSMAX UNDER ’Seats Available’. SUM = SUM + SFLIGHT-SEATSOCC. ENDLOOP. ULINE. WRITE: ’Total Bookings:’ INTENSIFIED OFF, SUM UNDER SFILGHT-SEATSOCC COLOR COL_TOTAL. ULINE. ENDLOOP. 该报表输出列表,如图1-17所示。 23 图1-17 所有标题以背景颜色COL_HEADING显示。表格SPFLI 的关键字字段使用COL_KEY作为背景颜色。事件 GET SFLIGHT 的列表正文行背景颜色(COL_NORMAL)不同于列表背景 (COL_BACKGROUND) 。而且,预定数量在某一最小数量以下的航班,其背景为红色。每个航班的总预定数量背景黄色。 请注意,对于每个新事件,系统都将格式化选项复位为缺省设置(COLOR OFF、 INTENSIFIED ON)。因此,在上面程序中,GET LATE事件时输出“总计预定”的行背景还是 COL_BACKGROUND。将 INTENSIFIED 设置为 OFF 以获取与其他输出相同的前景颜色 。 交互式报表 1、什么是交互式报表? 传统的、非交互式报表由创建单个列表的一个程序组成。这意味着启动报表之后,它创建的列表必须包含所有要求的数据,而不管用户想查看的细节的数目。该程可能导致扩展列表,用户必须从该列表中挑选相关的数据。对于后台处理,这是唯一可能的方法。启动后台作业之后,没有任何方法影响程序。必须预先做出所要求的选择,并且报表必须提供详细信息 。 对于对话框会话,没有这种限制。 执行时用户在场,可以直接控制和操作程序流 。为了能够利用联机环境的所有优点,传统报表已发展为交互式报表 。 交互式报表允许用户在会话期间积极参与检索和提出数据 。交互式报表创建的不是一个扩展的和详细的列表,而是一个精简的基本列表, 通过定位光标并输入命令,用户可以从该列表中调用详细信息。因此 ,交互式报表减少了实际需要检索的数据信息 。 24 在次列表中显示详细信息。次列表完全覆盖基本列表,或 者出现在屏幕上的附加对话窗口中 。次列表本身也可以是交互式的。 除了创建次列表之外, 交互式报表还允许从列表中调用事务和其它报表。然后, 这些程序将 显示在列表中的值用作 输入值。例如,用户可以从列表中调用事务以 更改数据库表格,该数据库表的数显示在列表中,如图1-18所示。 图1-18 2、交互式列表的事件控制 ABAP/4 程序由事件关键字控制。 事件关键字是交互地使用列表所必需的。 下列事件是交互式列表环境特有的 : AT LINE-SELECTION、AT PF 如果在程序中为这些事件之一定义处理块,则程序可以对某些用户动作做出反应 。如果用户随后执行显示列表中的已定义的行为,则系统将触发相应事件。系统将在上述事件之一的处理块中编写的所有输出语句的输出写入到所谓的次列表中 。 3、交互式列表上的动作 必须在列表的界面定义中确定用户可以在列表上执行的,并触发特定事件的动作。可以为每个列表定义单独的界面。默认情况下,事件发生在列表的下列动作之后: AT LINE-SELECTION : 出现在用户双击某行之后,单击热点。 AT PF AT USER-COMMAND : 出现在用户选择自定义行为之后。 4、事件控制带来的结果 使用事件关键字编写交互式列表的事实带来下列重要结果 :不能嵌套处理块,这是由于每个新事件关键字终止前面的处理块。 因此,无法在交互式列表的处理块内处理其它事件。 尤其不能: 25 ( 1 ) 使用 GET 和 GET LATE 之类的事件检索次列表的数据,但必须使用 SELECT 语句。只有对基本列表才能使用分配给报表的逻辑数据库 。如果要在交互式事件期间使用逻辑数据库, 必须调用使用SUBMIT的独立报表。 ( 2 ) 使用事件TOP-OF-PAGE和END-OF-PAGE影响次列表结构。为了设置次列表的页眉,必须使用事件TOP-OF-PAGE DURING LINE-SELECTION。 ( 3 ) 使用独立的处理块处理其它交互式事件。一定的用户动作总是触发程序中同一个处理块。 必须使用处理块内的控制语句(IF 和 CASE) ,以确保系统处理要求 语句。在 该环境中有几个系统字段帮助完成该操作,如表1-2所示。 系统字段 SY-LSIND SY-LISTI SY-LILLI SY-LISEL SY-CUROW SY-CUCOL SY-CPAGE SY-STARO SY-STACO SY-UCOMM SY-PFKEY 信 息 当前事件中创建的列表索引(基本列表 = 0) 触发事件的列表级索引 触发事件的行的绝对号 触发事件的行的内容 触发事件的行在窗口中的位置(计数开始于 1) 触发事件的列在窗口中的位置(计数开始于 2) 触发事件的列表显示的第一页的页号 触发事件的列表显示的第一页第一行的行号(计数开始于1)。该行可能是页眉 触发事件的列表显示的第一列的列号 (计数开始于 1) 触发事件的功能代码 显示列表的状态 表1-2 如果使用自定义的列表界面,则系统字段 SY-UCOMM 和 SY-PFKEY 很重要。 次列表的页眉 系统在次列表上不显示标准页眉,并且不触发事件 TOP-OF-PAGE。要创建次列表的页眉, 必须增强 TOP-OF-PAGE: 语法:TOP-OF-PAGE DURING LINE-SELECTION. 对每个次列表,系统都触发该事件。如果要为不同列表级创建不同的页眉,必须相应地编写该事件的处理块,例如,通过使用系统字段,如控制语句(IF 和CASE)中的 SY-LSIND 或 SY-PFKEY。 用户垂直滚动次列表时,系统将保留页眉而只滚动页眉下的列表行 。 列表中的消息 ABAP/4 允许您根据错误的严重程度通过显示影响程序流的消息对错误或有疑问的用户输 入做出反应 。处理消息是对话编程中详细描述的主题。消息是通过语言、双字符标识和三个数字的号码存储的。可以为输出的各种消息分配不同消息类型。消息对程序流的影响取决于消息类型。 在程序中使用 MESSAGE 语句静态或动态地输出信息,并确定信息类型 。 语法:REPORT 26 由于该语句的作用,报 表 要静态地指定消息号, 请使用: 语法:MESSAGE 该语句输出存储在号码 要在运行时动态地指定消息标识、 类型和号码 ,请使用: 语法:MESSAGE ID 消息可以有五种不同类型。列表处理期间,这些消息类型有下列作用 : A (=终止) :系统在对话窗口中显示该消息类型的消息。用户使用 ENTER 确认信息之后,系统终止整个事务(例如,SE38) 。 E(=错 误)或 W(=警告 ):系统在状态行中显示该消息类型的消息。用户选择 ENTER 之后,系统将按下列情况运作: 创建基本列表时,系统终止报表。 创建次列表时,系统终止相应处理块,并继续显示前面的列表级 ,如图1-18所示。 图1-18 I(=信息) :系统在对话窗口中显示该消息类型的消息。用户选择 ENTER 之后,系统在当前程序位置继续处理 S(=成功) :在输出屏幕上,系统在当前创建的列表的状态行中显示该消息类型的消息。 字符‘&’ 在消息中起占位符的作用。如果使用 WITH 选项,系统用字段 用SE91调用 MESSAGE,一类的MESSAGE 最大的番号为 1000(0~999),如图1-19所示。 27 图1-19 调用MESSAGE简单的方法为:按“模式”按钮,出现界面如图1-20所示。 图1-20 执行MESSAGE的后续动作: S: 状态栏的图标 继续执行以后的代码 E: 状态栏的图标 停止 I: 状态栏的图标 继续执行以后的代码 从程序中触发事件 不是使用户通过输出屏幕上的行为触发交互式事件,而是您自己可以从程序中触发事件。 语法: SET USER-COMMAND 28 此语句在完成当前列表后生效。系统显示列表之前,将触发与存储在 AT LINE-SELECTION 和 AT PF 只有把光标置于列表行上时,功能代码 PICK 才触发事件。 对于为系统功能定义的功能代码, 系统不触发事件,而是执行相应行为。例如,要一起显示列表和“搜索”对话窗口,请在 如果创建列表时使用好几个SET USER-COMMAND 语句,系统只执行最后一个语句。 从列表中读取行 系统内在地存储一个报表程序连续创建的所有列表。因此,可以从由当前会话创建的程序中访问任何列表,并且没有通过返回到前一列表级而删除它。 1、要在出现交互式列表事件之后读取行,请使用 READ LINE 语句。 语法:READ LINE [FIELD VALUE ]. 没有任何选项的语句存储列表中行 如果选定的行 INDEX FIELD VALUE 系统使用输出格式,即包括所有格式化字符,传输字段内容。这可能 致无法交换,例如将 编辑字符转换为十进制 符或其它字符。 由于这种情况下无法使用 HIDE 技术,所以主要使用该选项处理接受输入的列表字段中的用户输入。 OF CURRENT PAGE :对于此选项 , OF PAGE :对于此选项 , 页上的行号 。 2、取决于读取行的内容, 可能希望从同一行中重新填写字段 。请在程序中使用 READ CURRENT LINE 语句。此语句连续两次读行。 语法 :READ CURRENT LINE [FIELD VALUE 此语句通过交互式事件 (F2) 或通过 READ LINE 读取前面读取过的行。 FIELD VALUE 选项与 READ LINE 的相同。 29 在光标位置处读列表 1、要在交互式事件中检索光标位置处的信息,请使用 GET CURSOR 语句引用字段或行。 语法:GET CURSOR FIELD 在用户行为中,该语句将光标位置处的字段名传送到变量 系统传送子程序的全局变量、常量 、字段符号或引用参数的名称。对子程序的文字、局部字段和 VALUE 参数,系统将 SY-SUBRC 设置为 0,但将 SPACE 作为名称传输。 选项有下列作用: OFFSET ,如下所示 :. 可以是I(包括)和 E 排除)。缺省值是 I。 GET
LATE END-OF-SELECTION 事件 在显示选择屏幕之前的点 选择屏幕仍然活动时,处理用户在选择屏幕上输入之后的点 处理选择屏幕之后的点 点位于逻辑数据库提供数据库表
的行处。 处理所有表之后的点, 在逻辑数据库的结构中,使这些表位于数据库表
的下层。 处理完逻辑数据库提供的所有行之后的点。 下列主题说明这些事件的过程块