SAP-BTP :(9)RAP-草稿处理
一、草稿处理的核心价值草稿Draft是 RAP 为企业级应用提供的一种关键机制它允许用户在不立即提交数据的情况下长期编辑一个业务对象实例并且可以临时保存编辑状态、离开后返回继续编辑最后一次性激活。传统无草稿 BO每次修改立即进入事务缓冲区一旦离开页面未提交的更改即丢失。启用草稿后编辑内容被持久化到专门的草稿表支持草稿创建、编辑、激活、删除等操作。草稿机制使得 RAP 应用能够支持复杂的、多步骤的表单填写场景例如旅行申请、订单录入等。二、启用草稿所需的核心构件构件作用草稿表Draft Table存储草稿数据与激活数据表分离由 RAP 框架完全管理行为定义中的with draft开启 BO 的草稿能力关联上的with draft允许通过关联导航到草稿实例draft determine action Prepare激活前的校验触发点lock master total etag并发控制使用 ETag 字段防止版本冲突投影中的use draft将草稿能力暴露给服务消费者三、案例步骤整理Step 1 – 在基础业务对象中启用草稿1.1 添加with draft声明在基础行为定义ZI_RAP_Travel_####的头部managed;之后添加with draft;1.2 指定草稿表Travel 实体draft table zrap_dtrav_####Booking 实体draft table zrap_dbook_####1.3 生成草稿表光标放在表名上按Ctrl1Quick Fix选择生成草稿表。框架自动根据实体模型生成对应的草稿表结构。注意以后修改 BO 数据模型后可再次用 Quick Fix 重新生成草稿表会更新表定义。1.4 调整关联声明解决警告Travel 实体中的_Booking关联改为association _Booking { create; with draft; }Booking 实体中的_Travel关联改为association _Travel { with draft; }原因草稿启用后关联必须显式标记with draft才能在草稿实例间导航。1.5 添加总 ETag 锁定lock master total etag LastChangedAt作用使用LastChangedAt字段作为乐观锁版本标识防止草稿基于过期的激活实例激活。1.6 指定draft determine action Prepare触发的校验意义当用户点击“激活”时框架会先调用Prepare动作在此处执行所有需要检查的校验并将消息保存为状态消息即使激活失败用户返回后仍能看到错误提示。Step 2 – 在投影业务对象中暴露草稿2.1 添加use draft在投影行为定义ZC_RAP_Travel_####的头部添加use draft;2.2 调整投影关联Travel 投影use association _Booking { create; with draft; }Booking 投影use association _Travel { with draft; }2.3 针对 OData V2 的特殊处理如果使用 OData V2需要注释掉use etag因为 OData V2 的 Fiori Elements 尚不支持 ETag 与草稿同时使用。Step 3 – 调整行为实现授权控制在行为池类ZBP_I_RAP_TRAVEL_####中找到get_authorizations方法。在requested_authorizations条件判断中取消注释与%action-Prepare和%action-Edit相关的代码行。这样草稿相关的两个内置动作Prepare和Edit也会受到授权检查。Step 4 – 预览与测试启动 Fiori 应用后你会看到过滤器区域新增“编辑状态”Editing Status筛选。创建新对象时在对象页面编辑字段时你会立即在底部看到草稿保存指示器。在后端查看相关的草稿表可以看到目前已输入的所有值。四、关键设计思想1. 草稿表完全由框架管理开发者只需声明draft table xxx无需手动编写任何 DDL 或 DML。框架自动处理草稿的创建、读取、更新、激活、删除。2. 状态消息持久化启用草稿后校验失败的消息会作为状态消息写入草稿表而不是仅存在于当前会话。用户关闭应用再打开依然能看到之前的错误提示 —— 极大提升用户体验。3. 关联的草稿导航关联必须显式标记with draft才能在主实体与子实体的草稿实例之间导航。这避免了非草稿关联错误地指向激活实例。4. ETag 乐观锁使用lock master total etag确保激活操作基于最新的激活实例版本。如果草稿基于旧版本激活时会触发冲突处理通常提示用户刷新。5. Prepare 动作作为校验集中点在激活 OData 请求的单独 changeset 中调用Prepare将校验与激活分离。这样即使校验失败也已保存的状态消息仍然可以返回给前端。五、与无草稿 BO 的主要区别特性无草稿有草稿编辑方式直接修改事务缓冲区持久化到草稿表离开页面后修改是否保留❌ 丢失✅ 保留状态消息持久化❌ 仅当前会话✅ 存入草稿表on-modify determination立即在缓冲区执行立即在草稿实例执行on-save determination在 COMMIT 时执行在激活时执行并发控制数据库锁短暂ETag 草稿锁可长时间六、总结一句话启用草稿处理只需在行为定义中添加with draft、指定草稿表、调整关联及 ETag并在投影中暴露use draft即可让 Fiori 应用获得完整的草稿编辑、状态持久化和激活前校验体验。