云应用程序编程(CAPM)虚拟字段数据库

2020-08-30 01:30发布

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

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


大家好,

如果在cds模型中将实体的字段标记为虚拟,则不会在相应的数据库表上创建任何字段。 到目前为止,一切都很好。

如果现在使用GET请求在虚拟字段上使用过滤器调用此实体,则会返回以下错误:

 <错误xmlns =" http://docs.oasis-open.org/odata/ns/metadata">
  500 
 <消息>
 无法在以下行设置参数:1.参数必须是字符串
 
 
 

在调试过程中,我还遇到了以下异常文本:(属性VHierarchyNodeLevel被标记为虚拟)

选择a.modifiedAt AS" a_modifiedAt",a.createdAt AS" a_createdAt",a.createdBy AS" a_createdBy",a.modifiedBy AS" a_modifiedBy",a.VId AS" a_VId",a.VName AS" a_VName"  ",a.VHierarchyNodeLevel AS" a_VHierarchyNodeLevel"来自Service_PlanningUnits,其中a.VHierarchyNodeLevel <=?  LIMIT 128 OFFSET 0 

是否有可能将字段标记为虚拟字段,但是如果请求中存在针对此查询的过滤器,则会将虚拟字段添加到数据库查询的WHERE子句中?

在CDS实体之后,将虚拟字段填充在on.after(" READ",...)。

实体PlanningUnit:托管{
   键VId:UUID;
       VName:字符串;
       virtual VHierarchyNodeLevel:整数;
 }
 

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

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


大家好,

如果在cds模型中将实体的字段标记为虚拟,则不会在相应的数据库表上创建任何字段。 到目前为止,一切都很好。

如果现在使用GET请求在虚拟字段上使用过滤器调用此实体,则会返回以下错误:

 <错误xmlns =" http://docs.oasis-open.org/odata/ns/metadata">
  500 
 <消息>
 无法在以下行设置参数:1.参数必须是字符串
 
 
 

在调试过程中,我还遇到了以下异常文本:(属性VHierarchyNodeLevel被标记为虚拟)

选择a.modifiedAt AS" a_modifiedAt",a.createdAt AS" a_createdAt",a.createdBy AS" a_createdBy",a.modifiedBy AS" a_modifiedBy",a.VId AS" a_VId",a.VName AS" a_VName"  ",a.VHierarchyNodeLevel AS" a_VHierarchyNodeLevel"来自Service_PlanningUnits,其中a.VHierarchyNodeLevel <=?  LIMIT 128 OFFSET 0 

是否有可能将字段标记为虚拟字段,但是如果请求中存在针对此查询的过滤器,则会将虚拟字段添加到数据库查询的WHERE子句中?

在CDS实体之后,将虚拟字段填充在on.after(" READ",...)。

实体PlanningUnit:托管{
   键VId:UUID;
       VName:字符串;
       virtual VHierarchyNodeLevel:整数;
 }
 
付费偷看设置
发送
2条回答
黑丝骑士
1楼 · 2020-08-30 01:59.采纳回答

亲爱的西蒙·佩斯托弗,

非常感谢您为我们提供了详细的分析。 实际上,虚拟字段一定不能出现在SQL语句的WHERE子句中。

我们将研究一种修复程序,以防止将来发生这种情况。

但是,强烈建议不要对虚拟字段应用过滤条件,因为这样会大大降低性能(必须从数据库中提取所有项目,对于每个条目,都必须计算虚拟字段,然后才计算结果集 被过滤)。

再次感谢您!

David

CJones
2楼-- · 2020-08-30 01:47

可能相关...

你好,正如我所承诺的,我刚刚在 https://github.com/SAP-samples/cloud-cap-samples/blob/a6ae7cfc8db22daf007138f6f206eba602345b39 srv/admin-service.cds#L16

 service AdminService {...
   从my.OrderItems {
     *,
     数量* book.price作为netAmount @(Core.Computed):小数(9,2)
   };
 }
 
机制是:

将这些计算出的字段转换为SQL视图后,您可以根据它们进行任意过滤和排序。

您不必像示例中那样显式添加@ Core.Computed批注,因为只要将计算字段公开给OData,我们就会自动添加。

您还可以通过在示例根目录中执行以下操作,检查映射到SQL数据库时将CDS定义转换为什么: cds packages/bookshop/srv/admin-service.cds -2 sql> t.sql

例如 上面显示的实体变为以下CREATE VIEW语句:

创建视图AdminService_OrderItems AS SELECT
   OrderItems_0.ID,
   OrderItems_0.amount,
   OrderItems_0.amount * book_1.price AS netAmount,
   OrderItems_0.parent_ID,
   OrderItems_0.book_ID
 FROM(sap_capire_bookshop_OrderItems AS OrderItems_0左联接sap_capire_bookshop_Books AS book_1 ON(OrderItems_0.book_ID = book_1.ID));
 

Daniel

一周热门 更多>