Fiori Elements Object Page 为何不显示 Banks 表格?
结论
从已提供的代码看,targetElement: '_Bank' 指向 _Bank 导航属性,targetQualifier: 'Bank' 与子视图的 qualifier: 'Bank' 一致,不能直接判定 facet 引用写错。应先检查应用实际加载的 UI.Facets:如果本地注解覆盖了后端的同名注解,CDS 中新增的 Banks 区块就可能没有进入最终页面配置。
目前缺少应用的注解文件、服务元数据和运行日志,还不能确认唯一原因。建议按“本地覆盖 → 服务注解 → 导航数据”的顺序排查。
先确认现有注解的含义
主视图中的配置是:
{
id: 'Bank',
label: 'Banks',
type: #LINEITEM_REFERENCE,
position: 10,
targetQualifier: 'Bank',
targetElement: '_Bank'
}
这段配置沿 _Bank 导航到子实体,再引用子实体上 qualifier 为 Bank 的 UI.LineItem。子视图已为 BusinessPartner、BankIdentification 等字段显式定义了这组列注解,所示代码中的引用关系是一致的。SAP 对相关注解的定义也区分了 targetElement 和 targetQualifier 的作用。SAP UI Annotations
其中,facet 的 id: 'Bank' 是区块标识;与子视图 qualifier 匹配的是 targetQualifier。
1. 检查本地 UI.Facets 是否覆盖后端
在项目的 webapp/annotations/ 目录中搜索 UI.Facets,并查看 manifest.json 中主 OData 数据源配置了哪些 annotation source。
确认是否有本地 UI.Facets 作用于同一个主实体,并使用相同的 qualifier。即使本地集合里只有一个旧区块,也可能覆盖后端的整个同名集合,导致后端新增的 Banks 不显示。SAP 文档说明,在 target、term 和 qualifier 相同时,本地注解优先于后端注解。SAP Service Modeler 文档
如果确认存在覆盖,可以选择:
- 统一由 CDS 维护页面区块:移除对应的本地
UI.Facets定义,保留仍需使用的其他注解。 - 继续由本地注解维护:将 Banks 的
UI.ReferenceFacet加入现有本地集合。
不要直接删除整个注解文件,否则可能一并移除其他页面配置。
本地 XML 中新增记录的结构可以是:
<Record Type="UI.ReferenceFacet">
<PropertyValue Property="ID" String="Bank" />
<PropertyValue Property="Label" String="Banks" />
<PropertyValue Property="Target"
AnnotationPath="_Bank/@UI.LineItem#Bank" />
</Record>
将这段记录放入现有 UI.Facets 的 Collection 中。示例假设 UI 已声明为对应 vocabulary 的别名,且服务中的导航属性名称确实是 _Bank;实际名称应以服务元数据为准。
2. 检查服务是否输出了完整引用
打开浏览器开发者工具的 Network 面板,检查应用实际请求的 $metadata 和 annotation 文件。部分服务会把 UI 注解放在独立的 annotation source 中,因此不能只检查 $metadata。
需要逐项确认:
- 主实体存在指向银行子实体的导航属性。
- 主实体的
UI.Facets包含ID为Bank、标签为Banks的记录。 - 该记录的目标路径能够解析到银行子实体的
UI.LineItem#Bank。 - 子实体确实存在 qualifier 为
Bank的UI.LineItem,且列引用的属性存在。
如果服务响应中没有 Banks facet,应检查 CDS 激活结果、服务是否引用了当前视图,以及应用是否连接到预期的系统和服务。
如果 facet 存在,但导航属性或目标子实体缺失,应检查服务暴露配置。若实际使用的是 RAP service definition,需要按该服务模型暴露相关实体;不能仅凭 CDS 中声明了 composition,就认定服务已经完整提供导航。SAP 的组合服务教程对此有说明。SAP 组合服务教程
3. 可显式声明 purpose,但不要把它当成已确认的修复
为便于阅读,可以把 Banks facet 写成:
{
id: 'Bank',
label: 'Banks',
purpose: #STANDARD,
type: #LINEITEM_REFERENCE,
position: 10,
targetElement: '_Bank',
targetQualifier: 'Bank'
}
原代码前三个 facet 使用 purpose: #HEADER,用于页头;Banks 用于正文区块。UI.facet.purpose 的默认值是 #STANDARD,因此原代码没有显式填写这一项,尚不足以解释区块消失的原因。SAP UI Annotations
也不应单独删除 targetQualifier: 'Bank'。子视图提供的是带 qualifier 的 LineItem;只删除引用端的 qualifier,会改为查找另一组注解。
4. 区分区块缺失与数据为空
如果 Banks 标题和表格已经出现,但没有记录,再检查当前 BusinessPartner 的导航请求。使用 $metadata 中的实际 EntitySet、键格式和导航属性构造请求,确认返回的是空集合、正常数据还是错误响应。
如果整个区块仍未出现,则继续检查最终合并后的注解、可见性配置和控制台中的注解解析错误。单凭 _Bank 没有返回数据,不能确认整块不显示的原因。
完成修改后,先确认网络响应已经包含新注解,再刷新应用。只有响应仍然是旧内容时,才进一步检查相关缓存,避免把所有问题都归因于缓存。
备注:内容仅供参考。
