ITPub博客

首页 > 应用开发 > IT综合 > 〔转载〕ALV知识

〔转载〕ALV知识

原创 IT综合 作者:azqf 时间:2007-12-09 12:26:24 0 删除 编辑

ALV知识

Xiaogangh

一、ALV相关概念

ALV――ABAP LIST VIEWER,这里我姑且称之为ABAP表单浏览器,用它可以标准化,简单化R/3系统中的表单,它可以提供给用户一个统一的表单格式以及用户接口。

ALV即能显示简单表单(SIMPLE LIST)又能显示有序表单(SEQUENTIAL LIST):

简单表单(SIMPLE LIST)包含一系列不分层次的(NON-HIERARCHICAL),用户自定义的列。

层次表(即有序表SEQUENTIAL LIST)包含列表头以及它的子行,一个列表头的关键行能带出它下面的一些列项目(我们自己理解的时候可以想到BOM表的层次结构)。

我们还可以在简单表单以及关联表单中显示小计和总计

二、结合一个具体的实例来看ALV的功能

首先我们看下图中的这个ALV的布局(这是一般ALV程序表单的典型布局):

根据上面对ALV的直观形象,下面将屏幕上的区域划分成几块,分别来解释它的作用:

1.快捷工具栏(如下图)

细节按钮,你首先必须选中列表中的一行,然后点击它的话,就会弹出一个窗口,显示选中行的细节内容。(另外:你双击你要选择的行,也可以显示细节)

按升序排列,首先选中一列,然后再点击它,就可以看到该列是按照升序重新排列。

按降序排列,首先选中一列,然后再点击它,就可以看到该列是按照降序重新排列。

设置过滤器,通过设置它可以达到筛选的目的,以列名称作为筛选的筛选标准,填入过滤器相应的标准值,然后就可以筛选出满足自己条件的记录。

打印预览,点击它之后,就可以预览一下将要打印内容的布局情况。

Microsoft Excel,调用MSExcel到当前ALV的列表显示区域。(前提:必须安装了MSExcel

字处理,字处理的相关设置。

本地文件,将当前表单存储到本地机器上,有几种供选择的存储格式。

邮件收件人,给系统内用户发邮件

图形,点击它可以根据表单情况绘制相关图表。

更改布局,点击它可以对表单中的列项目排列次序的互换,删减等。

选择布局,从已经保存的布局中选择自己满意的布局。

保存布局,对于自己满意的布局,可以通过点击它来将布局保存起来。

2. 表单标题区

这个区域主要是用来显示一些抬头信息(总揽信息),类似于WORD中的页眉。我们在使用的时候根据需要来进行相关填写。

3.表单显示区

这个区域主要是用来显示我们通过代码筛选出来的数据,相关的操作在下面的程序编写部分详细介绍。

三、程序的编写

1.在我们写ALV程序的时候,有一个类型组是肯定要用到的:

TYPE-POOLSSLIS

在这个类型组中有很多ALV的自定义数据类型以及结构化数据类型(通过TYPE来定义的),我们在写ALV表单的时候需要调用的。我们常用的几个有(蓝色部分):

I.对一个最简单的ALV表单(无标题区和页脚区),我们只需要定义下面几个

data: i_fieldcat_alv type slis_t_fieldcat_alv with header line,

i_layout type slis_layout_alv, "alv的格式

i_fieldcat type slis_fieldcat_alv

w_repid like sy-repid.

它对应的start-of-selection中定义子函数如下:

start-of-selection.

perform getdata. “从数据库中取数据到相应内表中

perform layout_build. “用于定义ALV表单的相关格式、属性

perform fields. “用来定义表单中的各个列的相关信息,比如列名等

perform display_data. “用来显示ALV表单

子函数定义如下:

form layout_build.

i_layout-zebra = 'X'.

i_layout-detail_popup = 'X'. “是否弹出详细信息窗口

w_repid = sy-repid. “程序为当前程序

i_layout-f2code = '&ETA'.“设置触发弹出详细信息窗口的功能码,这里是双击

i_layout-no_vline = 'X'.“这个用来设置列间隔线

i_layout-colwidth_optimize = 'X'. “优化列宽选项是否设置

i_layout-detail_initial_lines = 'X'.

i_layout-detail_titlebar = '详细内容'. “设置弹出窗口的标题栏

endform.

form fields.

refresh i_fieldcat_alv.

pos = 1.

clear i_fieldcat.

i_fieldcat-col_pos = pos. “第几列

i_fieldcat-fieldname = 'NUM'.

i_fieldcat-seltext_l = '序号'. “列名

append i_fieldcat to i_fieldcat_alv.

pos = pos + 1.

i_fieldcat-col_pos = pos.

i_fieldcat-fieldname = 'AUFNR'.

i_fieldcat-seltext_l = '生产订单'.

append i_fieldcat to i_fieldcat_alv.

clear i_fieldcat.

…………

Endform.

form display_data.

call function 'REUSE_ALV_GRID_DISPLAY'

exporting

i_callback_program = w_repid “当前程序

i_save = ''

is_layout = i_layout “子函数layout_build填充的格式定义

it_fieldcat = i_fieldcat_alv[] “子函数fields填充的各列

tables

t_outtab = head1. “假设数据都在head1内表中

endform.

II.对一个稍微复杂一点的ALV表单(有标题区和页脚区),我们需要定义下面几个

data: i_fieldcat_alv type slis_t_fieldcat_alv,

“用来存储我们将要在表单显示区域显示出来的表单的列名,每个列名对应的字段名以及列表头其他相关属性信息的数据类型

i_fieldcat type slis_fieldcat_alv,

i_layout type slis_layout_alv. “ALV的格式

data: i_events type slis_t_event,

i_event_exit type slis_t_event_exit,

i_list_comments type slis_t_listheader, “用来填充表单标题区域的数据类型

i_excluding type slis_t_extab.

data:

w_variant like disvariant, "显示变式结构

wx_variant like disvariant,

w_variant_save(1) type c,

w_exit(1) type c,

w_user_specific(1) type c,

w_callback_ucomm type slis_formname, "字符型

w_print type slis_print_alv, "类型组

w_layout type slis_layout_alv, "类型组

w_html_top_of_page type slis_formname, "字符型

w_fieldcat_alv like line of i_fieldcat_alv,

w_excluding like line of i_excluding,

w_events like line of i_events,

w_event_exit like line of i_event_exit,

w_list_comments like line of i_list_comments.

*===========================================================================*

initialization.

perform init_variant. “这个子函数很重要,没有它会出错

*-----------------------------------------*

它对应的start-of-selection中定义子函数如下:

start-of-selection.

perform getdata. “从数据库中取数据到相应内表中

perform event_build.

perform layout_build. “用于定义ALV表单的相关格式、属性

perform fields. “用来定义表单中的各个列的相关信息,比如列名等

perform display_data. “用来显示ALV表单

*-----------------------------------------*

子函数定义如下:(这里只定义前面文档没有提到的子函数,其他同名的请参考前面)

form init_variant.

clear: w_variant.

w_repid = sy-repid. “当前程序

w_variant-report = w_repid.

w_variant-username = sy-uname.

w_variant_save = 'A'. "All types

endform.

form event_build.

call function 'REUSE_ALV_EVENTS_GET'

exporting

i_list_type = 0

importing

et_events = i_events.

read table i_events

with key name = slis_ev_top_of_page

into w_events.

if sy-subrc = 0.

move 'ALV_TOP_OF_PAGE' to w_events-form. “将标题区数据赋值给W_EVENTS

modify i_events from w_events index sy-tabix.

endif.

read table i_events

with key name = slis_ev_end_of_list

into w_events.

if sy-subrc = 0.

move 'ALV_END_OF_LIST' to w_events-form.“将页尾数据赋值给W_EVENTS

modify i_events from w_events index sy-tabix.

endif.

read table i_events

with key name = slis_ev_end_of_page

into w_events.

if sy-subrc = 0.

move 'ALV_END_OF_PAGE' to w_events-form. “将页脚区数据赋值给W_EVENTS

modify i_events from w_events index sy-tabix.

endif.

endform.

*-----------------------------------------*

form event_build子函数中黑体字部分对应的几个子函数,我们需要定义如下:

form alv_top_of_page.

clear: i_list_comments[].

w_list_comments-typ = 'H'. "H=Header, S=Selection, A=Action供选择

w_list_comments-key = ''.

w_list_comments-info = 'XX汽车有限公司变速箱废品率报表'.

append w_list_comments to i_list_comments.

w_list_comments-typ = 'S'. " H = Header, S = Selection, A = Action

w_list_comments-key = ''.

concatenate '库位:' werks-low into werks_t.

w_list_comments-info = werks_t.

append w_list_comments to i_list_comments.

w_list_comments-typ = 'S'. " H = Header, S = Selection, A = Action

w_list_comments-key = ''.

concatenate '库位:' werks-low into werks_t.

w_list_comments-info = werks_t.

append w_list_comments to i_list_comments.

call function 'REUSE_ALV_COMMENTARY_WRITE'

exporting

i_logo = 'ENJOYSAP_LOGO'

it_list_commentary = i_list_comments.

endform.

form alv_end_of_list.

clear: i_list_comments[].

w_list_comments-typ = 'A'. "H = Header, S = Selection, A = Action

w_list_comments-key = ''.

w_list_comments-info = '页脚显示'.

append w_list_comments to i_list_comments.

call function 'REUSE_ALV_COMMENTARY_WRITE'

exporting

it_list_commentary = i_list_comments

i_logo = 'ENJOYSAP_LOGO'

i_end_of_list_grid = 'X'.

endform.

form alv_end_of_page.

它的定义类似上面两个子函数的内容,这里不再赘述

endform.

*-----------------------------------------*

form display_data.

call function 'REUSE_ALV_GRID_DISPLAY'

exporting

* i_background_id = 'SIWB_WALLPAPER'

i_background_id = 'SIWB_WALLPAPER'

i_callback_program = w_repid

i_callback_html_top_of_page = w_html_top_of_page

* i_structure_name = 'TRDIR'

i_default = 'X'

i_save = 'A'

is_variant = w_variant

is_layout = w_layout

* i_callback_user_command = w_callback_ucomm

it_fieldcat = i_fieldcat_alv

it_events = i_events

it_event_exit = i_event_exit

it_excluding = i_excluding

is_print = w_print

* i_screen_start_column = 1

* i_screen_start_line = 1

* i_screen_end_column = 70

* i_screen_end_line = 30

tables

t_outtab = head1.

endform.

2.写一个ALV程序的基本流程(主要包括ALV相关的那部分,后面会附上一个ALV源程序的代码):

第一步:定义将要用到的表,即TALBES定义部分,然后定义TYPE-POOLS: SLIS.

第二步:定义1”中提到的这些数据类型或者内表的实体对象

第三步:定义一些需要用到的变量

第四步: 定义自己的选择屏幕

第五步: 定义INITIALIZATION部分,在这个部分往往要指定w_repid的值,

w_repid = sy-repid

第六步: start-of-selection部分

1用一个子函数完成对ALV表单标题区域的赋值(i_list_comments)

2用一个子函数完成自己所需要数据的抓取

3用一个子函数完成要显示列表的列名行(第一行)的相关赋值(i_fieldcat_alv)以及设置

4用一个子函数完成输出格式的设置(i_layout),比如双击一条记录是否弹出对话框啊?是用哪个功能键触发等等

5用一个子函数FORM DISPLAY_DATA来显示上面我们已经分别封装好的数据,需要调用两个常用的FUNCTION MODULE

FUNCTION 'REUSE_ALV_GRID_DISPLAY' “用来显示表单数据

FUNCTION 'REUSE_ALV_COMMENTARY_WRITE' “用来显示表单标题

附件: 示例程序源代码(注:下面这个程序调用的ALV功能应该讲是比较完全的了,大家可以通过上面的学习之后,再看这个程序,应该会有所收获)

*----------------------------------------------------------------------

* Program: ZZ_ALV_REPORT_STUB

* Author : Clayton Mergen

* Date :

*

* Purpose: Report using ALV function

*

* Notes:

* 1) Logos & wallpapers can be found in table BDS_CONN05

* with class = PICTURES

*

* 2) Transaction OAER can be used to create PICTURES.

* Run transaction OAER with class name = PICTURES, Class type = OT,

* and Object key with whatever name you want to create. In the

* next screen, right clicking on screen and import

*

*----------------------------------------------------------------------

* Revisions

*----------------------------------------------------------------------

* Name :

* Date :

* Comments:

*----------------------------------------------------------------------

report zflex004

no standard page heading

line-size 200

line-count 65

message-id zz.

*--------------------------------

* Tables

*--------------------------------

tables:

ekpo,

mara,

trdir.

*--------------------------------

* Global Types

*--------------------------------

type-pools: slis.

*--------------------------------

* Global Internal Tables

*--------------------------------

data:

i_fieldcat_alv type slis_t_fieldcat_alv,

i_events type slis_t_event,

i_event_exit type slis_t_event_exit,

i_list_comments type slis_t_listheader,

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/494796/viewspace-990584/,如需转载,请注明出处,否则将追究法律责任。

下一篇: 我的ERP之路
请登录后发表评论 登录
全部评论
  • 博文量
    7
  • 访问量
    16974