我正在创建一个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实现所困扰,我会在有时间时尝试至少部分实现它):
- 获取
()
中<COMPONENT> ne '<VALUE>'
的所有实例(使用REGEX) - 将每个
<COMPONENT>
替换为<COMPONENT>_<i>
,因此将有(<COMPONENT>_1 ne '<VALUE_1>' and <COMPONENT>_2 ne '<VALUE_2>' and... <COMPONENT>_<n> ne '<VALUE_n>'
) - 使用修改后的查询调用
/iwcor/cl_odata_expr_utils=>get_filter_select_options
- 通过将
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.