ALV Grid 函数

ALV Grid 函数的输出有两个:REUSE_ALV_GRID_DISPLAY 和 REUSE_ALV_GRID_DISPLAY_LVC

两者的操作大同小异,只是后者能更好的和ALV容器结合使用,前后则不能;而在输入参数属性的结构上也有些差异。

本篇文章主要讲解下ALV函数中输入参数的一些应用。

 

首先了解下ALV函数输入参数的作用(粗体为常用参数):

I_INTERFACE_CHECK: 检查接口一致性

I_BYPASSING_BUFFER: 是否使用缓存

I_BUFFER_ACTIVE:是否激活缓存,如果每次显示ALV都是相同的字段目录,则该字段目录会被放到一特殊的缓存里,加快显示速度。

I_CALLBACK_PROGRAM:调用ALV的程序名称

I_CALLBACK_PF_STATUS_SET:ALV工具栏Subroutine(子程序)

I_CALLBACK_USER_COMMAND:ALV User Command Subroutine(子程序),实现对应菜单项及相应事件功能

I_CALLBACK_TOP_OF_PAGE:ALV抬头内容信息

I_CALLBACK_HTML_TOP_OF_PAGE:ALV HTML格式抬头内容信息

I_CALLBACK_HTML_END_OF_LIST:ALV HTML格式页脚内容信息I_STRUCTURE_NAME:为输出表数据结构的命名,指定了这个参数,域目录将会自动生成

I_BACKGROUND_ID:ALV背景图片Object ID

I_GRID_TITLE:ALV 标题

I_GRID_SETTINGS:GRID信息

IS_LAYOUT / IS_LAYOUT_LVC:ALV输出布局样式

IT_FIELDCAT / IT_FIELDCAT_LVC:设定显示的项目名称及输出设定

IT_EXCLUDING:隐藏设置的ALV工具栏

IT_SPECIAL_GROUPS / IT_SPECIAL_GROUPS_LVC:若内表中一些字段通过SP_GROUP被分组在一起,必须为这些组传递组文本内表IT_SORT / IT_SORT_LVC:ALV排序设置

IT_FILTER / IT_FILTER_LVC:ALV过滤设置

IS_SEL_HIDE:替换或修改屏幕中select-option的值

I_DEFAULT:用户是否可以定义默认的布局,’X'-可以定义默认布局,Space-不可以定义默认布局 (默认:X)

I_SAVE:保存表格布局,’X'-只能保存全局变式;’U'-只能保存特定变式;’A'-都可以保存;Space-不能保存变式 (默认:space)

IS_VARIANT:表格布局变式

IT_EVENTS:设置事件, 类型为slis_t_event的内表(name:事件名称,form:事件的FORM)

IT_EVENT_EXIT:设置回调的方法的执行行为,表明用户所写的代码是在执行标准执行之前还是之后

IS_PRINT:后台打印的相关参数

I_SCREEN_START_COLUMN:以对话框形式显示的开始列

I_SCREEN_START_LINE:以对话框形式显示的开始行

I_SCREEN_END_COLUMN:以对话框形式显示的结束列

I_SCREEN_END_LINE:以对话框形式显示的结束行

I_HTML_HEIGHT_TOP:HTML抬头的高度

I_HTML_HEIGHT_END:HTML页脚的高度

IT_ALV_GRAPHICS:是否可以在图表中显示ALV

IT_HYPERLINK:使用超链接

 

下面详细介绍下常用的输入参数:

1. I_CALLBACK_PROGRAM 参数属性

定义调用程序名称,一般为当前程序sy-repid

 

2. I_CALLBACK_PF_STATUS_SET 参数

定义ALV屏幕菜单,此参数允许报表展现用户自定义的屏幕菜单,

参数类型为:SLIS_FORMNAME,指定自定义按钮的子FORM,该子FORM不显式的调用;

如:

i_callback_pf_status_set = 'FRM_SET_STATUS'

Form中的定义为:

FORM frm_set_status USING p_extab TYPE slis_t_extab.
 
SET PF-STATUS 'Z_ALV_STATUS'  .
 
ENDFORM.                    " frm_set_status

2.1). 没有自定义按钮时候,该参数可以不要,这时会显示ALV标准的按钮;

当然这些按钮可以部分隐藏(见:IT_EXCLUDING 参数属性);

2.2). 当我们使用自定义按钮后,ALV自带的标准按钮,则会失效,这时需要将一些必要的按钮在工具条补上;

2.3). 其中 “分隔符” 的插入方法为:在需要插入分隔符的方框内,选择菜单:Edit->Insert-> Separator line 即可插入分隔符;

2.4). 下面是ALV中的标准工具的名称、代码、图标名称、快捷键:

名称

代码

图标名称

快捷键

刷新

REFRESH

ICON_REFRESH

F8(可随便更改)

导出为EXCEL表格

EXCEL

Shift-F8(可随便更改)

ABC 分析

&ABC

ICON_ABC

Ctrl-F1

按升序排列

&OUP

ICON_SORT_UP

Ctrl-F4

设置过滤器

&ILT

ICON_FILTER

Ctrl-F5

总计

&UMC

ICON_SUM

Ctrl-F6

邮件查收件

%SL

ICON_MAIL

Ctrl-F7

更改布局…

&OL0

ICON_ALV_VARIANTS

Ctrl-F8

选择布局…

&OAD

ICON_ALV_VARIANT_CHOOSE

Ctrl-F9

保存布局…

&AVE

ICON_ALV_VARIANT_SAVE

Ctrl-F10

信息

&INFO

ICON_INFORMATION

Ctrl-F12

明细

&ETA

ICON_SELECT_DETAIL

Ctrl-Shift-F3

按降序排列

&ODN

ICON_SORT_DOWN

Ctrl-Shift-F4

删除过滤器

&ILD

ICON_FILTER_UNDO

Ctrl-Shift-F5

小计

&SUM

ICON_INTERMEDIATE_SUM

Ctrl-Shift-F6

Microsof

&VEXCEL

ICON_XLS

Ctrl-Shift-F7

字处理

&AQW

ICON_WORD_PROCESSING

Ctrl-Shift-F8

本地文件

%PC

ICON_EXPORT

Ctrl-Shift-F9

打印预览

&RNT_PREV

ICON_LAYOUT_CONTROL

Ctrl-Shift-F10

图形

&GRAPH

ICON_GRAPHICS

Ctrl-Shift-F11

 

2.5). 一般情况下,可以快速拷贝标准程序的菜单栏,再进行修改、筛选;

操作步骤如下:

01). 进入 SE80,打开 Repository Information System;

02). 打开路径: Repository Information System-> Program Library->Program SubObjects->GUI Status;

03). 在右边屏幕的程序名称(Program Name)输入框内输入标准程序名称:SAPLKKBL,然后执行;

04). 在输出的列表中,找到 STANDARD 或 STANDARD_FULLSCREEN:
05).双击进入菜单编辑后,拷贝到需要用到的程序中即可。

 

3. I_CALLBACK_USER_COMMAND 参数属性

响应菜单项及其相应事件,捕捉点击相应的按钮或双击等操作的 Function Code(FCode)

参数类型为:SLIS_FORMNAME,与 I_CALLBACK_PF_STATUS_SET 参数一样,为定义的子 FORM,不显式调用;

如:

i_callback_user_command = 'FRM_ ALV_USER_COMMAND'

Form 的定义为:

*&-----------------------------------------------------------------*
*&      Form  FRM_ALV_USER_COMMAN
*&-----------------------------------------------------------------*
FORM frm_alv_user_command USING p_ucomm        
TYPE sy-ucomm
                                
p_rs_selfield  TYPE slis_selfield.
  CASE p_ucomm.
    WHEN '&IC1' .    " 判断用户的动作
    "读取用户点击的当前行的一行内容
     READ TABLE  i_tab INTO wa_tab INDEX p_rs_selfield-tabindex .
      IF p_rs_selfield-fieldname EQ 'CITYFROM'.
        "判断用户点击的是哪一列
        IF NOT  wa_tab-cityfrom IS INITIAL .
          PERFORM frm_show_detail USING p_rs_selfield .    " 显示明细
        ENDIF.
       ELSEIF p_rs_selfield-fieldname EQ 'TCODE'  .
        IF NOT  wa_tab-tcode IS INITIAL .
          PERFORM frm_call_tran USING p_rs_selfield .      " 调用其他事务
        ENDIF .
       ELSEIF p_rs_selfield-fieldname EQ 'ICON_FOLDER'  .
         PERFORM frm_open_folder USING p_rs_selfield .      " 打开文件
       ENDIF.
       CLEAR wa_tab.
     WHEN '&SAVE_DATA' .
      PERFORM frm_save_data .                              " 保存数据
     WHEN 'PRINT' .
      PERFORM frm_print_data.                              " 打印数据
     WHEN 'EXCEL' .
      PERFORM frm_export .                                 " 导出数据
   ENDCASE.
   p_rs_selfield-refresh = 'X' .    " 当用户在显式界面上对数据进行修改时,同时内表中的数据也随之刷新 
ENDFORM.                    " frm_alv_user_command

其中,标准按钮的FCode,可以通过类 CL_GUI_ALV_GRID 中的 Attributes 查看;

操作步骤:

01). 进入事务码SE24,输入类名称:CL_GUI_ALV_GRID,点击显示( Display );

02). 切换到 Attributes 标签,找到自己需要的”属性”和”初始值”,这个初始值就是我们要找的标准按钮的FCODE;

 

3.1 热点链接

热点链接,即 Fieldcat中 的 hotspot 属性;

设置之后,当用户点击带有热点的字段时,就会触发 Subroutine(FRM_USER_COMMAND)中的动作;

对于热点链接,所对应的FCode为 “&IC1“;

示例如下:

lv_pos = lv_pos + 1 .
wa_fieldcat-col_pos       = lv_pos .
wa_fieldcat-fieldname     = 'MATNR' .
wa_fieldcat-scrtext_l     = '物料编号'.
wa_fieldcat-fix_column    = 'X' .
wa_fieldcat-hotspot       = 'X' .      " 热点,链接用
APPEND wa_fieldcat TO i_fieldcat .
CLEAR wa_fieldcat.
 
*&------------------------------------------------------------------*
*&      Form  FRM_ALV_USER_COMMAND
*&------------------------------------------------------------------*
FORM frm_alv_user_command USING p_ucomm        
TYPE sy-ucomm
p_rs_selfield  TYPE slis_selfield .
  CASE p_ucomm.
     WHEN '&IC1' .  "判断用户的动作
       "读取用户点击的当前行的一行内容
      READ TABLE  i_tab INTO wa_tab INDEX p_rs_selfield-tabindex .
       IF p_rs_selfield-fieldname EQ 'MATNR'.             " 判断用户点击的是哪一列
         IF NOT  wa_tab-matnr IS INITIAL .
          ………
        ENDIF.
       ELSEIF p_rs_selfield-fieldname EQ 'TCODE'  .
        IF NOT  wa_tab-tcode IS INITIAL .
          PERFORM frm_call_tran USING p_rs_selfield.      " 调用其他事务
        ENDIF .
       ENDIF.
       CLEAR wa_tab.
   ENDCASE.
   
  p_rs_selfield-refresh = 'X'.
   
ENDFORM.                    " frm_alv_user_command

3.2 显示明细

在使用 REUSE_ALV_GRID_DISPLAY_LVC 时,会发现使用 REUSE_ALV_GRID_DISPLAY 时的双击显示行明细功能没有了;

这是SAP标准程序决定的,REUSE_ALV_GRID_DISPLAY_LVC 已经取消了双击显示行明细功能。

当然,也可以点击工具栏中的放大镜按钮,直接查看明细;

如若想要实现双击显示明细,则可以直接执行FCode:&ETA调用标准功能:

*&---------------------------------------------------------------------*
*&      Form  FRM_ALV_USER_COMMAND
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->PA_UCOMM     text
*      -->PS_SELFIELD  text
*----------------------------------------------------------------------*
FORM frm_alv_user_command USING pa_ucomm TYPE sy-ucomm
                   ps_selfield TYPE slis_selfield.
 
  CASE pa_ucomm.
    WHEN '&IC1'.          "双击
      pa_ucomm = '&ETA'.  "查看明细
  ENDCASE.
 
ENDFORM.                    " FRM_ALV_USER_COMMAND

3.3 调用其他事务

*&---------------------------------------------------------------------*
*&      Form  frm_alv_call_tran
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_RS_SELFIELD  text
*----------------------------------------------------------------------*
FORM frm_alv_call_tran USING p_rs_selfield TYPE slis_selfield  .
   
  SET PARAMETER  ID  'LIB'  FIELD  p_rs_selfield-value.
   
  CALL TRANSACTION  'SE37'  AND  SKIP  FIRST  SCREEN.
   
ENDFORM.                    " frm_alv_call_tran

其中,”LIB“是指:参数ID(PARAMETER ID)。

查找方法:

01). 用一个事务码进入屏幕界面,在输入框内按 F1;

02). 在弹出来的界面中点击”技术信息”按钮,在字段数据的最后一行,即为参数ID;

“SE37″ 是指我们要调用的事务代码,AND SKIP FIRST SCREEN 表示跳过第一屏屏幕;

 

4. I_CALLBACK_TOP_OF_PAGE / I_CALLBACK_HTML_TOP_OF_PAGE 参数属性

I_CALLBACK_TOP_OF_PAGE 与 I_CALLBACK_HTML_TOP_OF_PAGE 参数属性都用于书写 ALV抬头标题信息,

只是区别在于后者支持 HTML格式;

参数类型:SLIS_FORMNAME,也与 I_CALLBACK_PF_STATUS_SET 参数一样,为定义的子FORM,不显式调用。

如:

i_callback_top_of_page       = 'FRM_TOP_OF_PAGE'
 
i_callback_html_top_of_page  = 'FRM_HTML_TOP_OF_PAGE'

其中,对应 FORM(FRM_HTML_TOP_OF_PAGE)的定义,需要引用类:CL_DD_DOCUMENT(动态文本类)来显示HTML格式。

如:

*&---------------------------------------------------------------------*
*&      Form  frm_html_top_of_page
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_CL_DD    text
*----------------------------------------------------------------------*
FORM frm_html_top_of_page USING p_cl_dd TYPE REF  TO  cl_dd_document.
   
  …
   
ENDFORM.                    "frm_html_top_of_page

示例如下:

*&---------------------------------------------------------------------*
*&      Form  frm_html_top_of_page
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM frm_html_top_of_page USING p_cl_dd TYPE REF  TO  cl_dd_document.
 
  " 定义登录用户的描述
  DATA: l_name     TYPE string ,
        name_first LIKE adrp-name_first ,
        name_last  LIKE adrp-name_last .
  " 定义登录日期
  DATA: l_date TYPE string .
 
  " 定义缓冲区变量
  DATA: m_p      TYPE i ,
        m_buffer TYPE string .
 
  " 得到登录用户的描述
  SELECT SINGLE  adrp~name_first
                adrp~name_last
    INTO (name_first,name_last)
    FROM adrp
    INNER JOIN  usr21 ON adrp~persnumber = usr21~persnumber
   WHERE usr21~bname = sy-uname .
 
  IF sy-subrc = 0 .
    CONCATENATE name_last name_first INTO l_name .
  ELSE .
    l_name = sy-uname .
  ENDIF.
  CLEAR name_first .
  CLEAR name_last .
 
  " 拼接制表日期
  CONCATENATE sy-datum+0(2) '.'
              sy-datum+4(2) '.'
              sy-datum+6(2) '.'
         INTO l_date .
 
  m_buffer = '<h1>ALV DEMO</h1>'  .
  CALL METHOD  p_cl_dd->html_insert
    EXPORTING
      contents = m_buffer
    CHANGING
      position = m_p.
 
  " 输出制表人和制表日期
  CONCATENATE '<p>出表人:'  l_name
              '     '
              '出表日期:' l_date '</p>'
        INTO m_buffer .
 
  CALL METHOD  p_cl_dd->html_insert
    EXPORTING
      contents = m_buffer
    CHANGING
      position = m_p.
 
ENDFORM.                    "frm_html_top_of_page
 
 
* ALV
CALL FUNCTION  'REUSE_ALV_GRID_DISPLAY_LVC'
  EXPORTING
    i_callback_program          = sy-repid           " 当前程序
    i_callback_top_of_page      = 'FRM_TOP_OF_PAGE'
    i_callback_html_top_of_page = 'FRM_HTML_TOP_OF_PAGE'
    is_layout_lvc               = i_layout_lvc       " 属性内表
    it_fieldcat_lvc             = i_fieldcat_lvc[]   " 列明内表
    i_save                      = 'X'               " 是否保存布局
  TABLES
    t_outtab                    = i_tab              " 数据内表
  EXCEPTIONS
    program_error               = 1
    OTHERS                      = 2.

4.1 REUSE_ALV_COMMENTARY_WRITE 函数

上面文档中出现 REUSE_ALV_COMMENTARY_WRITE 函数,这里顺便了解下该函数的应用。

该函数与 CL_DD_DOCUMENT 类一样,用于 I_CALLBACK_TOP_OF_PAGE FORM 中输出抬头/页脚内容信息;

所以一般情况下:

I_CALLBACK_TOP_OF_PAGE Form 与 REUSE_ALV_COMMENTARY_WRITE 函数配合使用;

I_CALLBACK_HTML_TOP_OF_PAGE Form 与 CL_DD_DOCUMENT 类配合使用。

 

REUSE_ALV_COMMENTARY_WRITE 函数包括一个必须参数,三个可选参数:

01). IT_LIST_COMMENTARY(必须):一个类型为 SLIS_T_LISTHEADER 的内表;

* Header table for top of page
TYPES: BEGIN OF  slis_listheader,
         typ(1)  TYPE C,    " H = Header, S = Selection, A = Action
         key(20) TYPE C,
         info    TYPE slis_entry,
       END OF  slis_listheader.
 
TYPES: slis_t_listheader TYPE slis_listheader OCCURS 1.

02). I_LOGO(可选):图片/Logo 的 Object ID

03). I_END_OF_LIST_GRID(可选):用于页脚的信息

04). I_ALV_FORM(可选):是否用于 ALV 的FORM中,默认为:Space

 

接下来,看下示例:

*&---------------------------------------------------------------------*
*&      Form  frm_top_of_page
*&---------------------------------------------------------------------*
*       ALV 标题
*----------------------------------------------------------------------*
FORM frm_top_of_page.
 
  DATA: i_header  TYPE  slis_t_listheader,
        wa_header TYPE slis_listheader.
 
* 定义登录用户的描述
  DATA: l_name     TYPE string ,
        name_first LIKE adrp-name_first ,
        name_last  LIKE adrp-name_last .
 
* 定义登录日期
  DATA: l_date TYPE string .
 
* 得到登录用户的描述
  SELECT SINGLE
    adrp~name_first
    adrp~name_last
    INTO (name_first,name_last)
    FROM adrp
    INNER JOIN  usr21 ON adrp~persnumber = usr21~persnumber
    WHERE usr21~bname = sy-uname .
 
  IF sy-subrc = 0 .
    CONCATENATE name_last name_first INTO l_name .
  ELSE .
    l_name = sy-uname .
  ENDIF.
 
  CLEAR name_first.
  CLEAR name_last.
 
* 拼接制表日期
  CONCATENATE sy-datum+0(4) '.'
              sy-datum+4(2) '.'
              sy-datum+6(2) INTO l_date.
 
  CONCATENATE '制表人:'    l_name INTO l_name .
  CONCATENATE '制表日期:'  l_date  INTO l_date .
 
* 位于标题第一行
  wa_header-typ  = 'H'.
  wa_header-info = 'ALV DEMO'  .
  APPEND wa_header TO i_header .
  CLEAR  wa_header .
 
* 相关内容信息,这里用于显示登录用户信息描述
  wa_header-typ  = 'S'.
  wa_header-key  = l_name .
  wa_header-info = l_date .
  APPEND wa_header TO i_header .
  CLEAR  wa_header .
 
  CALL FUNCTION  'REUSE_ALV_COMMENTARY_WRITE'
    EXPORTING
      it_list_commentary = i_header
      i_alv_form         = 'X'.
 
ENDFORM.                  "frm_top_of_page
 
* ALV
CALL FUNCTION  'REUSE_ALV_GRID_DISPLAY_LVC'
  EXPORTING
    i_callback_program          = sy-repid           " 当前程序
    i_callback_top_of_page      = 'FRM_TOP_OF_PAGE'
    is_layout_lvc               = i_layout_lvc       " 属性内表
    it_fieldcat_lvc             = i_fieldcat_lvc[]   " 列明内表
    i_save                      = 'X'               " 是否保存布局
  TABLES
    t_outtab                    = i_tab              " 数据内表
  EXCEPTIONS
    program_error               = 1
    OTHERS                      = 2.

4.2 上传图片

01).通过事务码:OAER,进入 Business Document Navigator 参数界面;

02).输入值:

ClassName 输入:”PICTURES”;

Class Type 输入: “OT”

Object Key 输入: 自定义ID名称(这里输入ZJX_LOGO),用于标记上上传图片的唯一标识

03).按F8执行后,进入到导航界面:

04) 选择 PICTURES 节点后,在创建标签中,打开标准文档类型节点;

05) 双击屏幕节点,会弹出文件框,直接上传现有的图片;

06) 选择文件后,输入描述与关键字,便于搜索查找;

07) 上传成功后,记录下Object Key:”ZJX_LOGO”

 

然后在 ALV抬头中加入上传后的LOGO:

CALL FUNCTION  'REUSE_ALV_COMMENTARY_WRITE'
  EXPORTING
    it_list_commentary = i_header
    i_logo             = 'ZJX_LOGO'  “ OAER 中的Object Key
    i_alv_form         = 'X'.

5. I_GRID_TITLE 参数属性

该参数为 ALV 小标题,位于 ALV 抬头信息下方;示例如下:

DATA: i_grid_title TYPE lvc_title .
 
i_grid_title = '小标题' .
 
CALL FUNCTION  'REUSE_ALV_GRID_DISPLAY_LVC'
  EXPORTING
    i_callback_program          = sy-repid           " 当前程序
    i_callback_top_of_page      = 'FRM_TOP_OF_PAGE'
    i_callback_html_top_of_page = 'FRM_HTML_TOP_OF_PAGE'
    i_grid_title                = i_grid_title
    is_layout_lvc               = i_layout_lvc       " 属性内表
    it_fieldcat_lvc             = i_fieldcat_lvc[]   " 列明内表
    i_save                      = 'X'               " 是否保存布局
  TABLES
    t_outtab                    = i_tab              " 数据内表
  EXCEPTIONS
    program_error               = 1
    OTHERS                      = 2.

6. I_GRID_SETTINGS 参数属性

该参数用于设置Grid相关参数(打印、单元格回调);

类型为:LVC_S_GLAY,该结构包括:

01) COLL_TOP_P:最小化 TOP_OF_PAGE

02) COLL_END_L:最小化 END_OF_LIST

03) TOP_P_ONLY:仅打印TOP_OF_PAGE

04) EOL_P_ONLY:仅打印END_OF_LIST

05) NO_COLWOPT:不优化打印的列宽

06) EDT_CLL_CB:退出可编辑单元格时回调

其中,常用的是 EDT_CLL_CB 字段,该字段用于回调输入的变量;

即,当我们在ALV的显示界面可编辑字段上修改了数据,回车后会回调我们修改的数据到内表中,并对其修改;

这个字段在编辑操作中很关键。

 

示例代码如下:

 定义回调变量
DATA: i_grid_settings TYPE  lvc_s_glay.
 
i_grid_settings-edt_cll_cb  = 'X' .
 
* 在ALV中使用
CALL FUNCTION  'REUSE_ALV_GRID_DISPLAY_LVC'
  EXPORTING
    i_callback_program = sy-repid
    is_layout_lvc      = i_layout_lvc
    it_fieldcat_lvc    = i_fieldcat_lvc[]
    i_grid_settings    = i_grid_settings
    i_save             = 'X'
  TABLES
    t_outtab           = i_tab
  EXCEPTIONS
    program_error      = 1
    OTHERS             = 2.

7. IS_LAYOUT/ IS_LAYOUT_LVC 参数属性

关于该参数,前面文章《ALV简介和Fieldcat与Layout相关参数属性》中已经讲述过其相关参数属性;

可查看相关参数属性:Layout属性,这里列举下常用的一些属性:

7.1 设置grid的字段列宽度自动适应

i_layout-colwidth_optimize = 'X'

7.2 设置grid的行颜色变换显示

i_layout-zebra  = 'X'

7.3 设置弹出窗口的标题栏

i_layout-detail_titlebar = '详细内容'

7.4 设置grid的多行选择列,其中box必须为内表的一列,为一个字符长度

1

i_layout-box_fieldname= 'BOX'

7.5 设置grid是否显示行分割线

1

i_layout-no_vline= 'X'

7.6 设置grid的合计行显示在明细的上面

1

i_layout-totals_before_items= 'X'

7.7 设置grid不显示弹出明细显示窗口

1

i_layout-detail_popup= 'X'

7.8 设置grid显示led列, light为内表字段,,一个字符长,,值范围为1-3

1

i_layout-excp_fname= 'light'

7.9 设置grid的没有标题

1

i_layout-no_colhead = 'X'

 

8. IT_FIELDCAT/ IT_FIELDCAT_LVC 参数属性

与 IS_LAYOUT/ IS_LAYOUT_LVC 参数一样,前面文章《ALV简介和Fieldcat与Layout相关参数属性》中已经讲述过该参数的相关属性;

可查看相关参数属性:Fieldcat属性,这里列举下常用的一些属性:

8.1 单列优化宽度

1

wa_fieldcat-col_opt   = 'X'.

 

8.2 单列求和或者取消求和,添加属性

1

2

wa_fieldcat-do_sum    = ‘X’.    " 求和

wa_fieldcat-no_sum    = ‘X’.    " 取消求和

 

如若在IS_LAYOUT属性中加上下列属性,则求和后的行就会在第一行出现

1

i_layout-totals_bef   = 'X'.

 

8.3 对齐方式

1

2

3

wa_fieldcat-just    = 'L' .    " 左对齐

wa_fieldcat-just    = 'C' .    " 居中对齐

wa_fieldcat-just    = 'R' .   " 右对齐

默认情况下,ABAP 的各种数据类型优默认的对其方式:

字符串是默认为左对齐;

货币、数量默认为右对齐;

 

8.4 以图标方式输出

需要作为图标输出,首先要引入图标的信息:Include <list>;

然后在内表中添加显示图标的字段名称;

在 Fieldcat 添加属性的时候,则可以为内表显示图标的字段添加相关图标。

 

示例如下:

01

02

03

04

05

06

07

08

09

10

11

12

13

* 内表字段

i_tab-icon_folder = icon_object_folder.

* FieldCat 属性

lv_pos = lv_pos + 1 .

wa_fieldcat-col_pos    = lv_pos .

wa_fieldcat-fieldname  = 'ICON_FOLDER'.

wa_fieldcat-scrtext_l  = 'ICON' .

wa_fieldcat-icon       = 'X' .       "启用图标

wa_fieldcat-hotspot    = 'X' .

APPEND wa_fieldcat TO i_fieldcat .

CLEAR wa_fieldcat .

这样图标就可以在ALV界面中显示了,其中添加”热点”的目的是为了当用户点击该图标的时候,可以触发一系列的操作,如文件的选择等等;

 

注意:图标的名称用事务码”ICON“进入后,第二列就是图标代码,根据需要进行选择;

 

8.5 单元格的F1、F4帮助

8.5.1 F1帮助

在Fieldcat的RollName属性中,添加指定的数据元素,即可激活F1帮助;如:

1

wa_fieldcat-rollname  = 'PS_PSPID' .  " 指定数据元素

 

8.5.2 F4帮助

在Fieldcat中添加下列属性:

1

2

3

wa_fieldcat-ref_field = 'PSPID'. " 对应DDIC中的参考字段

wa_fieldcat-ref_table = 'PROJ'.  "  对应DDIC中的参考表

这样在ALV的显示界面,在该字段处就可以按F4来查看相关的内容了;

 

8.6 字段类型保留

对于货币或数量字段,需要在其设置字段中再添加一个”指定数据类型”的属性,如下:

1

2

3

4

5

6

* 货币字段

wa_fieldcat-datatype  = 'CURR' .      " 指定数据类型

* 数量字段

wa_fieldcat-datatype  = 'QUAN' .     " 指定数据类型

wa_fieldcat-inttype   = 'C' .      " 数据类型以C类型输出

 

9. IT_EXCLUDING 参数属性

该参数可对ALV标准工具栏隐藏不必要的功能;

对于该参数的应用,需要知道ALV标准按钮对应的 FCode,这里在上面讲过,可以查看 CL_GUI_ALV_GRID 类的属性及其初始值;

示例代码如下:

* 定义隐藏标准按钮的变量

DATA: wa_excluding TYPE slis_t_extab ,

      it_excluding   TYPE slis_extab .



* 将需要隐藏的标准按钮的"FCODE"添加到内表IT_EXCLUDING中

wa_excluding-fcode = '&ABC' .

APPEND wa_excluding TO it_excluding.



CALL FUNCTION  'REUSE_ALV_GRID_DISPLAY_LVC'

  EXPORTING

    i_callback_program = sy-repid

    is_layout_lvc      = i_layout_lvc

    it_fieldcat_lvc    = i_fieldcat_lvc[]

    it_excluding       = it_excluding       " 添加隐藏按钮的属性参数

    i_save             = 'X'

  TABLES

    t_outtab           = i_tab

  EXCEPTIONS

    program_error      = 1

    OTHERS             = 2.

​​​​​​​

 

10. IT_SORT/ IT_SORT_LVC 参数属性

ALV 字段排序设置;

两个参数的类型定义虽然不一样,但结构是一样的,所以操作上并无差异;

下面查看下IT_SORT参数的类型结构定义:

TYPES: BEGIN OF  slis_sortinfo_alv,

         spos      LIKE alvdynp-sortpos,   “ 排序顺序序号

         fieldname TYPE slis_fieldname,    “ 排序内表字段名称

         tabname   TYPE slis_fieldname,    “ 排序内表名称

         up        LIKE alvdynp-sortup,    “ 升序

         down      LIKE alvdynp-sortdown,  “ 降序

         group     LIKE alvdynp-grouplevel,“

         subtot    LIKE alvdynp-subtotals, “ 输出小计

         comp(1)   TYPE c,

         expa(1)   TYPE c,

         obligatory(1) TYPE c,

       ENF OF slis_sortinfo_alv.

 

示例代码如下:

* 定义排序变量

DATA: wa_sort_lvc TYPE lvc_s_sort ,

      it_sort_lvc TYPE lvc_t_sort .



* 设置排序参数

wa_sort_lvc-spos        = 1 .            " 排序顺序

wa_sort_lvc-fieldname   = 'WERKS' .   " 排序字段

wa_sort_lvc-up          = 'X' .          " 升序

APPEND wa_sort_lvc TO it_sort_lvc .

CLEAR wa_sort_lvc .



wa_sort_lvc-spos        = 2 .            " 排序顺序

wa_sort_lvc-fieldname   = ‘matnr’ .   " 排序字段

wa_sort_lvc-up          = 'X' .          " 升序

APPEND wa_sort_lvc TO it_sort_lvc .

CLEAR wa_sort_lvc .



* ALV 中添加排序属性

CALL FUNCTION  'REUSE_ALV_GRID_DISPLAY_LVC'

  EXPORTING

    i_callback_program          = sy-repid           "

    is_layout_lvc               = i_layout_lvc       "

    it_fieldcat_lvc             = i_fieldcat_lvc[]   "

    it_sort_lvc                 = it_sort_lvc

  TABLES

    t_outtab                    = i_tab              "

  EXCEPTIONS

    program_error               = 1

    OTHERS                      = 2.

 

11. I_DEFAULT/ I_SAVE/ IS_VARIANT 参数属性

这三个参数都是用于ALV 布局的保存设置:

01). I_DEFAULT参数用于设置用户是否可以定义默认的布局: ’X' 可以定义默认布局, SPACE 不可以定义默认布局 (默认:X)

02). I_SAVE 参数 保存表格布局: ’X' 只能保存全局变式 ’U' 只能保存特定变式 ’A' 都可以保存 SPACE 不能保存变式 (默认:space)

03). IS_VARIANT 参数用于启用用户表格布局变式

12. IT_EVENTS 参数属性

IT_EVENTS 参数属性,传入一个 SLIS_T_EVENT 类型的内表,设置相应处理FORM;

通过与REUSE_ALV_EVENTS_GET函数配合使用,可自定义ALV事件。

 

首先,查看下SLIS_T_EVENT的类型结构定义,如下所示:

*--- Structure for event handling

TYPES: BEGIN OF  slis_alv_event,

        name(30),

        form(30),

      END OF  slis_alv_event.

TYPES: slis_t_event TYPE slis_alv_event OCCURS 0.

 

再看下 REUSE_ALV_EVENTS_GET 函数,该函数可以获取ALV中现有的事件,其参数也较为简单:

Import 参数:I_LIST_TYPE,类型为SLIS_LIST_TYPE,即为ALV事件的序号,其输入可以为:0,1,2,4

Export 参数:ET_EVENTS,类型为 SLIS_T_EVENT;

 

接下来,查看下示例:

* 全局变量

DATA: gv_index  TYPE sy_tabix.



DATA: gt_events TYPE slis_t_event.      "ALV 事件



*&---------------------------------------------------------------------*

*&      Form  FRM_GET_EVENT

*&---------------------------------------------------------------------*

FORM frm_get_event.



  DATA formname_top_of_page TYPE slis_formname VALUE 'FRM_TOP_OF_PAGE'.

  DATA lw_events            TYPE LINE  OF  slis_t_event.



  CALL FUNCTION  'REUSE_ALV_EVENTS_GET'

    EXPORTING

      i_list_type     = 0

    IMPORTING

      et_events       = gt_events

    EXCEPTIONS

      list_type_wrong = 1

      OTHERS          = 2.

  IF sy-subrc <> 0.

    MESSAGE ID  sy-msgid TYPE sy-msgty NUMBER sy-msgno

           WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

  ENDIF.



* 修改TOP_OF_PAGE以加入表头,设置处理子程序为'FRM_TOP_OF_PAGE'

  CLEAR gv_index.

  CLEAR lw_events.

  READ TABLE  gt_events INTO lw_events WITH KEY

  name = slis_ev_top_of_page.



  IF sy-subrc = 0.



    gv_index = sy-tabix.

    MOVE 'FRM_TOP_OF_PAGE'  TO  lw_events-form.

    MODIFY gt_events FROM lw_events INDEX gv_index.



  ELSE.



    lw_events-form = 'FRM_TOP_OF_PAGE'.

    lw_events-name = slis_ev_top_of_page.

    APPEND lw_events TO gt_events.



  ENDIF.



  lw_events-name = 'CALLER_EXIT'.

  lw_events-form = 'FRM_BUTTON'.

  APPEND lw_events TO gt_events.



ENDFORM.                    " FRM_GET_EVENT





*&---------------------------------------------------------------------*

*&      Form  frm_button

*&---------------------------------------------------------------------*

*       text

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

FORM frm_button USING e_grid TYPE slis_data_caller_exit.





*

ENDFORM.                    "FRM_BUTTON

 

通过IT_EVENTS 参数属性,就可以为ALV添加自定义的事件 CALLER_EXIT;

其事件的相应处理,则放在FORM中。

  • 21
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值