【问题标题】:How to exclude multiple values in OData call?如何在 OData 调用中排除多个值?
【发布时间】:2019-02-14 01:31:28
【问题描述】:

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

我发现“and_expression”中的所有属性(包括嵌套的 or_expressions)都必须具有唯一名称。

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

/IWCOR/CL_ODATA_EXPR_UTILS=>GET_FILTER_SELECT_OPTIONS 获取您传递的表达式并将其解析为选择选项表。

返回的选择选项表是/IWCOR/IF_ODATA_TYPES=>EDM_SELECT_OPTION_T 类型,它是HASHED TABLE .. WITH UNIQUE KEY 属性。

发件人:https://archive.sap.com/discussions/thread/3170195

问题是您不能将NE 术语与OR 结合使用。因为NE之后的两个参数都不应该出现在结果集中。

所以最后it_filter_select_options 是空的,只有iv_filter_string 被填充。

是否有解决此问题的手动方法(评估iv_filter_string)来处理多个NE 术语?

这是一个示例请求:

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

通常我希望这从我从后端检索的结果集中排除具有“笔记本”和“智能手机”类别的项目。

【问题讨论】:

  • 你能分享一下构建过滤器的客户端代码吗?
  • 我没有修改将请求分成过滤器(it_filter_select_options)。这是一个标准的 sap gw 功能(方法) - 不确定这是在哪里完成的。稍后您可以访问 DPC EXT 方法中的过滤器表。
  • 好的。您说“智能图表让用户创建过滤器”。这是怎么做到的?
  • link - 使用智能图表时,您有一个开箱即用的设置按钮。如果你按下它,你可以做一些排序和过滤东西。可排序和可过滤的内容来自元数据。元数据是在事务 SEGW 中创建的服务之外创建的。
  • 另外,您说“您不能将 'NE' 术语与 'OR' 结合使用”。查询为:(Category ne 'Smartphone' and Category ne 'Notebook') and Purchaser eq 'CompanyABC' and BuyDate eq datetime'2018-10-12T02:00:00'。您提到的变量名称也令人困惑。 /iwcor/cl_odata_expr_utils=>get_filter_select_options 接收 iv_expression 并返回 rt_select_options。我现在发布一个可能的答案。如果我没有得到你,请修复我。

标签: odata sapui5 abap


【解决方案1】:

如果/iwcor/cl_odata_expr_utils=>get_filter_select_options内部存在bug,导致无法处理同一组件的多个NE过滤器,你不能等待OSS。我建议将它包装在一个新的静态方法中,该方法将产生以下逻辑(如果你会坚持使用 ABAP 实现,我会在有时间时尝试至少部分实现它):

  1. () 中获取<COMPONENT> ne '<VALUE>' 的所有实例(使用正则表达式)。
  2. 将每个<COMPONENT> 替换为<COMPONENT>_<i>,这样就会有(<COMPONENT>_1 ne '<VALUE_1>' and <COMPONENT>_2 ne '<VALUE_2>' and... <COMPONENT>_<n> ne '<VALUE_n>')。
  3. 使用修改后的查询致电/iwcor/cl_odata_expr_utils=>get_filter_select_options
  4. 通过将COMPONENT_<i> 再次更改为<COMPONENT> 来修改rt_select_options 结果。

【讨论】:

  • 嗨,Dorad,我尝试了您描述的内容,但最终出现以下错误:cx_no_check。
【解决方案2】:

我找不到来源,但我记得不支持多个“ne”。当你在 SE16 中做多个底片时,这不是同样的事情,会显示一些警告吗?

我为 Business ByDesign 找到了这段摘录:

无法使用 OR 运算符排除两个值(例如:$filter=CACCDOCTYPE ne ‘1000’ 或 CACCDOCTYPE ne ‘4000’)。

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

我也可以确认我的代码sn-p我用了很久的过滤也有同样的问题...

* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCL_MGW_ABS_DATA->FILTERING
* +-------------------------------------------------------------------------------------------------+
* | [--->] IO_TECH_REQUEST_CONTEXT        TYPE REF TO /IWBEP/IF_MGW_REQ_ENTITYSET
* | [<-->] CR_ENTITYSET                   TYPE REF TO DATA
* | [!CX!] /IWBEP/CX_MGW_BUSI_EXCEPTION
* | [!CX!] /IWBEP/CX_MGW_TECH_EXCEPTION
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD FILTERING.

  FIELD-SYMBOLS <lt_entityset> TYPE STANDARD TABLE.
  ASSIGN cr_entityset->* TO <lt_entityset>.

  CHECK: cr_entityset   IS BOUND,
         <lt_entityset> IS ASSIGNED.

  DATA(lo_filter) = io_tech_request_context->get_filter( ).

  /iwbep/cl_mgw_data_util=>filtering(
    exporting it_select_options = lo_filter->get_filter_select_options( )
    changing  ct_data           = <lt_entityset> ).

ENDMETHOD.

【讨论】:

  • 嘿,问题是“排除”功能是什么。智能图表控件开箱即用。因此,呼叫会以这种形式自动触发,并带有多个“NE”。您只选择想要的东西而不是不想要的东西的想法似乎很好。但问题是我无法为我想要的每条记录执行 getEntity 请求。
  • 我明白了。像这样的积极过滤器应该可以工作:XYZ/SmartChartSet?$filter=(Category eq 'Laptop' or Category eq 'Watch') and Purchaser eq 'CompanyABC'
猜你喜欢
  • 2022-09-30
  • 2022-09-22
  • 2020-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-22
  • 2015-05-24
  • 2017-03-21
相关资源
最近更新 更多