第24课:综合实战 —— SFLIGHT 航班管理系统(收官)¶
45分钟 | 阶段:现代开发篇 | 毕业设计
前置依赖¶
- 前 23 课全部内容——它们都是这次的积木。
问题引入¶
23 个知识点散落在 23 个 Demo 里。最后一步:把它们组装成一台完整的机器——选择屏幕进、CDS 取数、OO ALV 展示、双击预订(BAPI)、消息反馈、一键导出(Excel/CSV)、TR 打包、abapGit 发布。这趟走完,你就拥有了"接一个真实需求,从零交付到上线"的全流程体感——这也是课程的毕业礼。
对象状态
本课的主程序 zac_flight_manager(含 5 个 INCLUDE + Screen 100)尚未随 abapGit 入库(见第0课矩阵),但完整参考源码已随仓库提供:capstone-source/zac_flight_manager/ 内含全部可粘贴级 .abap 源码与 Screen 100 元素清单,在系统里建好激活后 abapGit pull 即完成入库。数据层的 zac_flight_detail / zac_flight_stats、业务层的 zcl_ac_flight_service、消息类 zac_flight_msg 都已在库——搭积木的材料先到了一大半。
时间安排¶
| 时段 | 内容 | 时长 |
|---|---|---|
| 场景引入 | 从"知识点"到"产品"的思维转换 | 3 分钟 |
| Demo 演示 | 系统功能全貌走一遍 | 5 分钟 |
| 设计走读 | 架构 / Include 拆分 / 核心类 / 数据流 | 28 分钟 |
| 课程总结 | 24 课知识地图 + 后续路线 | 6 分钟 |
| 课后思考 | 毕业设计题 | 3 分钟 |
本课目标¶
完成本课你将能够:
- 用 Include 结构组织一个正式的 ABAP 应用;
- 按 MVC 思想分配职责:CDS(Model 数据)→ OO ALV(View 展示)→ 应用类(Controller 编排);
- 复用前 23 课的资产(CDS 视图、服务类、消息类)组装完整功能;
- 走完"开发 → 传输(TR)→ 发布(abapGit)"的端到端流程。
系统设计¶
1. 目标功能¶
flowchart LR
A["选择屏幕<br/>公司/日期区间(第7课)"] --> B["CDS 取数<br/>zac_flight_detail(第20课)"]
B --> C["上座率/状态计算<br/>COND(第19课)"]
C --> D["OO ALV 展示<br/>Custom Container(第22课)"]
D -->|"双击行"| E["BAPI 创建预订<br/>zcl_ac_flight_service(第14课)"]
E --> F["消息反馈<br/>zac_flight_msg(第18课)"]
D -->|"工具栏导出"| G["CSV 导出(第12课)"]
H["交付:TR 传输(第17课)<br/>+ abapGit 推送(第23课)"]
2. 对象清单(对照第0课矩阵)¶
ZAC_FLIGHT_MANAGER(主程序,参考源码见 capstone-source/,abapGit 对象待入库)
├── ZAC_FLIGHT_TOP → 全局声明:TABLES/类型/对象引用
├── ZAC_FLIGHT_SEL → 选择屏幕(PARAMETERS/SELECT-OPTIONS + 校验)
├── ZAC_FLIGHT_PBO → Screen 100 PBO:容器/Grid 初始化
├── ZAC_FLIGHT_PAI → Screen 100 PAI:OK_CODE 分发
├── ZAC_FLIGHT_FORMS → 编排:取数/展示/预订/导出
├── zac_flight_detail → CDS 航班详情(✅已入库)
├── zac_flight_stats → CDS 航班统计(✅已入库)
├── zcl_ac_flight_service → 业务服务类:BAPI 封装(✅已入库)
└── zac_flight_msg → 消息类(✅已入库)
复用清单就是成绩单:待写的只有展示层和编排层——数据层、业务层、消息层前 23 课已经备好。
3. 核心代码走读¶
以下代码块是设计走读用的精简版;完整可运行源码(含视图类
lcl_alv_display与 Screen 100 配置清单)在仓库capstone-source/zac_flight_manager/——边读课文边对照真码,效果最佳。
主程序 + TOP(结构骨架):
REPORT zac_flight_manager.
INCLUDE zac_flight_top.
INCLUDE zac_flight_sel.
INCLUDE zac_flight_pbo.
INCLUDE zac_flight_pai.
INCLUDE zac_flight_forms.
* ZAC_FLIGHT_TOP —— 全局声明集中在顶楼
TABLES: sflight.
DATA: go_app TYPE REF TO lcl_flight_app. " 控制器(本程序本地类)
" 输出行结构:CDS 行 + 两个计算列
TYPES: BEGIN OF ty_flight_detail.
INCLUDE TYPE zac_flight_detail. " CDS 字段整建制引入(第20课)
TYPES: status TYPE string,
load_factor TYPE p LENGTH 5 DECIMALS 2,
END OF ty_flight_detail.
控制器(取数 + 编排):
CLASS lcl_flight_app DEFINITION.
PUBLIC SECTION.
METHODS:
get_data,
display,
create_booking IMPORTING iv_carrid TYPE s_carr_id
iv_connid TYPE s_conn_id
iv_fldate TYPE s_date,
export_to_csv.
PRIVATE SECTION.
DATA: mt_data TYPE STANDARD TABLE OF ty_flight_detail WITH EMPTY KEY,
mo_alv TYPE REF TO lcl_alv_display.
ENDCLASS.
CLASS lcl_flight_app IMPLEMENTATION.
METHOD get_data.
" 数据层:CDS 视图 + 选择屏幕条件(第5/7/20课合体)
SELECT * FROM zac_flight_detail
WHERE carrid = @p_carrid AND fldate IN @s_date
INTO CORRESPONDING FIELDS OF TABLE @mt_data.
" 加工层:表达式计算状态与上座率(第19课)
LOOP AT mt_data ASSIGNING FIELD-SYMBOL(<fs>).
<fs>-load_factor = COND #( WHEN <fs>-seatsmax > 0
THEN <fs>-seatsocc * 100 / <fs>-seatsmax
ELSE 0 ).
<fs>-status = COND string(
WHEN <fs>-seatsocc >= <fs>-seatsmax THEN '已满'
WHEN <fs>-load_factor > 80 THEN '紧张'
ELSE '可订' ).
ENDLOOP.
ENDMETHOD.
METHOD display.
mo_alv = NEW lcl_alv_display( me ). " 视图持有控制器引用,事件只做翻译
mo_alv->set_data( mt_data ).
mo_alv->display( ). " 触发 CALL SCREEN 100 → PBO 起容器
ENDMETHOD.
METHOD create_booking.
" 业务层:复用第14课封装好的服务类(BAPI + RET2 + COMMIT 全在里面)
DATA(lv_bookid) = zcl_ac_flight_service=>create_booking(
iv_carrid = iv_carrid
iv_connid = iv_connid
iv_fldate = iv_fldate ).
MESSAGE ID 'ZAC_FLIGHT_MSG' TYPE 'S' NUMBER 003
WITH iv_carrid iv_connid lv_bookid. " 预订成功:&1-&2-&3(第18课)
get_data( ). " 数据变了
mo_alv->refresh( mt_data ). " 视图跟着刷(第22课)
ENDMETHOD.
METHOD export_to_csv.
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
filename = |flight_{ sy-datum DATE = ISO }.csv|
filetype = 'ASC'
write_field_separator = 'X'
TABLES
data_tab = mt_data.
MESSAGE ID 'ZAC_FLIGHT_MSG' TYPE 'S' NUMBER 005
WITH |flight_{ sy-datum DATE = ISO }.csv|. " 数据已导出至 &1(第18课)
ENDMETHOD.
ENDCLASS.
交互(示意): ALV 的 double_click 事件由视图类 handler 接住 → 读当前行 → 转发 mo_app->create_booking( );工具栏 ZEXPORT 按钮 → mo_app->export_to_csv( )——事件入口只做"翻译",业务全部交给控制器(完整实现见 capstone-source/zac_flight_manager/zac_flight_forms.abap)。
4. 交付流程(课程的最后一公里)¶
- 自测:第6课的调试器全流程过一遍(断点在 create_booking,亲眼看 BAPI 的 RET2);
- 打包:全部对象收进一个 TR(第17课:功能完整一车走),释放;
- 发布:abapGit stage/commit/push(第23课),CI 自动部署文档站——你正在读的这篇课文就是这条流水线的产物。
课程总结¶
24 课知识地图¶
| 阶段 | 课 | 你获得了什么 |
|---|---|---|
| 基础 1-6 | SAP 入门 / 类型 / DDIC / 内表 / SQL / 调试 | 独立读写数据、排错的基本功 |
| 核心 7-13 | 选择屏幕 / 格式化 / FM / ALV / Excel / OO | 交付"用户能用的东西"的能力 |
| 高级 14-19 | BAPI / 增强 / 接口 / 传输 / 消息 / 新语法 | 与标准系统和外部世界协作 |
| 现代 20-24 | CDS / OO ALV / BTP / abapGit / 实战 | 面向未来的数据模型与工程化 |
后续学习路线¶
- 真实项目:找一个真实需求完整交付一次——胜过再看十门课;
- RAP + Fiori Elements:CDS 之后的正牌续集(/DMO/ 参考场景起步);
- SAPUI5 / Fiori:前端界面开发;
- 深化专题:IDoc/ALE、Workflow、HANA Native SQL、ABAP Unit 测试;
- 社区:SAP Community + SAP Help Portal——遇到问题先搜这里的长期主义。
💡 实战经验¶
先画图再写码
综合项目最忌"边写边想"。先画出对象清单(像上面的树)与数据流图,每个类一句话职责——写之前它已经是设计题而不是编码题。
积木复用,不要重造
第 1-23 课的每个对象都是为今天准备的:CDS 管数据、服务类管业务、消息类管提示。检查你的设计里有没有"重写的已有积木"——有就说明架构没收干净。
范围控制:完整 > 完美
毕业设计的目的是走通全流程。功能闭环、流程走完、TR/Git 交付齐活,比任何单点的炫技都值钱——优化是下一个项目的事。
📖 延伸阅读¶
- 参考资料库——全课程外部资料总索引;
- ABAP Flight Reference Scenario(/DMO/)——你的下一站。
课后思考(毕业设计题)¶
完成后把你的答案/作品链接贴到页面底部评论区——这里会留下每一届学员的脚印,我也会来点评。
- 毕业设计:不看参考,自己实现
zac_flight_manager的展示层(Screen 100 +lcl_alv_display),跑通"筛选→展示→双击预订→导出"闭环;卡住或完成后,对照仓库capstone-source/zac_flight_manager/里的官方参考实现做一次重构复盘——commit 到你的 Fork 并贴出链接; - 扩展题:增加"按月份票价趋势"统计页(提示:CDS 里
dats_add_days/日期函数 + 第21课聚合); - 复盘:24 课里你最有信心讲给别人听的是哪一课?最容易忘的是哪块?(评论区立个 flag,三个月后回来看看)
- 展望:如果这个系统要上 BTP(RAP 重写),哪些资产可以直接搬走,哪些必须重做?(提示:CDS 的可迁移性正是它存在的意义)
课程完。 感谢走到这里——回到首页看看你走过的路,评论区聊聊你的下一步。