如何在CAP中使用外部OData v2服务实现$ count = true支持?

2020-08-15 18:27发布

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

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


在由外部OData v2服务提供服务的实体上运行Fiori预览时,页面显示错误"不支持功能:fluent API的方法.count"。 在服务实现中有什么方法可以解决?

这将在查询中支持$ filter(因此不是我要的解决方案),但是出于测试目的,我尝试检查req.query.cqn.count是否为真,然后执行显式的OData v2 $ count 要求:

等待返回ext.tx(req).get("/img/User/$ count")

这确实得到了计数,但是在服务实现中返回数字会导致以下错误:

 [2020-07-06T19:41:42.970Z | 错误|  [1773773]:在实体集合的序列化期间发生错误。
 

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

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


在由外部OData v2服务提供服务的实体上运行Fiori预览时,页面显示错误"不支持功能:fluent API的方法.count"。 在服务实现中有什么方法可以解决?

这将在查询中支持$ filter(因此不是我要的解决方案),但是出于测试目的,我尝试检查req.query.cqn.count是否为真,然后执行显式的OData v2 $ count 要求:

等待返回ext.tx(req).get("/img/User/$ count")

这确实得到了计数,但是在服务实现中返回数字会导致以下错误:

 [2020-07-06T19:41:42.970Z | 错误|  [1773773]:在实体集合的序列化期间发生错误。
 
付费偷看设置
发送
5条回答
ZJXianG
1楼 · 2020-08-15 18:51.采纳回答

请参见 /img/comments/ 13085009/view.html 作为解决方案。

问题"找不到数据。尝试调整过滤器设置。" 在使用注释限制列后已解决。 我无法弄清楚为什么会这样。

蓋茨
2楼-- · 2020-08-15 18:56

嗨,奥琳娜,

谢谢,它肯定有用。 但是,即使看起来我返回的结构正确,数据也不会显示在Fiori预览中。 "找不到数据。请尝试调整过滤器设置。"

服务实施:

 srv.on('READ',User,async req => {
         让结果= {}
         如果(req.query.cqn.count){
             删除req.query.count
             删除req.query.cqn.count
             const queryObject = cqnToQuery(req.query,{
                 种类:" odata"
               })
             const count =等待ext.tx(req).get("/img/User/$ count")
             结果=等待ext.tx(req).get(queryObject.path +"&$ inlinecount = allpages")
             req.query.count = true
             req.query.cqn.count = true
             result。$ count =计数
         }
         其他{
             结果=等待ext.tx(req).run(req.query)
         }

         result.map(实体=> convertDatesv2Tov4(要求,实体))
         返回结果;
     })
 

显然,SuccessFactors不支持$ inlinecount,因此除了查询之外,我还获得了显式的$ count。 (这打破了我认为的$ filter和$ inlinecount的组合)

返回的数据:

 {
   " @ odata.context":" $ metadata#User",
   " @ odata.count":" 90",
   "值":[
     {
       " userId":" 1",
       " defaultFullName":" AA BB"
     },
     {
       " userId":" 23",
       " defaultFullName":" XX YY"
     }
   ]
 } 
软件心理学工程师
3楼-- · 2020-08-15 19:01

嗨,Pieter,

看来,在使用流畅的api进行外部服务调用时,您遇到了很多限制。 我确实遇到了其中的少数几个,并决定脱离使用流畅的api框架。 我所做的就是将axios称为自己,如下所示:

 const axios = require(" axios")。default;
 const client = axios.create(options);  <-选项是我的基本请求,即基本URL和身份验证
 client.post(path,data)<---您的案例路径=/User/$ count
 

我相信您已经知道cds框架在后台使用axios。 这只是一个DIY过程。

SAP德到
4楼-- · 2020-08-15 19:01

嗨,Pieter,

正如我在上面给您的链接中提到的那样,node.js运行时中的自定义处理程序应使用OData v4,而不是OData v2。 另外,结果变量应该是一个数组(也写在链接中),请调整结果初始化。

您是否正在使用OData v2适配器 https://www .npmjs.com/package/@ sap/cds-odata-v2-adapter-proxy 还是您要制作自己的?

最诚挚的问候,

Olena

DafaDDDa
5楼-- · 2020-08-15 19:03

嗨Olena,

感谢您的跟进。 我共享的代码可以正常工作,但是后来我发现问题必须与注解或限制Fiori预览中使用的属性有关。 查看接受的答案。

最诚挚的问候,

Pieter

一周热门 更多>