目录
一、基本概念
1、ALV概览
ALV:SAP List View,是SAP提供的一个强大的数据报表显示工具
ALV实际上是一个屏幕控件对象,它通过程序传递内表的方式来显示数据
实现方式:调用标准函数、优化接口
显示方式:List--类似于write语句输出的表单形式
Grid:每个输出字段提供按钮,用户可以自行设定,操作更为灵活
2、基本概念
类型池:SLIS,特殊类型程序,包含各种TPYES语句
1)Fieldcat TYPE slis_t_fieldcat_alv
列格式设置(表单)
字段名称,列是否可修改,列宽度等
FIELDCAT规定的每一行属性代表数据库表中每一列的基本属性,FIELDCAT--内表
2)Layout TYPE slis_layout_alv
全局格式设置--结构
整表字段是否可修改,是否以斑马纹输出,是否显示选择按钮字段等,只有一个属性
3)函数:RESUE_ALV_FIELDCATALOG_MERGE
根据内表结构返回FIELDCAT字段结构信息,自动创建
4)函数:RESUE_ALV_GRID_DISPLAY/REUSE_ALV_LIST_DISPLAY
使用GRID/LIST模式输出ALV报表
5)FIELDCAT参数
6)layout
二、属性更改
1、FIELDCAT
在end-of-selection中创建build_alv,调用"RESUE_ALV_GRID_DISPLAY"函数
传入参数IT_FILTER每个字段相关的属性设置,是个表类型,先给这个参数传一个内表
TYPE-POOLS SLIS."参照类型池
DATA GT_STUDENT TYPE TABLE OF ZSTUDENT_G_01.
DATA GS_STUDENT TYPE ZSTUDENT_G_01.
*FUNCTION ALV
*对ITFIELDCAT进行传参,就参照其类型创建内表
DATA GT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV."内表 列属性
DATA GS_FIELDCAT TYPE SLIS_FIELDCAT_ALV.
给内表GT_FIELDCAT增加数据,那么就要先查看IT_FILTER包含哪些数据,双击SLIS_T_FIELDCAT_ALV查看,例如:
"FIELDCAT一行的属性相当于表单的一列的属性
FORM BUILD_FIELDCAT .
CLEAR GS_FIELDCAT.
GS_FIELDCAT-COL_POS = '1'."第几段输出
GS_FIELDCAT-FIELDNAME = 'ZCODE'."字段名是什么
GS_FIELDCAT-OUTPUTLEN = '10'."输出长度
GS_FIELDCAT-SELTEXT_M = '学生编号'."描述文本
APPEND GS_FIELDCAT TO GT_FIELDCAT.
ENDFORM.
但是,后期数据维护很可能会增加很多列,将这些数据进行封装,采取宏相关的封装
2、宏
如果涉及的属性过多,就不适合用宏调用,可以使用PERFORM调用
*宏 一个宏最多可以定义9个参数
DEFINE %%APPEND_FIELDCAT.
CLEAR GS_FIELDCAT.
GS_FIELDCAT-COL_POS = &1.
GS_FIELDCAT-FIELDNAME = &2."字段名是什么
GS_FIELDCAT-OUTPUTLEN = &3."输出长度
GS_FIELDCAT-SELTEXT_M = &4."描述文本
APPEND GS_FIELDCAT TO GT_FIELDCAT.
END-OF-DEFINITION.
传值
"FIELDCAT一行的属性相当于表单的一列的属性
FORM BUILD_FIELDCAT .
%%APPEND_FIELDCAT: '1' 'ZCODE' '10' '学生编号',
'2' 'ZNAME' '20' '学生姓名',
'3' 'SEX' '3' '性别',
'4' 'ZSCHOOL' '10' '学校',
'5' 'WEIGH' '15' '体重',
'6' 'UNIT' '3' '单位'.
ENDFORM.
给内表添加数据,执行查看显示效果
添加属性:
3、LAYOUT
LAYOUT与FIELDCAT不同,它是一个结构。首先给引用的函数中的IS_LAYOUT传值,定义一个GS_LAYOUT
根据函数中IS_LAYOUT定义的参照类型,给GS_LAYOUT定义
使用字段对全局属性进行设置
FORM BUILD_LAYOUT .
GS_LAYOUT-COLWIDTH_OPTIMIZE = 'X'."优化列宽
GS_LAYOUT-ZEBRA = 'X'."斑马纹
ENDFORM.
4、升序降序SORT
DATA GT_SORT TYPE SLIS_T_SORTINFO_ALV."排序
DATA GS_SORT TYPE SLIS_SORTINFO_ALV.
先按照学校的升序,在在此基础上按照性别降序
FORM BUILD_SORT .
*按照学校升序
CLEAR GS_SORT.
GS_SORT-SPOS = '1'.
GS_SORT-FIELDNAME = 'ZSCHOOL'.
APPEND GS_SORT TO GT_SORT.
*按照学校降序
CLEAR GS_SORT.
GS_SORT-SPOS = '2'.
GS_SORT-FIELDNAME = 'SEX'.
APPEND GS_SORT TO GT_SORT.
ENDFORM.
先将体重合计后,在按学校升序小计
*按照学校升序
CLEAR GS_SORT.
GS_SORT-SPOS = '1'.
GS_SORT-FIELDNAME = 'ZSCHOOL'.
GS_SORT-UP = 'X'."先将学校升序排列,在小计
GS_SORT-SUBTOT = 'X'.
APPEND GS_SORT TO GT_SORT.
5、FILTER
删选的功能,首先在函数中找到传入的相关参数,即IT_FILTER,找到对应的函数部分,对其传值,那么就需要创建一个与其结构相同的类型传值,参照IT_FILTER的参考类型(判断是结构还是内表), 来创建内表与结构体,并看其(IT_FILTER的参考类型)有哪些字段,以及功能
进行FILTER时,需要选择一个字段进行筛选,那么就要定义一个字段名 -->选择FILTER按钮,类型为选择界面,那么就要插入一个类似于select-option的限制(四个字段,SIGN、OPTION、LOW、HIGH)--->FILTER的参数有哪些是类似的 -->创建一个BUILD_FILTER-->插入数据
FORM BUILD_FILTER .
CLEAR GS_FILTER.
GS_FILTER-FIELDNAME = 'SEX'.
GS_FILTER-SIGN0 = 'I'.
GS_FILTER-OPTIO = 'EQ'.
GS_FILTER-VALUF = ''.
APPEND GS_FILTER TO GT_FILTER.
ENDFORM.
6、I_SAVE
7、I_VARIANT 格式参数
三、交互
1、实现自己的按钮
为ALV定义自己的按钮,效果如下:
首先查看函数中用于交互的参数,并根据其关联类型,查看其定义的字段有哪些
可以看到,有两个字段,那么就定义一个类似的结构体与内表,给这两个字段传值
给这两个字段赋值。因为通过函数声明的控件自定义的按钮需要与ALV相关联,就需要使用set。。语句,放在一个子程序中,将子程序又赋给GS_EVENTS-FORM
FORM BUILD_EVENTS .
CLEAR GS_EVENTS.
GS_EVENTS-NAME = 'PF_STATUS_SET'.
GS_EVENTS-FORM = 'SET_STATUS'."子程序
APPEND GS_EVENTS TO GT_EVENTS.
ENDFORM.
*通过函数声明的控件 自定义的按钮需要与ALV相关联,就需要使用set。。语句,放在一个子程序中
*将子程序又赋给GS_EVENTS-FORM
FORM SET_STATUS USING RT_EXTAB TYPE SLIS_T_EXTAB.
SET PF-STATUS 'STATUS' EXCLUDING RT_EXTAB. "设定自己的按钮
ENDFORM.
并在函数调用中解开IT_EVENTS的注释,同时回调自己的程序,如下图所示,即可实现最终效果
但上述的调用会覆盖掉系统默认的按钮
增加自定义的按钮而不覆盖原来的按钮,有两种方法:
1)参照标准按钮程序
程序右键创建GUI STATUS,附加-调整模板-列表查看器,引用标准按钮,即可调回标准按钮
在标准按钮的状态下,增加自定义的按钮
实现增加自己的按钮
2)参照其他的程序
先不引入自己创建的按钮,然后查看系统-状态-查看当前系统使用的按钮
复制完成后,可以看到复制过来的按钮,也可以点进去修改,新增自己定义的按钮
2、实现自定义按钮的功能
也可以不给IT_EVENTS传值,直接将子程序的名称赋值给函数中的字段
2、设置单击/双击功能
单击--前提是HOTSPOT设置,第一种在FIELDCAT设置,针对字段,将该字段的HOTSPOT给上X即可,第二种对于关键字的设置可以在LAYOUT设置KEY-HOTSPOT
双击-没有设置热点也可以触发对应的按钮功能
针对已经设置过的热点,如何完成单击的功能--USER_COMMAND
功能:当单击ZCODE,跳转到详细页面,例如查看供应商
双击时,显示学校信息:
WHEN OTHERS."双击
*当前行的学校信息
READ TABLE GT_STUDENT INTO GS_STUDENT INDEX RS_SELFIELD-TABINDEX.
PERFORM DISPLAY_ALV_SCHOOL USING GS_STUDENT-ZSCHOOL.