01 ALV报表功能介绍
02 ALV报表开发步骤
03 ALV报表开发实战
01 ALV报表功能介绍
AVL报表是ABAP最重要的报表工具其英文全称Abap list viewer
其输入结果以行和列展示,集成的功能有排序,求和,过滤,列求和,隐藏等;
输出的格式也有EXCEL,水晶报表,CSV文件等;
然后展现的方式有简单list,连续等级list,树等.
系统ALV报表的样例
ALV报表开发步骤
基本流程:
• 第一步:声明变量定义alv所要用到的类型池:针对ALV的控制信息数据
• 第二步: 定义内表存放自定义数据文件的数据,以及在ALV中显示
• 第三步:读取数据读取数据存放至内表(internal table)
• 第四步:ALV格式控制建立AVL显示样式(layout)和显示字段清单(Field Catalogs) :具体就是整个字体的显示和每个列的显示。
• 第五步: 定义事件(Reuse_alv_events_get)建立事件清单(Event Catalogs)
• 第六步:显示ALV调用Alv Function Module
• 第七步:用户事件;定义user按键处理事件。
ALV报表开发实战
业务背景:
某SAP培训学院为督促与管理学员的正常上课,现要求每位上课学员,通过SAP系统-学员签到平台进行打卡。 实现学员线上打卡,老师线上统计打卡情况;以备管理使用。
功能分析:
1)为实现学员打卡,需要开发一套打卡功能。
2)实现老师线上统计打卡程序,需要开发一查询统计报表。
实现步骤:
准备工作:
1.SE11 创建要用到的数据库表( “ZHY01_XYXX”学员信息表和“ZHY01_XYKQ”学员考勤表)
(创建表步骤:https://www.jianshu.com/p/c1d111f2969b)
2.SE38 创建程序
输入【标题】和【类型】,点击【保存】
保存在自己创建的包和请求号下
然后就进入到了自己的开发程序界面。
3.SE38程序开发规约一——注释的添加
*&---------------------------------------------------------------------*
*& Report ZHY01_HY101_20220624_01
*&---------------------------------------------------------------------*
*& Program Name <程序名称>: ZHY01_HY101_20220624_01
*& Purpose <程序用途>: 学习ALV报表
*& Project Name <项目名称>: SAP_ABAP_学习
*& Created by <创 建 人>: 鼠小倩
*& Created on <创建日期>: 20220624
*& FC Consultant <功能顾问>: 鼠小倩
*& Description <功能描述>: 学员考勤查询报表
*&---------------------------------------------------------------------*
* Modification Log<程序修改日志>
*<日期> <开发者> <功能顾问> <修改描述>
* 20220624 鼠小倩 鼠小倩 S4HK909677
*&---------------------------------------------------------------------*
4.SE38程序开发规约二——程序的框架(函数组)
(一个完整的程序,最少包含五个include文件,即把一部分程序放在具有相同意义的地方,include文件相当于代码的集合)
代码如下
REPORT ZHY01_HY101_20220624_01.
*&-----------------------------------------------------------------*
* DESC: INCLUDES 文件-变量定义
*&-----------------------------------------------------------------*
INCLUDE ZHY01_HY101_20220624_01_TOP.
**&-----------------------------------------------------------------*
** DESC: INCLUDES ALV相关定义
**&-----------------------------------------------------------------*
INCLUDE ZHY01_HY101_20220624_01_ALV.
*&-----------------------------------------------------------------*
* DESC: INCLUDES 文件-选择界面
*&-----------------------------------------------------------------*
INCLUDE ZHY01_HY101_20220624_01_SCREEN.
*&-----------------------------------------------------------------*
* DESC: INCLUDES 文件-子程序
*&-----------------------------------------------------------------*
INCLUDE ZHY01_HY101_20220624_01_FORM.
*&-----------------------------------------------------------------*
* DESC: INCLUDES 文件-主程序
*&-----------------------------------------------------------------*
INCLUDE ZHY01_HY101_20220624_01_MAIN.
双击创建各include程序,搭建程序框架
如下:
自动显示“include”标题和类型,可修改
点击保存,创建成功
同理,创建其他include程序。
报表“ZHY01_HY101_20220624_01”创建完后,点击保存,激活
总结:
SE38程序开发步骤——01定义选择界面
INCLUDES 程序文件-选择界面“INCLUDE ZHY01_HY101_20220624_01_SCREEN.”
1.代码示例
*&---------------------------------------------------------------------*
*& 包含 ZHY01_HY101_20220624_01_SCREEN
*&---------------------------------------------------------------------*
TABLES: ZHY01_XYXX,
zhy01_xykq.
*&---------------------------------------------------------------------*
*& DESC: 定义初始屏幕
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK sb01 WITH FRAME TITLE text-001."定义sb01块,抬头text文本
PARAMETERS: p_zxh LIKE zhy01_xyxx-zxh. "单值选择,引入数据库表zhy01_xyxx 字段 学号
SELECT-OPTIONS: s_zkqrq FOR zhy01_xykq-zrq."范围选择,引入数据库表zhy01_xykq 字段考勤日期
SELECTION-SCREEN END OF BLOCK sb01.
PARAMETERS: p_zhy RADIOBUTTON GROUP gp01, "单选框
p_zqt RADIOBUTTON GROUP gp01.
PARAMETERS: p_zzs AS CHECKBOX, "复选框
p_zjf AS CHECKBOX.
2.text文本描述修改
输入文本符号
输入【选择文本】
3.效果展示
总结:
SE38程序开发步骤——02 数据获取
(下面介绍)
SE38程序开发步骤——03 报表显示
INCLUDES 程序文件-主程序 “INCLUDE ZHY01_HY101_20220624_01_MAIN.”
通过事件触发,调用报表的数据,一般有
- 初始化:START-OF-SELECTION
- 选择事件:AT SELECTION-SCREEN
- 事件:AT SELECTION-SCREEN OUTPUT
1.测试事件
(1)测试事件“START-OF-SELECTION”
*&---------------------------------------------------------------------*
*& 包含 ZHY01_HY101_20220624_01_MAIN
*&---------------------------------------------------------------------*
START-OF-SELECTION.
MESSAGE '测试' TYPE 'I'.
测试结果
(2)测试事件“AT SELECTION-SCREEN”和“START-OF-SELECTION”触发状态
*&---------------------------------------------------------------------*
*& 包含 ZHY01_HY101_20220624_01_MAIN
*&---------------------------------------------------------------------*
AT SELECTION-SCREEN.
MESSAGE '测试:AT SELECTION-SCREEN' TYPE 'I'.
START-OF-SELECTION.
MESSAGE '测试' TYPE 'I'.
点击回车触发“AT SELECTION-SCREEN”
点击执行,先触发“AT SELECTION-SCREEN”,后触发“START-OF-SELECTION”
2.显示ALV报表
- 获取数据
- 处理数据
- 显示数据
首先定义局部变量
INCLUDES 程序文件-变量定义“INCLUDE ZHY01_HY101_20220624_01_TOP.”
- 定义结构
- 定义内表
*&---------------------------------------------------------------------*
*& 包含 ZHY01_HY101_20220624_01_TOP
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& DESC:结构
*&---------------------------------------------------------------------*
DATA: BEGIN OF gs_item, "定义结构
sel(1), "定义单值,选择条件被选中
zxm LIKE zhy01_xyxx-zxm, "学员姓名
zqdqj(4). "签到期间
INCLUDE STRUCTURE zhy01_xykq.
DATA END OF gs_item.
*&---------------------------------------------------------------------*
*& DESC:内表
*&---------------------------------------------------------------------*
DATA: gt_item LIKE TABLE OF gs_item.
获取数据
(1)“main”文件代码
**获取数据
PERFORM frm_get_data.
(2)创建对象“ frm_get_data ”
(3)放入“form”文件中
(4)保存,然后返回
处理数据
“main”文件代码
**处理数据
PERFORM frm_edit_data.
同理,创建对象“frm_edit_data”,放入“from”文件中;保存
显示数据
“main”文件中利用if条件判断语句
IF gt_item[] IS NOT INITIAL.
PERFORM frm_show_data.
ELSE.
MESSAGE '无学员考勤记录' TYPE 'I'.
ENDIF.
同理,创建对象“frm_show_data”,放入“from”文件中;保存
(1)“main”程序执行,查看效果( 直接运行)
内表为空,输出“无学员考勤记录”.
(2)“main”程序执行,查看效果(在“form”文件处理数据——进行赋虚假的值: 插入假数据 '功能正在开发中')
FORM frm_edit_data .
gs_item-zxh = 'HY101'.
gs_item-zxm = '鼠小倩'.
APPEND gs_item TO gt_item.
ENDFORM.
FORM frm_show_data .
MESSAGE '功能正在开发中' TYPE 'I'.
ENDFORM.
结果展示
(3)“main”程序执行,查看效果(在“form”文件处理数据——显示数据:调用function函数)
FORM frm_show_data .
** 调用function显示ALV
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING "传入参数
i_callback_program = sy-repid "当前程序名
i_default = ''
*
TABLES
t_outtab = gt_item[].
IF sy-subrc<>0."abap语句返回码
MESSAGE id sy-msgid
type sy-msgty "消息类型
NUMBER sy-msgno "消息编号
WITH sy-msgv1
sy-msgv2
sy-msgv3
sy-msgv4.
ENDIF.
endform.
执行显示“没有可用字段”
接下来填入列的显示字段,子例程“frm_show_data”下,子例程“frm_show_data”下
创建新的子例程 “frm_alv_set_fields”,放入“form”程序文件中
在“ALV”程序文件中定义变量
*&---------------------------------------------------------------------*
*& 包含 ZHY01_HY101_20220624_01_ALV
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& DESC: ALV定义变量
*&---------------------------------------------------------------------*
TYPE-POOLS:
ABAP,
OLE2,
SLIS.
DATA: GS_LAYOUT TYPE LVC_S_LAYO, "SLIS_LAYOUT_ALV
GS_FCAT TYPE LVC_S_FCAT,
GT_FCAT LIKE TABLE OF GS_FCAT.
在“form”程序文件中写入
在“form”程序文件中填写信息
FORM frm_alv_set_fields .
***定义表中添加的内容
DATA: lv_index LIKE sy-index.
CLEAR: gs_fcat,
gt_fcat,
gs_layout.
**ALV全局设置
gs_layout-cwidth_opt = 'X'.
gs_layout-box_fname = 'SEL'.
**ALV字段处理宏
DEFINE catalog.
CLEAR gs_fcat.
lv_index = lv_index + 1.
gs_fcat-col_pos = lv_index.
gs_fcat-fieldname = &1.
gs_fcat-fix_column = &2. "固定列
gs_fcat-ref_table = &3.
gs_fcat-edit = &4.
gs_fcat-colddictxt = 'L'.
gs_fcat-scrtext_l = &5.
gs_fcat-ref_field = &6.
gs_fcat-outputlen = &7.
gs_fcat-emphasize = &8. "列颜色
gs_fcat-hotspot = &9. "热点
APPEND gs_fcat TO gt_fcat.
END-OF-DEFINITION.
** &1 &2 &3 &4 &5 &6 &7 &8 &9
catalog 'ZBJ' 'X' '' '' '班级' '' '' '' ''.
catalog 'ZXH' 'X' 'ZTKT_XYXX' '' '学号' 'ZXH' '' 'C510' 'X'.
catalog:'ZXM' 'X' '' '' '姓名' '' '' '' '',
'ZRQ' '' 'BKPF' 'X' '考勤日期' 'BUDAT' '' '' '',
'ZKQSJ' '' '' 'X' '签到时间' '' '' '' '',
'ZKQCS' '' '' '' '考勤次数' '' '' '' ''.
ENDFORM.
保存并进行激活
点击执行,结果展示
一个基本路径展示的ALV创建成功(这里还没有使用选择屏幕)
总结: