CAP扩展方案-如何询问过滤器?

2020-08-15 20:21发布

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

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


我们刚刚启动了一个项目,使用CAP Java为SuccessFactors构建新的扩展。 我们需要做的第一件事之一就是为持久保存在SF中而不是HANA中的实体(就像它们中的大多数一样)处理读取场景。 我需要确定传入了哪些过滤器,然后使用它们从SF构建一个类似的查询(使用SAP Cloud SDK)。

我不敢相信这有多难! 我(Java开发人员)同事的方法是(使用Spring Boot API)获取整个请求url,然后以这种方式确定过滤器。 我认为"必须有更好的方法,因为这应该是CAP的核心重点"。

经过反复试验,我设法产生了这种基本方法(参见下文),这使我可以继续进行自己的开发。 这是一项正在进行的工作(顺便说一句,我不是Java专家),需要进行增强以处理诸如OR条件和诸如NE或LT之类的谓词。

有人有更好的方法吗? 我并不是真的要整理这段代码(例如,使用groupBy方法)。 相反,我的意思是还有其他可用的CAP Java API吗?

我的另一个问题是," 扩展方案的文档在哪里?"。 我看过了

几乎所有这些内容都与未开发的CAP方案有关,例如著名的书店示例。 在我们扩展后端系统(例如S/4(尤其是S/4 Cloud))的情况下,没有任何事情 或SuccessFactors。 许多示例都显示了诸如创建订单时如何更新书籍存货之类的事情,但与扩展方案并不相关。 我们需要的第一件事是如何

询问由UI传递给CAP的读取请求。 对于我在代码中使用的SAP类和接口,没有任何文档。 许多类甚至都没有公共的JavaDoc! 我确实找到了一个有关扩展的教程,但这是针对node.js CAP的。

Iwona Hahn 您能帮我找到一些有关扩展方案的文档吗?

公共静态Map  mapFilterFieldsFromSimpleCqnSelect(CqnSelect cqn){
         Map  filtersMap = new HashMap ();

         如果(cqn.where()。isPresent()){
             CqnPredicate pred = cqn.where()。get();
             Stream 令牌;
            
            //建立属性名称清单
             令牌= pred.tokens();
             List 属性= tokens.filter(令牌-> ElementRefImpl的令牌实例)
                                             .map(ElementRefImpl.class :: cast)
                                             .map((ref)-> ref.displayName())
                                             .collect(Collectors.toList());
    
            //建立栏位值清单
             令牌= pred.tokens();
             List 值= tokens.filter(令牌-> CqnStrLiteral的令牌实例)
                                         .map(CqnStrLiteral.class :: cast)
                                         .map((lit)-> lit.value())
                                         .collect(Collectors.toList());
    
            //组合成地图
             for(int i = 0; i 

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

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


我们刚刚启动了一个项目,使用CAP Java为SuccessFactors构建新的扩展。 我们需要做的第一件事之一就是为持久保存在SF中而不是HANA中的实体(就像它们中的大多数一样)处理读取场景。 我需要确定传入了哪些过滤器,然后使用它们从SF构建一个类似的查询(使用SAP Cloud SDK)。

我不敢相信这有多难! 我(Java开发人员)同事的方法是(使用Spring Boot API)获取整个请求url,然后以这种方式确定过滤器。 我认为"必须有更好的方法,因为这应该是CAP的核心重点"。

经过反复试验,我设法产生了这种基本方法(参见下文),这使我可以继续进行自己的开发。 这是一项正在进行的工作(顺便说一句,我不是Java专家),需要进行增强以处理诸如OR条件和诸如NE或LT之类的谓词。

有人有更好的方法吗? 我并不是真的要整理这段代码(例如,使用groupBy方法)。 相反,我的意思是还有其他可用的CAP Java API吗?

我的另一个问题是," 扩展方案的文档在哪里?"。 我看过了

几乎所有这些内容都与未开发的CAP方案有关,例如著名的书店示例。 在我们扩展后端系统(例如S/4(尤其是S/4 Cloud))的情况下,没有任何事情 或SuccessFactors。 许多示例都显示了诸如创建订单时如何更新书籍存货之类的事情,但与扩展方案并不相关。 我们需要的第一件事是如何

询问由UI传递给CAP的读取请求。 对于我在代码中使用的SAP类和接口,没有任何文档。 许多类甚至都没有公共的JavaDoc! 我确实找到了一个有关扩展的教程,但这是针对node.js CAP的。

Iwona Hahn 您能帮我找到一些有关扩展方案的文档吗?

公共静态Map  mapFilterFieldsFromSimpleCqnSelect(CqnSelect cqn){
         Map  filtersMap = new HashMap ();

         如果(cqn.where()。isPresent()){
             CqnPredicate pred = cqn.where()。get();
             Stream 令牌;
            
            //建立属性名称清单
             令牌= pred.tokens();
             List 属性= tokens.filter(令牌-> ElementRefImpl的令牌实例)
                                             .map(ElementRefImpl.class :: cast)
                                             .map((ref)-> ref.displayName())
                                             .collect(Collectors.toList());
    
            //建立栏位值清单
             令牌= pred.tokens();
             List 值= tokens.filter(令牌-> CqnStrLiteral的令牌实例)
                                         .map(CqnStrLiteral.class :: cast)
                                         .map((lit)-> lit.value())
                                         .collect(Collectors.toList());
    
            //组合成地图
             for(int i = 0; i   
付费偷看设置
发送
3条回答
Nir深蓝
1楼 · 2020-08-15 21:05.采纳回答

嗨,迈克,

我们在公共cloud-cap-samples-java存储库中有一个远程S/4 OData扩展用例的示例: https://github.com/SAP-samples/cloud-cap-samples-java/tree/odata-service-consumption (位于odata-service-consumption分支中)。

具体来说,该类在示例中处理从CQN到OData的转换: https://github.com/SAP-samples/cloud-cap-samples-java/blob/odata-service -consumption/srv/src/main/java/my/bookshop/handlers/external/ApiBusinessPartnerHandler.java

您可能知道,Node.js可以开箱即用地处理远程OData服务。 我们还在Java中开发此功能,但尚未准备就绪。

CQN确实是一种强大的野兽,它可以带来一些复杂性。 特别是当必须分析CQN语句时,我们还没有许多API可以简化此任务。 Matthias Schur 可能会提供更多的提示,说明现有的API如何帮助完成任务 从CQN检索过滤器。

最好的问候,
马克

粗暴的香蕉
2楼-- · 2020-08-15 21:15

为远程服务创建CAP代理时,我的期望是,如果我不想添加任何其他限制:

 readEntitySet(CdsReadEventContext context){
return remoteService.readEntitySet(context);
}

在大多数情况下,CAP中间件必须限制用户可以通过某些属性读取的内容。 让我们以最简单的示例用户名为例:

 readEntitySet(CdsReadEventContext context){
where = context.getCqn()。where();
where.addAnd(" username =" + context。 getUser());
context.setCqn()。setWhere(where);
remoteService.readEntitySet(context);
}

将CAP指向< a hraf=" https://people.sap.com/marcbecker">马克·贝克尔,马蒂亚斯·舒尔

N-Moskvin
3楼-- · 2020-08-15 21:09

嗨,马克,非常感谢您的回复。 您使用的API看起来很相似,但是您的代码当然更全面。 很高兴知道我处在正确的轨道上,未来更加光明。

也许您应该更广泛地共享这些示例应用程序。 例如,一个特定的扩展教程会很棒

一周热门 更多>