SAP CDS view 里的 Aggregation Expression

发布时间 2023-08-13 13:16:45作者: JerryWang_汪子熙

SAP ABAP CDS(Core Data Services)视图是SAP系统中的一种建模工具,用于定义数据模型和数据库视图。CDS视图允许开发者创建高级数据模型,可以从多个数据库表中提取数据,并在SAP应用程序中使用。在CDS视图中,"Aggregation Expressions"(聚合表达式)是一项强大的功能,它允许开发者对从底层数据库表中检索的数据进行聚合操作,例如求和、计数、平均值等。

聚合表达式在CDS视图中通过使用@Aggregation注解来定义。这样,您可以将数据库表中的原始数据转换为更有意义的、聚合后的结果,以便在报表和分析中更方便地使用。使用CDS视图的聚合功能,可以在数据库层面上进行复杂的计算,从而提高查询性能,并减轻SAP应用程序的负担。

让我们通过一个具体的例子详细说明SAP ABAP CDS视图的Aggregation Expressions功能。

假设我们有一个SAP系统,其中有两个数据库表:SalesOrderHeaderSalesOrderItem,分别存储销售订单头和订单行项目的数据。现在,我们希望创建一个CDS视图,将这两个表的数据连接起来,并对订单行项目进行聚合,以便计算每个销售订单的总金额和平均折扣率。

首先,我们定义数据库表结构:

-- Sales Order Header Table
CREATE TABLE SalesOrderHeader (
    SalesOrderID INT PRIMARY KEY,
    CustomerID INT,
    OrderDate DATE
);

-- Sales Order Item Table
CREATE TABLE SalesOrderItem (
    ItemID INT PRIMARY KEY,
    SalesOrderID INT,
    ProductID INT,
    Quantity INT,
    UnitPrice DECIMAL(10,2),
    Discount DECIMAL(5,2)
);

接下来,我们创建CDS视图,并使用@Aggregation注解对订单行项目进行聚合:

-- CDS View Definition
@AbapCatalog.sqlViewName: 'ZCDS_SalesOrder'
@AbapCatalog.compiler.compareFilter: true
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: 'Sales Order CDS View'
define view ZSalesOrder as select from SalesOrderHeader
    association [0..*] to SalesOrderItem as _Item
        on $projection.SalesOrderID = _Item.SalesOrderID
{
    key SalesOrderHeader.SalesOrderID as SalesOrderID,
    SalesOrderHeader.CustomerID as CustomerID,
    SalesOrderHeader.OrderDate as OrderDate,
    
    // Aggregation Expressions
    @Aggregation.sum: @_Item.Quantity
    @ObjectModel.text.element: 'TotalQuantity'
    @_Item.Quantity as TotalQuantity,
    
    @Aggregation.sum: @_Item.Quantity * @_Item.UnitPrice * (1 - @_Item.Discount / 100)
    @ObjectModel.text.element: 'TotalAmount'
    @_Item.Quantity * @_Item.UnitPrice * (1 - @_Item.Discount / 100) as TotalAmount,
    
    @Aggregation.avg: @_Item.Discount
    @ObjectModel.text.element: 'AverageDiscount'
    @_Item.Discount as AverageDiscount
}
group by SalesOrderHeader.SalesOrderID, SalesOrderHeader.CustomerID, SalesOrderHeader.OrderDate;

在上面的CDS视图定义中,我们使用了@Aggregation注解来定义三个聚合表达式:

  1. TotalQuantity:使用@Aggregation.sum注解对订单行项目的Quantity字段进行求和,得到每个销售订单的总数量。
  2. TotalAmount:使用@Aggregation.sum注解对订单行项目的TotalAmount字段进行求和,计算每个销售订单的总金额。这里我们通过乘以(1 - Discount / 100)来应用折扣率,以得到折扣后的总金额。
  3. AverageDiscount:使用@Aggregation.avg注解对订单行项目的Discount字段进行平均值计算,得到每个销售订单的平均折扣率。

在CDS视图中,我们使用了关联_ItemSalesOrderHeader表和SalesOrderItem表连接起来。然后,我们使用聚合表达式对SalesOrderItem表中的QuantityUnitPriceDiscount字段进行计算,得到每个销售订单的总数量、总金额和平均折扣率。

通过以上CDS视图的定义,我们可以在SAP应用程序中轻松地获取每个销售订单的总数量、总金额和平均折扣率,无需手动编写复杂的查询。并且,这些计算是在数据库层面上进行的,因此查询性能也得到了优化。

总结一下,SAP ABAP CDS视图的Aggregation Expressions功能允许开发者在CDS视图中定义聚合表达式,以对底层数据库表的数据进行聚合操作,例如求和、计数和平均值等。这样可以提供更有意义的数据,并简化SAP应用程序中的数据处理和报表生成。通过使用@Aggregation注解,可以在CDS视图中轻松地实现这些聚合操作,从而提高应用程序的性能和效率。