CDS中表关联及筛选的使用

在CDS中,可以使用Associations来连接多多,同时也能在其中进行筛选(Filtered)。

过滤的关联的语法

CDS中表关联及筛选的使用 - 第1张  | 优通SAP

语法过滤的关联

  • 可以使用过滤条件来扩展CDS DDL中的路径表达式。
  • 当系统将路径表达式转换为数据库级别的联接时,过滤条件将成为ON条件的一部分,也就是说,可以在ON中写查询条件,相当于以前写在WHERE中的条件,可以使用在ON后面。
CDS中表关联及筛选的使用 - 第2张  | 优通SAP
示例:路径表达式中的过滤条件
  • 在此示例中,表tcurt与表scarr(航空公司的主数据)相关联。表tcurt是所谓的文本表。它包含许多不同语言的货币名称和描述。关联的“打开”条件定义了两个表之间的基本外键关系,即表scarr中的货币代码(字段currcode)链接到表tcurt中的关键字段was。
  • 这种关联将一个承运人与其本国货币的所有描述相关联,而与语言无关。
  • 该示例未在关联的ON条件中将选择限制为一种语言,而是在路径表达式中使用了过滤条件。从技术上讲,即在数据库上,结果是相同的。但是通过使用路径表达式中的过滤条件,可以更清楚地了解哪些条件是外键关系的一部分,以及哪些条件反映了附加选择。

1.Associations中可使用的运算符

  • =,<,>,<=,> =,<>

左侧:

  • 必须是关联对象字段

右侧:

  • 关联对象领域字段
  • 文字
  • 参数
  • 会话变量

实施过滤条件时,以下规则适用

  • 允许所有关系运算符(=,<,>,<=,> =,<>)。
  • 条件的左侧需要关联目标的字段(在我们的示例中为_currency的字段)。
  • 右侧可以是该目标数据源的另一个字段,文字,参数或会话变量。

2.过滤关联Associations中的基数

CDS中表关联及筛选的使用 - 第3张  | 优通SAP
  • 上面的示例包含表TCURT与表SCARR的关联。此关联的正确基数为0 .. *:一个承运人的本地货币代码可以在表tcurt中包含任意数量的文本-每种维护的语言都可以有一个。
  • 我们已经了解到,通常,一旦在路径表达式中使用了关联,基数*就会导致语法警告甚至错误。
  • 在我们的示例中,过滤条件将关联的基数减小为“ 0..1”:对于给定的语言,每个货币代码TCURT最多包含一个条目。
  • 要对此进行记录-并使语法警告和错误消失,可以在路径表达式的过滤条件中指定基数“ 1”。

注意:在没有过滤条件的情况下,不允许在路径表达式中指定基数。

3.注释比较过滤器Annotation Compare Filter

CDS中表关联及筛选的使用 - 第4张  | 优通SAP
注释比较过滤器
  • 默认情况下,每个具有过滤条件的新路径表达式都将在生成的SQL视图中导致单独的联接。即使过滤条件相同,也会发生这种情况(请参见上面的示例和左侧的SQL CREATE语句)。
  • ABAP批注“ AbapCatalog.compiler.compareFilter”可用于指定是否对视图的路径表达式比较过滤条件。如果过滤条件
  • 匹配时,关联的联接表达式仅创建一次,通常可以提高性能。

注意:两种配置的结果集可能不同。

CDS中表关联及筛选的使用 - 第5张  | 优通SAP
比较过滤器为假的示例
  • 在上面的示例中,两个路径表达式中的过滤条件相同。
  • 注释ABAPCatalog.compiler.compareFilter的值为false。这使得系统生成scarr和tcurt的两个单独的联接以检索字段ktext和Itext。值为true时,系统将比较过滤器,意识到它们是相同的,并且仅使用一个联接来检索两个字段。

注意:所有数据定义模板都包含注释ABAPCatalog.compiler.compareFilter,其值为true。