如何在OData调用中排除多个值?

如何在OData调用中排除多个值?,odata,sapui5,abap,Odata,Sapui5,Abap,我正在创建一个SAPUI5应用程序。此应用程序通过OData连接到后端SAP系统。在SAPUI5应用程序中,我使用智能图表控件。开箱即用的智能图表允许用户为基础数据创建过滤器。这很好-除非您尝试对一个属性使用多个“不等于”。有没有办法做到这一点 我发现“and_表达式”(包括嵌套或_表达式)中的所有属性都必须具有唯一的名称 具有相同属性的两个参数未解析到选择选项中的原因: /IWCOR/CL\u ODATA\u EXPR\u UTILS=>GET\u FILTER\u SELECT\u OPTI

我正在创建一个SAPUI5应用程序。此应用程序通过OData连接到后端SAP系统。在SAPUI5应用程序中,我使用智能图表控件。开箱即用的智能图表允许用户为基础数据创建过滤器。这很好-除非您尝试对一个属性使用多个“不等于”。有没有办法做到这一点

我发现“and_表达式”(包括嵌套或_表达式)中的所有属性都必须具有唯一的名称

具有相同属性的两个参数未解析到选择选项中的原因:

/IWCOR/CL\u ODATA\u EXPR\u UTILS=>GET\u FILTER\u SELECT\u OPTIONS
获取您传递的表达式并将其解析为一个选择选项表

返回的选择选项表的类型为
/IWCOR/IF\u ODATA\u TYPES=>EDM\u select\u option\u T
,它是一个
哈希表。。具有唯一键
属性

发件人:

问题是您无法将
NE
术语与
组合。因为
NE
之后的两个参数不应显示在结果集中

因此,在最后,
it\u filter\u select\u options
是空的,只有
iv\u filter\u字符串
被填充

是否有一种手动方法来处理多个
NE
术语来解决此问题(评估
iv\u过滤器\u字符串

这将是一个示例请求:

XYZ/SmartChartSet?$filter=(Category%20ne%20%27Smartphone%27%20and%20Category%20ne%20%27Notebook%27)%20and%20Purchaser%20eq%20%27CompanyABC%27%20and%20BuyDate%20eq%20datetime%272018-10-12T02%3a00%3a00%27&$inlinecount=allpages

通常,我希望从我从后端检索的结果集中排除“Notebook”和“Smartphone”类别的项目。

如果在
/iwcor/cl\u odata\u expr\u utils=>get\u filter\u select\u options
中存在错误,则无法处理同一组件的多个
NE
过滤器,你不能等待OSS。我建议将其封装在一个新的静态方法中,该方法将产生以下逻辑(如果您将被ABAP实现所困扰,我将在有时间时尝试至少部分实现它):

  • 获取
    ()
    (使用正则表达式)中
    ne'
    的所有实例
  • 将每个
    替换为
    ,这样将有(
    \u 1 ne''和\u 2 ne''以及…\u ne''
  • 使用修改后的查询调用
    /iwcor/cl\u odata\u expr\u utils=>get\u filter\u select\u options
  • 通过再次将
    组件
    更改为
    来修改
    rt\u选择选项
    结果

  • 我找不到源代码,但我记得不支持多个“ne”。在SE16中,当您进行多个负片时,会显示一些警告,这难道不是同样的事情吗

    我为Business ByDesign找到了以下摘录:

    不可能使用OR运算符排除两个值(例如:$filter=CACCDOCTYPE ne“1000”或CACCDOCTYPE ne“4000”)

    我看到的解决方法是选择您积极想要的类别,而不是UI5应用程序中不需要的类别

    我还可以确认,我用了很长时间进行过滤的代码片段也有同样的问题

    *---------------------------------------------------------------------------------------+
    *|实例公共方法ZCL_MGW_ABS_数据->过滤
    * +-------------------------------------------------------------------------------------------------+
    *|[-->]IO_TECH_REQUEST_CONTEXT TYPE REF TO/IWBEP/IF_MGW_REQ_ENTITYSET
    *[]CR_实体将类型REF设置为数据
    *|[!CX!]/IWBEP/CX_MGW_BUSI_异常
    *|[!CX!]/IWBEP/CX\u MGW\u TECH\u异常
    * +--------------------------------------------------------------------------------------
    方法过滤。
    字段符号类型标准表。
    将cr_entityset->*分配给。
    检查:cr_entityset已绑定,
    被分配了。
    数据(lo_过滤器)=io_技术_请求_上下文->获取_过滤器()。
    /iwbep/cl_mgw_数据_util=>筛选(
    导出它\u选择\u选项=低过滤器->获取过滤器\u选择选项()
    更改ct_数据=)。
    
    ENDMETHOD.
    您能分享构建过滤器的客户端代码吗?我不会修改将请求分离到过滤器中(it\U filter\U select\U选项)。这是标准的sap gw功能(方法)-不确定在哪里完成。稍后,您可以访问DPC EXT methods.OK中的筛选器表。你说“智能图表让用户创建过滤器”。这是怎么做到的使用智能图表时,您可以使用“设置”按钮。如果你按下它,你可以做一些排序和过滤的东西。可排序和可过滤的内容来自元数据。元数据是从事务SEGW中创建的服务中创建的。此外,您说过“不能将‘NE’术语与‘OR’组合在一起”。查询为:
    (ne类“智能手机”和ne类“笔记本”)和购买者eq“CompanyABC”和购买日期eq datetime“2018-10-12T02:00:00”
    。此外,您提到的变量名称也令人困惑
    /iwcor/cl\u odata\u expr\u utils=>get\u filter\u select\u options
    接收
    iv\u表达式
    并返回
    rt\u select\u options
    。我现在发布一个可能的答案。如果我没有得到你,请修复我。嘿,问题是“排除”功能是从智能图表控件框中出来的。因此,此表单中的呼叫会自动触发多个“NE”。你只选择想要的东西而不选择不想要的东西的想法似乎很好。但问题是我不能对我想要的每一条记录都执行getEntity请求。我明白了。像这样的正过滤器应该可以工作:XYZ/SmartChartSet?$filter=(类别eq‘笔记本电脑’或类别eq‘手表’)和购买者eq‘CompanyABC’嗨,多拉德,我尝试了你所描述的方法,但最终出现了以下错误:cx\u no\u check。