CDS ABAP-两个CDS视图的合并/联合,但需要单独的金额字段

2020-09-10 10:54发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


您好,我正在尝试合并两个单独的CDS视图-本年度数据和上年度数据。

这些视图具有完全相同的列(如下所示),但前5列中的数据可能有所不同-使某些条目唯一(例如,下面完全突出显示的行)。

我需要实现的效果显示在下面的屏幕截图中:

*如果当前和优先级中的前5列均匹配,则联接表需要在当前和优先级列中均显示一行且金额相同。

*如果"当前"中有一个条目与"先验"中的一行不完全匹配,则需要在联接表中将"先验"金额显示为零。 (反之亦然)

我本质上在寻找的是完全外部联接。 我尝试了所有形式的Joins和Unions,但没有一个给我预期的结果。 当我尝试输入完全外部联接时,出现错误,因为它无法识别单词" full"(见下文)

有人做过类似的事情吗? 这让我发疯,所以任何输入都会大受好评!

谢谢。

Pete

screenshot1.jpg (65.1 kB)

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


您好,我正在尝试合并两个单独的CDS视图-本年度数据和上年度数据。

这些视图具有完全相同的列(如下所示),但前5列中的数据可能有所不同-使某些条目唯一(例如,下面完全突出显示的行)。

我需要实现的效果显示在下面的屏幕截图中:

*如果当前和优先级中的前5列均匹配,则联接表需要在当前和优先级列中均显示一行且金额相同。

*如果"当前"中有一个条目与"先验"中的一行不完全匹配,则需要在联接表中将"先验"金额显示为零。 (反之亦然)

我本质上在寻找的是完全外部联接。 我尝试了所有形式的Joins和Unions,但没有一个给我预期的结果。 当我尝试输入完全外部联接时,出现错误,因为它无法识别单词" full"(见下文)

有人做过类似的事情吗? 这让我发疯,所以任何输入都会大受好评!

谢谢。

Pete

screenshot1.jpg (65.1 kB)
付费偷看设置
发送
5条回答
nice_wp
1楼-- · 2020-09-10 11:25

您可以使用以下示例:

第一个"虚拟" CDS包含当月的数据:

 @ AbapCatalog.sqlViewName:'ZZZJC_004A_V'
 @ AbapCatalog.compiler.compareFilter:是
 @ AbapCatalog.preserveKey:是
 @ AccessControl.authorizationCheck:#检查
 @ EndUserText.label:'ZZZJC_004Current'
 定义视图ZZZJC_004Current
 如
 从t000中选择虚拟
 {
       键" 1"作为GLAccount
     ,将键" S"作为供应商名称
     ,将''作为BA
     ,以''作为贸易伙伴
     ,将键" Z"作为CustomerName
    
     ,金额为10
 }
 哪里
 Dummy.mandt = $ session.client

 从t000作为Dummy进行联合选择{密钥'2'作为GLAccount,密钥''作为VendorName,密钥''作为BA,密钥'T'作为TradingPartner,密钥''作为CustomerName,20作为金额}其中Dummy.mandt = $ session  。客户
 工会从t000中选择Dummy {键'3'作为GLAccount,键''作为VendorName,键''作为BA,键''作为TradingPartner,键''作为CustomerName,30作为金额},其中Dummy.mandt = $ session。 客户
 联合从t000中选择作为Dummy {键'4'作为GLAccount,键'W'作为VendorName,键''作为BA,键''作为TradingPartner,键''作为CustomerName,40作为金额}其中Dummy.mandt = $ session  。客户
 从t000作为Dummy进行联合选择{键'5'作为GLAccount,键'X'作为VendorName,键''作为BA,键'Z'作为TradingPartner,键''作为CustomerName,50作为金额}其中Dummy.mandt = $ 会话客户端
 

第二个"虚拟" CDS包含上个月的数据:

 @ AbapCatalog.sqlViewName:'ZZZJC_004B_V'
 @ AbapCatalog.compiler.compareFilter:是
 @ AbapCatalog.preserveKey:是
 @ AccessControl.authorizationCheck:#检查
 @ EndUserText.label:'ZZZJC_004Prior'
 定义视图ZZZJC_004Prior
 如
 从t000中选择虚拟
 {
       键" 1"作为GLAccount
     ,将键" S"作为供应商名称
     ,将''作为BA
     ,以''作为贸易伙伴
     ,以''作为客户名
    
     ,金额为11
    
 }
 哪里
 Dummy.mandt = $ session.client
 从t000作为Dummy进行联合选择{密钥'2'作为GLAccount,密钥''作为VendorName,密钥''作为BA,密钥'T'作为TradingPartner,密钥''作为CustomerName,22作为金额}其中Dummy.mandt = $ session  。客户
 联合从t000中选择作为Dummy {键'4'作为GLAccount,键'W'作为VendorName,键''作为BA,键''作为TradingPartner,键''作为CustomerName,33作为金额}其中Dummy.mandt = $ session  。客户
 从t000作为Dummy进行联合选择{键'5'作为GLAccount,键'X'作为VendorName,键''作为BA,键'Z'作为TradingPartner,键''作为CustomerName,44作为金额}其中Dummy.mandt = $ 会话客户端
 从t000作为Dummy进行联合选择{键'6'为GLAccount,键'U'为供应商名称,键''为BA,键'Y'为TradingPartner,键''为CustomerName,金额为55}其中Dummy.mandt = $ 会话客户端
 

CDS合并数据:

 @ AbapCatalog.sqlViewName:'ZZZJC_004C_V'
 @ AbapCatalog.compiler.compareFilter:是
 @ AbapCatalog.preserveKey:是
 @ AccessControl.authorizationCheck:#检查
 @ EndUserText.label:'ZZZJC_004Merge'
 定义视图ZZZJC_004Merge
 如
//内部联接
 从ZZZJC_004Current中选择当前
    
     内部加入ZZZJC_004Prior作为Prior
         在Current.GLAccount上= Prior.GLAccount
        和Current.VendorName = Prior.VendorName
        和Current.BA = Prior.BA
        和Current.TradingPartner = Prior.TradingPartner
        和Current.CustomerName = Prior.CustomerName

 {
       关键Current.GLAccount
     ,键Current.VendorName
     ,关键Current.BA
     ,关键Current.TradingPartner
     ,键Current.CustomerName
    
     ,Current.Amount作为CurrentAmount
     ,Prior.Amount作为PriorAmount

 }

 联盟

//左外连接
 从ZZZJC_004Current中选择当前
    
     左外部加入ZZZJC_004Prior作为Prior
         在Current.GLAccount上= Prior.GLAccount
        和Current.VendorName = Prior.VendorName
        和Current.BA = Prior.BA
        和Current.TradingPartner = Prior.TradingPartner
        和Current.CustomerName = Prior.CustomerName

 {
       关键Current.GLAccount
     ,键Current.VendorName
     ,关键Current.BA
     ,关键Current.TradingPartner
     ,键Current.CustomerName
    
     ,Current.Amount作为CurrentAmount
     ,0作为PriorAmount
 }
 哪里
     Prior.GLAccount为空
    
 联盟

//右外连接
 从ZZZJC_004Current中选择当前
    
     右外部加入ZZZJC_004Prior作为Prior
         在Current.GLAccount上= Prior.GLAccount
        和Current.VendorName = Prior.VendorName
        和Current.BA = Prior.BA
        和Current.TradingPartner = Prior.TradingPartner
        和Current.CustomerName = Prior.CustomerName

 {
       关键的Prior.GLAccount
     ,键Prior.VendorName
     ,密钥Prior.BA
     ,关键的Prior.TradingPartner
     ,键Prior.CustomerName
    
     ,0作为CurrentAmount
     ,Prior.Amount作为PriorAmount
 }
 哪里
     Current.GLAccount为空
 
CPLASF-自律
2楼-- · 2020-09-10 11:17

如果您这样做会发生什么:

从数据库中选择
 {key'1'as GLAccount
     ,key'S'as供应商名称
     ,以BA身份
     ,key''作为TradingPartner
     ,将'Z'作为客户名
     ,sum(10)作为current_Amount
     ,0作为Prior_Amount
 }
 全部合并
 {
       键" 1"作为GLAccount
     ,将键" S"作为供应商名称
     ,将''作为BA
     ,以''作为贸易伙伴
     ,以''作为客户名
     ,0作为current_Amount
     ,sum(11)为prior_Amount
    
 }
 按键分组... 

我现在没有系统可以检查...

土豆飞人
3楼-- · 2020-09-10 11:20

根据您的示例,您真正需要的是UNION ALL(因此两者都可以执行 并且不会删除重复项),并以7列作为输出。 前5列没什么特别的,但其他两列则更特别:

对于工会的第一部分,您需要生产:

  • 新列 AmountLC为 CurrentAmt
  • 一个空列''作为PriorAmount

对于工会的第二部分,您都需要反之亦然

  • 一个空列''为CurrentAmt
  • 新列 AmountLC作为PriorAmount

希望有帮助

------------

德米特里·库兹涅佐夫

BI咨询

CPLASF-自律
5楼-- · 2020-09-10 11:14

嗨,Dmitry,非常感谢您的答复-非常感谢。

谢谢。
Pete

一周热门 更多>