您好,欢迎来到筏尚旅游网。
搜索
您的当前位置:首页SAP报表开发指南

SAP报表开发指南

来源:筏尚旅游网


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

[()] [].

该语句创建参数

。附加项 与 DATA 语句相同。 语法:PARAMETERS

[DEFAULT ] [LOWER CASE] [OBLIGATORY]

[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 ......

可以是文字或字段名。如果指定字段名,则系统将按缺省值处理该字段的内容,报表用户可以在选择屏幕中更改缺省值,系统在时间事件INITIALIZATION之前将缺省值传输给参数。

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创建,并分配到组。字符串 的最大长度是4。允许使用附加的 LIKE 选项,但是必须参阅类型为C、长 度为1的字段。

必须为每个 组分配至少两个参数。每个组中只有一个参数可以用DEFAULT选项分配的缺省值。该值必须是' X'。

当用户单击选择屏幕中的单选按钮时,相应的参数被激活(分配值'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 FOR .

该语句创建选择表,该表与数据库表的列 或内部字段 相连接。该数据库表必须在程序中用 TABLES 语句声明。 名称 最多可以包含8 个字符。选择表 由报表用户在选择屏幕中填充。在程序中,可以修改选择表的行或往里面添加更多的行。

可以用在选择文本中描述的文字摘要来更改选择屏幕 上输入字段左面的文本字段。 Example: TABLES BKPF

SELECT-OPTIONS S_BUKRS FOR BKPF-BUKRS.

将条件的输入值存放入S_BUKRS,筛选选择为BKPF中的BUKRS字段 执行结果,如图1-8所示。

图1-8

2、给选择标准分配缺省值(请使用 SELECT-OPTIONS 语句的 DEFAULT 选项)

语法:SELECT-OPTIONS FOR DEFAULT [TO ] .... 的缺省值可以是实际值(在单引号中)或是字段名,该字段的值将用做缺省值。 系统在时间事件INITIALIZATION之前把缺省值传递给选择标准。因此,有那些在用户启动程序时已被填充的字段才可以用字段名而不用文字。 例如,这样的字段可以是系统字段。

对于每个 SELECT-OPTIONS 语句,可以 指定 DEFAULT附加部分。这意味着只能用缺省值填充选择表 的第一行。选择表行的第一行的所有组件可以用DEFAULT选项预先设置:

要只设置 LOW 字段(单值选择),请使用 ........DEFAULT .

要设置 LOW 和 HIGH 字段(间隔 选择),请增加 TO,如:......DEFAULT TO . Example:

SELECT-OPTIONS AIRLINE FOR SPFLI-CONNID DEFAULT '2042' TO '4555'.

8

要设置OPTION字段(选择运算符),请增加OPTION ,如:

......DEFAULT [to ] OPTION .

对于单值选择, 可以是 EQ、NE、GE、GT、LE、LT、CP 或 NP。缺省值是EQ。 对于期间选择, 可以是BT 或 NB。缺省值是BT 。 要设置 SIGN 域(包括/排 除),请增 加 SIGN ,如下所示 :

........DEFAULT [to ] [OPTION ] SIGN .

SIGN 可以是I(包括)和 E 排除)。缺省值是 I。

注:要给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 FOR ..... NO-EXTENSION .....

如果指定该选项,则选择屏幕上不出现右箭头,并且用户不能访问“复杂选择”窗口。 4、把选择表限制为单值选择(使用SELECT-OPTIONS 语句的 NO INTERVALS 选项)

语法: SELECT-OPTIONS FOR ..... NO INTERVALS .....

如果指定该选项,则“ 到”字段不出现在选择屏幕上。选择屏幕上的输入将限制为单值选择 。但是,用户可以在“复杂选择”屏幕中输入间隔选择。 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 ]] [NO INTERVALS]. ... ...<p>SELECTION-SCREEN END OF BLOCK <block>.<p>2、在选择屏幕上创建按钮(使用PUSHBUTTON 参数)<p>语法:SELECTION-SCREEN PUSHBUTTON [/]<pos(len)> <name> USER-COMMAND <ucom> [MODIF ID <key>].<p>参数 [/]<pos(len)>、<name>和MODIF ID 选项与在注释中对COMMENT选项进行的描述相同, 在 <name> 中指定的文本是按钮文本。对于 <ucom>, 必须指定最多为4 字符的代码。当用户在选择屏幕上单击按钮时,<ucom>被输入词典字段 SCRFIELDS-UCOMM。 3、产生空白列<p>语法:SELECTION-SCREEN SKIP [<n>] 4、产生底线<p>语法: SELECTION-SCREEN ULINE / <pos>(length) 5、印出备注说明<p>语法: SELECTION-SCREEN COMMENT / <pos>(length) <name> 6、同一列中输入数个数据项<p>12<p>语法:SELECTION-SCREEN BEGIN OF LINE. ……<p>SELECTION-SCREEN END OF LINE.<p>Example:<p>SELECTION-SCREEN BEGIN OF LINE. SELECTION-SCREEN POSITION 20.<p>PARAMETERS NAME(10). \"在20格输入NAME内容 SELECTION-SCREEN POSITION 40.<p>PARAMETERS BIRTH TYPE D. \"40格输入 BIRTH的内容 SELECTION-SCREEN END OF LINE. 7、绘出BLOCK PANEL<p>语法:SELECTION-SCREEN BEGIN OF BLOCK <block> [WITH FRAME [TITLE <title>]. …….<p>SELECTION-SCREEN END OF BLOCK <block>.<p>Example:<p>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.<p>8、SELECTION-SCREEN语句的实例:<p>程序代码,如图1-12所示。<p>13<p>图1-12<p>文本符号,如图1-13所示。<p>图1-13<p>程序执行结果,如图1-14所示。<p>14<p>图1-14<p>事件及其事件关键字<p>逻辑数据库是典型报表程序的外部流控制的中心点。如果将逻辑数据库链接到报表程序,将导致显示选择屏幕,并决定系统如何从数据库表中读取数据。这引起在下列表中说明的事件序列<p>事件关键字 INITIALIZATION AT SELECTION-SCREEN START-OF-SELECTION GET <Table> GET <Table> LATE END-OF-SELECTION 事件 在显示选择屏幕之前的点 选择屏幕仍然活动时,处理用户在选择屏幕上输入之后的点 处理选择屏幕之后的点 点位于逻辑数据库提供数据库表 <Table> 的行处。 处理所有表之后的点, 在逻辑数据库的结构中,使这些表位于数据库表 <Table> 的下层。 处理完逻辑数据库提供的所有行之后的点。 下列主题说明这些事件的过程块<p>处理和显示报表程序输出列表时,出现其他没有连接到逻辑数据库的事件。可以用这些事件格式化输出列表,并使报表程序成为交互式的<p>处理报表程序输出列表时,出现下列事件: 事件关键字 TOP-OF-PAGE END-OF-PAGE 事件 启动新页时,列表处理中的点 结束页时,列表处理中的点 可以用这些关键字改善输出列表 的格式。 下列事件出现在报表程序输出列表的显示中: 事件关键字 事件 15<p>AT LINE-SELECTION AT USER-COMMAND AT PF<nn> 用户在该点处选择行 用户在该点处按下功能键或在命令字段中输入命令 用户在该点处按下有功能代码 PF<n> 的功能键 可以使用这些关键字编写交互式报告的程序 1、AT USER-COMMAND 事件<p>要允许程序对触发自定义功能代码的用户行为作出反应,请定义并编码 AT USER-COMMAND 事件的处理块<p>语法:AT USER-COMMAND. <语句>.<p>无论何时用户从自定义用户界面中选择自定义功能代码,都将发生 AT USER-COMMAND 事件。如果用户选择为系统功能预定义的功能代码,或者选择总是触发 AT LINE-SELECTION 事件的功能代码PICK, 则不发生该事件。使用 AT USER-COMMAND 事件处理块中的 SY-UCOMM 系统字段区别不同的功能代码 2、内部表第一行<p>语法:AT FIRST. ……<p>ENDAT.<p>3、内部表最后一行<p>语法:AT LAST. ……<p>ENDAT.<p>4、内表中某个字段及其前面的字段遇到新值<p>语法:AT NEW <F>. \"F及其左边字段新值的开始 ……<p>ENDAT.<p>5、内表中某个字段及其前面的字段同一值结束<p>语法:AT END OF <F>. \"F及其左边字段同一值的结束 ……<p>ENDAT.<p>注:在上述AT语句中,进入AT语句以后,循环中的表头里面的数据都将变成'*',因此要先定义一个相同结构的数据将进入AT之前表头的数据备份出来,在AT语句块里面及其后使用 6、处理控制级<p>16<p>通过使用SORT语句给摘录数据集排序,可定义一个控制级结构。摘录数据集的控制级结构对应于HEADER 字段组中的字段的顺序。排序后, 可在LOOP-ENDLOOP循环中使用AT语句编写语句块,使系统只在控制中断时(即,控制级更改时)才处理它<p>语法:AT NEW <f> | AT END OF <f>.<p>... ENDAT.<p>如果字段 <f> 或当前摘录记录中的排序关键字的较高层字段中包含其它值,并且该值与摘录数据集前面的记录(对于 AT NEW)或后续记录( 对于 AT END)中的值不同, 将产生控制中断,并且系统将处理 AT-ENDAT 中的语句块 。字段 <f> 必须是 HEADER 字段组的一部分 7、计算序号和合计<p>在使用LOOP-ENDLOOP读取已排序的摘录数据集时,可以访问两个自动生成的字段 CNT(<f>) 和 SUM(<g>),这些字段提供了不同值的序号或数字字段的合计。系统将在控制级的最后以及读取 数据集的最后一个记录后填充这些字段 ➢<p>CNT(<f>)<p>如果 <f> 是 HEADER字段组的非数字字段, 并且系统是根据 <f> 给摘录数据集排序的, 则 CNT(<f>) 包含了在控制级中或在整个数据集中分别设定的不同值 <f> 的序号。 ➢<p>SUM(<g>)<p>如果 <g> 是摘录数据集的数字字段,SUM (<g>)将包含控制级或整个数据集中<g> 的值的合计 。<p>可以在控制中断产生之前,在AT END OF的过程块中访问这些字段;或在读取整个数据集后,在AT LAST后的过程块中访问这些字段<p>注:只能在给数据集排序后才能访问CNT(<f>) 和 SUM(<g>)字段。否则会产生运行时错误。<p>Example: REPORT ZZTEST_3750. TYPES: BEGIN OF T_C,<p>T1(4) TYPE C, T2 TYPE I, END OF T_C.<p>DATA IT TYPE TABLE OF T_C WITH<p>HEADER LINE.<p>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.<p>17<p>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.<p>WRITE 'Start of LOOP'. ULINE.<p>ENDAT. AT NEW T1.<p>WRITE / ' New T1:'. ENDAT. AT NEW T2.<p>WRITE / ' New T2:'. ENDAT.<p>WRITE: /14 T1, T2. AT END OF T2. 运行结果: Start of LOOP<p>New T1: New T2:<p>AAAA 1 End of T2 New T2:<p>AAAA 2 End of T2 New T2:<p>AAAA 3 End of T2 End of T1 New T1: New T2:<p>AABB 1 AABB 1 AABB 1 AABB 1 End of T2 End of T1 New T1:<p>WRITE / 'End of T2'. ENDAT. AT END OF T1. WRITE / 'End of T1'. ENDAT. AT LAST. ULINE. ENDAT. ENDLOOP.<p>New T2:<p>BBBB 1 End of T2 New T2:<p>BBBB 2 End of T2 End of T1 New T1: New T2:<p>BBCC 2 BBCC 2 End of T2 End of T1<p>18<p>分页<p>1、无条件分页<p>要在页处理期间触发分页(触发END OF PAGE),请使用 NEW-PAGE 语句的基本格式 语法:NEW-PAGE. 2、条件分页定义行块<p>要在少于某一页剩余行数的条件下执行分页(触发END OF PAGE),请使用RESERVE 语句:<p>语法: RESERVE <n> LINES.<p>如果当前列表页的最后输出和页脚之间剩余的自由行数少于<n>,则该语句触发分页。<n> 可以是变量。在开始新页之前,系统处理END-OF-PAGE 事件。只有输出写入到后续页时,RESERVE 才生效。不创建空页。<p>通过窗口滚动窗口<p>要以当前窗口大小垂直滚动列表并且与页长无关,请使用这条语句: 语法:SCROLL LIST FORWARD | BACKWARD [INDEX <idx>].<p>不带INDEX 选项时,该语句以当前窗口大小向前或向后滚动当前列表 。使用 INDEX 选项时,系统以列表级 <idx> 滚动列表。<p>Example:<p>REPORT ZZTEST_3750 NO STANDARD PAGE HEADING LINE-SIZE 40. TOP-OF-PAGE.<p>WRITE: 'Top of Page', SY-PAGNO, 'SY-SROWS:', SY-SROWS. ULINE.<p>START-OF-SELECTION. DO 100 TIMES.<p>WRITE / SY-INDEX. ENDDO. DO 3 TIMES.<p>SCROLL LIST FORWARD. ENDDO.<p>该报表创建没有结尾页的列表。在DO循环之内,系统三次SCROLL语句。如果当前窗口为12 行(存储在 SY-SROWS 中),则程序输出,如图1-15所示。<p>19<p>图1-15<p>按页滚动<p>要按页滚动列表,即按页长垂直滚动列表,SCROLL 语句提供下列选项: 1、滚动到某页<p>语法:SCROLL LIST TO FIRST PAGE | LAST PAGE | PAGE <pag> [ INDEX <idx> ] [ LINE <lin> ].<p>不用 INDEX 选项,语句将当前列表滚动到首页 、尾页或 <pag> 页。使用 INDEX 选项,则系统滚动列表 级 <idx> 的列表。使用 LINE 选项时,系统显示从实际列表的 <lin> 行开始滚动的页。不包括页眉行。 2、按页数滚动<p>语法:SCROLL LIST FORWARD | BACKWARD <n> PAGES [INDEX <idx>]. 不用 INDEX 选项时,语句向前或向后滚动 <n> 页。如上所 述,INDEX 选项参考某一列表级。<p>3、水平滚到列表的左或 右页边缘<p>语法:SCROLL LIST LEFT | RIGHT [INDEX <idx>]. 4、将输出定位到其它输出之下<p>可以将 WRITE 输出定位到上一 WRITE 输出的列中 。 语法:WRITE <f> UNDER <g>.<p>系统从开始输出字段 <g> 的同一列中开始输出 <f>。该语句不限于当前页,即 <g> 不必出现在相同页上。<p>列表中的颜色<p>FORMAT 语句的选项 COLOR、 INTENSIFIED 和 INVERSE 影响输出列表的颜色。 1、在程序中设置颜色<p>语法:FORMAT COLOR <n> [ON] INTENSIFIED [ON|OFF] INVERSE [ON|OFF]. 2、在运行时设置颜色<p>语法:FORMAT COLOR = <c> INTENSIFIED = <int> INVERSE = <inv>. 这些格式化选项不适用于由 ULINE 创建的水平行。其功能如下所示:<p>20<p>(1)COLOR 设置行背景的颜色。而且,如果设置 INVERSE ON ,则系统将更改前景颜色而不是背景颜色。<p>对于 <n>,可以设置颜色号或者颜色规范。但是 ,要代替颜色号 0,必须使用 OFF。如果在运行时设置颜色号码,则小于 0 或大于 7 的所有 <c> 值都将导致未定义的结果。下表汇总各种不同的选项:<p><n> <c> 0 1 2 3 4 5 6 7 颜色 取决于GUI 灰蓝 淡灰 黄 蓝绿 绿 红 紫 用于 背景 标题 列表正文 总计 关键字列 正门限值 负门限值 组级别 OFF 或 COL_BACKGROUND 1 或 COL_HEADING 2 或 COL_NORMAL 3 或 COL_TOTAL 4 或 COL_KEY 5 或 COL_POSITIVE 6 或 COL_NEGATIVE 7 或 COL_GROUP 缺省值为 COLOR OFF。<p>(2)INTENSIFIED 确定行背景的颜色调色板。<p>上面指定的行背景的颜色调色板可以很浓或正常,有一个例外 (COLOR OFF)。 缺省设置为 INTENSIFIED ON。对于 COLOR OFF,系统将更改前景颜色而不是背景颜色 。而且,如果设置 INVERSE ON,则 INTENSIFIED OFF 无效(同样 ,COLOR OFF 例外)。<p>(3)INVERSE 影响前景颜色。<p>系统从背景颜色调色板获取指定 COLOR 并将其用作前景颜色, 有一个例外 (COLOR OFF)。 背景颜色保持不变。对 于 COLOR OFF,INVERSE 无效,因为这将前景和背景颜色设置为相同颜色。<p>例1:显示各种颜色格式化选项的不同组合情况 : REPORT ZZTEST_3750. DATA I TYPE I VALUE 0. DATA COL(15). WHILE I < 8. CASE I.<p>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.<p>FORMAT INTENSIFIED COLOR = I. WRITE: /(4) I, AT 7 SY-VLINE,<p>21<p>COL, SY-VLINE,<p>COL INTENSIFIED OFF, SY-VLINE, COL INVERSE. I = I + 1. ENDWHILE.<p>在 FORMAT 语句中,在运行时设置续 WRITE 语句的COLOR选项。在程序中单独设置每条 WRTIE 语句的其他选项。<p>输出显示,如图1-16所示。<p>图1-16<p>例2:显示如何在列表中使用颜色以强调输出。<p>REPORT ZZTEST_3750 NO STANDARD PAGE HEADING LINE-SIZE 70. TABLES: SPFLI, SFLIGHT. DATA: SUM TYPE I,<p>IT_SPFLI LIKE TABLE OF SPFLI, IT_SFLIGHT LIKE TABLE OF SFLIGHT. WRITE: ’List of Flights’ COLOR_HEADING. ULINE.<p>SELECT * FROM SPFLI INTO TABLE IT_SPFLI.<p>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.<p>WRITE: ’CARRID’, 10 ’CONNID’, 20 ’FROM’, 40 ’TO’. FORMAT COLOR COL_KEY. LOOP AT IT_SPFLI INTO SPFLI.<p>WRITE: / SPFLI-CARRID UNDER ’CARRID’,<p>SPFLI-CONNID UNDER ’CONNID’, SPFLI-CITYFROM UNDER ’FROM’, SPFLI-CITYTO UNDER ’TO’.<p>ULINE.<p>FORMAT COLOR COL_HEADING.<p>22<p>WRITE: ’Date’, 20 ’Seats Occupied’, 50 ’Seats Available’. ULINE. SUM = 0.<p>LOOP AT IT_SFLIGHT INTO SFLIGHT WHERE CARRID = SPFLI-CARRID<p>AND CONNID = SPFLI-CONNID.<p>IF SFLIGHT-SEATSOCC LE 10. FORMAT COLOR COL_NEGATIVE. ELSE.<p>FORMAT COLOR COL_NORMAL. ENDIF.<p>IF SY-TABIX = 1.<p>WRITE: / SFLIGHT-FLDATE UNDER ’Date’. ELSE.<p>WRITE: SFLIGHT-FLDATE UNDER ’Date’. ENDIF.<p>WRITE: SFLIGHT-SEATSOCC UNDER ’ Seats Occupied’, SFLIGHT-SEATSMAX UNDER ’Seats Available’. SUM = SUM + SFLIGHT-SEATSOCC. ENDLOOP. ULINE.<p>WRITE: ’Total Bookings:’ INTENSIFIED OFF,<p>SUM UNDER SFILGHT-SEATSOCC COLOR COL_TOTAL. ULINE. ENDLOOP.<p>该报表输出列表,如图1-17所示。<p>23<p>图1-17<p>所有标题以背景颜色COL_HEADING显示。表格SPFLI 的关键字字段使用COL_KEY作为背景颜色。事件 GET SFLIGHT 的列表正文行背景颜色(COL_NORMAL)不同于列表背景<p>(COL_BACKGROUND) 。而且,预定数量在某一最小数量以下的航班,其背景为红色。每个航班的总预定数量背景黄色。<p>请注意,对于每个新事件,系统都将格式化选项复位为缺省设置(COLOR OFF、<p>INTENSIFIED ON)。因此,在上面程序中,GET LATE事件时输出“总计预定”的行背景还是 COL_BACKGROUND。将 INTENSIFIED 设置为 OFF 以获取与其他输出相同的前景颜色 。<p>交互式报表<p>1、什么是交互式报表?<p>传统的、非交互式报表由创建单个列表的一个程序组成。这意味着启动报表之后,它创建的列表必须包含所有要求的数据,而不管用户想查看的细节的数目。该程可能导致扩展列表,用户必须从该列表中挑选相关的数据。对于后台处理,这是唯一可能的方法。启动后台作业之后,没有任何方法影响程序。必须预先做出所要求的选择,并且报表必须提供详细信息 。<p>对于对话框会话,没有这种限制。 执行时用户在场,可以直接控制和操作程序流 。为了能够利用联机环境的所有优点,传统报表已发展为交互式报表 。<p>交互式报表允许用户在会话期间积极参与检索和提出数据 。交互式报表创建的不是一个扩展的和详细的列表,而是一个精简的基本列表, 通过定位光标并输入命令,用户可以从该列表中调用详细信息。因此 ,交互式报表减少了实际需要检索的数据信息 。<p>24<p>在次列表中显示详细信息。次列表完全覆盖基本列表,或 者出现在屏幕上的附加对话窗口中 。次列表本身也可以是交互式的。<p>除了创建次列表之外, 交互式报表还允许从列表中调用事务和其它报表。然后, 这些程序将 显示在列表中的值用作 输入值。例如,用户可以从列表中调用事务以 更改数据库表格,该数据库表的数显示在列表中,如图1-18所示。<p>图1-18<p>2、交互式列表的事件控制<p>ABAP/4 程序由事件关键字控制。 事件关键字是交互地使用列表所必需的。 下列事件是交互式列表环境特有的 :<p>AT LINE-SELECTION、AT PF<nn>、AT USER-COMMAND<p>如果在程序中为这些事件之一定义处理块,则程序可以对某些用户动作做出反应 。如果用户随后执行显示列表中的已定义的行为,则系统将触发相应事件。系统将在上述事件之一的处理块中编写的所有输出语句的输出写入到所谓的次列表中 。 3、交互式列表上的动作<p>必须在列表的界面定义中确定用户可以在列表上执行的,并触发特定事件的动作。可以为每个列表定义单独的界面。默认情况下,事件发生在列表的下列动作之后:<p>AT LINE-SELECTION : 出现在用户双击某行之后,单击热点。 AT PF<nn> : 出现在用户按下相应功能键之后。<p>AT USER-COMMAND : 出现在用户选择自定义行为之后。 4、事件控制带来的结果<p>使用事件关键字编写交互式列表的事实带来下列重要结果 :不能嵌套处理块,这是由于每个新事件关键字终止前面的处理块。 因此,无法在交互式列表的处理块内处理其它事件。<p>尤其不能:<p>25<p>( 1 ) 使用 GET 和 GET LATE 之类的事件检索次列表的数据,但必须使用 SELECT 语句。只有对基本列表才能使用分配给报表的逻辑数据库 。如果要在交互式事件期间使用逻辑数据库, 必须调用使用SUBMIT的独立报表。<p>( 2 ) 使用事件TOP-OF-PAGE和END-OF-PAGE影响次列表结构。为了设置次列表的页眉,必须使用事件TOP-OF-PAGE DURING LINE-SELECTION。<p>( 3 ) 使用独立的处理块处理其它交互式事件。一定的用户动作总是触发程序中同一个处理块。 必须使用处理块内的控制语句(IF 和 CASE) ,以确保系统处理要求 语句。在 该环境中有几个系统字段帮助完成该操作,如表1-2所示。<p>系统字段 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<p>如果使用自定义的列表界面,则系统字段 SY-UCOMM 和 SY-PFKEY 很重要。<p>次列表的页眉<p>系统在次列表上不显示标准页眉,并且不触发事件 TOP-OF-PAGE。要创建次列表的页眉, 必须增强 TOP-OF-PAGE:<p>语法:TOP-OF-PAGE DURING LINE-SELECTION.<p>对每个次列表,系统都触发该事件。如果要为不同列表级创建不同的页眉,必须相应地编写该事件的处理块,例如,通过使用系统字段,如控制语句(IF 和CASE)中的 SY-LSIND 或 SY-PFKEY。<p>用户垂直滚动次列表时,系统将保留页眉而只滚动页眉下的列表行 。<p>列表中的消息<p>ABAP/4 允许您根据错误的严重程度通过显示影响程序流的消息对错误或有疑问的用户输 入做出反应 。处理消息是对话编程中详细描述的主题。消息是通过语言、双字符标识和三个数字的号码存储的。可以为输出的各种消息分配不同消息类型。消息对程序流的影响取决于消息类型。<p>在程序中使用 MESSAGE 语句静态或动态地输出信息,并确定信息类型 。 语法:REPORT <rep> MESSAGE-ID <id>.<p>26<p>由于该语句的作用,报 表 <rep> 可以使用存储标识 <id> 下表格T100 中的所有消息。如果动态地指定消息标识,则可以忽略此 选项。<p>要静态地指定消息号, 请使用:<p>语法:MESSAGE <c> <num> [WITH <f1> ... <f4>].<p>该语句输出存储在号码 <num> 下表格T100 中的消息, 它的标识与 REPORT 语句中的标识相同,与消息类型 <c> 一样。<p>要在运行时动态地指定消息标识、 类型和号码 ,请使用:<p>语法:MESSAGE ID <id> TYPE <c> NUMBER <num> [WITH <f1> ... <f4>]. 该语句输出其标识、号码和类型存储在字段 <id>、 <num> 和 <c> 中的消息。 对该语句, 不需要 REPORT 语句中的 MESSAGE-ID 选项。<p>消息可以有五种不同类型。列表处理期间,这些消息类型有下列作用 :<p>A (=终止) :系统在对话窗口中显示该消息类型的消息。用户使用 ENTER 确认信息之后,系统终止整个事务(例如,SE38) 。<p>E(=错 误)或 W(=警告 ):系统在状态行中显示该消息类型的消息。用户选择 ENTER 之后,系统将按下列情况运作:<p>创建基本列表时,系统终止报表。<p>创建次列表时,系统终止相应处理块,并继续显示前面的列表级 ,如图1-18所示。<p>图1-18<p>I(=信息) :系统在对话窗口中显示该消息类型的消息。用户选择 ENTER 之后,系统在当前程序位置继续处理<p>S(=成功) :在输出屏幕上,系统在当前创建的列表的状态行中显示该消息类型的消息。 字符‘&’ 在消息中起占位符的作用。如果使用 WITH 选项,系统用字段 <fi> 的内容替代消息中的占位符‘&’ ,并根据号码替代数字化的占位符 ‘&I’。 要在信息中输出‘&’ ,必须写‘ &&’<p>用SE91调用 MESSAGE,一类的MESSAGE 最大的番号为 1000(0~999),如图1-19所示。<p>27<p>图1-19<p>调用MESSAGE简单的方法为:按“模式”按钮,出现界面如图1-20所示。<p>图1-20<p>执行MESSAGE的后续动作:<p>S: 状态栏的图标 继续执行以后的代码 E: 状态栏的图标 停止<p>I: 状态栏的图标 继续执行以后的代码<p>从程序中触发事件<p>不是使用户通过输出屏幕上的行为触发交互式事件,而是您自己可以从程序中触发事件。 语法: SET USER-COMMAND <fc>.<p>28<p>此语句在完成当前列表后生效。系统显示列表之前,将触发与存储在 <fc> 中的功能代码对应的事件,而独立于应用的用户界面。这意味着,对于自定义的功能代码, 将发生 AT USER-COMMAND 事件,对于功能代码 PICK 和PF <nn>, 将发生事件<p>AT LINE-SELECTION 和 AT PF <nn>。<p>只有把光标置于列表行上时,功能代码 PICK 才触发事件。<p>对于为系统功能定义的功能代码, 系统不触发事件,而是执行相应行为。例如,要一起显示列表和“搜索”对话窗口,请在 <fc> 中指定'%SC' 。通过指定适当的滚动功能代码,可以在显示列表之前将它滚动到一定位置。<p>如果创建列表时使用好几个SET USER-COMMAND 语句,系统只执行最后一个语句。<p>从列表中读取行<p>系统内在地存储一个报表程序连续创建的所有列表。因此,可以从由当前会话创建的程序中访问任何列表,并且没有通过返回到前一列表级而删除它。<p>1、要在出现交互式列表事件之后读取行,请使用 READ LINE 语句。<p>语法:READ LINE <lin> [INDEX <idx>]<p>[FIELD VALUE <f1> [INTO <g1>] ... <fn> [INTO <gn>]] [OF CURRENT PAGE | OF PAGE<p>].<p>没有任何选项的语句存储列表中行 <lin> 的内容,在该列表上用 SY-LISEL 系统字段触发了事件( 索引 SY-LILLI) ,并把为此行存储的 HIDE 信息填写回相应字段中。至于 SY-LISEL 和 HIDE 区域,READ LINE 与交互式行 选择具有相同的效果。<p>如果选定的行 <lin> 存在,则系统将 SY-SUBRC 设置为 0,否则,将它设置为4。 选项有下列作用:<p>INDEX <idx> : 系统从级 <idx> 的列表中读取行的信息 。<p>FIELD VALUE <f1> [INTO <g1>] ... <fn> [INTO <gn>] :系统将行 <lin> 中变量 <fi> 的输出值解释为字符串 ,并将它们放到同一字 段 <fi> 中,或者使用 INTO 时,将它们放到字段 <gi> 中。重新填写字段时, 系统将应用转换规则。未出现在行中的字段不 影响目标字段。如果字段在行中出现了好几次 ,则系统只使用第一个字段。<p>系统使用输出格式,即包括所有格式化字符,传输字段内容。这可能 致无法交换,例如将 编辑字符转换为十进制 符或其它字符。<p>由于这种情况下无法使用 HIDE 技术,所以主要使用该选项处理接受输入的列表字段中的用户输入。<p>OF CURRENT PAGE :对于此选项 ,<lin> 不是整个列表的行号,而是定址列表当前显示页的行号。 系统字段 SY-CPAGE 存储相应页号。<p>OF PAGE<p>:对于此选项 ,<lin> 不是整个列表的行号,而是定址列表<p>页上的行号 。<p>2、取决于读取行的内容, 可能希望从同一行中重新填写字段 。请在程序中使用 READ CURRENT LINE 语句。此语句连续两次读行。<p>语法 :READ CURRENT LINE [FIELD VALUE <f1> [INTO <g1>] ...].<p>此语句通过交互式事件 (F2) 或通过 READ LINE 读取前面读取过的行。 FIELD VALUE 选项与 READ LINE 的相同。<p>29<p>在光标位置处读列表<p>1、要在交互式事件中检索光标位置处的信息,请使用 GET CURSOR 语句引用字段或行。<p>语法:GET CURSOR FIELD <f> [OFFSET <off>] [LINE <lin>] [VALUE <val>] [LENGTH <len>].<p>在用户行为中,该语句将光标位置处的字段名传送到变量 <f> 中。如果光标在字段上 ,则系统将 SY-SUBRC 设置为 0,否则,将其设置为 4。<p>系统传送子程序的全局变量、常量 、字段符号或引用参数的名称。对子程序的文字、局部字段和 VALUE 参数,系统将 SY-SUBRC 设置为 0,但将 SPACE 作为名称传输。<p>选项有下列作用:<p>OFFSET <off> :字段 <off> 包含光标在字段中的位置。如果光标在第一列上,则 <off> = 0。<p>LINE <lin> :字段 <lin> 包含光标所在列表行的行号 (SY-LILLI)。<p>VALUE <val> :字段 <val> 包含光标所在字段的字符串输出表示法。表示法包括格式化字符。<p>LENGTH <len> :字段 <len> 包含光标所在字段的输出长度。 2、关于行的信息<p>语法:GET CURSOR LINE <lin> [OFFSET <off>] [VALUE <val>] [LENGTH <len>]. 此语句将用户行为期间光标所在行的行号传输到变量 <lin> 中。如果光标在列表行上,则系统将 SY-SUBRC 设置为 0,否则,将其设置为 4。可以使用此语句避免用户选择无效行。<p>选项有下列作用:<p>OFFSET <off> : 字段 <off> 包含光标在列表行中的位置。如果光标在第一列上,则 <off> = 0。<p>VALUE <val> :字段 <val> 包含光标所在行的字符串输出表示 法。表示法包括格式化字符 LENGTH <len> :字段 <len> 包含光标所在行的输出长度。<p>传递列表属性<p>处理列表级时,如果需要知道创建列表时忘记存储在变量中的属性, 或者如果使用另一个报表创建的列表级,则请使用 DESCRIBE LIST 语句。 1、检索列表的行数或列表的页数<p>语法:DESCRIBE LIST NUMBER OF LINES | PAGES <n> [INDEX <idx>].<p>此语句将列表级 <idx> 的行数或页数写入变量 <n> 中。如果索引为 <idx> 的列表不存 在,则系统将 SY-SUBRC 设置为非 0,否则,将其设置为 0。 2、检索特定行号的页码<p>语法:DESCRIBE LIST LINE <lin> PAGE <pag> [INDEX <idx>].<p>此语句将列表行号 <lin> 所在的列表级 <idx> 的页号写入变量 <pag> 中。系统按照下列情况设置 SY-SUBRC: 如果索引为 <idx> 的列表不存在,则设置为 8;如果行号为 <lin> 的行不存在 ,则设置为 4;否则,设置为 0。 3、检索特定页的属性<p>语法:DESCRIBE LIST PAGE <pag> [INDEX <idx>] [<options>]<p>30<p>此语句检索列表级 <idx> 的属性,该属性是在页 <pag> 的 <options> 中指定的。 系统按照下列情况设置 SY-SUBRC: 如果索引为 <idx> 的列表不存 在,则设置为 8;如果页 号为 <pag> 的页不存在 ,则设置为 4;否则,设置为 0。<p>该语句的 <options> 是:<p>LINE-SIZE <col> :将页宽度写入变量 <col> 中。 LINE-COUNT <len> :将页长度写入变量 <len> 中。 LINES <lin> :将显示行的行号写入变量 <lin> 中。<p>FIRST-LINE <lin1> :将第一行的绝对行号写入变量 <lin1> 中。 TOP-LINES <top> :将页眉行的行号写入变量 <top> 中。 TITLE-LINES <tit> :将标准页眉表头的行号写入变量 <tit> 中。 HEAD-LINES <head> :将标准页眉表头的列号写入变量 <head> 中。 END-LINES <end> :将页脚行行号写入变量 <end> 中。<p>将光标设置到显示列表行的特定字段<p>语法:SET CURSOR FIELD <f> LINE <lin> [OFFSET <off>].<p>此语句将 <lin> 行上的光标设置到名称存储在 <f> 中的字段上 。如果字段在行上不止出现一次, 则系统将光标设置到第一个字段上 。如果字段没有出现在行上,或者如果它在显示区域之外 ,则系统将忽略此语句 。<p>在最后这种情况中, 使用 SCROLL 语句将该行滚动到窗口的可见区域。使用OFFSET 选项将光标设置到存储在 <f> 中的字段的 <off> 位置。<off> = 0 表示第一位置。<p>将光标设置到输出窗口中列表的特定行<p>语法:SET CURSOR LINE <lin> [OFFSET <off>].<p>此语句将光标设置到行 <lin>。 如果该行不出现在列表中或窗口的可见区域内 ,则系统忽 略该语句。 在后一种情况中,请首先使用 SCROLL 语句将该行滚动到窗口的可见区域。<p>使用 OFFSET 选项将光标设置到 <off> 列和 <lin> 行。<off> = 0 表示第一列 。如果该位置在列表的可见区域之外,则系统忽略该语句 。<p>2 报表取数<p>报表中取数一般按照屏幕字段给定的用户输入条件,在相应的数据库表里面取满足条件的数据。如果需要在多张表里面取数据,可以将要取的数据表JOIN起来,但是这样可能会导致程序索引无效,影响程序的取数效率。因此可用表驱动形式,具体语法如下:<p>SELECT <f1> <f2> …|* INTO <itab1> FROM <dbtable><p>FOR ALL ENTRIES IN <itab2> WHERE <f3> = <itab2>-<f31> AND <f4> = <itab2>-<f41> …<p>AND <fn> = …<p>31<p>….<p>条件字段(如f3)要与内表中的字段(如f31)类型一样<p>SELECT语句中,WHERE后面的条件如果遇到PARAMETER,则要用“字段 = 参数名”,而遇到SELECT-OPTION时要用“字段 IN 参数名”,CHECKBOX和RADIOBUTTON一般用于取数的外部条件控制,而不直接用在SQL语句中<p>在取数的时候,WHERE后面的条件尽量用数据库的索引,特别是一些业务数据表。随着数据量的增大,若不用索引,程序会顺序读取数据表中的条目,从而取数会明显变慢 从有些类型的数据表中取数很慢,例如BSEG,如果程序中要从它里面取数,最好先通过BKPF或者BSIS/BSAS/BSIK/BSAK/BSID/BSAD中先将要取的数据筛选一次,然后以Key作为条件从里面取数<p>尽量在程序中将需要的数据一次性取到程序内表中,然后通过内表去筛选所要的数据,这样会使程序的执行效率更高,从而用以时间换空间的方法使报表程序得到优化<p>3 数据整理<p>一般开发报表的时候,从数据库表中取出的数据不能直接展示给用户,都要经过处理。具体的处理方法则要根据用户的要求而定<p>4 WRITE输出<p>现在很少用WRITE输出来展示报表,因其不美观,且开发的时候容易出错,格式不好控制,现在的报表多数是用ALV的形式展示<p>5 报表编制的实例<p>Z2011_3750_PO.xls<p>6 扩展<p>屏幕控制<p>选择屏幕的元素有三种模式,即:<p>screen-input、screen-invisible、screen-active screen-input = '0'时,该输入框灰掉,只输出信息<p>screen-invisible = '1'时,该输入框输入的东西会用“*”做掩码,适合输入密码 screen-active = '0'时,不显示该元素 Example:<p>REPORT ZZTEST_3750.<p>PARAMETERS: P_STR0(10) TYPE C,<p>P_STR1(10) TYPE C,<p>32<p>P_STR2(10) TYPE C. AT SELECTION-SCREEN OUTPUT. PERFORM FRM_SET_SCREEN.<p>FORM FRM_SET_SCREEN . LOOP AT SCREEN.<p>IF screen-name = 'P_STR0' . screen-input = '0'. \"灰掉,只输出 ENDIF.<p>IF screen-name = 'P_STR1'.<p>screen-invisible = '1'. \"*做掩码,适合输入密码 ENDIF.<p>IF screen-name = 'P_STR2'. screen-active = '0'. \"不显示 ENDIF.<p>MODIFY SCREEN. ENDLOOP. ENDFORM .<p>设置下拉框<p>有时候有需要为一个文本输入框做下拉菜单,这可以用ABAP程序实现,示例代码如下: TYPE-POOLS VRM. \"下拉的数据类型<p>DATA: T_VVA TYPE VRM_VALUES, \"下拉数据源 W_VVA LIKE LINE OF T_VVA.<p>PARAMETERS FLD1(20) TYPE C. \"屏幕下拉组件名称<p>AT SELECTION-SCREEN OUTPUT. PERFORM FRM_SET_VALUE.<p>FORM FRM_SET_VALUE. \"增加两条记录 W_VVA-KEY = '1'. W_VVA-TEXT = '重庆'. APPEND W_VVA TO T_VVA. CLEAR W_VVA.<p>W_VVA-KEY = '1'. W_VVA-TEXT = '上海'. APPEND W_VVA TO T_VVA.<p>33<p>CLEAR W_VVA. ...<p>\"调用函数,将内表数据赋给组件FLD1 CALL FUNCTION 'VRM_SET_VALUES' EXPORTING<p>ID = 'FLD1' \"对应屏幕中的下拉控件的name 必须大写 VALUES = T_VVA \"选择的内表数据 EXCEPTIONS<p>ID_ILLEGAL_NAME = 1 OTHERS = 2.<p>IF SY-SUBRC <> 0.<p>MESSAGE '下拉菜单未成功设置' TYPE 'E'. ENDIF. ENDFORM.<p>下拉组件是可以设置 FUNCTIONCODE的,所以一样可以触发点击事件<p>vrm_values为一个内表 结构是VRM_VALUE 包含两个字段 一个是key 一个是value 就是实际值和显示值<p>自制Search Help<p>可以用ABAP程序实现屏幕字段的Search Help,可自定义设置Search Help中的内容 示例代码如下:<p>FORM FRM_SET_SEARCHHELP USING P_DATA.<p>DATA: IT_TIDNRV TYPE TABLE OF HELP_VALUE, \"Search Help中的列 WA_TIDNRV TYPE HELP_VALUE.<p>DATA: BEGIN OF WA_BUKRS, \"Search Help中列字段对应的值 BUKRS LIKE T001-BUKRS, BUTXT LIKE T001-BUTXT, END OF WA_BUKRS.<p>DATA: BEGIN OF WA_BUKRS_VALUE, STRING(60),<p>END OF WA_BUKRS_VALUE.<p>DATA: IT_BUKRS LIKE TABLE OF WA_BUKRS,<p>IT_BUKRS_VALUE LIKE TABLE OF WA_BUKRS_VALUE.<p>34<p>\"公司代码<p>WA_TIDNRV-TABNAME = 'ZFI32_CONFIG'. WA_TIDNRV-FIELDNAME = 'BUKRS'.<p>WA_TIDNRV-SELECTFLAG = 'X'. \"选择的时候进入输入框的字段设为‘X’ APPEND WA_TIDNRV TO IT_TIDNRV. CLEAR WA_TIDNRV.<p>\"公司名称<p>WA_TIDNRV-TABNAME = 'T001'. WA_TIDNRV-FIELDNAME = 'BUTXT'. APPEND WA_TIDNRV TO IT_TIDNRV.<p>\"Search help的所有值 SELECT DISTINCT BUKRS<p>INTO CORRESPONDING FIELDS OF TABLE IT_BUKRS<p>FROM ZFI32_CONFIG. \"屏幕字段P_DATA的值为表ZFI32_CONFIG中的所有值<p>LOOP AT IT_BUKRS INTO WA_BUKRS. \"取公司名称<p>SELECT SINGLE BUTXT INTO WA_BUKRS-BUTXT FROM T001<p>WHERE BUKRS = WA_BUKRS AND SPRAS = SY-LANGU. \"设置Search help单元格的值<p>MODIFY IT_BUKRS FROM WA_BUKRS INDEX SY-TABIX. WA_BUKRS_VALUE-STRING = WA_BUKRS-BUKRS. APPEND WA_BUKRS_VALUE TO IT_BUKRS_VALUE. CLEAR: WA_BUKRS_VALUE.<p>WA_BUKRS_VALUE-STRING = WA_BUKRS-BUTXT. APPEND WA_BUKRS_VALUE TO IT_BUKRS_VALUE. CLEAR: WA_BUKRS_VALUE. ENDLOOP.<p>\"获取Search help 的值<p>CALL FUNCTION 'HELP_VALUES_GET_WITH_TABLE' EXPORTING<p>FIELDNAME = 'BUKRS'<p>35<p>TABNAME = 'ZFI32_CONFIG' * TITLE_IN_VALUES_LIST = '选择公司代码' IMPORTING<p>SELECT_VALUE = P_DATA TABLES<p>FIELDS = IT_TIDNRV VALUETAB = IT_BUKRS_VALUE EXCEPTIONS<p>FIELD_NOT_IN_DDIC = 1 MORE_THEN_ONE_SELECTFIELD = 2 NO_SELECTFIELD = 3 OTHERS = 4. IF SY-SUBRC <> 0.<p>MESSAGE '自定义Search Help失败' TYPE 'E'. ENDIF.<p>ENDFORM. \" FRM_SET_SEARCHHELP 上面的代码设置的Search Help的格式为 公司代码 公司名称 1000 公司1 1001 公司2<p>选择后,P_DATA的值为公司代码的值<p>36<p> <div class="preview-ft"> <div class="preview-title"> <p style="color: red;"><strong>因篇幅问题不能全部显示,请点此查看更多更全内容</strong></p> <div class="model-fold-cover-bd"><a href="https://www.tang5.com/mluiog/nreigeaoukk/" target="_blank"><span>查看全文</span><i class="iconfont icon-chakangengduo"></i></a></div> </div> </div> <script type="text/javascript" src="https://jss.efsc.cn/pc/wenzhang/detail_left.js"></script> </div> <div class="glfra_f"> </div> </div> <script type="text/javascript" src="https://jss.efsc.cn/pc/wenzhang/wenzhang/detail_foot.js"></script> <script type="text/javascript" src="https://jss.efsc.cn/pc/share_right_gg1.js"></script> <script type="text/javascript" src="https://jss.huatuo6.com/pc/share_right_xgzx.js"></script> <script type="text/javascript" src="https://jss.efsc.cn/pc/share_right_gg2.js"></script> <script type="text/javascript" src="https://jss.huatuo6.com/pc/share_right_rmyd.js"></script> </div> <div class="n_right"> <script type="text/javascript" src="https://jss.efsc.cn/pc/share_cebian_gg1.js"></script> <script type="text/javascript" src="https://jss.huatuo6.com/pc/share_cebian_rmht.js"></script> <script type="text/javascript" src="https://jss.efsc.cn/pc/share_cebian_gg2.js"></script> <script type="text/javascript" src="https://jss.huatuo6.com/pc/share_cebian_rmtw.js"></script> <script type="text/javascript" src="https://jss.efsc.cn/pc/share_cebian_gg3.js"></script> <script type="text/javascript" src="https://jss.huatuo6.com/pc/share_cebian_wntj.js"></script> </div> </div> <div class="foot"> <div class="smain"> <div class="foot_ano clearfix"> <!-- <div class="foot_logo"> <img src="images/logo_w.png" alt="AI游中国" /> </div> --> <div class="foot_mesg"> <p> Copyright © 2019-<span class="currentYear"></span> efsc.cn 版权所有 <a href="https://beian.miit.gov.cn/" target="_blank" style="color:#fff"></a> </p> <p> 违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com </p> <p> 本站由北京市万商天勤律师事务所王兴未律师提供法律服务 </p> </div> </div> </div> </div> <script type="text/javascript"> const currentYear = new Date().getFullYear(); $('.currentYear').html(currentYear) </script>