CAP的自定义逻辑错误:"无效的列名:COUNT"

2020-08-24 02:08发布

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

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


我正在使用CAP创建OData服务。

目标是使以下网址正常工作。

 /analytics-output/ApplicationUsage?select = application,count&$ orderby = count 

这是服务模型。

 @readonly
     实体ApplicationUsage {
         关键应用:String(80);
             计数:十进制;
             timestamp:DateTime null;
     }
 

这是自定义逻辑(js文件)的实现

 srv.on('READ','ApplicationUsage',(req)=> {
         selectQuery ='选择'+
             "将关键的app.application作为应用程序," +
             'COUNT(app.application)as count:十进制'+
             '来自cis.fiorianalytics。动作作为动作'+
             '将action.applicationID = app.id内加入cis.fiorianalytics.Apps作为应用程序'+
             '按应用程序分组';

         让查询= cds.parse.cql(selectQuery);
        //附加时间戳记WHERE和ORDERBY条件
         query.SELECT.orderBy = req.query.SELECT.orderBy;
         query.SELECT.where = req.query.SELECT.where;
         返回cds.run(query);
     }); 

这在本地部署中效果很好,我得到了数据。 但是它无法在HANA中工作(在部署到试用版CF之后)。

我最终在浏览器中得到了一个不太有用的错误。

 <错误xmlns =" http://docs.oasis-open.org/odata/ns/metadata">
  500 
 内部服务器错误
  

当我查看SCP上的"日志"时,我看到下面的行似乎与之相关。

任何帮助将不胜感激。

(34.0 kB)

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

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


我正在使用CAP创建OData服务。

目标是使以下网址正常工作。

 /analytics-output/ApplicationUsage?select = application,count&$ orderby = count 

这是服务模型。

 @readonly
     实体ApplicationUsage {
         关键应用:String(80);
             计数:十进制;
             timestamp:DateTime null;
     }
 

这是自定义逻辑(js文件)的实现

 srv.on('READ','ApplicationUsage',(req)=> {
         selectQuery ='选择'+
             "将关键的app.application作为应用程序," +
             'COUNT(app.application)as count:十进制'+
             '来自cis.fiorianalytics。动作作为动作'+
             '将action.applicationID = app.id内加入cis.fiorianalytics.Apps作为应用程序'+
             '按应用程序分组';

         让查询= cds.parse.cql(selectQuery);
        //附加时间戳记WHERE和ORDERBY条件
         query.SELECT.orderBy = req.query.SELECT.orderBy;
         query.SELECT.where = req.query.SELECT.where;
         返回cds.run(query);
     }); 

这在本地部署中效果很好,我得到了数据。 但是它无法在HANA中工作(在部署到试用版CF之后)。

我最终在浏览器中得到了一个不太有用的错误。

 <错误xmlns =" http://docs.oasis-open.org/odata/ns/metadata">
  500 
 内部服务器错误
  

当我查看SCP上的"日志"时,我看到下面的行似乎与之相关。

任何帮助将不胜感激。

(34.0 kB)
付费偷看设置
发送
4条回答
SAP浪
1楼-- · 2020-08-24 02:41

克里希纳,你好

" req.query.SELECT.orderBy"中的order by子句不适合您的SQL,因为该模型不知道您正在使用的联接(该模型是OData查询处理的基础)。 您需要手动调整模型或构建子句,而不是从" req.query.SELECT"中提取。

最好,
塞巴斯蒂安

克里希纳,你好

解析后的查询是什么样的?

最好,
塞巴斯蒂安

槿木_熙
3楼-- · 2020-08-24 02:32

在本地和CF上,它们看起来都一样,看起来也不错。

 {
   "选择": {
     "来自":{
       " join":"内部",
       "参数":[
         {
           "参考":[
             " cis.fiorianalytics.Actions"
           ],
           " as":"动作"
         },
         {
           "参考":[
             " cis.fiorianalytics.Apps"
           ],
           " as":" app"
         }
       ],
       "上": [
         {
           "参考":[
             "行动",
             " applicationID"
           ]
         },
         " =",
         {
           "参考":[
             "应用"
             "ID"
           ]
         }
       ]
     },
     "列": [
       {
         "键":是的,
         "参考":[
           "应用"
           "应用"
         ]
       },
       {
         "键":是的,
         "参考":[
           "行动",
           "用户身份"
         ]
       },
       {
         " func":" COUNT",
         "参数":[
           {
             "参考":[
               "行动",
               "用户身份"
             ]
           }
         ],
         " as":" count",
         "投": {
           " type":"十进制"
         }
       },
       {
         " val":1
         " as":" userCount",
         "投": {
           " type":"整数"
         }
       }
     ],
     "通过...分组": [
       {
         "参考":[
           "应用"
           "应用"
         ]
       },
       {
         "参考":[
           "行动",
           "用户身份"
         ]
       }
     ]
   }
 }
 
nice_wp
4楼-- · 2020-08-24 02:33

您好,克里希纳,

您已使用属性计数定义了实体ApplicationUsage。 如果现在在请求中执行" $ orderby = count",则这将转换为" req.query.SELECT.orderBy"中的" order by ApplicationUsage.count asc",即列上的order by。 但是,在您的SQL中,您联接了两个表,而创建别名CAP不知道,而count实际上是一个聚合,而CAP也不知道。 因此," req.query.SELECT.orderBy"的内容不适合您的SQL。

顺便说一句,SQLite只是忽略了这样的错误,这就是为什么您不在本地遇到它们的原因。

最佳,
塞巴斯蒂安

一周热门 更多>