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



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

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

具有相同属性的两个参数无法解析为选择选项的原因:

/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被填充。

有没有一种手动的方法来处理多个NE术语来面对这个问题(评估iv_filter_string)?

这将是一个示例请求:

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

通常,我希望从后端检索的结果集中排除类别为"笔记本"one_answers"智能手机"的项目。

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

  1. 获取()<COMPONENT> ne '<VALUE>'的所有实例(使用REGEX)
  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结果

我找不到源代码,但我记得不支持多个"ne"。当你在SE16中做多个否定时,会显示一些警告,这不是同样的事情吗?

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

使用OR运算符排除两个值(例如:$filter=CACCDOCTYPE ne"1000"或CACCDOCYPE ne"4000")是不可能的。

我看到的解决方法是选择你想要的类别,而不是UI5应用程序中没有的类别。

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

* <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.

相关内容

  • 没有找到相关文章

最新更新