拍摄于南戴河
原文地址
https://www.ut163.com/fiori_learning_arrangement/sap-cds/the_use_of_table_association_and_filtering_in_cds/
CDS中表关联及筛选的使用
Associations中可使用的运算符
过滤关联Associations中的基数
注释比较过滤器Annotation Compare Filter
在CDS中,可以使用Associations来连接多多,同时也能在其中进行筛选(Filtered)。
过滤的关联的语法
语法过滤的关联
可以使用过滤条件来扩展CDS DDL中的路径表达式。
当系统将路径表达式转换为数据库级别的联接时,过滤条件将成为ON条件的一部分,也就是说,可以在ON中写查询条件,相当于以前写在WHERE中的条件,可以使用在ON后面。
在此示例中,表tcurt与表scarr(航空公司的主数据)相关联。表tcurt是所谓的文本表。它包含许多不同语言的货币名称和描述。关联的“打开”条件定义了两个表之间的基本外键关系,即表scarr中的货币代码(字段currcode)链接到表tcurt中的关键字段was。
这种关联将一个承运人与其本国货币的所有描述相关联,而与语言无关。
该示例未在关联的ON条件中将选择限制为一种语言,而是在路径表达式中使用了过滤条件。从技术上讲,即在数据库上,结果是相同的。但是通过使用路径表达式中的过滤条件,可以更清楚地了解哪些条件是外键关系的一部分,以及哪些条件反映了附加选择。
1.Associations中可使用的运算符
=,<,>,<=,> =,<>
左侧:
必须是关联对象字段
右侧:
关联对象领域字段
文字
参数
会话变量
实施过滤条件时,以下规则适用
允许所有关系运算符(=,<,>,<=,> =,<>)。
条件的左侧需要关联目标的字段(在我们的示例中为_currency的字段)。
右侧可以是该目标数据源的另一个字段,文字,参数或会话变量。
2.过滤关联Associations中的基数
上面的示例包含表TCURT与表SCARR的关联。此关联的正确基数为0 .. *:一个承运人的本地货币代码可以在表tcurt中包含任意数量的文本-每种维护的语言都可以有一个。
我们已经了解到,通常,一旦在路径表达式中使用了关联,基数*就会导致语法警告甚至错误。
在我们的示例中,过滤条件将关联的基数减小为“ 0..1”:对于给定的语言,每个货币代码TCURT最多包含一个条目。
要对此进行记录-并使语法警告和错误消失,可以在路径表达式的过滤条件中指定基数“ 1”。
注意:在没有过滤条件的情况下,不允许在路径表达式中指定基数。
3.注释比较过滤器Annotation Compare Filter
-
注释比较过滤器 默认情况下,每个具有过滤条件的新路径表达式都将在生成的SQL视图中导致单独的联接。即使过滤条件相同,也会发生这种情况(请参见上面的示例和左侧的SQL CREATE语句)。
ABAP批注“ AbapCatalog.compiler.compareFilter”可用于指定是否对视图的路径表达式比较过滤条件。如果过滤条件
匹配时,关联的联接表达式仅创建一次,通常可以提高性能。
注意:两种配置的结果集可能不同。
在上面的示例中,两个路径表达式中的过滤条件相同。
注释ABAPCatalog.compiler.compareFilter的值为false。这使得系统生成scarr和tcurt的两个单独的联接以检索字段ktext和Itext。值为true时,系统将比较过滤器,意识到它们是相同的,并且仅使用一个联接来检索两个字段。
注意:所有数据定义模板都包含注释ABAPCatalog.compiler.compareFilter,其值为true。
推荐阅读:
《ABAP新语法1》
《关于 SM30/VIEW_MAINTENANCE_CALL锁整张表问题》
《使用cl_gui_docking_container 实现多ALV》
《DEMO:S/4 1809 FAGLL03H 增加字段增强》
《几个ABAP实用模板,体力活就别一行行敲了,复制粘贴得了》
《SAP Parallel Accounting(平行分类账业务)配置+操作手册+BAPI demo程序》
《CC02修改确认日期BAPI:Processing of change number was canceled》《我是怎样调试BAPI的,以F-02为例》
《苏州游记》
《杂谈:几种接口》
《RESTful DEMO 一:SAP 如何提供 RESTful Web 服务》
《DEMO search help 增强 ( vl03n KO03 等)》
Debug 系列