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-ucommp_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-ucommps_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_firstadrp~name_lastINTO (name_first,name_last)FROM adrpINNER JOIN usr21 ON adrp~persnumber = usr21~persnumberWHERE 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_insertEXPORTINGcontents = m_bufferCHANGINGposition = m_p." 输出制表人和制表日期CONCATENATE '<p>出表人:' l_name' ''出表日期:' l_date '</p>'INTO m_buffer .CALL METHOD p_cl_dd->html_insertEXPORTINGcontents = m_bufferCHANGINGposition = m_p.ENDFORM. "frm_html_top_of_page* ALV
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'EXPORTINGi_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' " 是否保存布局TABLESt_outtab = i_tab " 数据内表EXCEPTIONSprogram_error = 1OTHERS = 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 = Actionkey(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 SINGLEadrp~name_firstadrp~name_lastINTO (name_first,name_last)FROM adrpINNER JOIN usr21 ON adrp~persnumber = usr21~persnumberWHERE 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'EXPORTINGit_list_commentary = i_headeri_alv_form = 'X'.ENDFORM. "frm_top_of_page* ALV
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'EXPORTINGi_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' " 是否保存布局TABLESt_outtab = i_tab " 数据内表EXCEPTIONSprogram_error = 1OTHERS = 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'EXPORTINGit_list_commentary = i_headeri_logo = 'ZJX_LOGO' “ OAER 中的Object Keyi_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'EXPORTINGi_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_titleis_layout_lvc = i_layout_lvc " 属性内表it_fieldcat_lvc = i_fieldcat_lvc[] " 列明内表i_save = 'X' " 是否保存布局TABLESt_outtab = i_tab " 数据内表EXCEPTIONSprogram_error = 1OTHERS = 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'EXPORTINGi_callback_program = sy-repidis_layout_lvc = i_layout_lvcit_fieldcat_lvc = i_fieldcat_lvc[]i_grid_settings = i_grid_settingsi_save = 'X'TABLESt_outtab = i_tabEXCEPTIONSprogram_error = 1OTHERS = 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'EXPORTINGi_callback_program = sy-repidis_layout_lvc = i_layout_lvcit_fieldcat_lvc = i_fieldcat_lvc[]it_excluding = it_excluding " 添加隐藏按钮的属性参数i_save = 'X'TABLESt_outtab = i_tabEXCEPTIONSprogram_error = 1OTHERS = 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'EXPORTINGi_callback_program = sy-repid "is_layout_lvc = i_layout_lvc "it_fieldcat_lvc = i_fieldcat_lvc[] "it_sort_lvc = it_sort_lvcTABLESt_outtab = i_tab "EXCEPTIONSprogram_error = 1OTHERS = 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 handlingTYPES: 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'EXPORTINGi_list_type = 0IMPORTINGet_events = gt_eventsEXCEPTIONSlist_type_wrong = 1OTHERS = 2.IF sy-subrc <> 0.MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgnoWITH 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 KEYname = 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中。