PAYATHON 2026

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。

需要逐项确认:

  1. 主实体存在指向银行子实体的导航属性。
  2. 主实体的 UI.Facets 包含 ID 为 Bank、标签为 Banks 的记录。
  3. 该记录的目标路径能够解析到银行子实体的 UI.LineItem#Bank。
  4. 子实体确实存在 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 没有返回数据,不能确认整块不显示的原因。

完成修改后,先确认网络响应已经包含新注解,再刷新应用。只有响应仍然是旧内容时,才进一步检查相关缓存,避免把所有问题都归因于缓存。

备注:内容仅供参考。