转 ALV报表总结

 

 

本文转自:http://yw911.blog.sohu.com/154887844.html

 

 

ALV的创建一般有两种方式: 1> 采用function module, 2> OOPS abap
两种创建方式有对应的适用范围,也有一些交集,可以参考下图:

可以看到需要创建ALV list/ hierachical list, Fullscreen grid时可以采用Function module.并且是向后兼容的
而我们创建ALV grid or tree control时则要采用OO的创建方法,在6.4之前也是适用的,但使用OO ALV wrapper to control时,则适用于6.4之后的版本.
NW WAS 与R3 4.6之间还是有较大的改变,整个平台扩展了许多东西, 像web service, OO的大规模使用,而且据说是采用SOA策略的实现,

一 .FM

在使用FM来实现ALV时,对应于fullscreen alv, Type-pool: SLIS非常重要,它定义了FM中的许多参数类型.
1 . ALV是种展现手段,那么它就会涉及到定义数据选择条件,数据获取,数据展现,事件处理等步骤.
1> 在定义选择条件时,可以采用Selection screen来定义条件,可以定义一个值(PARAMETERS),也可以定义一个范围(SELECTION-OPTIONS),方便的很,如果程序中如果有动态条件的话,可以考虑采用RANGES来, 并且有个小技巧是采用 ( ) 来动态执行SQL.简单例子如下.
select * into itab from sflightwhere (wheretab) wheretab 是个行项类型是字符型的内表, 它的每一行就是一个选择条件字符串.
对于这种动态语句尽量避免使用,因为它在运行时才能确定执行语句,并且可以避过编译时的语法检查.
注: SAP标准程序中可以看到这种用法,如FM: SD_PARTNER_READ.
SELECT * FROM (object ) INTO TABLE l_vbpa WHERE vbeln = f_vbeln. 它是将选取的数据表动态化了.
2> 数据选取
这里一般对程序性能影响最大,关注点在于对数据库表的访问,内表的操作等方面.
3> 数据展现
field catalog:它是一个内表,对应于每一列的显示选项的技术性信息或额外的信息,像hotspot的定义,这一列显示不显示等.
layout structure: layout for grid,可以定义一些GRID的配置,像求总选项,
4> 事件处理
对于双击事件,hotspot的处理, TOP-OF-PAGE, END-OF-LIST等.
2.相关的FM.
REUSE_ALV_VARIANT_DEFAULT_GET
REUSE_ALV_VARIANT_F4
REUSE_ALV_VARIANT_EXISTENCE
REUSE_ALV_EVENTS_GET: 包含事件名称与事件处理form名称的内表 
REUSE_ALV_COMMENTARY_WRITE
REUSE_ALV_FIELDCATALOG_MERGE: 根据ABAP Dictionary中的Transparent table , Structure, View等生成一个field catalog 
REUSE_ALV_LIST_DISPLAY: 以list形式显示结果
REUSE_ALV_GRID_DISPLAY: 以Grid形式显示结果
 
REUSE_ALV_POPUP_TO_SELECT
粗线标识的是最经常使用的.
3. field catalog
1>它是对输出表的字段的描述,定义了字段的输出属性.
比如:
col_pos 字段在表中第几列,
fieldname 输出的字段名,如果此字段是CURR(currency field) ,QUAN(Quantity field) 需要指定相应的CUKY, UNIT字段.设置,Cfieldname Ctabname 和Qfieldname Qtabname 
no_out 隐藏此列,不输出,但注意用户可以change layout来显示出此列.
hotspot 设置此列的所有cell为热点, 单击即可触发相应function.
do_sum 此列求总
no_zero 只输出有意义的值,空值不输出.
edit_mask 对字段像WRITE般设置格式化.
just R L 调整对齐方式
调整输出列抬头的文本:文本可以随着用户调整列的宽度而变化,其文本即是在对应data element中定义的,如果需要定制,则可以指定以下字段
seltext_l (long field label)
seltext_m (medium field label)
seltext_s (short field label)
reptext_ddic (header) Analogous to the Data element main header
Ddictxt (specify text): You can specify with values 'L', 'M', and 'S',直接指定文本显示长文本,中,短文本, 指定这个字段后则会固定下来,不会随着用户的宽度调整变化.
2> 如何构建
A. 手工构建 创建SLIS_T_FIELD_ALV类型的内表, 行项类型为SLIS_FIELD_ALV 对每个字段的相应属性进行设置后,加入内表.
CLEAR X_FIELDCAT.
X_FIELDCAT-COL_POS = 12.
X_FIELDCAT-FIELDNAME = 'DMBTR'.
X_FIELDCAT-TABNAME = 'I_TAB'.
X_FIELDCAT-SELTEXT_M = 'Local curr'.
X_FIELDCAT-OUTPUTLEN = 12.
X_FIELDCAT-INTTYPE = 'P'.
X_FIELDCAT-JUST = 'R'.
X_FIELDCAT-DO_SUM = 'X'.
APPEND X_FIELDCAT TO I_FIELDCAT.
B. 半自动
调用FM: REUSE_FIELD_CATALOG_MERGE ,传入DDIC中的transparent table, view ,structure的名称,输出field catalog内表.
CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE' 
EXPORTING 
* I_PROGRAM_NAME = 
* I_INTERNAL_TABNAME = 
i_structure_name = c_alv_structure_name
* I_CLIENT_NEVER_DISPLAY = 'X' 
* I_INCLNAME = 
* I_BYPASSING_BUFFER = 
* I_BUFFER_ACTIVE = 
CHANGING 
ct_fieldcat = gt_fieldcat[]
EXCEPTIONS 
inconsistent_interface = 1 
program_error = 2 
OTHERS = 3 

如果要对抬头,hotspot等属性进行调整, 可以循环field catalog内表,修改其对应属性.如:
LOOP AT gt_fieldcat ASSIGNING <l_fcat>.
CASE <l_fcat>-fieldname.
WHEN 'flname'.
"修改属性.
ENDCASE.
ENDLOOP. 

4. field layout
注意属性 GET_SELINFOS ,它对于REUSE_ALV_GRID_DISPLAY 的输入IS_SEL_HIDE有用,但在WAS 7.0中已不再支持.
5. 事件
ALV触发的事件可用FM: REUSE_ALV_EVENTS_GET 来获得, 输出一个内表,类型是slis_t_event , 行项为slis_alv_event,包含两个字段,一个事件名,另一个是事件处理的FORM名.
CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
EXPORTING
I_LIST_TYPE = 0
IMPORTING
ET_EVENTS = I_EVENTS.
常用事件有:
列表抬头处理: Slis_ev_top_of_page TYPE slis_formname VALUE 'TOP_OF_PAGE'.
双击,单击 : 
Slis_ev_user_command TYPE slis_formname VALUE'USER_COMMAND'
subtotal文本:
Slis_ev_subtotal_text TYPE slis_formnameVALUE'SUBTOTAL_TEXT'. 
参考 
https://www.sdn.sap.com/irj/scn/wiki?path=/display/Snippets/Display%252bsubtotal%252btext%252bin%252bALV%252bgrid
https://www.sdn.sap.com/irj/scn/thread?threadID=1033110&tstart=0
注意: 如果必须修改subtotal对应的字段的field_catalog属性no_out为X才可以触发这个事件.
6.开发时一般的需求:
一般都会涉及到REUSE_ALV_GRID_DISPLAY 的输入属性
1> ALV variant 保存
is_default
is_save 
is_variant
2> 小计, 排序
it_sort属性,可以定义按哪个字段排序并且可以指定按这个字段小计其它可以汇总的字段.
- spos : Sort sequence
- fieldname : Internal output table field name
- tabname : Only relevant for hierarchical-sequential lists. Name of the internal output table.
- up : 'X' = sort in ascending order
- down : 'X' = sort in descending order
- subtot : 'X' = subtotal at group value change
- group : '* ' = new page at group value change ,'UL' = underline at group value change 
3> ALV 抬头 页脚
A. 可以采用TOP_OF_PAGE事件触发可以采用方式:
a. CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE' 输出一个内表: 
slis_t_listheader 这种方法输出格式固定,不利于对齐设置输入属性i_logo可输出图片.
b. Grid方式:设置 , 布局容易控制一些.
DATA : lr_content TYPE REF TO cl_salv_form_element.
DATA : lr_grid TYPE REF TO cl_salv_form_layout_grid, " top grid definition 
lr_flow TYPE REF TO cl_salv_form_layout_flow, " flow for top grid 
l_text(500 ) TYPE c . " showed in top of list 
* create a grid 
CREATE OBJECT lr_grid.
*创建一个单元格
lr_flow = lr_grid->create_flow(
row = 1 "行 
column = 1 ). "列

* write a blank column 
WRITE (20 ) '' . "可直接输出

plr_flow = plr_grid->create_flow(
row = 1
column = 2 ).

* create text in cell 
lr_flow->create_text( text = pl_text ). "定制cell里的文本
cl_salv_form_content=>set( lr_content ).
B. 设置I_CALLBACK_HTML_TOP_OF_PAGE 属性触发
FORM f_html_top_of_page USING pr_document TYPE REF TO cl_dd_document. 
可以加入HTML文本,链接,图片
CALL METHOD pr_document->add_text( text = 'Picture' ).

CALL METHOD pr_document->add_gap( width = 10 ).

CALL METHOD pr_document->add_picture( picture_id = 'ENJOYSAP_LOGO' ). 
4> 点击某列,转到另外一个tranaction中,需要设置列字段为hotspot,再在user_command中处理function code: "&IC1 " 
it_events属性,传入一个slis_t_event类型的内表.设置相应处理form,如 handle_user_command.
FORM handle_user_command USING p_ucomm LIKE sy-ucomm
ps_selfield TYPE slis_selfield. 

 
 
 
 
 
 
 
 
 
 
 
二. OOPS 
1. 面向对像的方式创建ALV Grid control,它是Control Framework中的一个组件,另外也可以采用CL_SALV_TABLE,CL_SALV_HIERSEQ_TABLE,CL_SALV_TREE.等.后者创建是list形式,也可以是Grid形式,是目前SAP推荐的创建方式,是在NW 2004以后支持的版本。 
全屏幕的Grid control有个对应的function module: REUSE_ALV_GRID_DISPLAY_LVC. 
OOPS的方式功能更强大一些,这种方式支持求最大值,最小值等标准功能。目前SAP中的组件已以OO方式重写,采用OO方式来编写是以后的发展方向。 

相关类: 
CL_GUI_ALV_GRID: alv grid control class, ALV List Viewer 
CL_GUI_CUSTOM_CONTAINER: Container for Custom Controls in the Screen Area 
相关DDIC中的structure/table type 
LVC_T_FCAT: Field Catalog for List Viewer Control, table type 
LVC_S_FCAT: field catalog fro ALV control , structure 
LVC_T_LOUT:ALV control: Layout structure 

2 .步骤: 
1>. 在screen上定义一个custom control area 
2>. 生成一个 CL_GUI_CUSTOM_CONTAINER class 实例,在构造器参数中传入custom area的名称。 
3>. 生成一个 CL_GUI_ALV_GRID 实例,在构造器的参数中设置上面生成container引用 
4>. 调用grid实例的 SET_TABLE_FOR_FIRST_DISPLAY 方法,给它设置要显示的内表。另外可以传入全局的structure名称,即要显示的ALV 内表对应的line type,也可以传递一个field catalog内表。 

注意 在生成CL_GUI_ALV_GRID实例时,构造器参数I_PARENT是必需的,但如果要对ALV 的功能进行扩展,例如工具栏加入按钮,并在事件处理器中对ALV的cell的属性如颜色,style等进行更改,则必须对I_APPL_EVENTS赋值为X. 

SET_TABLE_FOR_FIRST_DISPLAY 的一些参数: 
定义variant相关的参数: is_variant, is_save, i_default 
隐藏不需要的功能:IT_TOOLBAR_EXCLUDING , 相关的功能码是以MC_FC打头的常量. 
定义排序表it_sort 
列抬头相关: COLDDICTXT COLTEXT REPTEXT SCRTEXT_L SCRTEXT_M SCRTEXT_S SELDDICTXT 
refresh_table_display 用来在PBO刷新ALV,而不用重新生成一个ALV. 

3. field catalog 可以手动生成,也可以调用 FM LVC_FIELDCATALOG_MERGE 先生成一个field catalog table,然后再按需求循环修改属性. 
I_STRUCTURE_NAME’ ‘IT_FIELDCATALOG’ 两个参数如果都传入的话,I_STRUCTURE_NAME有优先权. 

在使用set_table_for_first_display方法的参数it_sort时, 排序时会把相同的列值垂直合并,如果要对所有列取消合并可更改layout中的no_merging,更改单列的合并可更改对应field catalog的no_merging. 


Reference: 
An Easy Reference Guide for ALV Grid Control 
https://www.sdn.sap.com/irj/scn/go/portal/prtroot/docs/library/uuid/e8a1d690-0201-0010-b7ad-d9719a415907   
posted @ 2014-02-24 21:52  qdxjmei  阅读(199)  评论(0编辑  收藏  举报