Как исключить несколько значений в вызове OData? - PullRequest
0 голосов
/ 12 февраля 2019

Я создаю приложение SAPUI5.Это приложение подключено к бэкэнд-системе SAP через OData.В приложении 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 голосов
/ 13 февраля 2019

Я не могу найти источник, но я помню, что несколько "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.
0 голосов
/ 12 февраля 2019

Если внутри /iwcor/cl_odata_expr_utils=>get_filter_select_options есть ошибка, из-за которой невозможно обрабатывать несколько фильтров 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. Измените результат rt_select_options, снова изменив COMPONENT_<i> на <COMPONENT>.
...