目录
15.1概要
15.1.1 什么是ALV
ALV的主要功能
15.1.2 ALV的类型
15.1.3 ALV GRID容器接口
15.1.4 ALV GRID 容器结构
15.2 SAP容器
15.2.1 创建SAP容器及容器对象
15.3 创建ALV
15.3.1 创建ALV GRID 容器
1. 创建参照变量
2.创建SAP容器
3.创建ALV GRID 控件
4.查询数据
5.调用ALV显示方法
6.执行程序
15.3.2 利用Docking容器创建程序
15.4 ALV方法
15.4.1 set_table_for_first_display方法
1. I_STRUCTURE_NAME 参数
2. IS_VARIANT 参数
3. I_SAVE 参数
4.I_DEFAULT 参数
5.IS_LAYOUT 参数
6.IT_OUTTAB 参数
7.IT_FIELDCATALOG 参数
8.IT_TOOLBAR_EXCLUDING 参数
9.IT_SORT 参数
15.4.2 ALV 其他方法
1. get_current_cell 方法
目录
15.1概要
15.1.1 什么是ALV
ALV的主要功能
15.1.2 ALV的类型
15.1.3 ALV GRID容器接口
ALV是ABAP List Viewer的缩写,是实际业务中查询数据或修改数据是经常使用的程序。“第 12 章 报表程序”中是使用WRITE语句制作了报表程序。面向对象程序中为了追加下载数据的功能,首先要创建GUI STATUS,从而在画面中增加按钮,
然后实现用户单击按钮时触发事件。但是ALV已经提供了包含这些基本业务的程序包。即在Excel程序中,排序数据,计算合计,筛选信息等基本功能不用通过代码也能自由地实现。
- 排序功能
- 过滤设置
- 变更列管
- 变更布局
- ABC分析
- 下载Excel及Word文档的保存。
ALV在SAP Release3.1版本以后开始出现在ABAP程序中,最近除报告书,成绩表等有固定样式的文档程序基本使用ALV进行开发
ALV分为利用函数的方法和利用GRID控件的方法两种,两种方法内部含有相似的结构和功能,当然也存在SALV(New ALV)。这些技术出现的顺序依次为Function ALV > GRID ALV > SALV。REUSE_ALV_GRID_DISPLAY函数也以类为基础
但是SAP公司为了提供方便集合了多样的功能使用功能函数实现。若利用函数输出ALV程序,则不易控制画面。就因为存在这些限制项,从SAP Release3.1版本开始导入了利用ABAP对象的ALV GRID技术。另外,Net Web 2004平台中发布了集合
ALV功能的SALV包(SALV也称为 New ALV)。SALV可以像使用函数生成ALV一样不适用画面以全屏模式输出,也可以利用容器在画面上显示ALV。利用GRID的ALV不能以Batch Job登录后再后台运行,但SALV可正常运行。SALV与现有方法相比
为开发提供了便利,集合了详细功能以接口方式提供。但是SALV的唯一缺点就是不支持编辑模式。
利用ALV,只要运用数据结构和内标就可以在短时间内开发报表。Function ALV在第16章进行介绍。ALV GRID是以类开发的技术,因此需要掌握“第 14 章 ABAP 对象”的知识。
下图是用ALV查询列表的画面。ALV GRID 使用 SAP 公司开发的控件技术。与其他很多容器相同,ALV GRID 容器提供可以通过全局类影响属性的方法,通过这些方法可以为程序包ALV基本功能基础上适用追加项。另外 ALV GRID 容器定义 SAP
Context 菜单就可以使用标准程序的综合功能。
ALV 程序中使用的接口由参照CL_GUI_ALV_GRID类的变量定义。用下列语句定义对象引用变量。
DATA : name TYPE RET TO cl_gui_alv_grid.
上面语句的name变量是参照CL_GUI_ALV_GRIDE的对象引用变量(Object Reference Variable)。
另外,用CREATE OBJECT 语句调用类的构造函数并生成ALV GRID接口
CREATE OBJECT name.
ALV GRID 容器中拥有画面显示的所有信息,调用类方法可以重新定义或修改ALV画面属性。
下图说明了ALV的继承树。在类生成器T-CODE:SE24中查询CL_GUI_ALV_GRID可以发现Supper class字段上面存在超级类。还可以看出CL_GUI_ALV_GRID的超级类是CL_GUI_ALV_OBJECT。
下图说明了ALV GRID 显示在画面的顺序。
要利用ALV显示数据,至少要经过下列两个步骤。
只要启动ALV GRID,则传递给ALV GRID容器中的输出表一直有效。输出表可以利用ABAP数据字典对象,但也可以只用字段目录创建ALV结构。字段目录(Field CataLog)是存储要显示在ALV画面上的字段信息的表。例如,定义ALV字段的类型,属性,长度等。
字段目录是LVC_T_FCAT类型的表。下图显示生成ALV画面之前的内部结构顺序。
为了显示ALV实例到画面,首先要定义ALV领域,可以利用屏幕编辑器的自定义控件设置。另外,显示ALV必须要有连接屏幕领域与ALV的SAP容器控件。ALV是与画面的SAP控件相连后显示在画面上的。控件从“Containe”单词可以看出是代表给画面“装什么”的意思。即容器时在画面上显示类似于 Textedit,Picture等控件对象时使用的上级控件。在第二节中会详细介绍SAP容器。
若要显示ALV画面,必须要有连接屏幕与ALV GRID控件的SAP容器控件。即SAP容器为了充当连接器,将SAP控件包含在容器中。SAP容器类型有SAP Tree,SAP Picture,SAP Textedit,SAP Splitter控件等。SAP容器时包含其他控件的控件,也称为父控件(Parent Control)。
下图中的容器控件为基础创建ALV程序。能显示这些SAP控件的SAP容器种类
容 器 类 型 | 功 能 |
---|---|
SAP 自定控件 | 在使用屏幕编辑器的一般画面上定义领域 类:CL_GUI_CUSTOM_CONTAINER |
SAP 对话框控件 | 对话框或者在全画面上以对话框形式显示 类:CL_GUI_DILGONBOX_CONTAINER |
SAP Docking 控件 | 在画面领域的各边角可以调节其大小。是在ALV程序中经常与自定义控件一起使用的形态 类:CL_GUI_DOCKING_CONTAINER |
SAP 拆分控件 | 拆分容器时使用 类:CL_GUI_SPLITTER_CONTAINER |
SAP 细拆分控件 | 和Splitter控件功能相同,可以再拆分已被拆分的容器 类:CL_GUI_EASY_SPLITTER_CONTAINER |
本章重点学习这5种类型中的SAP自定义控件。另外,在实际也去中也经常使用SAP Docking容器,因此先简单了解基本结构后做实际练习。此外,容器的基本原理都相似,因此只要掌握其使用方法就不难理解。
创建屏幕,利用屏幕编辑器追加自定义控件CON1。然后追加创建参照ALV GRID 容器的引用变量,与此同时创建要显示在屏幕上的内表。
REPORT z15_02.
DATA : con1_ref TYPE REF TO CL_GUI_CUSTOM_CONTAINER.
DATA : G_GRID TYPE REF TO CL_GUI_ALV_GRID.
DATA : GT_SFLIGHT TYPE TABLE OF SFLIGHT.
在屏幕上创建适当大小的自定义控件。另外,在PBO模块init_con中追加下列代码后创建SAP容器。CREATE OBJECT语句会调用类CL_GUI_CUSTOM_CONTAINER的构造函数,创建SAP容器的实例。此时,参数指定屏幕上创建的自定义控件。
IF~is initial.语句的内容意味着已经创建容器对象不重复创建。例如,ALV GRID已经显示在画面上,当用户点击REFRESH按钮要重新刷新画面时没有必要重新创建实例。
MODULE init_con OUTPUT.
IF con1_ref is initial.
CREATE OBJECT con1_ref
EXPORTING
container_name = 'CON1'.
利用CREATE OBJECT 语句创建参照CL_GUI_ALV_GRID控件实例。参数i_parent为了显示ALV指定连接屏幕时使用的SAP容器。
CREATE OBJECT G_GRID
EXPORTING
i_parent = con1_ref.
ENDIF.
ENDMODULE.
在主程序中追加执行事件START-OF-SELECTION来查询数据。然后调用存在自定义控件的屏幕。
SELECT * FROM sflight
INTO TABLE gt_sflight UP TO 25 ROWS.
CALL SCREEN 100.
只要调用显示ALV的G_GRID方法就可以很简单地结束ALV画面。此时,参数利用SFLIGHT结构体要显示在画面上的数据使用内表gt_sflight。在MODULE init_con最后追加下面代码
CALL METHOD g_grid->set_table_for_first_display
EXPORTING
I_STRUCTURE_NAME='SFLIGHT'
CHANGING
it_OUTTAB=gt_sflight.
自定义容器是在画面指定领域,于此相反Docking容器是创建实例时直接直接指定屏幕和大小。即就如Docking单词的本意一样,不用通过自定义容器直接指定ALV要使用的领域和屏幕编号。下图为Docking容器的结构
除了决定SAP容器的类不同和不指定屏幕领域这两点之外,其他使用方法和自定义控件相似。首先,定义参照Docking容器的类型参照对象和ALV实例。
DATA:G_DOCKING TYPE REF TO CL_GUI_DOCKING_CONTAINER,
G_GRID TUPE REF TO CL_GUI_ALV_GRID.
利用CREATE OBJECT语句调用类cl_gui_docking_container的构造函数创建g_docking实例。但是创建Docking容器组件时参数还需要指定程序编号sy-repid和屏幕编号sy-dynnr。
CREATE OBJECT G_GOCKING
EXPROTING
REPID=SY-REPID
DYNNER=SY-DYNNR
EXTENSION=800."显示宽度
利用CREATE OBJECT语句创建参照CL_GUI_ALV_GRID的ALV GRID控件实例。然后创建ALV GRID控件实例的同时连接Docking容器。
CREATE OBJECT G_GRID
EXPORTING
I_PARENT = G_DOCKING.
本章介绍ALV中经常用到的方法。前面已经介绍方法决定对象的行为即ALV方法管理ALV行为。
set_table_for_first_display是 ALV GRID 控件实例显示在输出列表时最基本,最重要的方法。调用方法时需要参照ABAP数据字典的结构或者需要定义字段目录。前者指的是如前面实例中的EXPORTING I_STRUCTURE_NAME='SFLIGHT'所示,参照SFLIGHT表一样的结构,后者指的是在代码中直接构成ALV字段。另外,调用set_table_for_first_display方法时在运行程序之前可以排序或者过滤字段,如下图语句所示
CALL METHOD->set_table_for_first_display
EXPORTING
I_STRUCTURE_NAME =
IS_VARIANT =
I_SAVE =
I_DEFAULT =
IS_LAYOUT =
IS_PRINT =
IT_SPECIAL_GROUPS =
IT_TOOLBAR_EXCLUDING =
CHANGING
IT_OUTTAB =
IT_FIELDCATALOG =
IT_SORT =
IT_FILTER =
下面仔细观察一下set_table_for_first_display 方法中要使用的参数和属性。
为了制作输出表的形式输入类似于SFLIGHT的一样的ABAP数据字典结构体名字。只要设置这个参数会自动生成符合此结构体的字段目录。即在程序内部没有必要重新构成字段目录。
DATA : g_g_grid TYPE REF TO cl_gui_alv_grid.
gt_sflight TYPE TABLE OF sflight.
CALL METHOD g_grid->set_table_for_first_display
EXPORTING
I_STRUCTURE_NAME = 'SFLIGHT'
CHANGING
IT_OUTTAB = GT_SFLIGHT.
可以设置ALV列表变式(Variant)。列表变式把修改的画面字段顺序、排列字段等操作保存成一个变式,以便以后查询时以同样式显示。首先需要在报表程序中追加用于选择布局的参数及功能。
函数set_table_for_first_display的参数I_SAVE已经在前面讲述,因此下面简单整理一下相关值
值 | 功 能 |
X | 只能保存全局布局 |
U | 只能保存自定义布局 |
A | 同时包含X和U |
SPACE | 不保存布局 |
决定用户是否能保存默认变式。
值 | 功 能 |
X | 可以设置默认变式 |
SPACE | 不能设置默认变式 |
利用IS_LAYOUT 参数可以定义ALV GRID控件的画面属性,如设置合计金额或者以条纹形式显示等。布局是LVC_S_LAYO类型的结构体。此结构体可以在T-CODE:SE11中查询
字 段 | 描 述 | 目 的 |
CTAB_FNAME | 指定字段列颜色 | 颜色 |
CWIDTH_OPT | 自动调整列宽 | GRID属性 |
DFTAILINIT | 决定是否在详细画面显示初始值 | Interaction |
DFTAILTITL | 显示详细画面的标题栏 | Interaction |
EXCP_CONDS | 显示例外处理字段Sub Total | Exeptions |
EXCP_FNAME | 显示例外处理字段 | Exeptions |
EXCP_LED | 例外处理字段不用信号灯显示,而是用LED | Exeptions |
EXCP_ROLLN | 显示关于例外处理字段的帮助 | Exeptions |
GRID_TITLE | 指定标题栏的描述 | GRID 属性 |
INFO_FNAME | 指定行颜色 | 颜色 |
KEYHOT | 指定以HOTSOPOT显示的主键 | Interaction |
NO_HEADERS | 不显示字段标题 |
GRID 属性 |
NO_HGRIDLN | 不显示GRID的水平线 | GRID 属性 |
NO_MERGING | 排序字段时防止合并相同值的列 | GRID 属性 |
NO_ROWMARK | 删除GRID的行选择按钮 SEL_MODE='D'时删除行选择按钮 SEL_MODE=‘A’时删除字段/行按钮 |
GRID 属性 |
NO_TOOLBAR | 不显示工具栏 | GRID 属性 |
NO_TOTLINE | 不显示所有行 | Total选项 |
NO_VGRIDLN | 不显示Grid的垂直线 | GRID 属性 |
NUM_TOTAL | 显示NUMC字段的合计金额 | Total选项 |
S_DRAGDROP | 设置Drag & Drop控件 (复制,移动行的功能) |
Interaction |
SEL_MODE | 设置选择模式 (A,B,C,D,SPACE) |
GRID 属性 |
SGL_CLK_HD | 单击字段标题时进行排序 | Interaction |
SMALLTITLE | 决定标题大小 | GRID 属性 |
TOTALS_BEF | 合计金额显示在最上行 | Total选项 |
ZEBRA | 变换行颜色 | 颜色 |
设置几个布局属性后进行测试,其他的参数可以通过练习掌握功能,生成LVC_S_LAYO类型的变量。
IT_OUTTAB 参数是定义要显示数据的输出表的参数。换句话说是指定包含要显示数据的内表参数。
决定要显示的数据类型及输出表结构。
在ALV GRID控件中有需要隐藏按钮时使用。先定义ui_funcionts 类型的内表,然后把此Function代码插入到此表中,则相应按钮就会隐藏
设置ALV数据排列顺序的参数。定义参照LVC_T_SORT类型的内表后,加入要用于排序的字段到此表中杰克。LVC_T_SORT中T指的是表,LVC_S_SORT指的是结构体。排序表的选项中Subtot设置以排序字段为基准显示合计金额和全体合计金额。
属 性 | 值 | 说 明 |
SPOS | 数字 | 指定排列顺序 |
FIELDNAME | 字段名 | 指定需要排序的字段名 |
UP | “,‘X’ | 升序排序 |
DOWN | “,‘X’ | 降序排序 |