目录
15.4.1 set_table_for_first_display方法
目录
15.1概要
15.1.1 什么是ALV
ALV是ABAP List Viewer的缩写,是实际业务中查询数据或修改数据是经常使用的程序。“第 12 章 报表程序”中是使用WRITE语句制作了报表程序。面向对象程序中为了追加下载数据的功能,首先要创建GUI STATUS,从而在画面中增加按钮,
然后实现用户单击按钮时触发事件。但是ALV已经提供了包含这些基本业务的程序包。即在Excel程序中,排序数据,计算合计,筛选信息等基本功能不用通过代码也能自由地实现。
ALV的主要功能
- 排序功能
- 过滤设置
- 变更列管
- 变更布局
- ABC分析
- 下载Excel及Word文档的保存。
ALV在SAP Release3.1版本以后开始出现在ABAP程序中,最近除报告书,成绩表等有固定样式的文档程序基本使用ALV进行开发
15.1.2 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 菜单就可以使用标准程序的综合功能。
15.1.3 ALV GRID容器接口
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。
15.1.4 ALV GRID 容器结构
下图说明了ALV GRID 显示在画面的顺序。
要利用ALV显示数据,至少要经过下列两个步骤。
- 定义内表:定义显示在画面上的内表。在ALV上存储数据信息的内表叫输出表(Output Table)。
- 数据结构(字段目录):定义ALV GRID容器显示在画面上的结构。即拥有如ALV GRID容器中定义的数据结构,技术属性,描述等信息。一般利用ABAP数据字典的表,结构体或者直接使用内表结构。
只要启动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容器。
15.2 SAP容器
15.2.1 创建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容器,因此先简单了解基本结构后做实际练习。此外,容器的基本原理都相似,因此只要掌握其使用方法就不难理解。
15.3 创建ALV
15.3.1 创建ALV GRID 容器
1. 创建参照变量
创建屏幕,利用屏幕编辑器追加自定义控件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.
2.创建SAP容器
在屏幕上创建适当大小的自定义控件。另外,在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'.
3.创建ALV GRID 控件
利用CREATE OBJECT 语句创建参照CL_GUI_ALV_GRID控件实例。参数i_parent为了显示ALV指定连接屏幕时使用的SAP容器。
CREATE OBJECT G_GRID
EXPORTING
i_parent = con1_ref.
ENDIF.
ENDMODULE.
4.查询数据
在主程序中追加执行事件START-OF-SELECTION来查询数据。然后调用存在自定义控件的屏幕。
SELECT * FROM sflight
INTO TABLE gt_sflight UP TO 25 ROWS.
CALL SCREEN 100.
5.调用ALV显示方法
只要调用显示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.
6.执行程序
15.3.2 利用Docking容器创建程序
自定义容器是在画面指定领域,于此相反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.
15.4 ALV方法
本章介绍ALV中经常用到的方法。前面已经介绍方法决定对象的行为即ALV方法管理ALV行为。
15.4.1 set_table_for_first_display方法
set_table_for_first_display是 ALV GRID 控件实例显示在输出列表时最基本,最重要的方法。调用方法时需要参照ABAP数据字典的结构或者需要定义字段目录。前者指的是如前面实例中的EXPORTING I_STRUCTURE_NAME='SFLIGHT'所示,参照SFLIGHT表一样的结构,后者指的是在代码中直接构成ALV字段。另外,调用set_table_for_first_display方法时在运行程序之前可以排序或者过滤字段,如下图语句所示
CALL METHOD<ref.var.to CL_GUI_ALV_GRID>->set_table_for_first_display
EXPORTING
I_STRUCTURE_NAME =<string of type DD02L-TABNAME>
IS_VARIANT =<structure of type DISVARIANT>
I_SAVE =<var.of TYPE cHAR01>
I_DEFAULT =<var.of TYPE cHAR01>
IS_LAYOUT =<structure of type LVC_S_LAYO>
IS_PRINT =<structure of type LVC_S_PRNT>
IT_SPECIAL_GROUPS =<internal table of type LVC_T_SGRP>
IT_TOOLBAR_EXCLUDING =<internal table of type UI_FUNCTIONS>
CHANGING
IT_OUTTAB =<internal table>
IT_FIELDCATALOG =<internal table of type LVC_T_FCAT>
IT_SORT =<internal table of type LVC_T_SORT>
IT_FILTER =<internal table of type LVC_T_FILT>
下面仔细观察一下set_table_for_first_display 方法中要使用的参数和属性。
1. I_STRUCTURE_NAME 参数
为了制作输出表的形式输入类似于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.
2. IS_VARIANT 参数
可以设置ALV列表变式(Variant)。列表变式把修改的画面字段顺序、排列字段等操作保存成一个变式,以便以后查询时以同样式显示。首先需要在报表程序中追加用于选择布局的参数及功能。
3. I_SAVE 参数
函数set_table_for_first_display的参数I_SAVE已经在前面讲述,因此下面简单整理一下相关值
值 | 功 能 |
X | 只能保存全局布局 |
U | 只能保存自定义布局 |
A | 同时包含X和U |
SPACE | 不保存布局 |
4.I_DEFAULT 参数
决定用户是否能保存默认变式。
值 | 功 能 |
X | 可以设置默认变式 |
SPACE | 不能设置默认变式 |
5.IS_LAYOUT 参数
利用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类型的变量。
6.IT_OUTTAB 参数
IT_OUTTAB 参数是定义要显示数据的输出表的参数。换句话说是指定包含要显示数据的内表参数。
7.IT_FIELDCATALOG 参数
决定要显示的数据类型及输出表结构。
8.IT_TOOLBAR_EXCLUDING 参数
在ALV GRID控件中有需要隐藏按钮时使用。先定义ui_funcionts 类型的内表,然后把此Function代码插入到此表中,则相应按钮就会隐藏
9.IT_SORT 参数
设置ALV数据排列顺序的参数。定义参照LVC_T_SORT类型的内表后,加入要用于排序的字段到此表中杰克。LVC_T_SORT中T指的是表,LVC_S_SORT指的是结构体。排序表的选项中Subtot设置以排序字段为基准显示合计金额和全体合计金额。
属 性 | 值 | 说 明 |
SPOS | 数字 | 指定排列顺序 |
FIELDNAME | 字段名 | 指定需要排序的字段名 |
UP | “,‘X’ | 升序排序 |
DOWN | “,‘X’ | 降序排序 |