当前位置: 代码迷 >> SAP >> [SAP ABAP开发技术小结]ALV
  详细解决方案

[SAP ABAP开发技术小结]ALV

热度:156   发布时间:2016-04-29 01:46:58.0
[SAP ABAP开发技术总结]ALV

声明:原创作品转载时请注明文章来自SAP师太博客并以超链接形式标明文章原始出处否则将追究法律责任!
原文出自:
ALV开发必备!这里只贴一些粗略的东西,还有一篇关于ALV详细的文档,有时间再贴吧

7.   ALV

7.1.  Layout重要字段

zebra(1) type c, " striped pattern斑马线显示,颜色隔行交替显示
edit(1) type c, " for grid only ALV是否可编辑,注意只对Grid模式有效,对List模式无效
f2code like sy-ucomm, "gs_layout-f2code='&ETA'.
双击时触发的Funcode
这里为弹出详情窗口

colwidth_optimize(1) type c, ALV网格(单元格)宽度设置为自动最优化,按输出内容宽度自动调整[??pt??ma?z]

lights_fieldname type slis_fieldname," fieldname for exception列显示为红绿灯
box_fieldname type slis_fieldname, " fieldname for checkbox
指定数据内表中哪列以选择按钮形式显示(首列前可按下或弹上来的按钮),ALV最左上角会出现全选按钮image080

key_hotspot(1) type c,        " keys as hotspot " K_KEYHOT设置关键字段是否是热点,可单击
info_fieldname type slis_fieldname, " infofield for listoutput
指定数据输出内表中哪列存储的是颜色,用来设置ALV
每行数据的颜色

7.2.  FIELDCATALOG重要字段

[?k?t?l?ɡ]

key(1) type c, " column with key-color指定字段是否是关键字段,如果是则单元格显示的颜色会不同,并会靠前显示

col_pos like sy-cucol, " position of the column列的输出位置字段在表中第几列

fieldname type slis_fieldname,"针对输出内表哪列进行设置,只有设置了的列才会显示,如果没有设置,则不会显示在ALV中。如果此字段是CURR金额(currency field) ,QUAN数量(Quantity field) 需要指定所参照的CUKY货币单位、UNIT字段名,需设置Cfieldname Ctabname Qfieldname Qtabname
cfieldname type slis_fieldname, "field with currency unit金额字段所参照的货币单位字段名

ctabname type slis_tabname,   " and table
qfieldname type slis_fieldname, " field with quantity unit数量字段所参照的数量单位字段名
qtabname type slis_tabname,   " and table

just(1type c, " (R)ight (L)eft (C)ent.单元格中内容显示时对齐方式。不设置时按钮数据类型默认对齐方式来对齐
lzero(1) type c, " leading zero
X时输出前导零
no_sign(1) type c, " write no-sign
不显示数字符号
no_zero(1) type c, " write no-zero
只输出有意义的值,空值不输出。为X时全为零(如:00000)时不输出,所以不输出零时应该最好同时设置lzero = sapceno_zero = X,相反如果要输出,则应同时设置lzero = X no_zero = space
fix_column(1) type c, " Spalte fixieren
列固定不滚动,与Key属性相似,但颜色不会发生变化
do_sum(1) type c, " sum up
该列是否进行小计,需与gt_sort-subtot
一起使用(即需要参考排序),否则只对整列进行一个合计


seltext_l like dd03p-scrtext_l, " long key word标题字段显示的名称(长)
seltext_m like dd03p-scrtext_m, " middle key word标题字段显示的名称(中)
seltext_slike dd03p-scrtext_s, " short key word标题字段显示的名称(短)
ddictxt(1) type c, " (S)hort (M)iddle (L)ong
设置以长、中还是短名称来显示,取值分别为 SML。直接指定文本显示为长文本、中、还是短文本, 指定这个字段后则会固定下来,不会随着用户的宽度调整变化
.

如果是金额P小数(数量)类型时,需要对下面两个属性进行设置,否则,如果不设置时,在修改对应ALV单元格内容时,会自动将你所输入的数除100,即小数点提前两位;并且如果是数量类型,除了设置datatype外,inttype也需要进行设置,且为C
datatype like dd03p-datatype,数据类型
inttype like dd03p-inttype,
内部
类型

 

ref_fieldname  like dd03p-fieldname,"如需单元格显示F4输入帮助,则需要指定字段所参照的表
ref_tabname like dd03p-tabname,"如需单元格显示F4
输入帮助,则需要指定字段所参照的表中的字段名

另外,以上两个字段还可以解决ALV中形如参照VBELNMATNR词典类型的列导出(自带的导出功能)Excel时被截断的问题,具体请参照:ALV自带导出文件时字段数据末尾被截断问题

CONVEXIT:设置转换规则,对应于Domain中的转换规则,也可用于解决导出Excel数据前导0被截断的问题

 

edit(1) type c, " internal use only是否可编辑
hotspot(1) type c, " hotspot
设置字段内容下面是否有热点(有下划线,可点击,单击即可触发相应事件)

7.3.  指定双击触发的FunCode

gs_layout-f2code  = '&ETA'设置ALV数据行双击触发的Tcode,这里为弹出详情窗口

7.4.  相关函数

REUSE_ALV_GRID_DISPLAY

REUSE_ALV_LIST_DISPLAY

REUSE_ALV_GRID_DISPLAY_LVC

REUSE_ALV_FIELDCATALOG_MERGE   [m?:d?] 混合, (使)合并

7.5.  重要参数接口

I_CALLBACK_PF_STATUS_SET  设置工具条

I_CALLBACK_USER_COMMAND用户点击工具栏中自定义按钮、预置按钮(需通过IT_EVENT_EXIT参数指定预置FunCode才会回调指定的Form)、数据行双击、单元格热点等时,会回调此参数指定的Form

IT_SORT排序、分类汇总

 

I_SAVE保存表格布局:'X' 只能保存为全局标准变式,'U' 只能保存特定用户变式,'A'都可以保存,SPACE不能保存变式

I_DEFAULT用户是否可以设置默认的布局变式(即是否可以将某个布局变式设置为默认的布局)

IS_VARIANT指定布局变式

 

IT_EVENTS事件回调,可以用来代替I_CALLBACK_USER_COMMAND参数

IT_EVENT_EXIT 预置FunCode回调I_CALLBACK_USER_COMMAND指定的Form

 

IS_LAYOUT

IT_FIELDCAT

T_OUTTAB需要显示的数据内表

7.6.  让预置按钮回调I_CALLBACK_USER_COMMAND 

IT_EVENT_EXIT:让预置按钮回调I_CALLBACK_USER_COMMAND 指定的Form。可以向IT_EVENT_EXIT参数内表填充需要被拦截的保留Funcode,及在是执行对应功能代码之前还是之后调用:

  DATA: event_exit TYPE slis_t_event_exit WITH HEADER LINE.
  event_exit
-ucomm = '&OAD'."Funcode为点击AlV工具栏上的选择布局按钮image081所对应的FunCode,会被USER_COMMAND 指定的Form拦截
  event_exit
-after = 'X'."在执行完预置功能代码之前还是之后调用
 
APPEND event_exit.
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'

   
EXPORTING
      i_callback_program
= sy-repid
      it_fieldcat       
=
fieldcat[]
      i_callback_user_command
= 'USER_COMMAND'

     
IT_EVENT_EXIT = event_exit[]
   
TABLES

      t_outtab          
= gt_result.
FORM user_command  USING r_ucomm LIKE sy-ucomm rs_selfield TYPE slis_selfield.

ENDFORM.

7.7.  颜色

行颜色gs_layout-info_fieldname = 'COLOR'."指定数据内表中的哪一列用来作为行颜色的列,颜色值与下面列颜色取值格式是一样的,也是4位,不同的是此种方式下的颜色值是与显示数据内表存放在一起,而下面的颜色值则是与gt_fieldcat存放在一起
列颜色gt_fieldcat-emphasize['emf?sa?z]强调) = 'C510'."此种方式下的颜色值定义为4位字符,各位含意:

1位:固定取值为C

2COL颜色值,取值为0~7

3INT高亮,即颜色是否加深,取值为011表示加深显示

4INV颜色是否反转,即颜色是作用在背景上,还是作用在输出字符上,取值上为01。为1时表示设置的是前景色,即输出字符本身的颜色(好像只有在第3位为0时才有效?)

单元格颜色gs_layout-coltab_fieldname = 'COLORTABLE'."数据内表中哪列为颜色内表,颜色内表结构如下:

image082 image083

slis_color颜色结构类型各字体对应于上面颜色值串'C510'后三位,意义也是一样,只是没有第一位固定字符C

7.8.  可编辑

整体可编辑gs_layout-edit = 'X'.

某列可编辑gt_fieldcat-edit = 'X'.

单元格可编辑:只能使用REUSE_ALV_GRID_DISPLAY_LVC,并且还作以下一些设置:
cellstab TYPE lvc_t_styl,"在输出内表中加上这一类型的列
"先将所有单元格设置为可编辑状态
gt_fieldcat
-edit = 'X'.

DATA: gt_cellstab TYPE lvc_t_styl WITH HEADER LINE.

  "再将原本可编辑的单元格切换到不可编辑样式。注:这里只是样式的切换,不能仅仅使用cl_gui_alv_grid=>mc_style_enabled来将单元格设置为可编辑状态,单元格真正是否可编辑是由fieldcat-editlayout-edit来决定的,而仅设置为cl_gui_alv_grid=>mc_style_enabled是不可编辑的
gt_cellstab
-style = cl_gui_alv_grid=>mc_style_disabled.

   APPEND gt_cellstab.
gt_data
-cellstab = gt_cellstab[].
gs_layout
-stylefname = 'CELLSTAB'."数据内表中哪列为可编辑信息内表

7.9.  单元格数据修改后立即自动刷新

单元格中的数据被修改后,将ALV单元格中的数据立即刷新到ABAP对应的内表中:

法一通过对REUSE_ALV_GRID_DISPLAY函数参数i_grid_settings-edt_cll_cb进行设置:

i_grid_settings-edt_cll_cb  = 'X' .
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    
EXPORTINGi_grid_settings = i_grid_settings
法二通过函数参数I_CALLBACK_USER_COMMAND指定的回调Form参数slis_selfield进行设置:

FORM user_command USING ucomm LIKE sy-ucommselfield selfield TYPE slis_selfield.
 
 selfield-refresh = 'X'.
 
CASE ucomm.
   
WHEN 'UPDATE'.
     
PERFORM frm_update.
 
ENDCASE.
ENDFORM.

7.10.     数据有效性验证事件:data_changed

通过REUSE_ALV_GRID_DISPLAY函数的it_events参数设置DATA_CHANGE事件及事件回调Form

  t_events-name = slis_ev_data_changed.
  t_events
-form = 'ALV_DATA_CHANGED'.
 
APPEND t_events.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
   
EXPORTING

    
it_events          = t_events[]

"注:如果没有设置REUSE_ALV_GRID_DISPLAY 函数的参数i_grid_settings-edt_cll_cb  = 'X',在单元格数据被修改后,此Form不会自动调用(即不触发data_changed事件),直到点击了保存或刷新按钮后才会被调用,另外 cl_gui_alv_grid CHECK_CHANGED_DATA方法也会触发 data_changed事件;另外,如果是通过OO实现的ALV,要让DATA_CHANGE事件触发,则还需要注册回车或焦点失去动作,具体参看后面
FORM alv_data_changed USING pel_data TYPE REF TO cl_alv_changed_data_protocol.
 
DATA: l_name(20),ls_cells TYPE lvc_s_modi.
 
FIELD-SYMBOLS <fs_value>.
 
LOOP AT pel_data->mt_mod_cells INTO ls_cells."读取被修改了的单元格
   
CLEAR gt_data.
   
READ TABLE gt_data INDEX
ls_cells-row_id."被修改了的单元格所对应输出内表行数据
   
CONCATENATE 'GT_DATA-'
ls_cells-fieldname INTO l_name. "读取被单元格所对应的输出内表中的相应列数据,注:读取出来是的单元格修改之前的数据
   
ASSIGN (l_name) TO <fs_value>."<fs_value>即为修改前的值
    <fs_value>
= ls_cells
-value. "ls_cells-value单元格中修改后的新值?
   
"实际上不需要此句来修改输出内表中的数据,因为只要在该Form中不弹出 E MSG,则该Form执行完后会也会自动更新输出内表
   
"MODIFY gt_data INDEX ls_cells-row_id.
 
ENDLOOP.

 

注:如果是通过CL_GUI_ALV_GRID来实现ALV,则在ALV单元格中修改数据后,要在失去焦点或回车时自动触发DATA_CHANGE事件,则还需要通过CL_GUI_ALV_GRID类的REGISTER_EDIT_EVENT方法来设置发数据改变事件在何时触发,2 种方式: