一、ALV
ALV 是 ABAP List Viewer 的缩写,是实际业务中查询数据或修改数据时经常使用的程序。
1、ALV的主要功能排序功能 (Ascending/Descending);
过滤设置;
变更列宽;
变更布局;
ABC 分析;
下载 Excel及 Word 文档的保存。
2、ALV的类型
Function ALV;
GRID ALV;
SALV;
3、GRID ALV容器接口:
ALV 程序中使用的接口由参照 CL GUI ALV_GRID 类的变量定义。用下列语句定义对
象引用变量。
用 CREATE OBEJCT 语调用类的构造函数并生成 ALV GRID 接口。
4、GRID ALV容器的结构
要利用 ALV 显示数据,至少要经过下列两个步骤。
(1) 定义内表: 定义显示在画面上的内表。在 ALV 上存储数据信息的内表叫输出表
(Output Table)。
数据结构(字段目录):定义 ALV GRID 容器显示在画面上的结构。即拥有如 ALVGRID 容器中定义的数据结构、技术属性、描述等信息。一般利用 ABAP 数据字典的表、结构体或直接使用内表结构。
只要启动 ALVGRID,则传递给 ALV GRID 容器中的输出表一直有效。输出表可以利用ABAP 数据字典对象,但也可以只用字段目录创建 ALV 结构。字段目录 (Field Catalog)是存储要显示在 ALV 画面上的字段信息的表。
二、SAP容器
1、创建SAP容器及容器对象
若要显示 ALV 画面,必须要有连接屏幕与ALV GRID 控件的 SAP 容器控件。即 SAP 容器为了充当连接器,将SAP 控件包含在容器中。SAP 容器类型有 SAP Tree、SAP Picture、SAPTextedit、SAP Splitter 控件等。SAP 容器是包含其他控件的控件,也称为父控件 (ParentControl)
2、创建引用变量
SAP 自定义控件参数属性
3、调用屏幕
4、创建ALV GRID控件
5、创建ALV对象
三、创建ALV
1、创建ALV GRID容器
(1)创建参照变量
(2)创建SAP容器
在屏幕 100 创建适当大小的自定义控件。另外,在 PBO 模块 init_con 中追加下列代码后创建 SAP 容器。CREATE OBEJCT 语会调用类 CL GUI CUSTOM CONTAINER的构造函数(Constructor),创建 SAP 容器的实例。此时,参数指定屏幕上创建的自定义控件。
(3)创建ALV GRID控件
(4)查询数据
(5)调用ALV显示方法
(6)执行程序
例:
REPORT z_alv_gui_test.
DATA:con TYPE REF TO cl_gui_custom_container.
DATA:gui TYPE REF TO cl_gui_alv_grid.
DATA:gt_sflight TYPE TABLE OF sflight.
DATA:ok_code LIKE sy-ucomm,
save_code LIKE sy-ucomm.
CALL SCREEN 100.
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
save_code = ok_code.
CLEAR ok_code.
CASE save_code.
WHEN 'EXIT'.
LEAVE PROGRAM.
WHEN OTHERS.
ENDCASE.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
IF con IS INITIAL.
CREATE OBJECT con
EXPORTING
container_name = 'CON'.
CREATE OBJECT gui
EXPORTING
i_parent = con.
ENDIF.
SELECT * FROM sflight INTO TABLE gt_sflight.
CALL METHOD gui->set_table_for_first_display
EXPORTING
i_structure_name = 'SFLIGHT'
CHANGING
it_outtab = gt_sflight.
ENDMODULE.
2、利用Docking容器创建程序
自定义容器是在画面指定领域,与此相反 Docking 容器是创建实例时直接指定屏幕和大小。
即就如Docking单词的本意一样,不用通过自定义容器直接指定ALV要使用的领域和屏幕编号。
(1)创建参照变量
(2)创建docking容器
(3)创建ALV GRID控件
例:
*&---------------------------------------------------------------------*
*& Report Z_ALV_DOCKING
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT z_alv_docking.
DATA:container TYPE REF TO cl_gui_docking_container,
grid TYPE REF TO cl_gui_alv_grid.
DATA:gt_sflight TYPE TABLE OF sflight.
DATA:gs_variant TYPE disvariant."ALVl列表变式
SELECT * FROM sflight INTO TABLE gt_sflight.
gs_variant-report = sy-repid.
gs_variant-username = sy-uname.
CALL SCREEN 100.
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
IF container IS INITIAL.
CREATE OBJECT container
EXPORTING
repid = sy-repid "程序编号
dynnr = sy-dynnr "屏幕编号
extension = 2000.
CREATE OBJECT grid
EXPORTING
i_parent = container.
ENDIF.
CALL METHOD grid->set_table_for_first_display
EXPORTING
i_structure_name = 'SFLIGHT'
i_default = 'X'
is_variant = gs_variant
i_save = 'A'
CHANGING
it_outtab = gt_sflight.
ENDMODULE.
四、ALV方法
1、set_table_for_first_display方法
(1)I_STRUCTRE_NAME 参数
为了制作输出表的形式输入类似于 SFLIGHT 的一样的 ABAP 数据字典结构体名字。只要设置这个参数会自动生成符合此结构体的字段目录。即在程序内部没有必要重新构成字段目录。
(2)IS_VARIANT参数
可以设置 ALV 列表变式 (Variant)。列表变式把修改的画面字段顺序、排列字段等操作保存成一个变式,以便以后查询时以同样式显示。首先需要在报表程序中追加用于选择布局的参数及功能。
(3)I_SAVE参数
(4)I_DEFAULT参数
决定用户是否能保存默认变式
(5)IS_LAYOUT参数
利用IS LAYOUT 参数可以定义 ALV GRID 控件的画面属性,如设置合计金额或者以条文形式显示等。布局是 LVC S LAYO 类型的结构体。此结构体可以在 T-CODE:SE11 中查询。
(6)IT_OUTTAB参数
IT_OUTTAB 参数是定义要显示数据的输出表的参数。换句话说是指定包含要显示数据的内表的参数。
(7)IT_FIELDCATALOG参数
决定要显示的数据类型及输出表结构。
(8)IT_TOOLBAR_EXCLUDING参数
在 ALV GRID 控件中有需要隐藏的按钮时使用。例如,为技术类职员显示画面时有必要隐藏保存布局的按钮。此时可以根据用户显示或隐藏布局按钮。先定义 ui functions 类型的内表,然后把此 Function 代码插入到此表中,则相应按钮就会隐藏。
(9)IT_SORT参数
设置 ALV 数据排列顺序的参数。定义参照 LVC_T_SORT 类型的内表后,加入要用于排序的字段到此表中即可。LVC T SORT 中T 指的是表,LVC S SORT 的 S 指的是结构体排序表的选项中 Subtot 设置以排序字段为基准显示合计金额和全体合计金额。
2、ALV其他方法
(1)get_current_cell方法
get_current_cell 方法返回 ALV GRID 控件中鼠标所在位置的值和属性。若没有选择任何单元格,则行的 Row 值返回0。ALV GRID 控件返回两个行和字段的索引号,一个是现在被选择的行和字段索引,另一个是输出表(内表)的行和字段索引号。这是因为当设置隐藏字段时实际画面上显示的顺序与内表的顺序不同。
(2)get_frontend_layout方法
取出现在设置的ALV GRID 的布局信息
(3)get_selected_cells方法
用 LVC_T_CELL 类型的表返回现在所选的多个单元格信息。即取出现在所选单元格的字段名、索引等信息。
(4)get_selected_columns方法
(5)get_selected_rows方法
用LVC TROW类型的表返回多个行信息
(6)Refresh_table_display方法
重新查询已经显示在 ALV 的输出表时使用的方法。修改数据或新执行 SELECT 语句时不会重复创建 ALV 对象而只是重新显示数据。
(7)set_frontend_layout方法
修改 ALV GRID 布局。调用此方法后调用 REFRESH_TABLE DISPLAY 方法,则修改的
布局会起作用。
五ALV事件
1、定义事件
在类生成器 T-CODE:SE24 中查询 CL GUI ALV GIRD 可以发现有 DOUBLE CLICK
事件。
2、定义事件handler方法
3、注册事件handler方法
4、调用事件
双击 CL GUI ALV GRID 的画面会执行 RAISE EVENT 方法,此方法会触发 USERCOMMAND 对应的事件。
5、执行事件handler方法
双击事件
HOTSPOT_CLICK事件
鼠标单击 Hotspot 类型的字段时触发的事件。相应字段要定义字段目录时需要定义成HOTSPOT 属性。字段目录会在后面仔细介绍。
Toobar事件
程序员可以追加 ALV 提供的基本图标以外的功能。Toolbar 事件是用于单纯追加 ALVGRID 的图标,当单击图标时会执行 user command 事件。
USER-COMMAND事件
USER-COMMAND 事件是为标准工具栏中后追加的图标添加功能的事件。追加当单击刷新按钮时读取新数据的逻辑。相关的事件有 after user command,before user command。
onDrag、onDrop事件
在ALV GRID 内执行 Drag & Drop 时执行的 Drag 相关事件
六、字段目录
字段目录 (Field Catalog) 参照包含 ALV 画面的字段信息的 LVC T FCAT 类型的表结构。ALV 利用存有字段目录的内表识别字段类型。例如,可以区分字段的类型,可以指定要显示在画面上的字段长度,可以显示成单选按钮形式,可以修改成可编辑字段等等。
1、创建ALV字段目录
(1)利用ABAP数据字典的方法
参照 ABAP 数据字典中的内表定义字段目录的方法已经在前面介绍。利用set_table_for_first_display 方法的 IS_TRUCTURE_NAME 参数就会直接将 ABAP 数据字典对象显示在ALV 输出表中。
(2)收到构成字段目录的方法
有时会遇到不想使用 ABAP 数据字典的所有字段显示字段目录的情况。此时可以用代码(手动)定义自己所需的字段添加到目录中。另外,可以修改字段目录内表属性来隐藏字段。
(3)结构体与字段目录同时使用
需要使用结构体字段之外的由用户定义的字段时可以使用此方法。此时,若结构体与字段目录同时存在相同的字段时,会优先识别字段目录上的字段定义。
2、利用字段目录的ALV属性变更
(1)设置字段属性(key,fix_column)
(2)设置数据样式(JUST,EDIT_MASK属性)
七、ALV GRID要素
1、信号灯处理
ALV 字段由信号灯显示且根据特定字段变更其颜色。这个属性可以使最终用户容易识别紧急性、重要性数据。例如,在库存管理中将安全库存时设置为绿色,危险时为黄色,超过安全库存时为红色。
(1)追加Exceptions字段
要显示信号灯的字段定义成字符类型追加到内表(OUTPUT)中。
(2)设置Exceptions字段
在ALV布局设置中利用excp fame 属性设置信号灯字段
(3)根据预约座位变更信号灯颜色
将内表字段显示时按以下规则,没有座位就显示红色,少于 50 就显示黄色,除此以外显
示绿色。下面执行程序确认结果。
2、Coloring Rows
(1)追加LINE COLOR字段
在内表(OUTPUT)中追加要显示 line color 的字符类型字段。
(2)设置INFOR_FNAME字段
在ALV布局设置中定义要用于指定颜色的字段。
(3)根据Carrid ID修改相应的颜色
设置 Carrier ID,当 AA 时为蓝色,AZ 时为黄色,DL 时为绿色。
3、单元格染色
在ALV GRID 中可以修改想强调的单元格颜色。但是比起之前所介绍的强调行颜色功能更注重系统资源,因此注重速度的程序中不易使用此功能。在内表中追加 LVC_T SCOL类型的颜色表。
(1)追加CELL COLOR字段
在内表中参照LVC T SCOL 追加用于显示 line color 的字段。
(2)设置CTAB_FNAME字段
在 ALV 布局设定中设置用于指定单元格颜色的字段。CELLCOLOR 不是存储变更颜色的字段变量,而是存储输出表中要修改颜色的单元格信息的内表。
(3)指定单元格颜色
根据PLANETYPE 追加可以指定颜色的代码
4、单元格显示成Pushbutton形式
以Pushbutton 形式显示 ALV GRID 单元格,使用户单击相应单元格时可以跳到其他画面或者可以显示更多相关信息。单击 Pushbutton 时 ALV GRID 会调用 button click 事件。为了做此练习,需要在内表中追加如下句所示的 LVC T STYL 类型字段。
(1)追加Pushbutton字段与单元格样式字段
CHK字段是用于显示 Pushbutton 的字段,CELLBTN 字段是用于存储 Pushbutton 等样式信息的字段。
(2)设置STYLEFNAME字段
在ALV布局设定中指定STYLEFNAME设置字段
(3)Pushbutton处理
设置 CHK 字段显示成 Pushbutton。与 Coloring Cell 逻辑相似
(4)注册单击按钮的事件
注册单击 Pushbutton 时触发的事件控制方法
(5)定义事件方法
(6)实现事件方法
追加单击按钮时读取相应行 carrid 字段值显示信息窗口的代码