ALV详解:Function ALV(二)

Function ALV

单元格数据修改后立即同步(即立即触发DATA_CHANGED事件)输出内表

如果修改了网格中数据,如果没有设置在单元格内容被修改后失去焦点(或回车)时立即同步到输出内表中(即立触发DATA_CHANGED事件),则输出内表中的数据要等到保存、刷新、切换布局等按钮执行后,才会触发DATA_CHANGED事件,将修改过的数据更新到输出内表中,如果要求在数据修改失去焦点时立即同步到输出内表,则有以下两种方法:

方法一:通过REUSE_ALV_GRID_DISPLAY 函数的i_grid_settings-edt_cll_cb进行设置:

TYPE-POOLS:slis.
DATA: gt_fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE.
DATA: gt_sort TYPE slis_t_sortinfo_alv WITH HEADER LINE.
DATA:BEGIN OF gt_data OCCURS 0,
  key1
(1),
  key2
(2),
 
END OF gt_data.

START-OF-SELECTION.
 
PERFORM inital.
 
DEFINE fill_fdcat.
   
clear gt_fieldcat.
    gt_fieldcat
-fieldname = &1.
    gt_fieldcat
-seltext_l = &2.
    gt_fieldcat
-key = &3.
    gt_fieldcat
-edit = 'X'.
   
append gt_fieldcat.
 
END-OF-DEFINITION.

  fill_fdcat
'KEY1' 'KEY1' 'X'.
  fill_fdcat
'KEY2' 'KEY2' 'X'.

 
DATA: i_grid_settings TYPE  lvc_s_glay .
  i_grid_settings
-edt_cll_cb  = 'X' .

 
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
   
EXPORTING
      it_fieldcat    
= gt_fieldcat[]
"
只要在显示界面可编辑字段上修改了数据,回车或失去焦点后就会立即将内表的数据也修改

    
 i_grid_settings = i_grid_settings
    TABLES

      t_outtab       
= gt_data[].
 
READ TABLE gt_data INDEX 1.
 
WRITE: gt_data-key1.

FORM inital .
  gt_data
-key1 = 'a'.
  gt_data
-key2 = 'aa'.
 
APPEND gt_data.
ENDFORM.

方法二:在user_command 回调Form处理:

 CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
   
EXPORTING
      i_callback_program      
= sy-cprog
      i_callback_user_command 
= 'USER_COMMAND'

      it_fieldcat             
= fieldcat[]
   
TABLES

      t_outtab                
= gt_data.

FORM user_command USING ucomm  LIKE sy-ucommselfield  selfield TYPE slis_selfield.
  
DATA l_ref1 TYPE REF TO cl_gui_alv_grid.
 
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
   
IMPORTING
      e_grid
= l_ref1.
  CALL METHOD l_ref1->check_changed_data. "调用此方法后会触发DATA_CHANGED事件。当此方法执行完后,被修改的数据就会更新到输出内表中了
  "好像没有上面几行代码,只需下面一行也可以自动更新,上面代码究竟有什么作用?

 
 selfield-refresh = 'X'.
  CASE ucomm.
   
WHEN 'UPDATE'.
     
PERFORM frm_update.
 
ENDCASE.
ENDFORM.

输出内表数据更新前触发DATA_CHANGE事件进行数据有效性验证

DATA_CHANGE事件触发时,可进一步检查数据输入的正确性

TYPE-POOLS:slis.
DATA: gt_fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE.
DATA: gt_sort TYPE slis_t_sortinfo_alv WITH HEADER LINE.
DATA:BEGIN OF gt_data OCCURS 0,
  key1
(1),
  key2
(2),
 
END OF gt_data.

START-OF-SELECTION.
 
PERFORM inital.
 
DEFINE fill_fdcat.
   
clear gt_fieldcat.
    gt_fieldcat
-fieldname = &1.
    gt_fieldcat
-seltext_l = &2.
    gt_fieldcat
-key = &3.
    gt_fieldcat
-edit = 'X'.
   
append gt_fieldcat.
 
END-OF-DEFINITION.

  fill_fdcat
'KEY1' 'KEY1' 'X'.
  fill_fdcat
'KEY2' 'KEY2' 'X'.

 
DATA: t_events TYPE slis_t_event WITH HEADER LINE.
  t_events
-name = slis_ev_data_changed.
  t_events
-form = 'ALV_DATA_CHANGED'.
 
APPEND t_events.

 
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
   
EXPORTING
      i_callback_program
= sy-repid
      it_fieldcat       
=
gt_fieldcat[]
      it_events         
=
t_events[]
   
TABLES

      t_outtab          
= gt_data[].
 
READ TABLE gt_data INDEX 1.
 
WRITE: gt_data-key1.

 
"注:如果没有设置 i_grid_settings-edt_cll_cb  = 'X',在单元格数据被
 
"修改后,此Form不会自动调用,直到点击了 保存或刷新 按钮后才会被调用
 
"另外 cl_gui_alv_grid CHECK_CHANGED_DATA方法也会触发 data_changed事件
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>
= ls_cells-value.
   
"实际上不需要此句来修改输出内表中的数据,因为只要在该Form中不
   
"弹出 E MSG,则该Form执行完后会也会自动更新输出内表
   
"MODIFY gt_data INDEX ls_cells-row_id.
 
ENDLOOP.

ENDFORM.
FORM inital .
  gt_data
-key1 = 'a'.
  gt_data
-key2 = 'aa'.
 
APPEND gt_data.
ENDFORM.

 

REUSE_ALV_GRID_DISPLAY[_LVC]函数中获取生成的OO ALV对象

有时REUSE_ALV_GRID_DISPLAYREUSE_ALV_GRID_DISPLAY_LVC函数并不能满足我们的需要,如通过REUSE_ALV_GRID_DISPLAY_LVC函数设置单元格显示为PushButton时,无法针对Button的单元事件进行处理,所以只能借助于OOALV。只需在代码中加入如下代码,即可获取到当前所产生的OO ALV对象,当拿到此对象后,就可以通过cl_gui_alv_grid来完成函数所无法完成的功能:

  DATA l_ref1 TYPE REF TO cl_gui_alv_grid.
 
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
   
IMPORTING
      e_grid
= l_ref1.

除此方法后,还可以在程序中动态获取此对象,可以参考这里

货币类、数量(P小数)类型字段修改时小数点问题

对于货币与P类型小数(如数量)类型字段,需要对gt_fieldcat-datatype属性进行设置,才能将输入的数字保持原样大小,否则输入的数据会自动将小数点提前2位;对于数量类型,好像还需要对gt_fieldcat-INTTYPE属性进行设置才好使,并且只能设置为C类型。datatypeINTTYPE实质上就是一种编辑类型与数据库字段类型的映射,即Hibernate中的ORM(对象关系映射)

datatypeABAP 字典中数据库类型,即SE11创建表结构时所参照的数据库字段类型(ABAP词典类型),取值如下:

ACCP   Posting period YYYYMM
CHAR   Character String
CLNT   Client
CUKY   Currency key, referenced by CURR fields

CURR
  Currency field, stored as DEC
D16D   Decimal Floating Point, 16 Digits, DEC on Database
D16R   Decimal Floating Point, 16 Digits,  RAW on Database
D16S   Decimal Floating Point. 16 Digits, with Scale Field
D34R   Decimal Floating Point, 34 Digits, RAW on Database
D34S   Decimal Floating Point, 34 Digits, with Scale Field
DATS   Date field (YYYYMMDD) stored as char(8)
DEC Counter or amount field with comma and sign
FLTP   Floating point number, accurate to 8 bytes
INT1   1-byte integer, integer number <= 255
INT2   2-byte integer, only for length field before LCHR or LRAW
INT4   4-byte integer, integer number with sign
LANG   Language key
LCHR   Long character string, requires preceding INT2 field
LRAW   Long byte string, requires preceding INT2 field
NUMC   Character string with only digits
PREC   Obsolete data type, do not use

QUAN
  Quantity field, points to a unit field with format UNIT
RAW Uninterpreted sequence of bytes
RSTR   Byte String of Variable Length
SSTR   Short Character String of Variable Length
STRG   Character String of Variable Length
TIMS   Time field (hhmmss), stored as char(6)
UNIT   Unit key for QUAN fields
VARC   Long character string, no longer supported from Rel. 3.0

INTTYPEABAP程序内部所使用的一种数据类型,即ABAP数据类型,取值如下:

C   Character String
N   Character String with Digits Only
D   Date (Date: YYYYMMDD)
T   Time (Time: HHMMSS)
X   Byte Seq. (heXadecimal), in DDIC metadata also for INT1/2/4
I   Integer number (4-byte integer with sign)
b   1-byte integer, integer number <= 254
s   2-byte integer, only for length field before LCHR or LRAW
P   Packed number
F   Floating point number to accuracy of 8 bytes
g   Character string with variable length (ABAP type STRING)
y   Byte sequence with variable length (ABAP type XSTRING)
u   Structured type, flat
v   Structured type, deep
h   Table type
V   Character string (old Dictionary type VARC)
r   Reference to class/interface
l   Reference to data object
a   Decimal Floating Point Number, 16 Digits
e   Decimal Floating Point Number, 34 Digits
j   Static Boxed Components
k   Generic Boxed Components

image031

TYPE-POOLS:slis.
DATA: gt_fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE.
DATA: gt_sort TYPE slis_t_sortinfo_alv WITH HEADER LINE.
DATA:BEGIN OF gt_data OCCURS 0,
  curr
TYPE ekpo-netpr,
  int
TYPE i,
  p
TYPE p LENGTH 5 DECIMALS 2,
 
END OF gt_data.

START-OF-SELECTION.
 
PERFORM inital.
 
DEFINE fill_fdcat.
   
clear gt_fieldcat.
    gt_fieldcat
-fieldname = &1.
    gt_fieldcat
-seltext_l = &2.
    gt_fieldcat
-edit = 'X'.
   
if &1 = 'CURR'.
     
"对于金额字段,需要设置为 CURR 数据库字典类型
      gt_fieldcat
-datatype = 'CURR'.
   
endif.
   
if &1 = 'P'.
     
"对于小数,需要设置为 QUAN 数据库字典类型
      gt_fieldcat
-datatype = 'QUAN'.
     
"除此之外,还需要将inttype类型设置为C类型。另外,按理来说要设置为P类型的,但
“发现不行,QUAN类型映射为 C类型??
      gt_fieldcat
-inttype = 'C'.
   
endif.
   
append gt_fieldcat.
 
END-OF-DEFINITION.

  fill_fdcat
'CURR' 'CURR' .
  fill_fdcat
'INT' 'INT' .
  fill_fdcat
'P' 'P(3.2)' .

 
DATA: i_grid_settings TYPE  lvc_s_glay .
 
"单元格内容修改后立即更新到输出内表中
  i_grid_settings
-edt_cll_cb  = 'X' .
 
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
   
EXPORTING
      i_callback_program
= sy-repid
      it_fieldcat       
=
gt_fieldcat[]
      i_grid_settings   
=
i_grid_settings
   
TABLES

      t_outtab          
= gt_data[].
 
READ TABLE gt_data INDEX 1.
 
WRITE:/ gt_data-curr,gt_data-int,gt_data-p.

FORM inital .
  gt_data
-curr = 1.
  gt_data
-int = 1.
  gt_data
-p = 1.
 
APPEND gt_data.
ENDFORM.

排序、汇总

GRIDALV排序、分类汇总

排序之前,如果同一列有相同的数据,则排好序以后,在该列会自动将相同的数据合并为一行显示,不再出现多行重复的情况(但是若该ALV中有字段设置了“可编辑”,合并这一现象会失效

只要某字段参设置了gt_sort-down/up,则在展示时,排序以后垂直的网格中相邻相同的单元格就会合并起来(即分类合并,如果要避免合并,请在布局中设置"no_merging""X"),而不是看是否设置了gt_sort-subtot属性(该设置只会决定是否进行大汇总与分类小计):

  gt_sort-spos = '2'."排序的顺序,如果根据多个字段来排时,决定哪个先排
  gt_sort
-fieldname = 'KEY2'.
  gt_sort
-down = 'X'."降序
* gt_sort-subtot    = 'X'.

 
APPEND gt_sort.

image032

虽然INT1INT2设置了gt_fieldcat-do_sum属性,但没有设置gt_sort-subtot,所以没有进行分类小计,只是对整列进行了合计(如需分类小计,则需要设置gt_sort-subtot):

"需要进行统计的字段:INT1INT2
   
if &1 = 'INT1' or &1 = 'INT2'.
      gt_fieldcat
-do_sum = 'X'.
   
endif.
gt_sort-spos = '2'."
排序的顺序,如果根据多个字段来排时,决定哪个先排
  gt_sort
-fieldname = 'KEY2'.
  gt_sort
-down = 'X'."降序
 
APPEND gt_sort.

image033

设置gt_sort-subtot后,才会对该列进行分类小计:

"需要进行统计的字段:INT1INT2
   
if &1 = 'INT1' or &1 = 'INT2'.
      gt_fieldcat
-do_sum = 'X'.
   
endif.
  gt_sort-spos = '2'."
排序的顺序,如果根据多个字段来排时,决定哪个先排
  gt_sort
-fieldname = 'KEY2'.
  gt_sort
-down = 'X'."降序
*  "是否需要以此字段进行分类合并、并进行小计(注:与本列是否参与排序无关系,只要设置此属性
*  "
就进行分类合并且小计,但如果设置了按其他列排序,则会对此列分类合并有影响——即
*  "
相同类型的单格不一定会合并成一个单元格,可能会合并出多个),另外,小计的前提条件是要对gt_fieldcat-do_sum进行了设置
  gt_sort
-subtot    = 'X'.
 
APPEND gt_sort.

image034

根据KEY1KEY2多列进行排序且小计:

image035

下面是完整代码:

TYPE-POOLS:slis.
DATA: gt_fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE.
DATA: gt_sort TYPE slis_t_sortinfo_alv WITH HEADER LINE.
DATA:BEGIN OF gt_data OCCURS 0,
  key1
(1),
  key2
(2),
  str
(3),
  int1
TYPE i,
  int2
TYPE i,
  int3
TYPE i,
 
END OF gt_data.

START-OF-SELECTION.
 
PERFORM inital.
 
DEFINE fill_fdcat.
   
clear gt_fieldcat.
    gt_fieldcat
-fieldname = &1.
    gt_fieldcat
-seltext_l = &2.
    gt_fieldcat
-key = &3.
   
"需要进行分类小计及汇总的字段:INT1INT2
    if &1 = 'INT1' or &1 = 'INT2'.
"决定此列是否进行分类汇总与大汇总。注:如果不设置gt_sort-subtot,则只有大汇总,不会进行分类小汇总(分类小计前提除了需要对要对gt_sort-subtot 进行了设置,还需要对gt_fieldcat-do_sum进行设置)
      gt_fieldcat-do_sum = 'X'. "如果此参数也不设置的话,则大汇总与小汇总都没有
   
endif.
   
append gt_fieldcat.
 
END-OF-DEFINITION.

  fill_fdcat
'KEY1' 'KEY1' 'X'.
  fill_fdcat
'KEY2' 'KEY2' 'X'.
  fill_fdcat
'STR' 'STR' ''.
  fill_fdcat
'INT1' 'INT1' ''.
  fill_fdcat
'INT2' 'INT2' ''.
  fill_fdcat
'INT3' 'INT3' ''.

 
"* alv sort
  gt_sort
-spos = '1'."排序的顺序,如果根据多个字段来排时,决定哪个先排
  gt_sort
-fieldname = 'KEY1'.
  gt_sort
-up = 'X'."升序,如果不指定排序(即gt_sort-upgt_sort-down都没设置时),默认为升序
 
"是否需要以此字段进行分类小计
  gt_sort
-subtot    = 'X'.
 
APPEND gt_sort.
  gt_sort
-spos = '2'."排序的顺序,如果根据多个字段来排时,决定哪个先排
  gt_sort
-fieldname = 'KEY2'.
  gt_sort
-down = 'X'."降序
  gt_sort
-subtot    = 'X'.
 
APPEND gt_sort.

 
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
   
EXPORTING
"i_callback_program = sy-repid
注:
      it_fieldcat
= gt_fieldcat[]
      it_sort    
=
gt_sort[]
   
TABLES

      t_outtab   
= gt_data.

FORM inital .
  gt_data
-key1 = 'a'.
  gt_data
-key2 = 'aa'.
  gt_data
-str = 'aaa'.
  gt_data
-int1 = 2.
  gt_data
-int2 = 1.
  gt_data
-int3 = 8.
 
APPEND gt_data.

  gt_data
-key1 = 'a'.
  gt_data
-key2 = 'aa'.
  gt_data
-str = 'aab'.
  gt_data
-int1 = 3.
  gt_data
-int2 = 2.
  gt_data
-int3 = 7.
 
APPEND gt_data.

  gt_data
-key1 = 'c'.
  gt_data
-key2 = 'aa'.
  gt_data
-str = 'aab'.
  gt_data
-int1 = 4.
  gt_data
-int2 = 2.
  gt_data
-int3 = 6.
 
APPEND gt_data.

  gt_data
-key1 = 'a'.
  gt_data
-key2 = 'ab'.
  gt_data
-str = 'aba'.
  gt_data
-int1 = 6.
  gt_data
-int2 = 1.
  gt_data
-int3 = 2.
 
APPEND gt_data.

  gt_data
-key1 = 'a'.
  gt_data
-key2 = 'ab'.
  gt_data
-str = 'abb'.
  gt_data
-int1 = 3.
  gt_data
-int2 = 4.
  gt_data
-int3 = 2.
 
APPEND gt_data.

  gt_data
-key1 = 'e'.
  gt_data
-key2 = 'ca'.
  gt_data
-str = 'eca'.
  gt_data
-int1 = 2.
  gt_data
-int2 = 2.
  gt_data
-int3 = 4.
 
APPEND gt_data.

  gt_data
-key1 = 'b'.
  gt_data
-key2 = 'ba'.
  gt_data
-str = 'bba'.
  gt_data
-int1 = 8.
  gt_data
-int2 = 5.
  gt_data
-int2 = 2.
 
APPEND gt_data.

  gt_data
-key1 = 'b'.
  gt_data
-key2 = 'bb'.
  gt_data
-str = 'bbb'.
  gt_data
-int1 = 1.
  gt_data
-int2 = 2.
  gt_data
-int3 = 4.
 
APPEND gt_data.

  gt_data
-key1 = 'c'.
  gt_data
-key2 = 'ca'.
  gt_data
-str = 'cca'.
  gt_data
-int1 = 5.
  gt_data
-int2 = 1.
  gt_data
-int2 = 3.
 
APPEND gt_data.

  gt_data
-key1 = 'c'.
  gt_data
-key2 = 'cc'.
  gt_data
-str = 'ccc'.
  gt_data
-int1 = 2.
  gt_data
-int2 = 1.
  gt_data
-int3 = 5.
 
APPEND gt_data.

  gt_data
-key1 = 'd'.
  gt_data
-key2 = 'ca'.
  gt_data
-str = 'dca'.
  gt_data
-int1 = 4.
  gt_data
-int2 = 6.
  gt_data
-int3 = 2.
 
APPEND gt_data.
ENDFORM.

小分类分隔方式(GROUP = */UL),仅适用于LIST输出的ALV

gt_sort-group = '*/UL'只在REUSE_ALV_LIST_DISPLAY列表方式输出时起作用,对  "REUSE_ALV_GRID_DISPLAY网格输出方式不起作用

TYPE-POOLS:slis.
DATA: gt_fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE.
DATA: gt_sort TYPE slis_t_sortinfo_alv WITH HEADER LINE.
DATA:BEGIN OF gt_data OCCURS 0,
  key1
(1),
  key2
(2),
  str
(3),
  int1
TYPE i,
  int2
TYPE i,
  int3
TYPE i,
 
END OF gt_data.

START-OF-SELECTION.
 
PERFORM inital.
 
DEFINE fill_fdcat.
   
clear gt_fieldcat.
    gt_fieldcat
-fieldname = &1.
    gt_fieldcat
-seltext_l = &2.
    gt_fieldcat
-key = &3.
   
"需要进行统计的字段:INT1INT2
   
if &1 = 'INT1' or &1 = 'INT2'.
      gt_fieldcat
-do_sum = 'X'.
   
endif.
   
append gt_fieldcat.
 
END-OF-DEFINITION.

  fill_fdcat
'KEY1' 'KEY1' 'X'.
  fill_fdcat
'KEY2' 'KEY2' 'X'.
  fill_fdcat
'STR' 'STR' ''.
  fill_fdcat
'INT1' 'INT1' ''.
  fill_fdcat
'INT2' 'INT2' ''.
  fill_fdcat
'INT3' 'INT3' ''.

 
"* alv sort
  gt_sort
-spos = '1'.
  gt_sort
-fieldname = 'KEY1'.
  gt_sort
-up = 'X'.
  gt_sort
-subtot    = 'X'.
  "小分类之间如何分隔,注:只在REUSE_ALV_LIST_DISPLAY列表方式输出时起作用,对
  "REUSE_ALV_GRID_DISPLAY
网格输出方式不起作用。
  "*
:小分类之间用分页符分开,即小分类之间完全隔断
  "UL
:小分类之间不隔断,而是使用下划线分隔
  gt_sort-group = '*'.
  APPEND gt_sort.

  gt_sort
-spos = '2'.
  gt_sort
-fieldname = 'KEY2'.
  gt_sort
-down = 'X'.
  gt_sort
-subtot    = 'X'.

 
gt_sort-group = '*'.
 
APPEND gt_sort.

 
CALL FUNCTION
'REUSE_ALV_LIST_DISPLAY'
   
EXPORTING
      
"i_callback_program = sy-repid 注:
      it_fieldcat
= gt_fieldcat[]
      it_sort    
=
gt_sort[]
   
TABLES

      t_outtab   
= gt_data.

FORM inital .
  gt_data
-key1 = 'a'.
  gt_data
-key2 = 'aa'.
  gt_data
-str = 'aaa'.
  gt_data
-int1 = 2.
  gt_data
-int2 = 1.
  gt_data
-int3 = 8.
 
APPEND gt_data.

  gt_data
-key1 = 'a'.
  gt_data
-key2 = 'aa'.
  gt_data
-str = 'aab'.
  gt_data
-int1 = 3.
  gt_data
-int2 = 2.
  gt_data
-int3 = 7.
 
APPEND gt_data.

  gt_data
-key1 = 'a'.
  gt_data
-key2 = 'ab'.
  gt_data
-str = 'aba'.
  gt_data
-int1 = 6.
  gt_data
-int2 = 1.
  gt_data
-int3 = 2.
 
APPEND gt_data.

  gt_data
-key1 = 'a'.
  gt_data
-key2 = 'ab'.
  gt_data
-str = 'abb'.
  gt_data
-int1 = 3.
  gt_data
-int2 = 4.
  gt_data
-int3 = 2.
 
APPEND gt_data.

  gt_data
-key1 = 'b'.
  gt_data
-key2 = 'ba'.
  gt_data
-str = 'bba'.
  gt_data
-int1 = 8.
  gt_data
-int2 = 5.
  gt_data
-int2 = 2.
 
APPEND gt_data.
ENDFORM.

无分隔时(不设置gt_sort-group)

image036

线分隔(gt_sort-group = 'UL')

image037

分页方式分隔(gt_sort-group = '*')

image038

表头信息说明

可以通过两种回调方式来实现,第一种:直接通过REUSE_ALV_GRID_DISPLAY函数的i_callback_html_top_of_page来回调Form;第二种:通过REUSE_ALV_GRID_DISPLAY函数的it_events参数接口,向事件内表中Append事件top_of_page与对应的Form

i_callback_html_top_of_page参数回调接口

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
   
EXPORTING
      it_fieldcat                
= fieldcat[]
      i_callback_program         
= sy-
repid
    
 i_callback_html_top_of_page 
= 'HTML_TOP_OF_PAGE'
   
TABLES
      t_outtab                   
= t_stock[].

FORM html_top_of_page USING r_ddoc TYPE REF TO cl_dd_document.
 
DATA: text TYPE sdydo_text_element.
 
CALL METHOD r_ddoc->initialize_document.
 
CALL METHOD r_ddoc->add_text"控制输出字体为粗体
   
EXPORTING
    
text = '行状态图标含义'
     sap_emphasis
= 'STRONG'.

 
DEFINE write_inf.
   
call method r_ddoc->new_line."换行
   
call method r_ddoc->add_icon"输出图标
     
exporting
        sap_icon
= &1.
   
call method r_ddoc->add_text"输出文本
     
exporting
       
text = &2.
 
END-OF-DEFINITION.

  write_inf
'ICON_GREEN_LIGHT' ':商品可用库存'."表头输出的图标及类型
  write_inf
'ICON_RED_LIGHT' ':商品非可用库存'.
ENDFORM.  

image039

top_of_page事件

使用 i_callback_html_top_of_page参数创建的ALV头不可打印,而使用REUSE_ALV_COMMENTARY_WRITETOP_OF_PAGE事件中输出的头可以打印,但SLIS_T_LISTHEADER-INFO只有60位,有一定的局限性,但可采用另一种而向对象方式来实现解决

image040

TYPE-POOLS:slis.
DATA: gt_fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE.
DATA: gt_event TYPE slis_t_event WITH HEADER LINE,
      gt_comment
TYPE slis_t_listheader WITH HEADER LINE.

DATA:BEGIN OF gt_data OCCURS 0,
  key1
(1),
  key2
(2),
  str
(3),
  int1
TYPE i,
  int2
TYPE i,
  int3
TYPE i,
 
END OF gt_data.

START-OF-SELECTION.
 
PERFORM inital.
 
PERFORM frm_set_event.
 
DEFINE fill_fdcat.
   
clear gt_fieldcat.
    gt_fieldcat
-fieldname = &1.
    gt_fieldcat
-seltext_l = &2.
    gt_fieldcat
-key = &3.
   
append gt_fieldcat.
 
END-OF-DEFINITION.

  fill_fdcat
'KEY1' 'KEY1' 'X'.
  fill_fdcat
'KEY2' 'KEY2' 'X'.
  fill_fdcat
'STR' 'STR' ''.
  fill_fdcat
'INT1' 'INT1' ''.
  fill_fdcat
'INT2' 'INT2' ''.
  fill_fdcat
'INT3' 'INT3' ''.

 
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
   
EXPORTING
      i_callback_program
= sy-repid
      it_fieldcat       
=
gt_fieldcat[]
      it_events         
=
gt_event[]
   
TABLES

      t_outtab          
= gt_data.

 
"取全部的事件,并且更改处理页眉页脚的事件的FORM的值
FORM frm_set_event .
 
CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
   
EXPORTING
      i_list_type
= 0
   
IMPORTING
      et_events  
= gt_event[].
 
READ TABLE gt_event WITH KEY name = slis_ev_end_of_list .
 
IF sy-subrc = 0.
   
"页尾输出触发事件时所回调的Form
    gt_event
-form = 'ALV_END_OF_LIST'.
   
MODIFY gt_event INDEX sy-tabix.
 
ENDIF.

 
READ TABLE gt_event WITH KEY name = slis_ev_top_of_page.
 
IF sy-subrc = 0.
   
"页眉输出触发事件时所回调的Form
    gt_event
-form = 'ALV_TOP_OF_PAGE'.
   
MODIFY gt_event INDEX sy-tabix.
 
ENDIF.
 
"DELETE gt_event WHERE form IS INITIAL.
ENDFORM.

"页眉触发时所回调Form
FORM alv_top_of_page.
 
DATA:lr_rows TYPE REF TO cl_salv_form_layout_grid,
        lr_grid_rows
LIKE lr_rows,
        lr_row
TYPE REF TO cl_salv_form_layout_flow,
        lr_logo
TYPE REF TO cl_salv_form_layout_logo.

 
DATA: l_row TYPE i VALUE '1'.
 
CREATE OBJECT lr_rows.
 
CREATE OBJECT lr_logo.

 
"相当于 H(header)
  lr_row
= lr_rows->add_row( )."创建行对象
  lr_row
->create_header_information( text = '表头(字体加粗加大,长度无限制)' )."为行对象设置表头信息

  lr_row
= lr_rows->add_row( )."空一行

  lr_row
= lr_rows->add_row( ).
  lr_grid_rows
= lr_row->create_grid( )."使行对象具有网格模式,即可以行列来定位
 
"相当于 S(selection) 下面为为单元格来填充内容
  lr_grid_rows
->create_label( row = l_row column = 1 text = '标签1(字体加粗,长度无限制):'). "Key
  lr_grid_rows
->create_textrow = l_row column = 2 text = '标签说明1(正常字体,长度无限制)' )."Info
  lr_grid_rows
->create_textrow = l_row column = 3 text = '标签说明2(正常字体,长度无限制)' )."Info
  l_row
= l_row + 1.
 
"为网格下一行填充内容
  lr_grid_rows
->create_label( row = l_row column = 1 text = '标签2(字体加粗,长度无限制):').

  lr_row
= lr_rows->add_row( ).

  lr_row
= lr_rows->add_row( ).
 
"相当于 A(action)
  lr_row
->create_action_information( text = '信息(字体斜体,长度无限制)' ).

 
"下面新增logo,左边为上面创建的文本内容,右边为指定的 logo 图标
  lr_logo
->set_left_content( lr_rows ).
  lr_logo
->set_right_logo( 'ENJOYSAP_LOGO' ).

 
"最后将组织好的内容设置进去
  cl_salv_form_content
=>set( lr_logo ).

*================下面是另一种实现,但输出长度有局限性,所以最好采用上面方式
*  REFRESH gt_comment.
*  CLEAR gt_comment.
*  "typ的取值为:"H=Header, S=Selection, A=Action
*  "H
:表示输出内容为列表头。通常只有一行(但可以有多行),此时KEY不会输出,
*  "  
只有INFO值才会输出。字体会加粗加大,左对齐
*  "S
:表示输出内容为字段型说明,即针对某个词进行说明,分两列(KEY--INFO)输出。
*  "  
通常有多个,且每行中只允许一对。此时KEYINFO都会输出。Key字段会加粗,INFO正常
*  "  
均左对齐输出。
*  "A
:表示输出内容为提示说明性文字。通常只有一行(但可以有多行)。此时KEY不会输出,
*  "  
只有INFO值才会输出。字粗为斜体
*  "  
左对齐输出。
*  "
同时有 HSA时,会按照 HSA的先后顺序输出(而不管向内表APEPEND的顺序)
*  "
,且HSA之间会使用空行分隔,但它们各自内部(类型相同的行)之间不会输出空行
*  "
*  "
另外,由于keyinfo字段长度都有限制(2060),所以超出此宽度的长度无法输出,此时
*  "
只能采用另一种面向对象的方式来输出,请参考上面的部分
*  gt_comment-typ  = 'H'.
*  gt_comment-key  = space."A类型时,Key不会输出
*  gt_comment-info = '表头(字体加粗加大,长度限制在60个字符)'.
*  APPEND gt_comment TO gt_comment.
*
*  CLEAR gt_comment.
*  gt_comment-typ  = 'S'.
*  gt_comment-key  = '标签(字体加粗,长度限制在20个字符):'.
*  gt_comment-info = '标签说明(正常字体,长度限制在60个字符)'.
*  APPEND gt_comment TO gt_comment.
*
*  CLEAR gt_comment.
*  gt_comment-typ  = 'A'.
*  gt_comment-key  = space."A类型时,Key不会输出
*  gt_comment-info = '信息(字体斜体,长度限制在60个字符)'.
*  APPEND gt_comment TO gt_comment.
*  CLEAR gt_comment.
*
*  CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
*    EXPORTING
*      it_list_commentary = gt_comment[]
*      i_logo             = 'ENJOYSAP_LOGO'." 输出图标
ENDFORM.

"页脚触发时所回调Form
FORM alv_end_of_list .
 
PERFORM alv_top_of_page.
ENDFORM.
FORM inital .
  gt_data
-key1 = 'a'.
  gt_data
-key2 = 'aa'.
  gt_data
-str = 'aaa'.
  gt_data
-int1 = 2.
  gt_data
-int2 = 1.
  gt_data
-int3 = 8.
 
APPEND gt_data.
ENDFORM.

ALV-F4-Layout、布局变式切换捕获(动态访问函数中定义的全局变量)

REUSE_ALV_GRID_DISPLAY函数的i_save参数值决定了ALV的布局相关的变式,是否可修改及是否只用于特定用户:
' ' = Display variants cannot be saved显示变式,但不能修改,此为默认值
'X' = Standard save mode
标准的保存模式,此模式下变式可存储为标准的变式,但不能存储为用户模式
'U' = User-specific save mode
用户保存模式,哪个创建,只能哪个来用
'A' = Standard and user-specific save mode
标准与用户模式,此模式下可以选择存储为标准还是用户变式

image041这三个按钮分配是布局修改、布局选择、布局保存,如果不输入或输入空时,没有保存布局image042按钮,如 i_save = 'X'情况下创建创建布局变式:

image043

i_save = 'U'情况下创建创建布局变式:

image044

i_save = 'A'情况下创建创建布局变式:

image045

当创建完上面三个模式的布局变式时,选择布局时,看到的情况如下:

image046

另外,在创建布局变式时,可以选择是否将某个布局变式设设置为默认的布局,这样在REUSE_ALV_GRID_DISPLAY函数调用时,没有传递is_variant 时,会默认采用此处设置的默认布局,另外默认布局还可以被REUSE_ALV_VARIANT_DEFAULT_GET函数读取出来:

image047

该程序实现了屏幕上选择Layout、获取默认的Layout、检查输入的Layout变式是否存在,获取当前使用的Layout中的显示字段与显示的顺序

image048

TYPE-POOLS:slis.
DATA: gt_fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE.
DATA: gs_layout TYPE slis_layout_alv.

DATA:BEGIN OF lt_stock OCCURS 0,
  sel
,"用来做选择按钮列
 
checkbox,"用作复选框列
  werks
LIKE mard-werks,"工厂
  matnr
LIKE mara-matnr,"物料
  labst
LIKE mard-labst,"库存
  int
TYPE i,"用来测试统计的自定义字段
 
color(4),"用来存储颜色
 
END OF lt_stock.
DATA: gx_variant         LIKE disvariant.
DATA: g_variant          LIKE disvariant.
PARAMETERS: p_varit TYPE disvariant-variant.

INITIALIZATION.
 
PERFORM inital.

 
CLEAR: gx_variant.
  gx_variant
-report = sy-repid.
 
CALL FUNCTION 'REUSE_ALV_VARIANT_DEFAULT_GET'
   
EXPORTING
      i_save       
= 'A'
   
CHANGING
      cs_variant   
= gx_variant
   
EXCEPTIONS

      error_message
= 1.
  p_varit
= gx_variant-variant.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_varit.
 
CLEAR: g_variant.
  g_variant
-report = sy-repid.
 
DATA: e_exit.
 
CALL FUNCTION 'REUSE_ALV_VARIANT_F4'
   
EXPORTING
      is_variant   
= g_variant
      i_save       
= 'A'

   
IMPORTING
      e_exit       
= e_exit "用户是否关掉了对话框
      es_variant   
= gx_variant"返回用户选择的Layout
   
EXCEPTIONS
      error_message
= 1.
  p_varit
= gx_variant-variant.

AT SELECTION-SCREEN ON p_varit.

 
CHECK p_varit is NOT INITIAL.
  g_variant
-report  = sy-repid.
  g_variant
-variant = p_varit.

 
"判断界面上用户所输入的布局变式名是否存在
 
CALL FUNCTION 'LVC_VARIANT_EXISTENCE_CHECK'
   
EXPORTING
      i_save    
= 'A'
   
CHANGING
      cs_variant
= g_variant
   
EXCEPTIONS

      not_found
      =1
.
 
IF sy-subrc = 1.
   
MESSAGE '布局变式名不存在' TYPE 'W'.
 
ENDIF.

START-OF-SELECTION.
 
DEFINE fill_fdcat.
   
clear gt_fieldcat.
    gt_fieldcat
-fieldname = &1. "需要显示的内表行结构中的哪个字段
    gt_fieldcat
-seltext_l = &2. "ALV显示时标题栏中的文本
    gt_fieldcat
-key = &3. "是否是关键字段,如果是则单元格显示的颜色会不同,并会靠前显示
   
append gt_fieldcat.
 
END-OF-DEFINITION.

  fill_fdcat
'WERKS' '工厂' 'X'.
  fill_fdcat
'MATNR' '物料' 'X'.
  fill_fdcat
'LABST' '库存' ''.
  fill_fdcat
'INT' '自定义字段' ''.

 
DATA: event_exit TYPE slis_t_event_exit WITH HEADER LINE.
  event_exit
-ucomm = '&OAD'."Funcode为点击AlV工具栏上的选择布局按钮时 会被USER_COMMAND Form拦截
  event_exit
-after = 'X'.
 
APPEND event_exit.

 
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
   
EXPORTING     
     
"i_callback_program参数一定要加上,不然即使设置了i_save,也不会出现布局选择与保存按钮
     i_callback_program     
= sy-repid
      it_fieldcat             =
gt_fieldcat[]
      i_save                 
= 'A'

      i_callback_user_command
= 'USER_COMMAND1'
      it_event_exit          
= event_exit[]
      is_variant             
= g_variant "ALV
展示时,所使用的布局变式名。如果不存在,按默认来
   
TABLES
      t_outtab               
= lt_stock.

FORM user_command1  USING r_ucomm LIKE sy-ucomm rs_selfield TYPE slis_selfield.
 
CASE  r_ucomm.
     
"当点击选择布局按钮时执行
   
WHEN '&OAD'."不知道为什么,&OAD功能(选择布局变式时)执行了两次?其他保留Funcode又是正常的编程时需注意
      
FIELD-SYMBOLS: <alv_grid> TYPE REF TO cl_gui_alv_grid.
      DATA: l_variant LIKE disvariant.
注:不能动态访问某个函数中定义的变量,这与报表程序中定义的变量是不一样的。这里需要动态访问gt_grid变量,所以不能这样访问:(REUSE_ALV_GRID_DISPLAY)gt_grid来动态访问,跟踪gt_grid变量时,发现是在LSLVC_FULLSCREENTOP Include文件中定义的,该文件又是被REUSE_ALV_GRID_DISPLAY函数所在函数组SLVC_FULLSCREEN所对应主程序SAPLSLVC_FULLSCREEN所包含进来,所以只能通过函数所在的函数组所对应主程序来动态访问:(SAPLSLVC_FULLSCREEN)gt_grid-grid
      
ASSIGN ('(SAPLSLVC_FULLSCREEN)gt_grid-grid') TO <alv_grid>."动态获取ALV所对应的ALV OO实例
      "获取当前切换的布局变式,l_variant用来接收 ALV Grid当前切换的变式布局名
      <alv_grid>
->get_variant( IMPORTING es_variant = l_variant ).
另外,除了像上面这样通过程序动态提示外,还可以通过GET_GLOBALS_FROM_SLVC_FULLSCR函数来获取,具体请参考这里
     
DATA:p_fieldcat_tab TYPE slis_t_fieldcat_alv, p_exit.
     
"当知道当前用户所选择的布局变式后,再通过函数 REUSE_ALV_VARIANT_SELECT 可以
     
"得到布局变式所对应的布局具体信息,如哪些字段显示、字段显示的顺序如何等,当得到这些
     
"布局信息后,可以用在用户在导出ALV数据到文件时使用,这样可以保持ALV显示的布局与
     
"导出去的文件显示的哪些内容及字段顺序体质一致
     
CALL FUNCTION 'REUSE_ALV_VARIANT_SELECT'
       
EXPORTING         
         
"X时会弹出当前布局变式列表框,这里只是想借助此函数来读取当前布局变式所对应的
         
"详细布局信息,所以不需要弹出对话框,让其在后台运行
          i_dialog           
= ' '
          i_user_specific    
= 'X'" U类型的Layout也会显示出来
          it_default_fieldcat
= gt_fieldcat[]
         
i_layout           
= gs_layout
       
IMPORTING         
         
" i_dialog X(即弹出框时)设置才有意义,作用是判断用户在对话框中点击的确认还是取消
         
"X时,表示用户点击的是取消按钮
          e_exit             
= p_exit
         
"
可以根据返回的p_fieldcat_tab,得到当前ALV所使用的布局变式所对应的Layout情况,如
         
"ALV数据下载成文件时需要与当前Layout布局一样:输出相同的字段与顺序,可以根据
         
"p_fieldcat_tab NO_OUT(控制是否输出)、COL_POS(控制顺序)来控制,文件表头可取
         
"seltext_lseltext_mseltext_s。可用于导出文件布局
          et_fieldcat        
= p_fieldcat_tab[]
       
CHANGING

          cs_variant         
= l_variant."传入的布局布局变式名'

     
"""""""下面就是对 p_fieldcat_tab[] 内表字段结构进行分析及应用了
     
....
 
ENDCASE.
ENDFORM.

FORM inital .
  lt_stock
-sel = 'X'.
  lt_stock
-checkbox = 'X'.
  lt_stock
-werks = '1001'.
  lt_stock
-matnr = '1001M1'.
  lt_stock
-labst = 4.
  lt_stock
-int = 2.
  lt_stock
-color = 'C100'.
 
APPEND lt_stock .

 
CLEAR:lt_stock.
  lt_stock
-sel = 'X'.
  lt_stock
-werks = '1001'.
  lt_stock
-matnr = '1001M2'.
  lt_stock
-labst = 3.
  lt_stock
-int = 1.
  lt_stock
-color = 'C200'.
 
APPEND lt_stock .

 
CLEAR:lt_stock.
  lt_stock
-checkbox = 'X'.
  lt_stock
-werks = '1002'.
  lt_stock
-matnr = '1001M1'.
  lt_stock
-labst = 2.
  lt_stock
-int = 3.
  lt_stock
-color = 'C300'.
 
APPEND lt_stock .

 
CLEAR:lt_stock.
  lt_stock
-werks = '1002'.
  lt_stock
-matnr = '1001M2'..
  lt_stock
-labst = 1.
  lt_stock
-int = 1.
  lt_stock
-color = 'C300'.
 
APPEND lt_stock .
ENDFORM.

image049

image050

红绿灯layout-lights_fieldname

image051

TYPE-POOLS:slis.
DATA: gt_fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE.
DATA: gs_layout TYPE slis_layout_alv.

DATA: BEGIN OF gt_data OCCURS 0,
  light
(1), "信息灯列
  val
(1),
  sel
, "选择列
END OF gt_data.

START-OF-SELECTION.
 
PERFORM inital.
 
DEFINE fill_fdcat.
   
clear gt_fieldcat.
    gt_fieldcat
-fieldname = &1.
    gt_fieldcat
-seltext_l = &2.
   
"请注意:这里一定要设置一下ddictxt,否则light列标题将显示为Exception
    gt_fieldcat-ddictxt = &3.
   
append gt_fieldcat.
 
END-OF-DEFINITION.

  fill_fdcat
'LIGHT' '红绿灯'  'L'.
  fill_fdcat
'VAL' ''  'L'.

  gs_layout
-lights_fieldname  = 'LIGHT'."指定灯列名

 
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
   
EXPORTING
      it_fieldcat
= gt_fieldcat[]
      is_layout  
=
gs_layout
   
TABLES

      t_outtab   
= gt_data.

FORM inital .
  gt_data
-light = ' '."
取值范围为:空、1~3
  gt_data
-val = ''.
 
APPEND gt_data .

  gt_data
-light = '1'.
  gt_data
-val = '1'.
 
APPEND gt_data .

  gt_data
-light = '2'.
  gt_data
-val = '2'.
 
APPEND gt_data .

  gt_data
-light = '3'.
  gt_data
-val = '3'.
 
APPEND gt_data .
ENDFORM.

F4帮助

image052
TYPE-POOLS:slis.
DATA: fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE.

DATA:BEGIN OF t_stock OCCURS 0,
  werks
LIKE mard-werks,"工厂
  matnr
LIKE mara-matnr,"物料
 
END OF t_stock.

INITIALIZATION.
 
PERFORM inital.

START-OF-SELECTION.

 
DEFINE fill_fdcat.
   
clear fieldcat.
    fieldcat
-fieldname = &1.
    fieldcat
-seltext_l = &2.
    fieldcat
-key = &3.
   
"如果不设为可编辑,则F4帮助只能看,不能选
    fieldcat
-edit = 'X'.
   
if &1  = 'WERKS'.
      fieldcat
-ref_tabname   = 'MARD'. "F4帮助,参照的表
      fieldcat
-ref_fieldname = 'WERKS'."F4帮助,参照的表中哪个字段
   
endif.
   
append fieldcat.
 
END-OF-DEFINITION.

  fill_fdcat
'WERKS' 'WERKS' ''.
  fill_fdcat
'MATNR' 'MATNR' ''.

 
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
   
EXPORTING
      it_fieldcat
= fieldcat[]
   
TABLES

      t_outtab   
= t_stock.

FORM inital .
  t_stock
-werks = '1001'.
  t_stock
-matnr = '1001M1'.
 
APPEND t_stock .
ENDFORM.

行多选按钮、复选框

image053
注:按住CTRL键可以选择多行

TYPE-POOLS:slis.
DATA: gt_fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE.
DATA: gs_layout TYPE slis_layout_alv.

DATA:BEGIN OF gt_stock OCCURS 0,
  sel
,"用来做选择按钮列image054
 
checkbox,"用作复选框列image055
  werks
LIKE mard-werks,"工厂
  matnr
LIKE mara-matnr,"物料
 
END OF gt_stock.

INITIALIZATION.
 
PERFORM inital.

START-OF-SELECTION.
 
DEFINE fill_fdcat.
   
clear gt_fieldcat.
    gt_fieldcat
-fieldname = &1.
    gt_fieldcat
-seltext_l = &2.
    gt_fieldcat
-key = &3.
   
append gt_fieldcat.
 
END-OF-DEFINITION.

  fill_fdcat
'WERKS' '工厂' 'X'.
  fill_fdcat
'MATNR' '物料' 'X'.
 
"==========复选框设置
 
CLEAR gt_fieldcat.
  gt_fieldcat
-seltext_l = '复选框'.
  gt_fieldcat
-fieldname = 'SEL'.
"
当用户点击复选框后,如需将数据更新到输出内表中,则需对REUSE_ALV_GRID_DISPLAY函数参数i_grid_settings-edt_cll_cb进行设置
  gt_fieldcat
-checkbox = 'X'.
 
APPEND gt_fieldcat.

  gs_layout
-box_fieldname = 'CHECKBOX'."行多选择按钮设置

 
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
   
EXPORTING
      it_fieldcat
= gt_fieldcat[]
      is_layout  
=
gs_layout
   
TABLES

      t_outtab   
= gt_stock.

FORM inital .
  gt_stock
-sel = 'X'.
  gt_stock
-checkbox = 'X'.
  gt_stock
-werks = '1001'.
  gt_stock
-matnr = '1001M1'.
 
APPEND gt_stock .

 
CLEAR:gt_stock.
  gt_stock
-sel = 'X'.
  gt_stock
-werks = '1001'.
  gt_stock
-matnr = '1001M2'.
 
APPEND gt_stock .
ENDFORM.

ALV报表标题

image056

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
   
EXPORTING
      it_fieldcat
=
gt_fieldcat[]
      i_grid_title = 'ALV
报表标题'
   
TABLES
      t_outtab   
= gt_data.

热点

image057


TYPE-POOLS:slis.
DATA: gt_fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE.
DATA: gt_sort TYPE slis_t_sortinfo_alv WITH HEADER LINE.
DATA:BEGIN OF gt_data OCCURS 0,
  key1
(1),
  key2
(2),
 
END OF gt_data.

START-OF-SELECTION.
 
PERFORM inital.
 
DEFINE fill_fdcat.
   
clear gt_fieldcat.
    gt_fieldcat
-fieldname = &1.
    gt_fieldcat
-seltext_l = &2.
    gt_fieldcat
-key = &3.

 
  
gt_fieldcat-hotspot = 'X'.
    append gt_fieldcat.
 
END-OF-DEFINITION.

  fill_fdcat
'KEY1' 'KEY1' 'X'.
  fill_fdcat
'KEY2' 'KEY2' 'X'.

 
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
   
EXPORTING
      i_callback_program     
= sy-repid
      it_fieldcat            
=
gt_fieldcat[]
      i_callback_user_command
= 'USER_COMMAND'

   
TABLES
      t_outtab               
= gt_data[].

FORM user_command  USING r_ucomm LIKE sy-ucommrs_selfield TYPE slis_selfield.
 
MESSAGE i001(00) WITH '热点触发事务码:r_ucomm.
ENDFORM.

FORM inital .
  gt_data
-key1 = 'a'.
  gt_data
-key2 = 'aa'.
 
APPEND gt_data.
ENDFORM.

posted @ 2015-02-14 11:04  江正军  阅读(13921)  评论(2编辑  收藏  举报