流程顺序
ALV的组成主要分为以下3大部分:
- 工具栏
- 标题栏
- 显示数据的网格控制器(必要时可以隐藏工具栏和标题栏)
ALV开发注意事项
- 在ALV中,需要注意所有需要显示的列,都必须在相应的内表中有对应的字段,字段名字不能写错。
- 在SAP ABAP程序中,字符串的大小写很重要,在单引号包围的字符串中,一般来说都应该用大写,特别是在调用一些系统的方法时传入字符串参数时。
- 传入到ALV中的列对应的字段名称也必须使用大写字母,否则数据不会显示出来。
- 使用宏定义或者子例程可以减少代码量,并且尽可能实现代码的复用。
- 注意在form里定义的变量在离开form后,就会被系统释放掉,回收内存空间。
开发ALV的基本流程
第一步:声明变量
定义ALV所要用到的类型池:type-pools:slis.
针对ALV的控制信息数据(Layout & Fieldcat)
type-pools:slis. "引入slis包定义使用专门ALV
data: gs_fielcat type lvc_s_fcat, "ALV控制:字段目录
gt_fielcat type lvc_t_fcat. "字段目录的工作区
data: gs_layout type lvc_s_layo. "ALV控制:布局结构
data: gs_listheader type slis_t_listheader, "表头的设置
gs_setting type lvc_s_glay. "网格设置
data: lt_event type slis_t_event, "事件的内表
ls_event type slis_alv_event. "事件的工作区
data: gs_sort type lvc_s_sort, "ALV控制:排序顺序
gt_sort type lvc_t_sort.
data:gs_stbl type lvc_s_stabl. "ALV控制:刷新稳定性
第二步:定义内表
存放自定义数据文件的数据,以及在ALV中显示
*方法一:
data: begin of gs_out,
sel,
id type zxytest-id, "学号
name type zxytest-name, "姓名
age type zxytest-age, "年龄
sex type zxytest-sex, "性别
hobby type zxytest-hobby, "爱好
end of gs_out.
data:gt_out like table of gs_out.
field-symbols: <fs_out> like gs_out. "定义gs_out的指针
* 方法二
types:begin of ls_out,
sel,
id type zxytest-id, "学号
name type zxytest-name, "姓名
age type zxytest-age, "年龄
sex type zxytest-sex, "性别
hobby type zxytest-hobby, "爱好
end of ls_out.
data: gs_out type ls_out,
gt_out type ls_out,
gs_out_pc type ls_out,
gt_out_pc type ls_out.
field-symbols:<fs_out> type lt_out.
第三步:读取数据
读取数据存放至Internal Table(内表)
form frm_get_data.
select *
into corresponding fields of table gt_out
from zxytest
where id in s_id
and name in s_name
and age in s_age.
endform.
第四步:ALV格式控制
ALV开发中两个重要的对象——fieldcat和layout
在调用ALV的函数中,除了定义所输出使用的内表之外,还有两部分是必须确认的:列栏位属性和布局属性。
列栏位属性fieldcat:
设置输出中具体字段的名称、类型、格式等属性;
对于系统结构表,函数可参照此结构自动创建列属性(这里是指REUSE_ALV_GRID_DISPLAY_LVC方法中的i_structre_name参数
),可以没有调用列栏位属性。
布局属性layout:
设置输出ALV列表的整体布局的属性,如输出字段的颜色、表格中的线条等。
没有调用布局属性时,系统按默认布局输出,不做任何调整。
两对象同属于类型组slis,在ALV开发中必须声明类型组slis。
ALV参数控制
在列栏位属性主要用到的参考表
lvc_s_fcat;
lvc_t_fcat.
data: gs_fielcat type lvc_s_fcat,
gt_fielcat type lvc_t_fcat.
fieldcat的部分属性
属性 | 说明 |
---|---|
fieldcat-col_pos = n. | 输出列 |
fieldcat-fieldname= ‘FIELDNAME’. | 对应的内表字段名称 |
fieldcat-reptext = ‘名称’. | 数据元素文本 |
fieldcat-ref_field = ‘NAME’. | 内部表字段的参考字段名称 |
fieldcat-ref_table = ‘ZXYTEST’. | 内部表字段的参考表名称 |
fieldcat-seltext_s/m/l = ‘列名’. | 输出列文本(_s:短文本,_l:长文本,_m:中文本) |
fieldcat-emphasize = ‘CX10’. | 带有颜色的高亮列(其中X=(1~7)颜色同format |
fieldcat-hotspot = ‘X’. | 作为热点显示可触发鼠标触发事件,下面出现下划线,响应单击 |
fieldcat-currency = ‘CURRKEY’. | 表TCURX中的货币名称 |
fieldcat-quantity(3) | 计量单位 |
fieldcat-qfieldname | 参考计量单位的字段名称 |
fieldcat-round = n. | 四舍五入至小数点位数下n位 |
fieldcat-exponent = n. | 浮点数的幂指数为n位 |
fieldcat-key = ‘X’. | 关键字段 |
fieldcat-icon = ‘X’. | 作为图标输出 |
fieldcat-symbol = ‘X’. | 作为符号输出 |
fieldcat-checkbox = ‘X’. | 作为复选框输出 |
fieldcat-just = SPACE,‘X’,‘L’,‘C’. | 对齐方式 |
fieldcat-lzero = ‘X’. | 输出前导零 |
fieldcat-no_sign = ‘X’. | 输出抑制符号 |
fieldcat-no_zero = ‘X’. | 为输出隐藏零 |
fieldcat-edit_mask = SAPACE,mask. | 输出编辑掩码格式 |
fieldcat-edit | 准备输入 |
fieldcat-fix_column = ‘X’. | 固定列 |
fieldcat-do_sum = ‘X’. | 总计列值总和 |
fieldcat-no_out = ‘X’. | 列不输出 |
fieldcat-tech = ‘X’. | 该字段为技术字段 |
fieldcat-outputlen = n. | 列的字符宽度为n |
fieldcat-decimals_out = n. | 能控制小数点的位数为n |
fieldcat-datatype = C,I,N… | 定义数据类型 |
gs_fielcat的代码用例
form frm_fieldcat.
data:lv_colpos type i.
"定义一个宏
define alv_fieldcat.
clear:gs_fielcat.
gs_fielcat-col_pos = lv_pos. "输出列
gs_fielcat-fieldname = &1. "ALV控制:内部表字段的字段名称
gs_fielcat-reptext = &2. "标题
gs_fielcat-scrtextl = &2. "长字段标签
gs_fielcat-scrtextm = &2. "中字段标签
gs_fielcat-scrtexts = &2. "短字段标签
gs_fielcat-ref_field = &3. "ALV 控制:内部表字段的参考字段名称
gs_fielcat-ref_table = &4. "ALV控制:内部表字段的参考表名称
gs_fielcat-key = &5. "ALV控制:关键字段
gs_fielcat-emphasize = &6. "ALV控制:带有颜色的高亮列
gs_fielcat-outputlen = &7. "ALV控制:列的字符宽度
gs_fielcat-edit = &8. "ALV控制:准备输入
append gs_fielcat to gt_fielcat. "将gs_fielcat中的值赋值给gt_fielcat
lv_colpos += 1.
end-of-definition.
refresh gt_fielcat.
lv_colpos = 1.
"调用宏,创建ALV字段目录
alv_fieldcat 'ID' '学号' 'ID' 'ZXYTEST' 'X' '' 'X' ' '.
alv_fieldcat 'NAME' '姓名' 'NAME' 'ZXYTEST' ' ' 'C111' 'X' 'X'.
alv_fieldcat 'AGE' '年龄' 'AGE' 'ZXYTEST' ' ' '' 'X' ' '.
alv_fieldcat 'SEX' '性别' 'SEX' 'ZXYTEST' ' ' '' 'X' 'X'.
alv_fieldcat 'HOBBY' '爱好' 'HOBBY' 'ZXYTEST' ' ' 'C610' 'X' 'X'.
endform.
以上代码主要是利用宏来创建ALV字段目录,其中字段目录最多可以有9个属性,因为宏的最大占字符为9.其中必须拥有的字段目录属性是fieldname(内部表的字段名称)、reptext(内部表的字段标题,其中与reptext在同一个占字符还有scrtext_l(长字段标签)、scrtext_m(中字段标签)、scrtext_s(短字段标签))、ref_field(内部表字段的参考字段名)、ref_table(内部表字段的参考表名称)。除了以上4个是必须存在的,其他根据要求选择,可以在lvc_s_fcat结构中查看。
定义宏的时候用了几个占字符,则在使用的时候就必须有几个占字符。
ALV参数控制(gs_layout)
在布局属性主要用到的参考表
lvc_s_layo
data:gs_layout type lvc_s_layo.
layout的部分属性
布局控制[Layout]
布局是用来控制整个ALV的一个布局,比如:ALV的标题是否可以编辑,行颜色,列颜色。
参照ALV的控制结构[LVC_S_LAYO]。
详细的结构说明如下:(注意这些字段的取值,单引号内,’ '空格代表否,'X’代表是)
字段名 | 描述 | 取值范围 |
---|---|---|
cwidth_opt | 最优化宽度 | space, ‘X’ |
smalltitle | 小标题 | space,‘X’ |
grid_title | 标题,在网格和工具条之间 | 最长70个字符 |
no_headers | 列标题隐藏 | space, ‘X’ |
no_hgridln | 隐藏水平线 | space, ‘X’ |
no_marging | 禁用单元格合并 | space, ‘X’ |
no_rowmark | 禁用系统自带的行选择‘X’为D和A的时候隐藏 | space, ‘X’ |
no_toolbar | 隐藏工具条 | space, ‘X’ |
no_vgridln | 隐藏垂直线 | space, ‘X’ |
sel_mode | 选择模式 | space, ‘X’ |
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个字符 |
box_fname | ALV控制:内部表字段的字段名称 | space, ‘X’ |
gs_layout的代码用例
form frm_layout.
clear: gs_layout.
gs_layout-zebra = 'X'. "斑马线,ALV控制:可选行颜色
gs_layout-cwidth_opt = 'X'. "ALV控制:优化列宽
gs_layout-box_fname = 'SEL'. "ALV控制:内部表字段的字段名称
endform.
zebra(ALV控制:可选行颜色)、cwidth_opt(ALV控制:优化列宽)、box_fname(ALV控制:内部表字段的字段名称)是ALV中最主要的三个样式,如果还需要其他样式可以在lvc_s_layo结构中查看需要添加的样式。
第五步:定义事件
建立事件清单(Event Catalogs),主要用到的参考表:
slis_t_event,
slis_alv_event.
data: gs_event type slis_t_event,
gt_event type slis_alv_event.
第六步:显示ALV
ALV数据的显示
调用ALV须有使用Function Module ‘REUSE_ALV_GRID_DISPLAY_LVC’.ALV的调用都需要调用这个方法在能实现。
form drm_display_data.
call function 'REUSE_ALV_GRID_DISPLAY_LVC'
exporting
* I_INTERFACE_CHECK = ' '
* I_BYPASSING_BUFFER =
* I_BUFFER_ACTIVE =
i_callback_program = sy-repid
i_callback_pf_status_set = 'SUB_STATUS_SET' "设置标题栏和状态栏
i_callback_user_command = 'SUB_USER_COMMAND' "ALV触发事件
* I_CALLBACK_TOP_OF_PAGE = ' '
* I_CALLBACK_HTML_TOP_OF_PAGE = ' '
* I_CALLBACK_HTML_END_OF_LIST = ' '
* I_STRUCTURE_NAME =
* I_BACKGROUND_ID = ' '
* I_GRID_TITLE =
i_grid_setting = gs_setting
is_layout_lvc = gs_layout
it_fieldcat_lvc = gt_fielcat
* IT_EXCLUDING =
* IT_SPECIAL_GROUPS_LVC =
* IT_SORT_LVC =
* IT_FILTER_LVC =
* IT_HYPERLINK =
* IS_SEL_HIDE =
* I_DEFAULT = 'X'
i_save = 'X'
* IS_VARIANT =
it_events = lt_event
* IT_EVENT_EXIT =
* IS_PRINT_LVC =
* IS_REPREP_ID_LVC =
* I_SCREEN_START_COLUMN = 0
* I_SCREEN_START_LINE = 0
* I_SCREEN_END_COLUMN = 0
* I_SCREEN_END_LINE = 0
* I_HTML_HEIGHT_TOP =
* I_HTML_HEIGHT_END =
* IT_ALV_GRAPHICS =
* IT_EXCEPT_QINFO_LVC =
* IR_SALV_FULLSCREEN_ADAPTER =
* IMPORTING
* E_EXIT_CAUSED_BY_CALLER =
* ES_EXIT_CAUSED_BY_USER =
tables
t_outtab = gt_out
exceptions
program_error = 1
others = 2.
if sy-subrc = 0.
message id sy-msgid type sy-msgty number sy-msgno
with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
endif
endform.
REUSE_ALV_GRID_DISPLAY_LVC方法中一些参数的解释
- i_structre_name参数
为了制作输出表的形式输入ABAP数据字典结构体名字。只要设置这个参数会自动生成符合此结构体的字段目录。即在程序内部没有必要重新构成字段目录。
call function 'REUSE_ALV_GRID_DISPLAY_LVC'
exporting
i_structre_name = 'MARA'. "系统将自动生成符合“mara”结构体的字段目录
mara(常规物料数据)是ABAP数据字典结构体中存在的结构体名字,只要i_structre_name = ‘MARA’,那么系统会自动生成与mara结构体相对应的字段目录,无需在内部重新构成字段目录。这样ALV将会显示mara整个表中的字段名。应该可以应用在只参考同一张abap数据字典结构体,且输出该结构体的所有字段名时可以用该参数。
- is_variant参数
可以设置ALV列表变式(Variant)。列表变式把修改的画面字段顺序、排列字段等操作保存成一个变式,以便以后查询时以同样式显示。首先需要在报表程序中追加用于选择布局的参数及功能。
data: gs_variant type disvariant.
call screen 100.
gs_variant-report = sy_repid.
gs_variant-username = sy-uname.
call function 'REUSE_ALV_GRID_DISPLAY_LVC'
exporting
is_variant = gs_variant
- i_save参数
值 | 功能 |
---|---|
X | 只能设置全局变量 |
U | 只限特定用户的布局 |
A | 同时包含X和U |
SPACE | 不保存布局 |
- i_default参数
决定用户是否能保存默认变式
值 功能 | |
---|---|
X | 可以设置默认变式 |
SPACE | 不能设置默认变式 |
- t_outtab参数
t_outtab参数是定义要显示数据的输出表的参数。换句话说就是指定包含要显示数据的内表的参数。
设置标题栏和状态栏
form sub_status_set using rt_extab type slis_t_extab
rs_selfield type slis_selfield.
set pf-status 'STATUS01'. "状态栏
set titlebar 'TITLE'. "标题栏,可以更改ALV最上面的标题
endform
ALV触发事件
form sub_user_command using rv_ucomm like sy-ucomm
rs_selfield type slis_selfield.
"刷新ALV输出表数据
data:lo_grid type ref to cl_gui_alv_grid.
call function 'GET_GLOBALS_FROM_SLVC_FULLSCR'
importing
e_grid = lo_grid.
call method lo_grid->check_changed_data. "检查改变的数据
call method lo_grid->refresh_table_display. "刷新ALV
endform.
第七步:用户事件
定义USER按键处理事件
在上述的ALV触发事件sub_user_command下面使用。
form sub_user_command using rv_ucomm like sy-ucomm
rs_selfield type slis_selfield.
case rv_ucomm.
when '自定义按钮名'
"该按钮的逻辑写在这里
when others.
endcase.
endform.