ABAP报表开发:ALV运用

一、ALV是什么?

ALV(SAP LIST VIEW)是一种比较美观的报表显示工具,具有网格显示方式,有排序、筛选、过滤、(分类)汇总等功能,数据以单元格为单位显示。

二、 ALV实现方法

ALV的实现方法有三种:

  • 使用类CL_SALV_TABLE

  • 使用类CL_GUI_GRID_DISPLAY

  • 使用Founction来实现的,REUSE_ALV_GRID_DISPLAY_LVCREUSE_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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 207,248评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,681评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,443评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,475评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,458评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,185评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,451评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,112评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,609评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,083评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,163评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,803评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,357评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,357评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,590评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,636评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,925评论 2 344

推荐阅读更多精彩内容

  • 作者: 惟湛 如何调整ABAP程序的性能(copy) 7、两个内表添加使用批量增加代替逐行不推荐Loop at i...
    SmalltalkVoice阅读 7,442评论 7 18
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,601评论 18 139
  • 这一天,朋友圈晒满了各种幸福,鲜花礼物充斥着画面,而跟贴最多的是一位老公为老婆精心准备的爱心早餐,所有的水果都切成...
    单单阅读 1,103评论 2 7
  • 01 小七是我的高中同学,性格大大咧咧、做事风风火火是个十足的假小子。高中的校服那么丑,硬是让她穿出了自己的味道。...
    君悦君语阅读 526评论 2 12
  • “这是一件特别有意思的事情”,是我今天在一位年轻艺术家的讲座上听到的一句话。于是有了写下这篇文章的念头,顺便记录着...
    Kathy_Ching阅读 291评论 0 0