ALV详解:Function ALV(二)

声明:原创作品,转载时请注明文章来自SAP师太技术博客:www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将追究法律责任!原文链接:http://www.cnblogs.com/jiangzhengjun/p/4291344.html

Function ALV.. 5

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

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

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

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

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

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

排序、汇总... 43

GRIDALV排序、分类汇总... 43

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

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

线分隔(gt_sort-group = ‘UL‘). 53

分页方式分隔(gt_sort-group = ‘*‘). 54

表头信息说明... 54

i_callback_html_top_of_page参数回调接口... 54

top_of_page事件... 55

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

红绿灯(layout-lights_fieldname)... 67

F4帮助... 69

行多选按钮、复选框... 70

ALV报表标题... 72

热点

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.
DATAl_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_DISPLAY、REUSE_ALV_GRID_DISPLAY_LVC函数并不能满足我们的需要,如通过REUSE_ALV_GRID_DISPLAY_LVC函数设置单元格显示为PushButton时,无法针对Button的单元事件进行处理,所以只能借助于OO的ALV。只需在代码中加入如下代码,即可获取到当前所产生的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类型。datatype与INTTYPE实质上就是一种编辑类型与数据库字段类型的映射,即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

INTTYPE:ABAP程序内部所使用的一种数据类型,即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

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.

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

"需要进行统计的字段:INT1、INT2
    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.

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

"需要进行统计的字段:INT1、INT2
    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.

根据KEY1、KEY2多列进行排序且小计:

下面是完整代码:

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.
    "需要进行分类小计及汇总的字段:INT1、INT2
    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-up、gt_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.
    "需要进行统计的字段:INT1、INT2
    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)

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

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

表头信息说明

可以通过两种回调方式来实现,第一种:直接通过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_pageUSING 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.

top_of_page事件

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

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_text(  row = l_row column = 2 text = ‘标签说明1(正常字体,长度无限制)‘ )."Info
  lr_grid_rows->create_text(  row = 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)输出。
*  "   通常有多个,且每行中只允许一对。此时KEY与INFO都会输出。Key字段会加粗,INFO正常
*  "   均左对齐输出。
*  "A:表示输出内容为提示说明性文字。通常只有一行(但可以有多行)。此时KEY不会输出,
*  "   只有INFO值才会输出。字粗为斜体
*  "   左对齐输出。
*  "同时有 H、S、A时,会按照 H、S、A的先后顺序输出(而不管向内表APEPEND的顺序)
*  ",且H、S、A之间会使用空行分隔,但它们各自内部(类型相同的行)之间不会输出空行
*  "
*  "另外,由于key与info字段长度都有限制(20、60),所以超出此宽度的长度无法输出,此时
*  "只能采用另一种面向对象的方式来输出,请参考上面的部分
*  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 标准与用户模式,此模式下可以选择存储为标准还是用户变式

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

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

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

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

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

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

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_l、seltext_m或seltext_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.

红绿灯(layout-lights_fieldname)

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.

FORMinital .
  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帮助


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.

行多选按钮、复选框


注:按住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,"用来做选择按钮列
  checkbox,"用作复选框列
  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报表标题

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

热点

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.

时间: 2024-08-27 18:56:29

ALV详解:Function ALV(二)的相关文章

iOS学习之UINavigationController详解与使用(二)页面切换和segmentedController

1.RootView 跳到SecondView 首先我们需要新一个View.新建SecondView,按住Command键然后按N,弹出新建页面,我们新建SecondView 2.为Button 添加点击事件,实现跳转 在RootViewController.xib中和RootViewController.h文件建立连接 在RootViewController.m中实现代码,alloc一个SecondViewController,用pushViewController到navigationCon

shared pool 和buffer pool 详解(之二, Cache Buffers LRU Chain、Cache Buffers LRU Chain闩锁竞争与解决)

[深入解析--eygle]学习笔记 1.1.2  Cache BuffersLRU Chain闩锁竞争与解决 当用户进程需要读数据到Buffer Cache时或Cache Buffer根据LRU算法进行管理等,就不可避免的要扫描LRU  List获取可用Buffer或更改Buffer状态,我们知道,Oracle的Buffer Cache是共享内存,可以为众多并发进程并发访问,所以在搜索的过程中必须获取Latch(Latch是Oracle的一种串行锁机制,用于保护共享内存结构),锁定内存结构,防止

[转]iOS学习之UINavigationController详解与使用(二)页面切换和segmentedController

转载地址:http://blog.csdn.net/totogo2010/article/details/7682433 iOS学习之UINavigationController详解与使用(一)添加UIBarButtonItem是上篇,我们接着讲UINavigationController的重要作用,页面的管理和切换. 1.RootView 跳到SecondView 首先我们需要新一个View.新建SecondView,按住Command键然后按N,弹出新建页面,我们新建SecondView 2

oracle HA 高可用性详解(之二,深入解析TAF,以及HA框架)

oracle HA 高可用性详解(之一,client.server端服务详解):http://write.blog.csdn.net/postedit 我们已经看到TAF是的Oracle的会话能够自动重新连接,需要说明的是,这个能力是基于OCI的,是OCI的一个功能,JDBC Thin Driver无效,因为这种驱动不是构建在OCI库上的. 虽然这个功能发起于RAC,但TAF并不局限于RAC,单实例.DG环境都可以享受这个好处.Oralce声称其TAF能够保证用户会话自动的转移到另一个实例上.这

ALV详解:Function ALV(一)

声明:原创作品,转载时请注明文章来自SAP师太技术博客:www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将追究法律责任!原文链接:http://www.cnblogs.com/jiangzhengjun/p/4291337.html Function ALV.. 5 Layout结构... 5 Fieldcat结构... 7 ALV相关函数... 9 简单实例... 13 Fieldcat动态创建... 15 通过编程创建... 15 通过REUS

ALV详解:OO ALV

声明:原创作品,转载时请注明文章来自SAP师太技术博客:www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将追究法律责任!原文链接:http://www.cnblogs.com/jiangzhengjun/p/4291373.html OO ALV.. 79 EnjoySAP Controls and CFW... 79 LVC_S_FCAT. 84 LVC_S_LAYO.. 88 set_table_for_first_dispaly()方法参数.

ALV详解:OO SALV

声明:原创作品,转载时请注明文章来自SAP师太技术博客:www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将追究法律责任!原文链接:http://www.cnblogs.com/jiangzhengjun/p/4291387.html OOSALV.. 123 三种显示模式... 123 全屏模式... 125 全屏经典列表模式... 126 可控模式... 126 CL_SALV_TABLE设置相关方法... 128 样式设置... 130 显示设

CocoaPods详解之(二)----进阶篇

CocoaPods详解之----进阶篇 作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/19178709 转载请注明出处 一.Podfile.lock文件 上文讲过,在开始使用CocoaPods,执行完pod install之后,会生成一个Podfile.lock文件.这个文件看起来跟我们关系不大,实际上绝对不应该忽略它. 该文件用于保存已经安装的Pods依赖库的版本,通过CocoaPods安装了SBJson.AFNe

dom对象详解--document对象(二)

   dom对象详解--style对象 style对象 style对象和document对象下的集合对象styleSheets有关系,styleSheets是文档中所有style对象的集合,这里讲解的重点是style对象,styleSheets不是重点. style对象定义:Represents the current settings of all possible inline styles for agiven element,即表示当前元素的样式设置. 例,可拖动的窗口 <!DOCTYP