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

时间:2019-02-12 10:05:19

标签: odata sapui5 abap

我正在创建一个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

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

2 个答案:

答案 0 :(得分:1)

如果(click)="clickOperator(operators.allClear)"中存在一个错误,使其无法处理同一组件的多个aggregate(warpbreaks$breaks,list(warpbreaks$wool,warpbreaks$tension),length) Group.1 Group.2 x 1 A L 9 2 B L 9 3 A M 9 4 B M 9 5 A H 9 6 B H 9 过滤器,则您无法等待OSS。我建议将其包装在一个新的静态方法中,该方法将产生以下逻辑(如果您对ABAP的实现感到困惑,我会在有空的时候尝试至少部分地实现它):

  1. 使用REGEX获取/iwcor/cl_odata_expr_utils=>get_filter_select_options内的NE的所有实例。
  2. 将每个<COMPONENT> ne '<VALUE>'替换为(),以便会有(<COMPONENT>)。
  3. 使用修改后的查询呼叫<COMPONENT>_<i>
  4. 通过再次将<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来修改rt_select_options的结果。

答案 1 :(得分:1)

我找不到源,但是我记得不支持多个“ ne”。当您在SE16中执行多个负片时,会显示一些警告,这不是同一件事吗?

我找到了Business ByDesign的摘录:

  

不能使用OR运算符排除两个值(例如:$ filter = CACCDOCTYPE ne'1000'或CACCDOCTYPE 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.