第七章 SAP应用界面开发及ABAP报表设计
第一节 SAP屏幕基本元素的创建
在第2章我们介绍了基本屏幕元素的概念,本节将重点介绍屏幕元素的种类及创建方法。
屏幕的创建通过ABAP编辑器:SE38或SE81来实现,SAP的基本屏幕元素定义语句包括:SELECT-OPTIONS,PARAMETERS,SELECTION-SCREEN等,下面将具体讲解其语法及属性。
7.1.1 SELECT-OPTIONS对象
1.SELECT-OPTIONS基本语法及定义
SELECT-OPTIONS通常用于参照一数据库字段来建立数据输入域,其定义对象命名长度不能超过8位,其产生的屏幕对象最大输入长度为18位,定义语法如下,执行效果如图7-1所示:
SELECT-OPTIONS <sel> FOR <f>.
例7-1 SELECT-OPTIONS定义代码。
REPORT ZSCREEN_TEST01.
SELECT-OPTIONS:DATA FOR SY-DATUM.
图7-1 创建SELECT-OPTIONS 输入域
单击屏幕右边的 按钮,将弹出多项数值输入界面,如图7-2所示。
通过SELECT-OPTIONS多值输入,可以发现通过SELECT-OPTIONS产生的是一个内表,该内表可存储一行到多行值。
图7-2 SELECT-OPTIONS 多值输入界面
可以通过内表具体栏位来获取输入参数值,如表7-1所示。
表7-1 SELECT-OPTIONS内表结构
数据在SELECT-OPTIONS内表中保存方式如图7-3所示,如输入值为01/01/2009~12/31/2009,系统会将输入日期型数据自动转换为数字格式,BT代表取两者之间日期范围,如图7-3所示。
图7-3 SELECT-OPTIONS 内表值
2.SELECT-OPTIONS的语法扩展
(1)默认值的设定
... DEFAULT g:定义单一默认值。
... DEFAULT g ... OPTION xx ... SIGN s:定义含判断条件的单一默认值。
... DEFAULT g TO h:定义默认值的取值范围。
... DEFAULT g TO h ... OPTION op ... SIGN s:设置默认值的取值范围及判断条件。
创建一SELECT-OPTIONS屏幕元素,默认值前三个字母等于“SAN”,如例7-2所示。
例7-2 SELECT-OPTIONS默认参数。
REPORT ZSCREEN_TEST02.
SELECT-OPTIONS SO_CITY FOR CITY DEFAULT 'SAN*' OPTION CP SIGN E.
(2)... MEMORY ID pid
将SELECT-OPTIONS分配参数名并存储在SAP内存,参数名长度不能超过三位。
(3)... NO-DISPLAY
将SELECT-OPTIONS设置为隐藏,不会在屏幕上输出。
(4)... LOWER CASE
输入值中不允许输入小写字符,否则会自动转换为大写。
(5)... OBLIGATORY
限制该SELECT-OPTIONS为必须输入的项目,执行中系统会提示。
(6)... NO-EXTENSION
限制该SELECT-OPTIONS只能输入一行数据,输入多行按钮 被隐藏。
(7)... NO INTERVALS
定义该SELECT-OPTIONS只有一个输入单元,即LOW字段,后一项被隐藏。
(8)... VISIBLE LENGTH vlen:
定义所显示数据的长度。
OPEN SQL可以直接调用SELECT-OPTIONS中的输入值作为执行参数,如例7-3所示。
例7-3 在OPEN SQL中调用SELECT-OPTIONS值作为查询条件。
REPORT ZSCREEN_TEST03.
TABLES: MARA.
*参考数据字典定义一PARAMETERS对象
SELECT-OPTIONS: matnr FOR MARA-matnr OBLIGATORY NO INTERVALS.
select SINGLE * INTO MARA FROM MARA WHERE MATNR IN matnr.
WRITE: MARA.
7.1.2 PARAMETERS对象
1.PARAMETERS的基本语法及定义
PARAMETERS可以参照数据字典具体字段或自定义数据类型创建文本输入域以及单选框/复选框等,与SELECT-OPTIONS不同的是,PARAMETERS只能创建一个单一的输入域且最多只能输入一行,其定义对象命名长度不能超过8位,显示长度随参照数据对象变化。PARAMETERS定义后不会产生内表,可作为变量在程序中应用,基本语法如下,具体使用如例7-4所示:
PARAMETERS p.
例7-4 PARAMETER对象定义代码
REPORT ZSCREEN_TEST04.
PARAMETERS: MATNR LIKE MARA-MATNR. "创建输入域
PARAMETERS: TYPE AS CHECKBOX . "创建CHECKBOX
PARAMETERS:P1 RADIOBUTTON GROUP GRP1 DEFAULT 'X', "创建RadioButton组
P2 RADIOBUTTON GROUP GRP1,
P3 RADIOBUTTON GROUP GRP1.
图7-4 创建PARAMETERS 屏幕对象
2.PARAMETERS的常用扩展语法
DEFAULT f:定义默认值。
TYPE type:参照某一类型对象定义PARAMETERS。
DECIMALS dec:定义小数位,对输入参数将自动格式化,该语法只对P类型有效。
LIKE g:参照某一字典对象定义PARAMETERS。
MEMORY ID pi:将PARAMETERS存储在SAP内存,参数名长度不能超过三位。
NO-DISPLAY:将PARAMETERS设置为隐藏,不会在屏幕上输出。
LOWER CASE:输入值中不允许输入小写字符,否则会自动转换为大写。
OBLIGATORY:限制该SELECT-OPTIONS为必须输入项,执行中系统会提示。
AS CHECKBOX:创建CHECKBOX对象。
RADIOBUTTON GROUP radi:建立分组单选框。
VISIBLE LENGTH vlen:定义显示长度。
USER-COMMAND ucom:为创建对象分配对象名,该值保存在内存中可供其他对象操作。
AS LISTBOX VISIBLE LENGTH vlen:创建一个下拉列表,并指定输出长度,对列表输出数据的填充如例7-5,执行效果如图7-5所示。
例7-5 PARAMETER定义下拉列表代码
REPORT ZSCREEN_TEST_LISTBOX.
*定义一下拉列表对象,其可视数据长度一般比输出数据长度大2用于放置下拉图标
PARAMETER:P_LANG(20) AS LISTBOX VISIBLE LENGTH 22.
DATA:INIT "该变量用于记录下拉列表数值是否初始化,否则每次屏幕初始化都会重新加载重复数据
AS SELECTION-SCREEN OUTPUT.
PERFORM SETLIST.
FORM SETLIST. "子程序用于加载列表中的数据
TYPE-POOLS VRM.
DATA VALUES TYPE VRM_VALUES WITH HEADER LINE.
*对内表加载值
VALUES-KEY = 'CHINESE'. APPEND VALUES.
VALUES-KEY = 'AMERICAN'. APPEND VALUES.
VALUES-KEY = 'ENGLISH'. APPEND VALUES.
VALUES-KEY = 'FRENCH'. APPEND VALUES.
IF INIT IS INITIAL.
CALL FUNCTION 'VRM_SET_VALUES' "调用函数对下拉列表对象传递数据
EXPORTING
ID = 'P_LANG' "下拉列表对象名
VALUES = VALUES[] "列表中加载的数据
EXCEPTION.
ID_ILLEGAL_NAME = 1
OTHERS = 2.
ENDIF.
INIT = 'X'. "记录初始化状态
ENDFORM.
** 补充: 引用字典对象TYPE-POOLS VRM用于保存列表对象,也可自定义一内表
** DATA:BEGIN OF VALUES OCCURS 0,
** KEY(40) TYPE C,
** TEXT(40) TYPE C,
** END OF VALUES.
图7-5 输出下拉列表
7.1.3 Text Elements(文本元素)对象
在SELECT-OPTIONS与PARAMETERS的设计中,我们可发现它们在屏幕上显示的名称都是直接等于定义名,但在实际中,我们需要提供某一字段的完整名称以方便用户理解,例如某物料字段名MATNR,我们要求其在屏幕显示字段名为“Material No”。那程序设计中该怎样实现这一需求呢?SAP提供了Text elements组件,能方便地实现栏位名的自定义。
使用该功能必须先进入ABAP编辑环境,操作路径在主菜单:GoTo → Text elements,文本的维护亦可通过TCode:SE32来实现,如图7-6所示。
Text element共包括三个部分,而且设置值与当前使用的语言版本有关。若程序存在多个语言版本,则需要在相关语言环境中分别维护其栏位及字段名称,这样也就保证了在不同语言环境中用户界面语言的自适。
图7-6 Text elements设置路径
1.List heading
用于定义Report标题名称及描述,如图7-7所示。
图7-7 List heading设置界面
List heading用于实现Report的标题,Column heading为附加说明。标题只能输入一行,但Column heading可以输入多行,并可通过工具栏按钮 进行增减。运行界面如图7-8所示。
图7-8 List heading设置后运行界面
2.Selection texts
用于定义程序中已存在的屏幕元素名称,如图7-9所示。
图7-9 Select text设置界面
Select text的设置界面如图7-9,在程序完成并激活后才能进行此项目的维护,Name为程序中所定义的对象名称,为系统自动引用。Text为该对象的描述,由开发人员按需求修改,完成后作为该字段在屏幕上的显示描述。Dictionary ref.用于设置是否参考数据字典中该元素对应的Data element命名,该选项只对参考数据字典定义的元素有效。如本例中MATNR参考MARA-MATNR创建(程序定义请参考例7-2)。
Text输入长度最多为30位。设置完成后保存并激活。我们可以发现原来的MATNR及TYPE字段都变成了设置描述,这样更方便操作和理解,如图7-10所示。
图7-10 Select text设置后运行界面
3.Text symbols
用于实现自定义文本及符号。
Text symbols设置界面可参考图7-11。开发人员可按需求定义相关文本或符号,该文本使用对象为Selection-Screen所定义的对象,Selection-Screen的使用方法在下一节介绍。Sym为一个三位的标识,作为程序中引用对象名.Text为该对象的描述,dlen表示输入的文本或符号的长度,mLen表示该文本的最大长度,如图7-11所示。
图7-11 Text symbols设置界面
程序界面中可加入相关图标符号,所有符号都有一个Code值相对应,如某符号Code为4A,那么可以在Text symbols通过@符号来进行引用,如@4A@,具体Code内容可参考程序“RSTXICON”,通过TCode:SE38执行该程序,选择“ICON AS ABAP LIST”选项并执行,可以查询到所有ICON相关信息,执行界面如图7-12所示。
图7-12 SAP ICON LIST查询
单击执行按钮将显示所有ICON及其信息,如图7-13所示。
图7-13 SAP ICON LIST所有信息界面
Text symbols设置后需要通过程序来进行引用,如例7-6所示。
例7-6 Text symbols的引用。
REPORT ZSCREEN_TEST05 .
PARAMETERS: MATNR LIKE MARA-MATNR.
PARAMETERS: TYPE AS CHECKBOX .
SELECTION-SCREEN skip. "换行
SELECTION-SCREEN COMMENT 1(20) TEXT-A01.
SELECTION-SCREEN COMMENT 30(30) TEXT-A02.
该例执行效果如图7-14所示。
图7-14 Text symbols的引用运行界面及代码
7.1.4 SELECTION-SCREEN对象
SELECT-SCREEN语句用于创建屏幕的框架结构,主要包括屏幕元素的创建、子屏幕的创建等。子屏幕主要分两种,一种为Include Screen,可以通过Report端程序直接调用;另一种为SubScreen,需要通过Screen Painter所创建的屏幕引用。SELECT-SCREEN应用的具体语法如下:
(1)SELECTION-SCREEN BEGIN OF SCREEN scr.
........
SELECTION-SCREEN END OF SCREEN scr.
该语法用于定义一个Include Screen,可以通过CALL方法在Report程序中引用,CALL屏幕窗体时加入STARING AT ... ENDING AT ... 参数可以将所定义屏幕窗体作为一个新的对话框窗体来引用,并指定其创建的具体大小及位置,具体定义如例7-7所示。
例7-7 通过SELECTION-SCREEN定义窗体。
REPORT ZSCREEN_TEST06 .
CALL SCREEN 123
starting at 10 10
ending at 80 10.
SELECTION-SCREEN BEGIN OF SCREEN 123 AS WINDOW TITLE TEXT-A01.
PARAMETERS: MATNR LIKE MARA-MATNR.
PARAMETERS: TYPE AS CHECKBOX .
SELECTION-SCREEN END OF SCREEN 123.
执行该例代码,执行界面如图7-15所示。
图7-15 调用屏幕自定义子窗体
注意,当从一个主屏幕中来调用其程序中的另一窗体时,必须使用CALL SELECTION-SCREEN的方法,如例7-8所示。
例7-8 通过SELECTION-SCREEN调用Include Screen。
REPORT ZSCREEN_TEST07 .
PARAMETERS: TYPE AS CHECKBOX .
CALL SELECTION-SCREEN SCREEN 123.
SELECTION-SCREEN BEGIN OF SCREEN 123 AS WINDOW TITLE TEXT-A01.
PARAMETERS: MATNR LIKE MARA-MATNR.
SELECTION-SCREEN END OF SCREEN 123.
(2)SELECTION-SCREEN BEGIN OF SCREEN scr AS SUBSCREEN.
该语法用于定义一个Subscreen,Subscreen主要应用于Screen Painter所创建屏幕,具体调用将在后续章节介绍。
(3)SELECTION-SCREEN BEGIN OF BLOCK block.
....
SELECTION-SCREEN END OF BLOCK.
该语法在屏幕中定义一个BLOCK,其扩展语法包括:
... WITH FRAME:创建一个框架。
... TITLE title:创建一个带标题的框架。
... NO INTERVALS:所创建的框架中限制SELECT只有一个输入项。
SELECTION-SCREEN BLOCK在程序中的具体应用请参考例7-9。
例7-9 通过SELECTION-SCREEN定义模块。
REPORT ZSCREEN_TEST07 .
DATA:MAT LIKE MARA-MATNR.
SELECTION-SCREEN BEGIN OF BLOCK block1.
SELECT-OPTIONS:MATNR1 FOR MAT.
SELECTION-SCREEN END OF BLOCK block1 .
SELECTION-SCREEN BEGIN OF BLOCK block2 WITH FRAME.
SELECT-OPTIONS:MATNR2 FOR MAT.
SELECTION-SCREEN END OF BLOCK block2 .
SELECTION-SCREEN BEGIN OF BLOCK block3
WITH FRAME
TITLE TEXT-A01.
SELECT-OPTIONS:MATNR3 FOR MAT.
SELECTION-SCREEN END OF BLOCK block3 .
SELECTION-SCREEN BEGIN OF BLOCK block4
WITH FRAME
TITLE TEXT-A01
NO INTERVALS .
SELECT-OPTIONS:MATNR4 FOR MAT.
SELECTION-SCREEN END OF BLOCK block4 .
以上代码包含了SELECTION-SCREEN定义的多种状态,其输出界面如图7-14所示。
图7-16 BLOCK输出界面
(4)SELECTION-SCREEN INCLUDE
参照某一个已经定义的屏幕元素来创建,如例7-10所示。
例7-10 调用已存在的屏幕元素。
REPORT ZSCREEN_TEST08 .
CALL SCREEN 1234.
SELECTION-SCREEN BEGIN OF SCREEN 1111.
SELECTION-SCREEN BEGIN OF BLOCK BL1.
SELECT-OPTIONS SEL0 FOR SY-REPID.
PARAMETERS PAR0.
SELECTION-SCREEN END OF BLOCK BL1.
SELECTION-SCREEN END OF SCREEN 1111.
SELECTION-SCREEN BEGIN OF SCREEN 1234.
SELECTION-SCREEN INCLUDE BLOCKS BL1. "参照SCREEN 1111中的BLOCK
SELECTION-SCREEN END OF SCREEN 1234.
(5)SELECTION-SCREEN ULINE
输出横线,必须用在BLOCK中才生效。
(6)SELECTION-SCREEN SKIP n
在BLOCK中产生换行。
(7)SELECTION-SCREEN POSITION pos
在BLOCK中产生空格。
(8)SELECTION-SCREEN BEGIN OF LINE.
....
SELECTION-SCREEN END OF LINE.
将所产生的屏幕元素控制在一行。
(9)AT SELECTION-SCREEN
用于屏幕输入检验,其扩展语法如下:
... ON <field> :该语法用于控制屏幕元素输入时的遇错处理,检查某具体输入字段(SELECT-OPTIONS或PARAMETERS)是否完整或正确,若输入有错或不满足条件,其他字段会变灰色直到该字段输入正确,各属性如下,具体使用如例7-11所示。
... ON VALUE-REQUEST FOR <field-low/high> : SELECT-OPTIONS按〈F4〉键时触发该事件;
... ON HELP-REQUEST FOR <field low/high> :SELECT-OPTIONS按〈F1〉键时触发该事件;
... ON RADIOBUTTON GROUP <radio>:控制RadioButton组值的输入;
... ON BLOCK <block>:控制框架中的屏幕元素值的输入;
... OUTPUT:用于屏幕输出时的各屏幕元素值的管控;
... ON EXIT-COMMAND:用于响应“Back”、“Cance”、及“Exit”等事件。
例7-11 定义AT SELECTION-SCREEN ON 在程序中的不同调用方法。
SELECT-OPTIONS SEL0 FOR SY-TVAR0.
SELECTION-SCREEN BEGIN OF BLOCK BL0.
SELECT-OPTIONS SEL1 FOR SY-TVAR1.
SELECTION-SCREEN BEGIN OF BLOCK BL1.
PARAMETERS P1 RADIOBUTTON GROUP RAD1.
PARAMETERS P2 RADIOBUTTON GROUP RAD1.
SELECTION-SCREEN BEGIN OF BLOCK BL2.
PARAMETERS P3.
SELECTION-SCREEN END OF BLOCK BL2.
SELECT-OPTIONS SEL2 FOR SY-TVAR2.
SELECTION-SCREEN END OF BLOCK BL1.
SELECTION-SCREEN END OF BLOCK BL0.
AT SELECTION-SCREEN ON SEL1.
AT SELECTION-SCREEN ON RADIOBUTTON GROUP RAD1 .
AT SELECTION-SCREEN ON P3 .
AT SELECTION-SCREEN ON BLOCK BL1.
AT SELECTION-SCREEN ON BLOCK BL2.
(10)SELECTION-SCREEN PUSHBUTTON fmt name USER-COMMAND ucom
用于在selection screen中产生一个按钮(pushbutton),fmt name 为定义该按钮的属性值,可以对其赋值描述及添加图标,USER-COMMAND ucom定义该按钮在Screen中的组件名。对按钮属性赋值可包括两种方式,如例7-12所示。
例7-12 定义pushbutton。
REPORT ZSCREEN_TEST09 .
include:<icon>. "按钮中加入图标必须调用该类型库
SELECTION-SCREEN PUSHBUTTON /1(20) PUBU1 USER-COMMAND ABCD.
SELECTION-SCREEN SKIP. "加入空行以便区分
SELECTION-SCREEN PUSHBUTTON /1(20) PUBU2 USER-COMMAND ABCD.
AT SELECTION-SCREEN OUTPUT.
MOVE 'My Button' TO PUBU1. "定义第一个按钮并赋值描述
WRITE ICON_OKAY AS ICON TO PUBU2. "定义第二个按钮并添加图标
CONCATENATE PUBU2 'My Button' INTO PUBU2
SEPARATED BY SPACE. "给第二个加上描述
更换按钮图标请参考TCode:ICON,上例输出界面如图7-17所示。
图7-17 pushbutton输出界面
SAP为事件驱动程序,运行中可以根据实际按钮事件来作出响应,通过该按钮名称来进行判断。我们会在本章最后以一具体事例来做整体介绍。
AT SELECTION-SCREEN.
IF SSCRFIELDS-UCOMM = 'ABCD'.
...
ENDIF.
(11)SELECTION-SCREEN COMMENT fmt name.
用于定义或修改本地元素的注释,包括Parameter、Checkbox Button等。例如Checkbox Button的描述,其在Selection texts中最长字段只有30位,通过SELECTION-SCREEN COMMENT语法可以按Text Symbols设置值对其属性重新定义,如例7-13所示。
例7-13 SELECTION-SCREEN COMMENT的使用。
REPORT ZSCREEN_TEST10 .
SELECTION-SCREEN BEGIN OF LINE .
SELECTION-SCREEN COMMENT (40) TEXT-A01 FOR FIELD PARM.
SELECTION-SCREEN POSITION 45.
PARAMETERS PARM LIKE MARA-MATNR.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN SKIP 1.
SELECTION-SCREEN BEGIN OF LINE .
PARAMETERS: TYPE AS CHECKBOX .
SELECTION-SCREEN COMMENT (40) TEXT-A01 FOR FIELD TYPE.
SELECTION-SCREEN END OF LINE.
上例执行界面如图7-18所示。
图7-18 Text symbols的定义及程序输出界面
(12)SELECTION-SCREEN FUNCTION KEY n.
用于在工具栏上新增一个功能按钮。该按钮的定义保存在系统结构体SSCRFIELDS中,n为一个整数的序数,例如当n等于1时,其按钮描述保存在字段SSCRFIELDS-FUNCTXT_01中,其按钮对象命名为“FC01”,保存在字段SSCRFIELDS-UCOMM中。具体使用方法如例7-14所示。
例7-14 SELECTION-SCREEN FUNCTION KEY的使用。
REPORT ZSCREEN_TEST10 .
PARAMETERS PARM LIKE MARA-MATNR.
TABLES SSCRFIELDS.
SELECTION-SCREEN FUNCTION KEY 1.
SELECTION-SCREEN FUNCTION KEY 2.
INITIALIZATION.
MOVE 'BUTTON' TO SSCRFIELDS-FUNCTXT_01.
MOVE 'BUTTON2' TO SSCRFIELDS-FUNCTXT_02.
本例共定义了两个按钮,并对其描述分别赋值,但是按钮是属于屏幕元素的一部分,必须先定义好屏幕,执行效果如图7-19所示。
图7-19 通过SELECTION-SCREEN FUNCTION定义工具栏按钮
对工具栏按钮的操作同样通过屏幕时间来实现,如上文所述,对象命名为“FC01”,保存在字段SSCRFIELDS-UCOMM中。
...
AT SELECTION-SCREEN.
IF SSCRFIELDS-UCOMM = 'FC01'.
...
ENDIF.
(13)SELECTION-SCREEN BEGIN OF TABBED BLOCK <block> FOR n LINES.
用于在屏幕上定义一个分页控件(tab),每个页签都是由一个子屏幕控制,n代表分页控件的高度,屏幕载入时必须先通过INITIALIZATION事件对其属性初始化,如定义两个分页的TAB控件,具体使用如例7-15所示。
例7-15 TAB控件事件在Report程序中的定义及应用。
REPORT ZSCREEN_TEST11.
TABLES: MARA.
*定义子屏幕100
SELECTION-SCREEN BEGIN OF SCREEN 100 AS SUBSCREEN.
SELECTION-SCREEN BEGIN OF BLOCK A1 WITH FRAME TITLE text-001.
SELECT-OPTIONS: mat1 FOR mara-matnr NO INTERVALS.
SELECTION-SCREEN SKIP 1.
PARAMETER: CHK1 AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN END OF BLOCK A1.
SELECTION-SCREEN END OF SCREEN 100.
*定义子屏幕200
SELECTION-SCREEN BEGIN OF SCREEN 200 AS SUBSCREEN.
PARAMETERS: MAT2 LIKE MARA-MATNR.
SELECTION-SCREEN END OF SCREEN 200.
*定义一个TAB空间,取名为MYTAB,控件高为5,共分两个选项卡BUTTON1、BUTTON2
*两个选项卡的功能代码分别为PUSH1、PUSH2
SELECTION-SCREEN: BEGIN OF TABBED BLOCK MYTAB FOR 5 LINES,
TAB (20) BUTTON1 USER-COMMAND PUSH1,
TAB (20) BUTTON2 USER-COMMAND PUSH2
END OF BLOCK mytab.
*为TAB控件分配初始化值,应用TEXT element定义文本
INITIALIZATION.
BUTTON1 = TEXT-010.
BUTTON2 = TEXT-020.
MYTAB-PROG = SY-REPID.
MYTAB-DYNNR = 100.
*TAB控件选项卡单击事件,选择不同选项卡显示不同子屏幕
AT SELECTION-SCREEN.
CASE sy-ucomm.
WHEN 'PUSH1'.
mytab-dynnr = 100.
mytab-activetab = 'BUTTON1'.
WHEN 'PUSH2'.
mytab-dynnr = 200.
mytab-activetab = 'BUTTON2'.
ENDCASE.
以上代码执行界面如图7-20所示。
图7-20 TAB控件的应用