ALV测试.docx
- 文档编号:29029529
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:45
- 大小:383.08KB
ALV测试.docx
《ALV测试.docx》由会员分享,可在线阅读,更多相关《ALV测试.docx(45页珍藏版)》请在冰豆网上搜索。
ALV测试
ALV
一.ALV概要
首先介绍下什么是ALV,在R/34.6C之前ALV全称为ABAPListViewer,在其后的版本中,已经正式更名为SAPListViewer。
ALV是SAP系统中心的列表标准,可以在ABAP程序中进行报表输出。
除去传统列表的显示和少量交互功能之外,ALV还提供给系统用户多种其它丰富的交互功能。
使用ALV有两种方式,一种为传统的CallFunction,另一种为面向对象的编程,为了有良好的编程习惯和跟随SAP技术的发展,在此,强烈推荐使用面向对象的编程来实现ALV,在此,本文档也是根据此来写的。
下面是一个ALV的用户界面(系统例子BCALV_FULLSCREEN_DEMO),可以分为三个部分:
1.ALV菜单栏
2.ALV标题栏
3.ALV网格控制器
(根据用户需要,可以隐藏ALV标题栏以及ALV菜单栏)
ALV网格控制器
ALV标题栏
ALV菜单栏
1.ALV菜单栏
细节按钮,你首先必须选中列表中的一行,然后点击它的话,就会弹出一个窗口,显示选中行的细节内容。
(另外:
你双击你要选择的行,也可以显示细节)
按升序排列,首先选中一列,然后再点击它,就可以看到该列是按照升序重新排列。
按降序排列,首先选中一列,然后再点击它,就可以看到该列是按照降序重新排列。
设置过滤器,通过设置它可以达到筛选的目的,以列名称作为筛选的筛选标准,填入过滤器相应的标准值,然后就可以筛选出满足自己条件的记录。
打印预览,点击它之后,就可以预览一下将要打印内容的布局情况。
MicrosoftExcel,调用MS的Excel到当前ALV的列表显示区域。
(前提:
必须安装了MS的Excel)
字处理,字处理的相关设置。
本地文件,将当前表单存储到本地机器上,有几种供选择的存储格式。
邮件收件人,给系统内用户发邮件
图形,点击它可以根据表单情况绘制相关图表。
更改布局,点击它可以对表单中的列项目排列次序的互换,删减等。
选择布局,从以及保存的布局中选择自己满意的布局。
保存布局,对于自己满意的布局,可以通过点击它来将布局保存起来。
2.ALV标题栏
这个区域主要是用来显示一些抬头信息(总揽信息),类似于WORD中的页眉。
我们在使用的时候根据需要来进行相关填写。
3.网格控制器
这个区域主要使用来显示我们通过代码写筛选出来的数据,相关的操作在下面的程序编写部分详细介绍。
二.ALV起步
ALVGRIDCONTROL(ALV网格控制器)
ALVGRIDCONTROL使用了控制器技术以实现精美的屏幕显示,像所有的控制器一样,ALVGRIDCONTROL通过系统中的一个全局类提供的方法,以响应它的动作.
使用了ABAP的对象以后,列表是通过ALV的一个实例(INSTANCE)来显示的,程序员可以使用ABAP对象的事件管理.
ALVGRID相关的几个控制结构
1.字段目录 [Fieldcatalog]
字段目录是用来控制ALV显示的网格中每个字段的属性的,比如字段的顺序,对齐方式,可编辑状态,颜色,等等.
参考结构LVC_S_FCAT
2.布局控制[layout]
布局是用来控制整个ALV的一个布局,比如ALV的标题,是否可编辑,行颜色,列颜色.
参照ALV的控制结构[LVC_S_LAYO],以后的例子我将详细介绍如何设置行颜色和列颜色.
3.打印和排序,过滤控制(不常用,略过)
打印的参数控制请参考结构[LVC_S_PRNT]
排序的参数控制请参考结构[LVC_S_SORT]
过滤的参数控制请参考结构[LVC_S_FILT]
创建ALV的必要条件
创建一个ALV,有两个条件是必须的,布局的话,应该是可以不设置的,使用默认的就可以了。
1,字段目录
这个是必须的,如果没有这个参数,参考一个数据字典也是可以的,就是参数I_STRUCTURE_NAME.
2.存放数据的内表
最好内表的结构和字段目录是一致的,否则可能会出现一些无法预知的错误,当然你说我非要不一样,那也不一定会出现错误.我建议是最好一样的.
ALV简单示例一(例子的实现及各类事件响应都能在28服务器上zalv_test1中找到,事物代码zalvtest1)
面向对象的ALVGRID必须存在于一个容器当中,就是FUNCTION的ALV,其实也是一样的,底层也是使用CL_GUI_ALV_GRID这个类的.
第一步:
创建个SCREEN,在屏幕上创建个容器,CONTAINER.定义变量.
DATA:
WCL_CONTAINERTYPEREFTOCL_GUI_CUSTOM_CONTAINER,"存放ALV的容器WCL_ALVTYPEREFTOCL_GUI_ALV_GRID,"ALV的网格
GT_FIELDCATTYPELVC_T_FCAT,"存放字段目录的内表
GS_LAYOUTTYPELVC_S_LAYO."布局结构
*----声明需要显示的内表(以SFLIGHT为例)
DATABEGINOFgt_listOCCURS0.
INCLUDESTRUCTURESFLIGHT.
DATAENDOFgt_list.
第二步:
创建ALV这个对象,它的父组件是那个容器.
在PBO中写入如下代码:
PROCESSBEFOREOUTPUT.
MODULEdisplay_alv.
创建DISPLAY_ALV的MODULE后,写下如下代码:
MODULEdisplay_alvOUTPUT.
PERFORMdisplay_alv.
ENDMODULE.
在FORMDISPLAY_ALV中,判断ALV实例是否存在,如果不存在,则创建:
IFWCL_ALVISINITIAL.
CREATEOBJECT:
WCL_CONTAINER
EXPORTING
CONTAINER_NAME='WCL_CONTAINER'.
CREATEOBJECTWCL_ALV
EXPORTING
I_PARENT=WCL_CONTAINER.
*获取字段目录
PERFORMPREPARE_FIELD_CATALOGCHANGINGGT_FIELDCAT.
*获取样式
PERFORMPREPARE_LAYOUTCHANGINGGS_LAYOUT.
*获取需要显示的数据
PERFORMGET_DATATABLESGT_LIST.
*-----显示ALV-------------------------------------------(详细的用法在最后附录)
CALLMETHODWCL_ALV->SET_TABLE_FOR_FIRST_DISPLAY
EXPORTING
*I_BUFFER_ACTIVE=
*I_CONSISTENCY_CHECK=
*I_STRUCTURE_NAME=
*IS_VARIANT=
*I_SAVE=
*I_DEFAULT='X'
IS_LAYOUT=GS_LAYOUT
*IS_PRINT=
*IT_SPECIAL_GROUPS=
*IT_TOOLBAR_EXCLUDING=
*IT_HYPERLINK=
CHANGING
IT_OUTTAB=GT_LIST[]
IT_FIELDCATALOG=GT_FIELDCAT
*IT_SORT=
*IT_FILTER=
EXCEPTIONS
INVALID_PARAMETER_COMBINATION=1
PROGRAM_ERROR=2
TOO_MANY_LINES=3
OTHERS=4.
ELSE.
*----------------------------刷新ALV----------------------(详细的用法在最后附录)
CALLMETHODWCL_ALV->REFRESH_TABLE_DISPLAY
*EXPORTING
*IS_STABLE=
*I_SOFT_REFRESH=
EXCEPTIONS
FINISHED=1
OTHERS=2.
IFSY-SUBRC<>0.
*--异常处理
ENDIF.
ENDIF.
第三步,获取要显示数据的字段目录.有两种方式.
1.手动创建
FORMprepare_field_catalogCHANGINGpt_fieldcatTYPElvc_t_fcat.
DATAls_fcattypelvc_s_fcat.
ls_fcat-fieldname='CARRID'.
ls_fcat-inttype='C'.
ls_fcat-outputlen='3'.
ls_fcat-coltext='CarrierID'.
ls_fcat-seltext='CarrierID'.
APPENDls_fcattopt_fieldcat.
CLEARls_fcat.
ls_fcat-fieldname='CONNID'.
ls_fcat-ref_table='SFLIGHT'.
ls_fcat-ref_table='CONNID'.
ls_fcat-outputlen='3'.
ls_fcat-coltext='ConnectionID'.
ls_fcat-seltext='ConnectionID'.
APPENDls_fcattopt_fieldcat.
ENDFORM.
2.根据结构自动创建
FORMPREPARE_FIELD_CATALOGCHANGINGGT_FIELDCATTYPELVC_T_FCAT.
DATAls_fcattypelvc_s_fcat.
CALLFUNCTION'LVC_FIELDCATALOG_MERGE'
EXPORTING
i_structure_name='SFLIGHT'
CHANGING
ct_fieldcat=GT_FIELDCAT[]
EXCEPTIONS
inconsistent_interface=1
program_error=2
OTHERS=3.
IFsy-subrc<>0.
*--Exceptionhandling
ENDIF.
ENDFORM."prepare_field_catalog
第四步,设置布局
FORMprepare_layoutCHANGINGps_layoutTYPElvc_s_layo.
ps_layout-zebra='X'.
ps_layout-grid_title='Flights'.
ps_layout-smalltitle='X'.
ENDFORM."prepare_layout
第五步,读取数据至内表
FORMGET_DATATABLESRT_OUTTABLIKEGT_LIST[].
SELECT*FROMSFLIGHTINTOCORRESPONDINGFIELDS
OFTABLERT_OUTTABUPTO30ROWS.
ENDFORM.
至此,一个最简单的面向对象的ALV创建完毕。
三.ALV进阶
功能一:
排除不需要的ALV菜单栏按钮
在你的ALV上,如果你想排除一些你不想要的标准按钮,你可以把需要排除的按钮填入到表UI_FUNCTIONS中,然后传给set_table_for_first_display方法的参数"IT_TOOLBAR_EXCLUDING".这些按钮的功能码一般都可以通过查看类cl_gui_alv_grid的常量属性中获取到,或者自己加个断点,在after_user_command事件中.
如果你要隐藏全部的工具条,你可以把layout中的no_toolbar设置为"X".
FORMexclude_tb_functionsCHANGINGpt_excludeTYPEui_functions.
DATAls_excludeTYPEui_func.
ls_exclude=cl_gui_alv_grid=>mc_fc_maximum.
APPENDls_excludeTOpt_exclude.
ls_exclude=cl_gui_alv_grid=>mc_fc_minimum.
APPENDls_excludeTOpt_exclude.
ls_exclude=cl_gui_alv_grid=>mc_fc_subtot.
APPENDls_excludeTOpt_exclude.
ls_exclude=cl_gui_alv_grid=>mc_fc_sum.
APPENDls_excludeTOpt_exclude.
ls_exclude=cl_gui_alv_grid=>mc_fc_average.
APPENDls_excludeTOpt_exclude.
ls_exclude=cl_gui_alv_grid=>mc_mb_sum.
APPENDls_excludeTOpt_exclude.
ls_exclude=cl_gui_alv_grid=>mc_mb_subtot.
ENDFORM.
功能二:
设置排序条件
有时候我们需要使用到数据的排序.这个可以通过填充参考结构LVC_T_SORT创建的内表来实现,这个内表中包含了排序的标准.可以传递给set_table_for_first_display这个方法的IT_SORT参数来初始化一个排序.
FORMprepare_sort_tableCHANGINGpt_sortTYPElvc_t_sort.
DATALS_SORTTYPELVC_S_SORT.
LS_SORT-SPOS='1'.
LS_SORT-FIELDNAME='PAYMENTSUM'.
LS_SORT-UP='X'."AtoZ
LS_SORT-DOWN=SPACE.
APPENDLS_SORTTOPT_SORT.
ENDFORM."prepare_sort_table
如果这边排序的字段名,不存在于字段目录中,那将出现ABAPDUMP.
也可以通过使用方法“get_sort_criteria”和“set_sort_criteria”来获取和设置排序的标准.
功能三:
设置过滤
ALV的标准按钮中已经有过滤的功能,我们也可以在初始显示的时候就设置过滤条件.我们需要把过滤条件填充到参考表类型"LVC_T_FILT"创建的内表中.过滤条件是类似一个RANGES结构的.然后把这个内表传递给方法"SET_TABLE_FOR_FIRST_DISPLAY"中的参数"IT_FILTER"
FORMPREPARE_FILTER_TABLECHANGINGPT_FILTTYPELVC_T_FILT.
DATALS_FILTTYPELVC_S_FILT.
LS_FILT-FIELDNAME='FLDATE'.
LS_FILT-SIGN='E'.
LS_FILT-OPTION='BT'.
LS_FILT-LOW='20080101'.“最高日期
LS_FILT-HIGH='20001231'.“最低日期
APPENDLS_FILTTOPT_FILT.
ENDFORM."preparefiltertable
我们可以使用"get_filter_criteria"和"set_filter_criteria"来获取过滤条件和设置过滤条件.
功能四:
选择方式
有时候,我们需要选择一些单元格,行或者列,在布局中,有个参数"SEL_MODE"可以设置我们不同的选择方式.下面是参数的介绍.和不同的地方.
值
模式
可能的选择
注释
SPACE
等同于B
参考B
默认设置
'A'
行和列的选择,无法选择单元格
多行,多列
用户可以使用最左边的选择按钮来选择多行
'B'
单选,不可以多选行,不可以多选单元格
多行,多列
'C'
多选,可以多选行,不可以多选单元格
多行,多列
'D'
单元格的选择,可以多选单元格
多行,多列,任何单元格多选
用户可以使用最左边的选择按钮来选择多行
WARNING!
!
!
1.如果你设置了ALV是可编辑的,可能会覆盖你在布局中选择方式的设置的.
2.设置了选择方式以后,我们可以使用很多方法来获取用户的选择.比如"GET_SELECTED_CELLS","GET_SELECTED_CELLS_ID","GET_SELECTED_ROWS","GET_SELECTED_COLUMNS"
3.在执行PAI以后,用户所选择的单元格,行或者列可能丢失.你可以在PBO中,使用对应的SET方法来恢复这些选择.
功能五:
颜色设置
有的时候,我们需要在ALV网格上绘上一些颜色.可以给特定的行,某个特定的列,某个特定的单元格绘制颜色.如果某列被设置为关键列,这列的颜色将被自动绘制,而不需要我们额外的指定.
先介绍ALV的色码.就是颜色编码,4位CHAR型.
常见的色码是Cxxx,第一位C代表英文Color的缩写,第二位则是颜色的代码,可以参照下表,第三位是加强设置,第四位是相反,个人理解,在强化关闭的情况下,相反的作用是背景和字体的变化。
x
颜色
主要使用在
1
Gray-blue
headers
2
Lightgray
Listbodies
3
yellow
totals
4
Blue-green
Keycolumns
5
green
Positivethresholdvalue
6
red
Negativethresholdvalue
7
orange
Controllevels
A)设置列的颜色.
我们可以通过字段目录的"emphasize"控制字段来控制某列的颜色.这个字段同样是4位的CHAR型,传入上述的颜色编码.例如:
LS_FCAT-EMPHASIZE = 'C701'.
如果这列被设置为关键列,就是 LS_FCAT-KEY = 'X',那么颜色设置就不会起作用.请注意,自动产生的字段目录中,KEY的设置是自动获取的.
B)设置行的颜色
为某行设置颜色,是有点复杂的,我们需要在要显示的数据内表中增加一个字段,这个字段不需要在字段目录中存在.同样,这个字段也是4位的CHAR型,符合颜色编码的定义.
那我们就需要这样来定义我们的数据内表:
DATABEGINOFCC_SFLIGHTOCCURS0.
……..
DATArowcolor(4)TYPEc.
DATAENDOFCC_SFLIGHT.
很明显,填入颜色编码以后,ALV怎么知道它是我们用来设置颜色的呢,在布局中,有个控制字段"INFO_FNAME",我们可以设置这个字段来告诉ALV,我们的颜色字段是哪个.
ps_layout-info_fname='ROWCOLOR'.
请注意,这个字段随便你起名字,但是记住,一定是数据内表里的字段,而且这边设置的时候一定要大写.你可以在任何时候设置行的颜色,只需要去修改内表里的这个字段的值,但是记得,一定要刷新以后才起作用.
功能六:
插入超链接
插入超链接是通过一个含有超级链接和句柄的表来实现的.这个表类型为"LVC_T_HYPE",句柄是一个INT4类型的字段,我们需要在数据显示的内表中,加入这样的字段,来告诉ALV,我们的字段指定的句柄,从而找到对应的超级链接.在字段目录中,WEB_FIELD是用来指定对应的句柄名的.
下面举个例子来说明,我们要为字段CARRID建立超级链接:
首先,内表定义中,我们加入2个句柄字段:
DATABEGINOFCC_SFLIGHTOCCURS0.
………………
DATAcarrid_handleTYPEint4.
DATAENDOFCC_SFLIGHT.
第二:
建立一个超级链接内表,里面存放句柄所对应的超级链接.创建的时候注意,它参考的表类型,一定是"LVC_T_HYPE".
FORMprepare_hyperlinks_tableCHANGINGpt_hypeTYPElvc_t_hype.
DATAls_hypeTYPElvc_s_hype.
ls_hype-handle='1'.
ls_hype-href='.
APPENDls_hypeTOpt_hype.
ls_hype-handle='2'.
ls_hype-href='.
APPENDls_hypeTOpt_hype.
ENDFORM.
第三.通过字段目录FIELDCATLOG来指定相应的句柄字段.
对于CARRID的fieldcatalog
Ls_fieldcat-web_field=‘CARRID_HANDLE’.
在方法"SET_TABLE_FOR_FIRST_DISPLAY"中把句柄内表传给参数it_hyperlink。
第四:
在数据显示的内表中,指定对应的句柄:
LOOPATCC_SFLIGHTINTOWA_SFLIGHT.
IFWA_SFLIGHT-CARRID='AA'.
WA_SFLIGHT-CARRID_HANDLE='1'.
ELSE.
WA_SFLIGHT-CARRID_HANDLE='2'.
ENDIF.
MODIFYCC_SFLIGHTFROMWA_SFLIGHT.
ENDLOOP.
功能七:
把字段设置为下拉
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ALV 测试