REUSE_ALV_GRID_DISPLAY_LVC函数输入参数属性的应用

前面我们讲过,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:
alv_gui_status

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

 

下图是SAP标准文档中的说明:
alv_i_callback_html_top_of_page_doc

 

示例如下:

*&---------------------------------------------------------------------*
*&      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 = '

ALV DEMO

' . CALL METHOD p_cl_dd->html_insert EXPORTING contents = m_buffer CHANGING position = m_p. " 输出制表人和制表日期 CONCATENATE '

出表人:' l_name '     ' '出表日期:' l_date '

' 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.

效果如图所示:

alv_i_callback_html_top_of_page_demo

 

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.

效果如图所示:

alv_i_callback_top_of_page_demo

 

4.2 上传图片

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

02).输入值:

ClassName 输入:”PICTURES”;

Class Type 输入: “OT”

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

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

alv_upload_files_oaer

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

alv_upload_files_oaer_create

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'.

效果如图所示:
alv_reuse_alv_commentary_write_logo_demo

 

关于图片上传的内容,可以查看以下内容:

* Notes:

* 1) Logos & wallpapers can be found in table BDS_CONN05

* 2) Transaction OAER can be used to create PICTURES.

* Run transaction OAER with class Class type = OT,

* and Object key with whatever name you want to create. In the

* next screen, right clicking on screen and import

 

Steps for uploading Logo :-:

1.  Goto the transaction OAER

2.  Enter the class name as ‘PICTURES’

3.  Enter the class type as ‘OT’

4.  Enter the object key as the name of the logo you wish to give

5.  Execute

6.  Then in the new screen select Standard doc. types in bottom window

Click on the Screen icon

Now, it will ask for the file path where you have to upload the logo

7.  Now you can use this logo in REUSE_ALV_COMMENTARY_WRITE

or

Import Logo and Background Picture for Reporting

In this step, you can import a customer-specific logo and a background picture into the R/3 System.

These will be displayed in the header area of reports in HR Funds and Position Management.

From the SPRO:

HR Funds and Position Management –> Dialog Control –> Customize Reporting Interface –> Import Logo and Background Picture for Reporting.

Activities

1. Enter the Name of your logo/background picture as an object key in the initial screen.

2. Make sure that the class name is PICTURES, and the class type is OT.

3. Choose Execute.

4. Double-click the document type Picture on the Create tab page.

A dialog box will appear in which you can enter the path in which the logo/background picture can be found.

5. Enter the path and choose Open.  The logo will be uploaded into the current R/3 System.

If the logo/background picture is to be transported into other systems as well, choose Transport.

6. Return to the initial screen and repeat the procedure after having entered the Name of your background picture as an object key.

Please note that the logo/background picture can only be displayed in ALV-based reports with an HTML header.

Manually programmed reports such as business distribution plans are not based on the ALV.

If you have selected several initial objects, ALV-based reports in HR Funds and Position Management will automatically use a hiearchical-sequential display.

A logo is not displayed here either. Note also that the logo cannot be printed (see print preview in program).

Make sure that the logo does not exceed a height of 100 pixels because it would mean that the header of the report will be scrollable.

 

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.

效果如图所示:
alv_grid_title_demo

 

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必须为内表的一列,为一个字符长度

i_layout-box_fieldname= 'BOX'

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

i_layout-no_vline= 'X'

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

i_layout-totals_before_items= 'X'

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

i_layout-detail_popup= 'X'

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

i_layout-excp_fname= 'light'

7.9 设置grid的没有标题

i_layout-no_colhead = 'X'

 

8. IT_FIELDCAT/ IT_FIELDCAT_LVC 参数属性

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

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

8.1 单列优化宽度

wa_fieldcat-col_opt   = 'X'.

 

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

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

 

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

i_layout-totals_bef   = 'X'.

 

8.3 对齐方式

wa_fieldcat-just    = 'L' .   " 左对齐
wa_fieldcat-just    = 'C' .   " 居中对齐
wa_fieldcat-just    = 'R' .   " 右对齐

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

字符串是默认为左对齐;

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

 

8.4 以图标方式输出

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

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

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

 

示例如下:

* 内表字段
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帮助;如:

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

 

8.5.2 F4帮助

在Fieldcat中添加下列属性:

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

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

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

 

8.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 参数用于启用用户表格布局变式

alv_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中。

关于 “REUSE_ALV_GRID_DISPLAY_LVC函数输入参数属性的应用” 的评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>