一.ALV介绍 

The ALV Grid Control (ALV = SAP List Viewer)是一个显示列表的灵活的工具,它提供了基本功能的列表操作,也可以通过自定义来进行增强,因此可以允许你可以在大型的应用程序中使用.
SAP提示: 在SAP的开发项目中,ALV GRID也可以作为修改和创建数据的一种工具,然而,目前这个功能只在实验计划中使用,还没有向客户发布.
下面是一个ALV GRID的图片:
它包括3大部分,工具栏,标题,用于显示数据的网格控制器.如果有必要,用户可以隐藏标题和工具栏.

ALV家族包含3中ALV工具:简易的,两层ALV,分等级连续的列表和树形结构的ALV.

二.ALV GRID CONTROL (ALV网格控制器) 
ALV GRID CONTROL使用了控制器技术以实现艺术性的屏幕显示,象所有的控制器一样,ALV GRID CONTROL通过系统中的一个全局的类提供了方法,以响应它的动作.
使用了ABAP的对象以后,列表是通过ALV的一个实例(INSTANCE)来显示的,程序员可以使用ABAP对象的事件管理.
三.ALV GRID CONTROL 实例
ALV GRID实例的定义,参照CL_GUI_ALV_GRID类 
data ALV_GRID1 type ref to cl_gui_alv_grid.
ALV GRID继承结构:

ALV_GRID介绍二(1)
四、ALV GRID相关的几个控制结构
1.字段目录 [Field catalog]
字段目录是用来控制ALV显示的网格中每个字段的属性的,比如字段的顺序,对齐方式,可编辑状态,颜色,等等.
常用的控制字段如下:(下面的示例将说明这些字段的使用,参考STRUCTURE LVC_S_FCAT)
2 ROW_POS ALV 控制: 输出行 (内部使用)  
3 COL_POS ALV 控制: 输出列 列的位置,第几列,例如1,2,…..
4 FIELDNAME ALV 控制: 内部表字段的字段名称 字段名称
5 TABNAME LVC 标签名称 表名,如果是内表,是1
6 CURRENCY ALV 控制: 货币单位  
7 CFIELDNAME ALV 控制: 参考的当前单位的字段名称  
8 QUANTITY ALV 控制: 计量单位  
9 QFIELDNAME ALV 控制: 参考计量单位的字段名称  
10 IFIELDNAME ALV 控制: 内部表字段的字段名称  
11 ROUND ALV 控制: ROUND 值  
12 EXPONENT ALV 控制:流动表示的指数  
13 KEY ALV 控制: 关键字段 关键字段,前面变蓝色
14 KEY_SEL ALV 控制: 可以被隐藏的关键列 可以被隐藏的关键列
15 ICON ALV 控制: 作为图标输出 此列作为图标输出
16 SYMBOL ALV 控制: 输出作为符号  
17 CHECKBOX ALV 控制: 作为复选框输出 复选框输出
18 JUST ALV 控制: 对齐 对齐方式:
     'R': right justified
     'L': left justified
     'C': centered
19 LZERO ALV 控制: 输出前导零 X'
20 NO_SIGN ALV 控制:输出抑制符号 X',不输出符号
21 NO_ZERO ALV 控制: 为输出隐藏零 X',隐藏0
22 NO_CONVEXT ALV 控制: 不考虑输出的转换退出  
23 EDIT_MASK ALV 控制: 为输出编辑掩码 格式
24 EMPHASIZE ALV 控制: 带有颜色的高亮列 列的颜色
25 FIX_COLUMN ALV 控制: 固定列  
26 DO_SUM ALV 控制: 总计列值 X',合计

ALV_GRID介绍二(2)
27 NO_SUM ALV 控制: 没有总计列值 X' ,没有合计
28 NO_OUT ALV 控制: 列没有输出 X' ,隐藏此列
29 TECH ALV 控制: 技术字段 X'.也是隐藏,但是有点不一样
30 OUTPUTLEN ALV 控制: 列的字符宽度 输出的长度
31 CONVEXIT 转换例程  
32 SELTEXT ALV 控制: 对话功能的列标识符  
33 TOOLTIP ALV 控制: 列抬头的工具提示  
34 ROLLNAME ALV 控制: F1 帮助的数据元素  
35 DATATYPE ABAP 字典中的数据类型 ABAP 字典中的数据类型
36 INTTYPE ABAP 数据类型(C,D,N,...) ABAP 数据类型(C,D,N,...)
37 INTLEN 以字节计的内部长度 内容的长度
38 LOWERCASE 允许/不允许小写字母 X' 允许大小写
39 REPTEXT 标题  
40 HIER_LEVEL ALV 控制: 内部使用  
41 REPREP ALV 控制: 价值是补充/补充接口的选择标准  
42 DOMNAME 定义域名  
43 SP_GROUP 组代码  
44 HOTSPOT ALV 控制: 单击敏感 X',下面出现下划线,响应单击
45 DFIELDNAME ALV 控制: 数据库中列组的字段名称  
46 COL_ID ALV 控制: 列 ID  
47 F4AVAILABL 字段有输入帮助吗 X'.此列有搜索帮助
48 AUTO_VALUE ALV 控制: 自动复制值  
49 CHECKTABLE 表名  
50 VALEXI 固定值存在  
51 WEB_FIELD ALV 控制: 内部表字段的字段名称  
52 HREF_HNDL 自然数 热点连接的句柄
53 STYLE ALV 控制: 样式 下面有例子会介绍,比如PUSHBUTTION
54 STYLE2 ALV 控制: 样式  
55 STYLE3 ALV 控制: 样式  
56 STYLE4 ALV 控制: 样式  
57 DRDN_HNDL 自然数 下拉的句柄
58 DRDN_FIELD ALV 控制: 内部表字段的字段名称 下拉的字段
59 NO_MERGING 字符字段长度 1 相同的值不合并
60 H_FTYPE ALV 树控制: 功能类型 (总计,平均,最大.最小, ...)  
61 COL_OPT 可选列优化的条目  
62 NO_INIT_CH 字符字段长度 1  
63 DRDN_ALIAS 字符字段长度 1  
64 REF_FIELD ALV 控制: 内部表字段的参考字段名称  
65 REF_TABLE ALV 控制: 内部表字段的参考表名称  
66 TXT_FIELD ALV 控制: 内部表字段的字段名称  
67 ROUNDFIELD ALV 控制: 带有 ROUND 说明的字段名称  
68 DECIMALS_O ALV 控制: 输出小数位的编号  
69 DECMLFIELD ALV 控制: 带有 DECIMALS 说明的字段名称  
70 DD_OUTLEN ALV 控制: 输出字符长度  
71 DECIMALS 小数点后的位数 设置小数的位数
72 COLTEXT ALV 控制: 列标题 列标题
73 SCRTEXT_L 长字段标签  
74 SCRTEXT_M 中字段标签  
75 SCRTEXT_S 短字段标签  
76 COLDDICTXT ALV 控制: 确定 DDIC 文本参考  
77 SELDDICTXT ALV 控制: 确定 DDIC 文本参考  
78 TIPDDICTXT ALV 控制: 确定 DDIC 文本参考  
79 EDIT ALV 控制: 准备输入 输出状态.'X'可输入
80 TECH_COL ALV 控制: 内部使用  
81 TECH_FORM ALV 控制: 内部使用  
82 TECH_COMP ALV 控制: 内部使用  
83 HIER_CPOS ALV 控制: 层次列位置  
84 H_COL_KEY 树控制: 列名称/项目名称  
85 H_SELECT 标识是否可以选择树控制中的列  
86 DD_ROLL 数据元素 (语义域)  
87 DRAGDROPID ALV 控制: 拖&放处理拖放对象  
88 MAC 字符字段长度 1  
89 INDX_FIELD 自然数  
90 INDX_CFIEL 自然数  
91 INDX_QFIEL 自然数  
92 INDX_IFIEL 自然数  
93 INDX_ROUND 自然数  
94 INDX_DECML 自然数  
95 GET_STYLE 字符字段长度 1  
96 MARK 字符字段长度 1  

ALV_GRID介绍二(3)
2.布局控制[layout]
布局是用来控制整个ALV的一个布局,比如ALV的标题,是否可编辑,行颜色,列颜色.
参照ALV的控制结构[LVC_S_LAYO],以后的例子我将详细介绍如何设置行颜色和列颜色.
详细的结构说明

字段名 描述 Value range
CWIDTH_OPT 最优化宽度 SPACE, 'X'
SMALLTITLE 小标题,如果设置了这个字段,
则标题与列标题大小一样 SPACE, 'X'
GRID_TITLE 标题,在网格和工具条之间 最长70个字符
NO_HEADERS 如果被设置,列标题隐藏 SPACE, 'X'
NO_HGRIDLN 隐藏水平线 SPACE, 'X'
NO_MERGING 禁用单元格合并 SPACE, 'X'
NO_ROWMARK 如果被设置,选择列在选择模式
为D和A的时候隐藏 SPACE, 'X'
NO_TOOLBAR 隐藏工具条 SPACE, 'X'
NO_VGRIDLN 隐藏垂直线 SPACE, 'X'
SEL_MODE 选择模式 SPACE, 'A', 'B', 'C', 'D'
EXCP_CONDS 合计例外 SPACE, 'X'
EXCP_FNAME 字段名称带有例外编码 最长30个字符
EXCP_LED 例外作为 LED SPACE, 'X'
EXCP_ROLLN 例外文档的数据元素 SPACE, 'X'
CTAB_FNAME 带有复杂单元格颜色编码的字段名称 最长30个字符
INFO_FNAME 带有简单行彩色代码的字段名称 最长30个字符
ZEBRA 可选行颜色,如果设置了,出现了间隔色带 SPACE, 'X'
NO_TOTLINE 没有总计 SPACE, 'X'
NUMC_TOTAL 可以对NUMC字段进行合计 SPACE, 'X'
TOTALS_BEF 总计输出在第一行,小计在新的值之前 SPACE, 'X'
STYLEFNAME 设置单元格,比如PUSHBUTTON 最长30个字符

ALV_GRID介绍二(4)
3.打印和排序,过滤控制
打印的参数控制请参考结构 [LVC_S_PRNT]
排序的参数控制请参考结构[LVC_S_SORT]
过滤的参数控制请参考结构[LVC_S_FILT]

五.编写简单的ALV程序.
首先这里就不详细介绍DIALOG的用法了.
OO的ALV GRID必须存在于一个容器当中,就是FUNCTION的ALV,其实也是一样的,底层也是使用CL_GUI_ALV_GRID这个类的.
首先ALV的显示需要有几个先决条件.

1,字段目录,这个是必须的,如果没有这个参数,参考一个数据字典也是可以的,就是参数I_STRUCTURE_NAME.
2.存放数据的内表,最好内表的结构和字段目录是一致的,否则可能会出现一些无法预知的错误,当然你说我非要不一样,那也不一定会出现错误.我建议是最好一样的.
这2个是必须的,布局的话,应该是可以不设置的,使用默认的就可以了.

第一步:创建个SCREEN,在屏幕上创建个容器,CONTAINER.定义变量.
DATA:
WCL_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER,
WCL_ALV TYPE REF TO CL_GUI_ALV_GRID .
*--- 存放字段目录的内表
DATA gt_fieldcat TYPE lvc_t_fcat .
*--- 布局结构
DATA gs_layout TYPE lvc_s_layo .
*----声明需要显示的内表(以SFLIGHT为例)
DATA BEGIN OF gt_list OCCURS 0 .
INCLUDE STRUCTURE SFLIGHT .
DATA END OF gt_list .

第二步: 创建ALV这个对象,它的父组件是那个容器.
在PBO中写入如下代码:

PROCESS BEFORE OUTPUT .
MODULE display_alv .

创建DISPLAY_ALV的MODULE后,写下如下代码:
MODULE display_alv OUTPUT .
PERFORM display_alv .
ENDMODULE .

在FORM DISPLAY_ALV中,判断ALV实例是否存在,如果不存在,则创建:
IF WCL_ALV IS INITIAL .
CREATE OBJECT: WCL_CONTAINER 
EXPORTING 
CONTAINER_NAME = 'ALV_CON'.
CREATE OBJECT WCL_ALV
EXPORTING
I_PARENT = WCL_CONTAINER.

*-----准备获取字段目录
PERFORM prepare_field_catalog CHANGING gt_fieldcat .
*-----设置布局
PERFORM prepare_layout CHANGING gs_layout .
*-----显示ALV
CALL METHOD gr_alvgrid->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
CALL METHOD gr_alvgrid->refresh_table_display
* EXPORTING
* IS_STABLE =
* I_SOFT_REFRESH =
EXCEPTIONS
finished = 1
OTHERS = 2 .
IF sy-subrc <> 0.
*--异常处理
ENDIF.
ENDIF .

方法"set_table_for_first_display"的参数说明

参数 含义
I_BUFFER_ACTIVE 如果方法调用是静态的,可以设置这个标记,这表示,如果每次显示ALV都是
相同的字段目录.既然这样,那么字段目录会被放到一个特殊的缓存里,
这样加速了ALV的显示
I_STRUCTURE_NAME 输出数据参考的数据字典的结构名,例如'SFLIGHT'.如果指定了这个参数,字段
目录会自动生成,下面的参数IT_FIELDCATALOG不需要传值.
IS_VARIANT 决定布局显示的变式
I_SAVE 决定用户是否可以保存变式:
'X' 只能保存全局变式
'U' 只能保存特定变式
'A' 都可以保存
SPACE 不可以保存变式
I_DEFAULT 决定用户是否可以定义默认的布局:
'X' 可以定义默认布局,这个参数是默认的
SPACE 不可以定义默认布局
IS_LAYOUT 布局参数,传递布局控制的一些信息
IS_PRINT 后台打印属性的参数
IT_SPECIAL_GROUPS 如果在字段目录中,一些字段通过SP_GROUP被分组在一起.我们就必须为这些
组传递一个组的文本内表进去
IT_TOOLBAR_EXCLUDING 需要隐藏的标准的按钮的内表
IT_HYPERLINK 为每个句柄分配了超连接的内表,LVC_S_HYPE中的HREF存放了超连接的地址,
HANDLE指定了句柄,使用这些句柄,你可以在GRID中使用超连接
IT_ALV_GRAPHICS 比较复杂,没有用过,意思好象是可以在图表中显示ALV.
IT_OUTTAB 输出数据存放的内表,数据都是存放在这个内表里
IT_FIELDCATALOG 字段目录
IT_SORT 排序的标准
IT_FILTER 过滤的标准

方法"REFRESH_TABLE_DISPLAY"的参数说明

参数 含义
IS_STABLE 刷新的稳定性,有2个参数,一个是行,一个是列.如果设置了相应的值,
那么对应的行,或者列,在刷新的时候,将会保持稳定,就是滚动条保持不动.
I_SOFT_REFRESH 这个参数只是在异常情况下被使用,如果设置了这个参数,任何创建的合计,
任何排序次序,任何为了显示数据而设置的过滤都将保持不变.这个是非常
有意义的.例如:当然你没有修改数据内表里的数据而想刷新ALV,仅仅只是
改变一下布局和字段目录.

ALV_GRID介绍二(5)
第三步,获取要显示数据的字段目录.有两种方式.
1.手动创建
FORM prepare_field_catalog CHANGING pt_fieldcat TYPE lvc_t_fcat .
DATA ls_fcat type lvc_s_fcat .
ls_fcat-fieldname = 'CARRID' .
ls_fcat-inttype = 'C' .
ls_fcat-outputlen = '3' .
ls_fcat-coltext = 'Carrier ID' .
ls_fcat-seltext = 'Carrier ID' .
APPEND ls_fcat to pt_fieldcat .
CLEAR ls_fcat .
ls_fcat-fieldname = 'CONNID' .
ls_fcat-ref_table = 'SFLIGHT' .
ls_fcat-ref_table = 'CONNID' .
ls_fcat-outputlen = '3' .
ls_fcat-coltext = 'Connection ID' .
ls_fcat-seltext = 'Connection ID' .
APPEND ls_fcat to pt_fieldcat .
ENDFORM .
2.半自动的创建
FORM prepare_field_catalog CHANGING pt_fieldcat TYPE lvc_t_fcat .
DATA ls_fcat type lvc_s_fcat .
CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
EXPORTING
i_structure_name = 'SFLIGHT'
CHANGING
ct_fieldcat = pt_fieldcat[]
EXCEPTIONS
inconsistent_interface = 1
program_error = 2
OTHERS = 3.
IF sy-subrc <> 0.
*--Exception handling
ENDIF.
LOOP AT pt_fieldcat INTO ls_fcat .
CASE pt_fieldcat-fieldname .
WHEN 'CARRID' .
ls_fcat-outpulen = '10' .
ls_fcat-coltext = 'Airline Carrier ID' .
MODIFY pt_fieldcat FROM ls_fcat .
WHEN 'PAYMENTSUM' .
ls_fcat-no_out = 'X' .
MODIFY pt_fieldcat FROM ls_fcat .
ENDCASE .
ENDLOOP .
ENDFORM .

ALV_GRID介绍二(6)
第四步,设置布局

FORM prepare_layout CHANGING ps_layout TYPE lvc_s_layo.
ps_layout-zebra = 'X' .
ps_layout-grid_title = 'Flights' .
ps_layout-smalltitle = 'X' .
ENDFORM. " prepare_layout

第五步,排除不需要的标准按钮(可选,这个是第一种方法,还有另外一种,在添加自定义的按钮的时候介绍)
在你的ALV上,如果你想排除一些你不想要的标准按钮,你可以把需要排除的按钮填入到表UI_FUNCTIONS中,然后传给 set_table_for_first_display方法的参数"IT_TOOLBAR_EXCLUDING".这些按钮的功能码一般都可以通过查看类cl_gui_alv_grid的常量属性中获取到,或者自己加个断点,在after_user_command事件中.

如果你要隐藏全部的工具条,你可以把layout中的no_toolbar设置为"X".

FORM exclude_tb_functions CHANGING pt_exclude TYPE ui_functions .
DATA ls_exclude TYPE ui_func.
ls_exclude = cl_gui_alv_grid=>mc_fc_maximum .
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_minimum .
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_subtot .
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_sum .
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_fc_average .
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_mb_sum .
APPEND ls_exclude TO pt_exclude.
ls_exclude = cl_gui_alv_grid=>mc_mb_subtot .
ENDFORM .

ALV_GRID介绍二(7)
按照上面的步骤,一个ALV的DEMO基本可以创建了.下面我们将讲述一些功能.

功能一:在第一次显示以后,修改字段目录和布局.

在运行的时候,很有可能需要在显示之后,需要设置一个新的布局或者字段目录.有下面这些方法去实现.

字段目录 : get_frontend_fieldcatalog
set_frontend_fieldcatalog
布局: get_frontend_layout
set_frontend_layout

使用这些方法,你在执行的任何时候,可以获取这些内容,然后修改他们.

DATA ls_fcat TYPE lvc_s_fcat .
DATA lt_fcat TYPE lvc_t_fcat .
DATA ls_layout TYPE lvc_s_layo .
CALL METHOD gr_alvgrid->get_frontend_fieldcatalog
IMPORTING
et_fieldcatalog = lt_fcat[] .
LOOP AT lt_fcat INTO ls_fcat .
IF ls_fcat-fieldname = 'PAYMENTSUM' .
ls_fcat-no_out = space .
MODIFY lt_fcat FROM ls_fcat .
ENDIF .
ENDLOOP .
CALL METHOD gr_alvgrid->set_frontend_fieldcatalog
EXPORTING
it_fieldcatalog = lt_fcat[] .

CALL METHOD gr_alvgrid->get_frontend_layout
IMPORTING
es_layout = ls_layout .
ls_layout-grid_title = 'Flights (with Payment Sums)' .
CALL METHOD gr_alvgrid->set_frontend_layout
EXPORTING
is_layout = ls_layout .

ALV_GRID介绍二(8)
功能二:设置排序条件

有时候我们需要使用到数据的排序.这个可以通过填充参考结构LVC_T_SORT创建的内表来实现,这个内表中包含了排序的标准.可以传递给set_table_for_first_display这个方法的IT_SORT参数来初始化一个排序.

FORM prepare_sort_table CHANGING pt_sort TYPE lvc_t_sort .
DATA ls_sort TYPE lvc_s_sort .
ls_sort-spos = '1' .
ls_sort-fieldname = 'CARRID' .
ls_sort-up = 'X' . "A to Z
ls_sort-down = space .
APPEND ls_sort TO pt_sort .
ls_sort-spos = '2' .
ls_sort-fieldname = 'SEATSOCC' .
ls_sort-up = space .
ls_sort-down = 'X' . "Z to A
APPEND ls_sort TO pt_sort .
ENDFORM. " prepare_sort_table

这有2点特别的说明:
1.如果这边排序的字段名,不存在于字段目录中,那将出现DUMP.
2.排序以后,垂直的网格中,如果出现相同的内容,就会合并,如果要避免,请在布局中设置"no_merging"为"X" .

你可以通过使用方法“get_sort_criteria” 和“set_sort_criteria”来获取和设置排序的标准.

ALV_GRID介绍二(9)
功能三:设置过滤(和排序类似)

ALV的标准按钮中已经有过滤的功能,我们也可以在初始显示的时候就设置过滤条件.我们需要把过滤条件填充到参考表类型"LVC_T_FILT"创建的内表中.过滤条件是类似一个RANGES结构的.然后把这个内表传递给方法"SET_TABLE_FOR_FIRST_DISPLAY"中的参数"IT_FILTER"

FORM prepare_filter_table CHANGING pt_filt TYPE lvc_t_filt .
DATA ls_filt TYPE lvc_s_filt .
ls_filt-fieldname = 'FLDATE' .
ls_filt-sign = 'E' .
ls_filt-option = 'BT' .
ls_filt-low = '20030101' .
ls_filt-high = '20031231' .
APPEND ls_filt TO pt_filt .
ENDFORM. " preparefiltertable
我们可以使用"get_filter_criteria" 和"set_filter_criteria"来获取过滤条件和设置过滤条件.

ALV_GRID介绍二(10)
功能四:选择方式
有时候,我们需要选择一些单元格,行或者列,在布局中,有个参数"SEL_MODE"可以设置我们不同的选择方式.下面是参数的介绍.和不同的地方.
值 模式 可能的选择 注释
SPACE 等同于B 参考B 默认设置
'A' 行和列的选择,无法选择单元格 多行,多列 用户可以使用最左边的选择按钮来选择多行
'B' 单选,不可以多选行,不可以多选单元格 多行,多列  
'C' 多选,可以多选行,不可以多选单元格 多行,多列  
'D' 单元格的选择,可以多选单元格 多行,多列,任何单元格多选 用户可以使用最左边的选择按钮来选择多行

注意: 
1.如果你设置了ALV是可编辑的,可能会覆盖你在布局中选择方式的设置的.
2.设置了选择方式以后,我们可以使用很多方法来获取用户的选择.比如"GET_SELECTED_CELLS","GET_SELECTED_CELLS_ID","GET_SELECTED_ROWS","GET_SELECTED_COLUMNS"
3.在执行PAI以后,用户所选择的单元格,行或者列可能丢失.你可以在PBO中,使用对应的SET方法来恢复这些选择.

ALV_GRID介绍二(11)
功能五:颜色设置
有的时候,我们需要在ALV网格上绘上一些颜色.可以给特定的行,某个特定的列,某个特定的单元格绘制颜色.
如果某列被设置为关键列,这列的颜色将被自动绘制,而不需要我们额外的指定.

先介绍ALV里色码.就是颜色编码,4位CHAR型.
Cxyz---
Color || |
| 1/0: 相反 开/关
1/0: 强化 开/关
其中C是固定的第一位,第二位代表是颜色编码(1到7),第三位是加强的设置,第四位是相反,个人理解,在强化关闭的情况下,相反的作用是背景和字体的变化.

颜色编码:
x 颜色 主要使用在
1 Gray-blue headers
2 Light gray List bodies
3 yellow totals
4 Blue-green Key columns
5 green Positive threshold value
6 red Negative threshold value
7 orange Control levels

A)设置列的颜色.
我们可以通过字段目录的"emphasize"控制字段来控制某列的颜色.这个字段同样是4位的CHAR型,传入上述的颜色编码.例如:
LS_FCAT-EMPHASIZE = 'C701'.

如果这列被设置为关键列,就是 LS_FCAT-KEY = 'X' ,那么颜色设置就不会起作用.请注意,自动产生的字段目录中,KEY的设置是自动获取的.

B)设置行的颜色

为某行设置颜色,是有点复杂的,我们需要在要显示的数据内表中增加一个字段,这个字段不需要在字段目录中存在.同样,这个字段也是4位的CHAR型,符合颜色编码的定义.
那我们就需要这样来定义我们的数据内表:

DATA BEGIN OF gt_list OCCURS 0 .
INCLUDE STRUCTURE SFLIGHT .
DATA rowcolor(4) TYPE c .
DATA END OF gt_list .

很明显,填入颜色编码以后,ALV怎么知道它是我们用来设置颜色的呢,在布局中,有个控制字段"INFO_FNAME",我们可以设置这个字段来告诉ALV,我们的颜色字段是哪个.
ps_layout-info_fname = 'ROWCOLOR'.

请注意,这个字段随便你起名字,但是记住,一定是数据内表里的字段,而且这边设置的时候一定要大写.你可以在任何时候设置行的颜色,只需要去修改内表里的这个字段的值,但是记得,一定要刷新以后才起作用.

C)设置单元格的颜色 
设置单元格和设置行的颜色,本质上没有什么大的区别,但是定位单元格需要2个参数.我们需要在数据内表中插入一个表类型的字段,这样我们的数据内表就变成了DEEP结构了,不过ALV是可以处理的.不需要担心.
插入的这个表类型的类型为"LVC_T_SCOL".
里面有3个参数:
FNAME告诉我们你需要设置的是哪个字段,如果为空,然后直接在COLOR中设置颜色,就是整行设置为这个颜色.如果具体到某个单元格,必须指定是哪个字段.
COLOR字段是用来设置颜色的.
NOKEYCOL字段比较关键了.设置为关键列的一些字段,我们的颜色设置可能被覆盖.通过这个字段的设置,可以避免被关键列覆盖.
同样,ALV在布局中有个字段"CTAB_FNAME"告诉我们,数据内表中,哪个字段是用来设置单元格的颜色的.
DATA BEGIN OF gt_list OCCURS 0 .
INCLUDE STRUCTURE SFLIGHT .
DATA rowcolor(4) TYPE c .
DATA cellcolors TYPE lvc_t_scol .
DATA END OF gt_list .
DATA ls_cellcolor TYPE lvc_s_scol .
...
READ TABLE gt_list INDEX 5 .
ls_cellcolor-fname = 'SEATSOCC' .
ls_cellcolor-color-col = '7' .
ls_cellcolor-color-int = '1' .
APPEND ls_cellcolor TO gt_list-cellcolors .
MODIFY gt_list INDEX 5 .

注意: 
颜色设置中有优先级顺序,他们是单元格--->行--->列.

ALV_GRID介绍二(12)
功能六:插入超链接
插入超链接是通过一个含有超级链接和句柄的表来实现的.这个表类型为"LVC_T_HYPE" ,句柄是一个INT4类型的字段,我们需要在数据显示的内表中,加入这样的字段,来告诉ALV,我们的字段指定的句柄,从而找到对应的超级链接.在字段目录中,WEB_FIELD是用来指定对应的句柄名的.
下面举个例子来说明,我们要为字段CARRID,CONNID建立超级链接:

首先,内表定义中,我们加入2个句柄字段:

DATA BEGIN OF gt_list OCCURS 0 .
INCLUDE STRUCTURE SFLIGHT .
DATA rowcolor(4) TYPE c .
DATA cellcolors TYPE lvc_t_scol .
DATA carrid_handle TYPE int4 .
DATA connid_handle TYPE int4 .
DATA END OF gt_list .

第二: 建立一个超级链接内表,里面存放句柄所对应的超级链接.创建的时候注意,它参考的表类型,一定是"LVC_T_HYPE".
FORM prepare_hyperlinks_table CHANGING pt_hype TYPE lvc_t_hype .
DATA ls_hype TYPE lvc_s_hype .
ls_hype-handle = '1' .
ls_hype-href = 'http://www.company.com/carrids/car1' .
APPEND ls_hype TO pt_hype .
ls_hype-handle = '2' .
ls_hype-href = 'http://www.company.com/carrids/car1' .
APPEND ls_hype TO pt_hype .
ls_hype-handle = '3' .
ls_hype-href = 'http://www.company.com/carrids/car1' .
APPEND ls_hype TO pt_hype .
ls_hype-handle = '4' .
ls_hype-href = 'http://www.company.com/connids/con11' .
APPEND ls_hype TO pt_hype .
ls_hype-handle = '5' .
ls_hype-href = 'http://www.company.com/connids/con12' 
APPEND ls_hype TO pt_hype .
.. ..
ENDFORM .

第三.通过字段目录FIELDCATLOG来指定相应的句柄字段.

对于CARRID的field catalog
Ls_fieldcat-web_field = ‘CARRID_HANDLE’.
对于CONNID的field catalog
Ls_fieldcat-web_field = ‘CONNID_HANDLE’.
在方法"SET_TABLE_FOR_FIRST_DISPLAY"中把句柄内表传给参数it_hyperlink。

第四:在数据显示的内表中,指定对应的句柄: 
LOOP AT gt_list.
IF gt_list-carrid = ‘XX’.
Gt_list-carrid_handle = ‘1’.
IF gt_list-connid = ‘01’.
Gt_list-connid_handle = ‘4’.
ENDIF.
ENDIF.
ENDLOOP.

ALV_GRID介绍二(13)
功能七:把字段设置为下拉
有时候我们可以把一些字段设置为下拉,比如一些类型,一些字段的值是比较固定的一些值,当然,我们也可以通过搜索帮助来做,这些只是看各自的爱好和需要了.
设置为下拉,和上一篇设置超级链接是类似的,也是使用了一个内表存放了句柄和对应的值,这个表类型为"LVC_T_DROP".不过传递给ALV的方式有点区别.超级链接是通过方法"SET_TABLE_FOR_FIRST_DISPLAY"的参数来传递的,而下拉的内表传递需要使用方法"SET_DROP_DOWN_TABLE".
如果我们希望把这个列都设置为下拉,那么我们可以在字段目录中,把控制字段"DRDN_HNDL"指向对应的下拉内表的句柄就可以了.例如: ps_fcat-drdn_hndl = '1' .

如果是某个单元格设置为下拉,那我们就需要在数据显示的内表中增加一个句柄字段(如果是有多个不同的字段需要设置下拉,可以增加多个字段),同时得在字段目录里设置"DRDN_FIELD".例如:
ps_fcat-drdn_field = 'PTYP_DD_HNDL' .

数据显示内表定义为:
DATA BEGIN OF gt_list OCCURS 0 .
INCLUDE STRUCTURE SFLIGHT .
DATA rowcolor(4) TYPE c .
DATA cellcolors TYPE lvc_t_scol .
DATA carrid_handle TYPE int4 .
DATA connid_handle TYPE int4 .
DATA ptype_dd_hndl TYPE int4 .
DATA END OF gt_list .
定义下拉的句柄内表:
FORM prepare_drilldown_values.
DATA lt_ddval TYPE lvc_t_drop .
DATA ls_ddval TYPE lvc_s_drop .
ls_ddval-handle = '1' .
ls_ddval-value = 'JFK-12' .
APPEND ls_ddval TO lt_ddval .
ls_ddval-handle = '1' .
ls_ddval-value = 'JSF-44' .
APPEND ls_ddval TO lt_ddval .
ls_ddval-handle = '1' .
ls_ddval-value = 'KMDA-53' .
APPEND ls_ddval TO lt_ddval .
ls_ddval-handle = '1' .
ls_ddval-value = 'SS3O/N' .
APPEND ls_ddval TO lt_ddval .
CALL METHOD gr_alvgrid->set_drop_down_table
EXPORTING
it_drop_down = lt_ddval .
ENDFORM. " prepare_drilldown_values
准备好内表,以后,使用方法set_drop_down_table来传递给ALV.

ALV_GRID介绍二(14)
功能八:基于事件的附加功能

作为使用面向对象的方法开发的一个组件,ALV GRID控制器有很多响应用户交互的事件.这些事件经常被用来增强一些用户响应的功能.为实现这样的功能,我们必须在程序中创建一个类的实例来作为ALV GRID实例的事件处理者. 
下表列出了一些ALV GRID的事件,后面的HTML列用来说明是否在HTML形式SAP GUI上支持.

用户定义文本输出:
Event Application HTML
Print_end_of_list Define output text to be printed at the end of the entire
list √
Print_top_of_list Define output text to be printed at begin of the entire list

Print_top_of_page Define output text to be printed at begin of each page √
Print_end_of_page Define output text to be printed at the end of each page √
Subtotal_text Define self-defined subtotal texts √

ALV GRID的鼠标动作事件
Event Application HTML
Button_click Query click on a push button in the ALV GRID control √
Double_click Query a double click on a cell of the ALV GRID √
Hotspot_click Query a hotspot click on columns defined for this purpose in
advance √
ondrag Collect information when elements of the ALV GRID Control are dragged ×
ondrop Process information when elements of the ALV GRID Control are dropped ×
ondropComplete Perform final actions after successful drag&drop ×
ondropGetFlavor Distinguish between options for drag&drop behavior ×

自定义和标准功能实现
Event Application HTML
Before_user_command Query self-defined and standard functions √
User_command Query self-defined function codes √
After_user_command Query self-defined and standard functions codes √

自定义功能的定义(自定义按钮,菜单等等)
Event Application HTML
Tool bar Change,delete or add gui elements on alv grid √
Menu_button Define menus for menu buttons in the toolbar √
Context_menu_request Change context menu ×
Onf1 Define self-defined f1 help √

下面是一段代码,举例说明如果定义我们的事件处理类.
CLAS lcl_event_handler DEFINITION.
PUBLIC SECTION.
METHODS:
*--在ALV的工具条上增加新的按钮
Handle_toolbar FOR EVENT toolbar OF cl_gui_alv_grid
IMPORTING e_object e_interactive,
*--实现用户命令
Handle_user_command 
FOR EVENT user_command OF cl_gui_alv_grid
IMPORTING e_ucomm.
*--热点点击控制
Handle_hotspot_click
FOR EVENT hotspot_click OF cl_gui_alv_grid
IMPORTING e_row_id e_column_id es_row_no.
*--在用户命令触发之前
Handle_before_user_command
FOR EVENT before_user_command OF cl_gui_alv_grid
IMPORTING e_ucomm.
*--在用户命令触发之后
Handle_after_user_command
FOR EVENT after_user_command OF cl_gui_alv_grid
IMPORTING e_ucomm.
*--在ALV可修改的情况下,控制数据修改
Handle_data_changed
FOR EVENT data_changed OF cl_gui_alv_grid
IMPORTING er_data_changed.
*--在数据修改完成之后
Handle_data_changed_finished
FOR EVENT data_changed_finished OF cl_gui_alv_grid
IMPORTING e_modified.
*--管理菜单
Handle_menu_button
FOR EVENT menu_button OF cl_gui_alv_grid
IMPORTING e_object e_ucomm.
*--管理按钮点击
Handle_button_click
FOR EVENT button_click OF cl_gui_alv_grid
IMPORTING e_objec e_ucomm.
PRIVATE SECTION.
ENDCLASS.

下面是类的实现的一些概要代码,参数可以从ALV的事件中直接获取出来:
CLASS lcl_event_handler IMPLEMENTATION.
*-- Handle toolbar
METHOD handle_toolbar.
PERFORM handle_toolbar USIGN e_object e_interactive.
ENDMETHOD.
*-- Handle hotspot click
METHOD handle_hotspot_click.
PERFORM handle_hotspot_click USING e_row_id e_column_id es_row_no.
ENDMETHOD.
*-- Handle double click
METHOD handle_double_click.
PERFORM handle_double_click USING e_row e_column es_row_no.
ENDMETHOD.
*-- Handle after user command
METHOD handle _after_user_command.
PERFORM handle_after_user_command USING e_object.
ENDFORM.
*-- Handle before user command
METHOD handle_before_user_command.
PERFORM handle_before_user_command.
ENDMETHOD.
*--Handle data changed
METHOD handle_data_changed.
PERFORM handle_data_changed USING er_data_changed.
ENDMEHTOD.
METHOD handle_data_changed_finished.
PERFORM handle_data_chaged USING e_modified.
ENDMETHOD.
METHOD handle_menu_button.
PERFORM handle_menu_button USING e_object e_ucomm.
ENDMEHTOD.
MEHTOD handle_button_click.
PERFORM handle_button_click USING e_objcet e_ucomm.
ENDMETHOD.
ENDCALSS.

光定义了这些还不够,我们需要把事件管理类注册到ALV GRID的实例事件.
DATA gr_event_handler TYPE REF TO lcl_event_handler .
.. ..
*--Creating an instance for the event handler
CREATE OBJECT gr_event_handler .
*--Registering handler methods to handle ALV Grid events
SET HANDLER gr_event_handler->handle_user_command FOR gr_alvgrid .
SET HANDLER gr_event_handler->handle_toolbar FOR gr_alvgrid .
SET HANDLER gr_event_handler->handle_menu_button FOR gr_alvgrid .
SET HANDLER gr_event_handler->handle_double_click FOR gr_alvgrid .
SET HANDLER gr_event_handler->handle_hotspot_click FOR gr_alvgrid .
SET HANDLER gr_event_handler->handle_button_click FOR gr_alvgrid .
SET HANDLER gr_event_handler->handle_before_user_command FOR gr_alvgrid .
SET HANDLER gr_event_handler->handle_context_menu_request FOR gr_alvgrid .
SET HANDLER gr_event_handler->handle_data_changed FOR gr_alvgrid .
SET HANDLER gr_event_handler->handle_data_changed_finished FOR gr_alvgrid .

ALV用例大全的更多相关文章

  1. Android JSON原生解析的几种思路,以号码归属地,笑话大全,天气预报为例演示

    Android JSON原生解析的几种思路,以号码归属地,笑话大全,天气预报为例演示 今天项目中要实现一个天气的预览,加载的信息很多,字段也很多,所以理清了一下思路,准备独立出来写一个总结,这样对大家 ...

  2. 接口如何使用(以笑话大全api为例)

    接口如何使用(以笑话大全api为例) 一.总结 一句话总结:直接用ajax,或者post,get方式向接口网址请求数据,然后接收网站传过来的数据就好,和我们写网站的时候前台向后台请求数据的方式一样. ...

  3. .NET Core dotnet 命令大全

    dotnet 命令大全,让你理解dotnet 命令. 本文将以一个实例串起 dotnet 所有命令,让你玩转dotnet 命令. 本篇文章编写环境为windows 10 ,dotnet 命令同样适用于 ...

  4. 【机器学习Machine Learning】资料大全

    昨天总结了深度学习的资料,今天把机器学习的资料也总结一下(友情提示:有些网站需要"科学上网"^_^) 推荐几本好书: 1.Pattern Recognition and Machi ...

  5. R语言:ggplot2精细化绘图——以实用商业化图表绘图为例

    本文版权归http://www.cnblogs.com/weibaar 本文旨在介绍R语言中ggplot2包的一些精细化操作,主要适用于对R画图有一定了解,需要更精细化作图的人,尤其是那些刚从exce ...

  6. SQL语句大全

    经典SQL语句大全(绝对的经典) 一.基础 1.说明:创建数据库CREATE DATABASE database-name 2.说明:删除数据库drop database dbname3.说明:备份s ...

  7. oracle 错误代码大全

    oracle错误代码大全(超详细)   ORA-00001: 违反唯一约束条件 (.) ORA-00017: 请求会话以设置跟踪事件 ORA-00018: 超出最大会话数 ORA-00019: 超出最 ...

  8. SQL 语句大全(转载)

    经典SQL语句大全 一.基础 1.说明:创建数据库CREATE DATABASE database-name 2.说明:删除数据库drop database dbname3.说明:备份sql serv ...

  9. Python资源大全

    The Python Tutorial (Python 2.7.11) 的中文翻译版本.Python Tutorial 为初学 Python 必备官方教程,本教程适用于 Python 2.7.X 系列 ...

随机推荐

  1. Android showing LoadingView or EmptyView for Activity or Fragment

    这几天利用一些时间,整理了一下,写了一个简单的工具类,用来快速的显示LoadingView或者EmptyView,以前都是定义一个layout,根布局为FrameLayout,再在layout布局文件 ...

  2. 关于python协程的一个例子的学习

    例子来自https://blog.tonyseek.com/post/event-manage-with-greenlet/ 加了一些注释看懂了: 注释中的数字表示执行的顺序,这个简单的例子用到了py ...

  3. php生成随机密码(php自定义函数)转自先锋教程网

    php生成随机密码(php自定义函数) 时间:2015-12-16 20:43:49来源:网络 导读:php随机密码的生成代码,使用php自定义函数生成指定长度的随机密码,密码规则为小写字母与数字的随 ...

  4. 【转载】linux tail命令的使用方法详解

    本文介绍Linux下tail命令的使用方法.linux tail命令用途是依照要求将指定的文件的最后部分输出到标准设备,通常是终端,通俗讲来,就是把某个档案文件的最后几行显示到终端上,假设该档案有更新 ...

  5. MFC ADO连接Oracle12c数据库 客户端环境搭建

    ADO连接方式一:Provider=MSDAORA.1; 环境配置如下: 去官网下载ODAC121024Xcopy_32bit.zip安装 安装方式如下: (1)解压文件 (2)用命令行CD到该文件的 ...

  6. andorid jni入门教程一之helloworld

    开发环境:windows2007, eclipse 做anroid越深发现用到底层开发的时候越多,但是我以前也没有搞过,因此现在打算好好学习学习.先从最简单的做起.正所谓万事开头难啊. 搞了近一天终于 ...

  7. AC_Dream 1224 Robbers(贪心)

    题意:n个抢劫犯分别抢到的金钱是k1, k2, k3,...,一共得到的金钱是m, 但是在分钱的时候是按照x1/y, x2/y, x3/y,....的比例进行分配的!这样的话 一些抢劫犯就会觉得不公平 ...

  8. 队列的图文解析 和 对应3种语言的实现(C/C++/Java)

    概要 本章和介绍"栈"时的流程一样,先对队列进行介绍,然后分别给出队列的C.C++和Java三种语言的实现.内容包括:1. 队列的介绍2. 队列的C实现3. 队列的C++实现4.  ...

  9. 简单的session共享的封装

    目的 session存储在缓存服务器上(各种缓存服务器上均可,本文以memcached为例),但对开发者来说,他不用关注,只需要调用request.getSession()方法即可获取到session ...

  10. Hadoop入门进阶课程6--MapReduce应用案例

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,博主为石山园,博客地址为 http://www.cnblogs.com/shishanyuan  ...