一、ALV是什么?
ALV(SAP LIST VIEW)是一种比较美观的报表显示工具,具有网格显示方式,有排序、筛选、过滤、(分类)汇总等功能,数据以单元格为单位显示。
二、 ALV实现方法
ALV的实现方法有三种:
使用类CL_SALV_TABLE;
使用类CL_GUI_GRID_DISPLAY
-
使用Founction来实现的,REUSE_ALV_GRID_DISPLAY_LVC和REUSE_ALV_GRID_DISPLAY,两个函数都可以将数据用ALV的形式显示出来,只是在一些小的地方有些不同。这两个Function的底层也是基于类CL_GUI_GRID_DISPLAY。
其中这两个函数都用到的全局变量为:
1个类型池SLIS和一个指定列数的变量DATA: v_pos TYPE i ." 指定第几列
REUSE_ALV_GRID_DISPLAY_LVC函数用到的全局变量:
DATA: wa_fieldcat TYPE lvc_s_fcat , " 列名表的工作区
i_fieldcat TYPE lvc_t_fcat , " 存放列名的表
i_layout TYPE lvc_s_layo . " 负责整个ALV的布局属性 ```
#####三、 ALV实例
下面以REUSE_ALV_GRID_DISPLAY来介绍ALV的用法:
1. 全局变量声明
----------------------------------ALV 常用变量声明:------------------------
TYPE-POOLS:slis. "类型池
DATA: it_fieldcat TYPE slis_t_fieldcat_al WITH HEADER LINE, "列名集
i_layout TYPE slis_layout_alv, "设置布局
g_repid LIKE sy-repid . "程序名
*页头
DATA: wa_header TYPE slis_listheader,
it_header TYPE slis_t_listheader.
*排序、过滤
DATA: wa_sort_lvc TYPE slis_sortinfo_alv,
it_sort TYPE slis_t_sortinfo_alv,
it_filter TYPE slis_t_filter_alv .
2. 调用ALV Founction 显示
调用alv显示函数:
FORM display_data .
PERFORM f_alv_layout_build CHANGING i_layout.
PERFORM f_alv_fieldcat_build CHANGING it_fieldcat[].
PERFORM f_filter_build TABLES it_filter.
PERFORM f_sort_build TABLES it_sort.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = g_repid
i_callback_pf_status_set = 'SET_PF_STATUS' "ALV工具栏Subroutine(子程序名),没有自定义按钮时候,该参数可以不要,这时会显示ALV标准的按钮;
i_callback_user_command = 'USER_COMMAND' "LV User Command Subroutine(子程序名)实现对应菜单项的操作响应
i_callback_top_of_page = 'TOP_OF_PAGE '
is_layout = i_layout
it_fieldcat = it_fieldcat[]
it_sort = it_sort[]
it_filter = it_filter[]
TABLES
t_outtab = it_data[]
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.
其中部分参数使用子程序名传递,部分参数变量传递,常用参数如下。
2. 设置显示的字段集,直接将处理后的it_fieldcat[]赋值给1中的it_fieldcat参数。
一种是手动设置
宏声明,放在数据定义部分:
DEFINE mar_out.
clear it_fieldcat.
it_fieldcat-fieldname = &1. "字段
it_fieldcat-tabname = &2. "alv使用的内表
it_fieldcat-seltext_l = &3. "字段展示文本
append it_fieldcat.
if it_fieldcat-fieldname = 'SAKNR' . "为字段SAKNR设置热点
it_fieldcat-hostpot = 'X' .
endif.
END-OF-DEFINITION.
设置列名的子程序
FORM f_alv_fieldcat_build CHANGING pt_fieldcat TYPE slis_t_fieldcat_alv.
FIELD-SYMBOLS <fs_fieldcat> LIKE LINE OF pt_fieldcat.
mar_out 'BUKRS' 'it_data' '公司代码'. "注意这个地方字段名要大写否则报错
mar_out 'BUTXT' 'it_data' '公司代码描述'.
mar_out 'SAKNR' 'it_data' '科目编号'.
mar_out 'TXT20' 'it_data' '科目名称'.
mar_out 'B_BALANCE' 'it_data' '期初余额'.
mar_out 'E_BALANCE' 'it_data' '期末余额'.
mar_out 'C_BALANCE' 'it_data' '当期发生额'.
LOOP AT it_fieldcat ASSIGNING <fs_fieldcat> WHERE fieldname = 'BUKRS'.
<fs_fieldcat>-do_sum = 'X'. "设置按bukrs字段汇总
ENDLOOP.
ENDFORM. "f_alv_fieldcat_build
另一种如果内表结构与数据字典的表结构一致,可以调用REUSE_ALV_FIENDCATALOG_MERGE 函数半自动创建列名集。
3. 设置布局,将处理后的i_layout 赋值给1中的is_layout。
FORM f_alv_layout_build CHANGING p_layout TYPE slis_layout_alv.
p_layout-colwidth_optimize = 'X'. " 自动调整列
p_layout-zebra = 'X'. "间隔行颜色变换显示
" p_layout-detail_titlebar = '详细内容'. "设置弹出窗口的标题栏
" p_layout-box_fieldname= 'BOX' "设置grid的多行选择列,其中box必须为内表的一列,为一个字符长度
" p_layout_no_colhead = 'X'. "不显示列名
" p_layout_no_vline = 'X'. "不显示列间竖线
" p_layout-totals_before_items= 'X' "设置grid的合计行显示在明细的上面
" p_layout-detail_popup= 'X' "设置grid不显示弹出明细显示窗口
" p_layout-box_fieldname = 'SELFLAG'. "表示ALV行项目选中的字段
ENDFORM. "f_alv_layout_build
4. 设置页头,将子程序名 top_of_page赋值给 1中i_callback_top_of_page,注意大写。
FORM top_of_page.
"定义登录用户的描述
DATA: l_name TYPE string VALUE '张三',
l_date TYPE string.
"拼接制表日期
CONCATENATE sy-datum+0(4) '.' sy-datum+4(2) '.' sy-datum+6(2) INTO l_date.
CONCATENATE '制表人:' l_name INTO l_name .
CONCATENATE '制表日期:' l_date INTO l_date .
"位于标题第一行
wa_header-typ = 'H'.
wa_header-info = 'ALV DEMO' .
APPEND wa_header TO it_header .
CLEAR wa_header .
"相关内容信息,这里用于显示登录用户信息描述
wa_header-typ = 'S'.
wa_header-key = l_name .
wa_header-info = l_date .
APPEND wa_header TO it_header .
CLEAR wa_header .
CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
EXPORTING
it_list_commentary = it_header
i_alv_form = 'X'. "是否用于 ALV 的FORM中,默认为:Space
ENDFORM. "top_of_page
5. 设置排序、过滤、汇总,变量赋值给1中对应参数。
(1)排序用到类型slis_t_sortinfo_alv,按条件把过滤的字段和规则设置好,添加到一个参考slis_t_sortinfo_alv类型的内表,在调用Function的时候指导内表赋给it_sort参数。
(2)过滤用到类型slis_t_filter_alv,按条件把排序的字段和规则设置好,添加到一个参考slis_t_filter_alv类型的内表,在调用Function的时候把内表的值赋给it_fitler参数。
(3)分类汇总是汇总和排序两。功能来进行分类和汇总的。按照排序的字段的值进行分类,对已经汇总的字段进行分类汇总。在设置排序的时候设置类型。
(4)汇总是设置要汇总的字段的Fieldcat属性,设置slis_t_fieldcat_alv-do_sum = ‘X’。
&---------------------------------------------------------------------
*& Form f_filter_build
&---------------------------------------------------------------------
FORM f_filter_build TABLES pt_filter TYPE slis_t_filter_alv.
DATA wa_filter LIKE LINE OF pt_filter.
wa_filter-fieldname = 'BUKRS'.
wa_filter-sign0 = 'E'.
wa_filter-optio = 'EQ'.
wa_filter-valut = 'MI '.
APPEND wa_filter TO pt_filter.
ENDFORM. "f_filter_build
&---------------------------------------------------------------------
*& Form f_sort_build
&---------------------------------------------------------------------
FORM f_sort_build TABLES pt_sort TYPE slis_t_sortinfo_alv.
DATA wa_sort LIKE LINE OF pt_sort.
wa_sort_lvc-spos = 1 . " 排序顺序
wa_sort-fieldname = 'BUKRS'. "要排序的字段
wa_sort-up = 'X'.
wa_sort-subtot = 'X'. "分类汇总
APPEND wa_sort TO pt_sort.
ENDFORM. "f_sort_build
6. 状态栏和user_usercommand
&---------------------------------------------------------------------
*& Form set_pf_status
&---------------------------------------------------------------------
FORM set_pf_status USING rt_extab TYPE slis_t_extab.
SET PF-STATUS 'ST_FULL' .
ENDFORM. "set_pf_status
&---------------------------------------------------------------------
*& Form user_command
&---------------------------------------------------------------------
FORM user_command USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield.
CASE r_ucomm.
WHEN '&IC1' . " 判断用户的动作
READ TABLE i_tab INTO wa_tab INDEX rs_selfield-tabindex . "读取用户点击的当前行的一行内容
IF rs_selfield-fieldname EQ 'saknr'. "判断用户点击的是哪个字段
IF NOT wa_tab-saknr IS INITIAL .
PERFORM frm_show_detail USING rs_selfield . " 显示明细
ENDIF.
ELSEIF it_data-belnr IS NOT INITIAL AND rs_selfield-fieldname = 'BELNR' .
SET PARAMETER ID 'BLN' FIELD it_data-belnr. "将字段值传递给FB03的参数
SET PARAMETER ID 'BUK' FIELD it_data-bukrs.
SET PARAMETER ID 'GJR' FIELD it_data-gjahr.
CALL TRANSACTION 'FB03' AND SKIP FIRST SCREEN . "调用事务码FB03并跳转屏幕
ELSEIF rs_selfield-fieldname EQ 'ICON_FOLDER' .
PERFORM frm_open_folder USING rs_selfield . " 打开文件
ENDIF.
CLEAR wa_tab.
WHEN '&SAVE_DATA' .
PERFORM frm_save_data . " 保存数据
WHEN 'PRINT' .
PERFORM frm_print_data. " 打印数据
WHEN 'EXCEL' .
PERFORM frm_export . " 导出数据
ENDCASE.
rs_selfield-refresh = 'X' . " 当用户在显式界面上对数据进行修改时,同时内表中的数据也随之刷新
ENDFORM. "USER_COMMAND
对于r_ucomm的值,WHEN '&IC1' . " 判断用户的动作
#####四、ALV更多应用
在SE38环境下的程序名输入栏输入**’DEMO’**后按F4,可以查到SAP所有的DEMO示例程序,会学到很多ABAP功能的实现方法,输入**’BCALV’**后按F4,可以查到很多ALV示例程序。
1. BALVSD06 : Output flights (simple version + save)这是该系列范例最简单的一个,建议以此入门。使用的Function Modules :REUSE_ALV_LIST_DISPLAY : 此FM非常重要,用来显示simple interactive list。大家要熟练掌握该FM的输入参数名称和作用,对ALV编程很有帮助。
2. BALVSD01 : Simple list flight model
3. BALVSD11 : Simple list with interactions and layouts
4. BALVHD01 : Hierarchical-sequential list flight model
5. BALVHD01_GROUP : Hierarchical-sequential list flight model
更过细节参考:
http://www.cnblogs.com/VerySky/articles/3388126.html
http://blog.sina.com.cn/s/blog_55c871720102w86j.html