You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在另一ABAP CDS视图中调用层级CDS并获取根节点ID

获取CDS层级中的根节点ID

我已创建一个ABAP CDS层级,希望在另一个CDS视图中调用它,获取每个节点对应的根节点ID。相关代码如下:

源表

@EndUserText.label : 'Hierarchy'
@AbapCatalog.enhancement.category : #EXTENSIBLE_CHARACTER_NUMERIC
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #A
@AbapCatalog.dataMaintenance : #RESTRICTED
define table hierarchy_table {
  key mandt   : mandt not null;
  key id      : char10 not null;
  parent      : char10;
}

层级源CDS视图

@AbapCatalog.viewEnhancementCategory: [#NONE]
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: 'Hierarchy Source'
@Metadata.ignorePropagatedAnnotations: true
define view entity ZI_HierarchySource as select from hierarchy_table
  association [1..1] to ZI_HierarchySource as _hierarchy on $projection.parent = _hierarchy.id
{
      _hierarchy,
      key id,
      parent
}

层级CDS

define hierarchy ZI_HIERARCHY
  as parent child hierarchy( source ZI_HierarchySource
  child to parent association _hierarchy
  siblings order by id ascending )
{
  id,
  parent,
  $node.node_id               as hiera_node_id,
  $node.parent_id             as hiera_parent_id,
  $node.hierarchy_is_orphan   as hiera_is_orphan,
  $node.hierarchy_is_cycle    as hiera_is_cycle,
  $node.hierarchy_rank        as hiera_rank,
  $node.hierarchy_parent_rank as hiera_parent_rank,
  $node.hierarchy_level       as hiera_level
}

目标视图需求

define view entity ZI_NODE_ID_AND_ROOT_ID
  as select from hierarchy_table 
  association [1..1] to ZI_Hierarchy as hier on $projection.id = hier.id
{
  key id,
      root // 需要从层级中获取根节点ID
}

在ABAP程序中可以使用层级节点导航器HIERARCHY_ANCESTORS实现,但不清楚如何在CDS视图中完成。


解决方案

要在CDS视图中获取根节点ID,可借助CDS层级的内置属性$hierarchy.root_id,步骤如下:

  1. 修改现有层级CDS,添加根节点字段
    更新ZI_HIERARCHY,将根节点ID作为字段包含进去:
define hierarchy ZI_HIERARCHY
  as parent child hierarchy( source ZI_HierarchySource
  child to parent association _hierarchy
  siblings order by id ascending )
{
  id,
  parent,
  $node.node_id               as hiera_node_id,
  $node.parent_id             as hiera_parent_id,
  $node.hierarchy_is_orphan   as hiera_is_orphan,
  $node.hierarchy_is_cycle    as hiera_is_cycle,
  $node.hierarchy_rank        as hiera_rank,
  $node.hierarchy_parent_rank as hiera_parent_rank,
  $node.hierarchy_level       as hiera_level,
  $hierarchy.root_id          as hiera_root_id // 添加根节点ID字段
}
  1. 在目标视图中关联层级CDS并获取根节点ID
    修改目标视图,通过关联层级CDS直接引用根节点字段:
define view entity ZI_NODE_ID_AND_ROOT_ID
  as select from hierarchy_table as ht
  left outer join ZI_HIERARCHY as hier on ht.id = hier.id
{
  key ht.id,
      hier.hiera_root_id as root // 直接获取根节点ID
}

这种方式复用了已定义的层级逻辑,实现更简洁高效。


内容的提问来源于stack exchange,提问作者RaTiO

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 05:52:51