ALV概览
ALV全称SAP List View,是SAP提供的一个强大的数据报表显示工具。ALV实质上是一个屏幕控件对象,它通过程序传递数据内表的方式来显示数据。
实现方式:调用标准函数;优化接口:用户可以实现对字段的排序、筛选及统计等功能。
显示方式:List 类似于write语句输出的表单形式;Grid 每个输出字段提供按钮,用户可以自行设定,操作更为灵活。如下示例:左边是LIST, 右边是GRID。
基本概念
类型池: SLIS 是个特殊类型的程序,包含了各种TYPES生成的结构体、表类型等,因为某种原因涉及的关联性比较强所以放在一个类型池里面,比如统一使用在函数组里面或统一用在某个功能组里面。
下面是它主要的属性参数 Fieldcat TYPE slis t fieldcat alv
- 列格式设置(表单)
- 字段名称,列是否可修改,列宽度等
Layout TYPE slis layout alv
- 全局格式设置 (结构)
- 整表字段是否可修改,是否以斑马纹输出,是否显示选择按钮字段等
通过函数传值 函数: REUSE ALV FIELDCATALOG MERGE
- 根据内表结构返回FIELDCAT字段结构信息
函数: REUSE ALV GRID DISPLAY/REUSE ALV LIST DISPLAY
- 使用GRID/LIST模式输出ALV报表
开发ALV的基本流程
1、声明变量
定义ALV所要用到的类型池:TYPE-POOLS: SLIS
针对ALV的控制信息数据(Layout & Fieldcat)FIELDCAT 是一张内表,记录的的是ALV输出时每列的属性信息。Layout 是一个结构,存储整个表单的全局设置。可以混合使用,FIELDCAT里面的属性优先。下面是fieldcat常用的参数说明。
字段 | 说明 |
KEY | 将该列设置为关键字 (“X”/“”) |
ICON | 以图标显示(“X”/“”) |
CHECKROK | 以复选框显示(“X”/“”) |
JUST | 定义对齐方式(“R”“L”“C”) |
LZERO | 增加前导等(“X”/“”) |
NO_SIGN | 不显示符号 (“X”/“”) |
NO_ZERO | 不显示前导零 (“X”/“”) |
COL_POS | 作为第几列输出(数字) |
DO_SUM | 对宇段讲行汇总(“X”/“”) |
SELTEXT_L/M/S | 字段名称描述长/中/短(字符串) |
HOTSPOT | 设置为热点(显示为有下划线) (“X”/“”) |
声明的基本代码如下:
TYPE-POOLS: slis.
DATA: fieldcat TYPE slis_t_fieldcat_alv, “字段清单内表
fieldcat_ln LIKE LINE OF fieldcat,
layout TYPE slis_layout_alv, “ALV格式
sortcat TYPE slis_t_sortinfo_alv, “ALV排序字段清单内表
sortcat_ln LIKE LINE OF sortcat,
eventcat TYPE slis_t_event, “ALV事件
eventcat_ln LIKE LINE OF eventcat.
DATA: col_pos TYPE i.
2、定义内表
存放自定义数据文件的数据,以及在ALV中显示。
DATA: BEGIN OF ivbap OCCURS 0,
vbeln LIKE vbap-vbeln,
matnr LIKE vbap-matnr,
matkl LIKE vbap-matkl,
END OF ivbap.
3、读取数据
SELECT vbeln posnr matnr matkl kwmeng vrkme
INTO CORRESPONDING FIELDS OF TABLE ivbap
FROM vbap
WHERE vbeln NE space.
4、ALV格式控制
字段目录是用来控制ALV显示的网格中每个字段的属性的,比如字段的对齐方式、可编辑状态、颜色等等。
layout-zebra = 'X'. ”呈现颜色交替
layout-detail_popup = 'X'. "是否弹出详细信息窗口
layout-f2code = '&ETA'. "设置触发弹出详细信息窗口的功能码,这里是双击
layout-no_vline = 'X'. "这个用来设置列间隔线
layout-colwidth_optimize = 'X'. "优化列宽选项是否设置
layout-detail_initial_lines = 'X'.
layout-detail_titlebar = '详细内容'."设置弹出窗口的标题栏
fieldcat_ln-ref_tabname = 'VBAP'.
fieldcat_ln-fieldname = 'VBELN'.
fieldcat_ln-key = 'X'.
fieldcat_ln-do_sum = space.
fieldcat_ln-col_pos = col_pos.
fieldcat_ln-no_out = space.
fieldcat_ln-qfieldname = ''.
fieldcat_ln-hotspot = 'X'.
5、定义事件
建立事件清单(Event Catalogs) 并需定义事件块,否则出错,并且函数ALV调用事件要在最后。因为事件块的执行是按照顺序的。在调用函数生成ALV过程中,可以进行用户操作使用回调函数(CALLBACK)的形式实现交互。事件块: FORM PAGE_HEADER. ENDFORM.
字段 | 说明 |
I_CALLBACK_PROGRAM | 调用ALV函数返回的程序 |
I_CALLBACK PF STATUS GET | 设置ALV程序内的按钮 |
I_CALLBACK USER COMMAND | 设置按钮功能,传输FORM名称 |
I_CALLBACK TOP_OF_PAGE | 表头 |
I_CALLBACK HTML TOP OF PAGE | 动态表头 |
IT EXCLUDING | 隐藏ALV基本按钮 |
IT EVENTS | 定义ALV事件 |
6、调用ALV
点击模式,调用函数会带出来所有的参数,这里需要用到那个放开那个就好。
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
I_CALLBACK_PROGRAM = SY-CPROG
I_CALLBACK_PF_STATUS_SET = 'SET_STATUS '
I_CALLBACK_USER_COMMAND = 'FM_USER_COMMAND '
I_GRID_TITLE = 'GRID标题'
IS_LAYOUT = GS_LAYOUT
IT_FIELDCAT = GT_FIELDCAT
IT_SORT = GT_SORT
IT_FILTER = GT_FILTER
* I_DEFAULT = 'X'
IT_EVENTS = GT_EVENTS
TABLES
t_outtab = GT_STUDENT
EXCEPTIONS
PROGRAM_ERROR = 1
OTHERS = 2
.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
7、用户事件
*USER-COMMAND子例程
FORM USER_COMMAND USING R_UCOMM LIKE SY-UCOMM
RS_SELFIELD TYPE SLIS_SELFIELD .
CASE R_UCOMM .
WHEN 'CALLSF' .
"PERFORM CALL_SMARTFORMS .
WHEN 'DOWNLOAD '.
ENDCASE .
ENDFORM .
注意事项
1、在ALV中,需要注意所有需要显示的列,都必须在相应的内表中有对应的字段,字段名字不能写错。
2、在SAP ABAP程序中,字符串的大小写很重要,在单引号包围的字符串中,一般来说都应该用大写,特别是在调用一些系统的方法时传入字符串参数时。
3、传入到ALV中的列对应的字段名称也必须使用大写字母,否则数据不会显示出来。
4、使用宏定义或者子例程可以减少代码量,并且尽可能实现代码的复用。
5、注意在FORM里定义的变量在离开FORM后,就会被系统释放掉,回收内存空间。