Как исключить несколько значений в вызове OData?

Я создаю приложение SAPUI5. Это приложение подключено к серверной системе SAP через OData. В приложении SAPUI5 я использую интеллектуальный элемент управления диаграммой. По умолчанию интеллектуальная диаграмма позволяет пользователю создавать фильтры для базовых данных. Это работает нормально, за исключением случаев, когда вы пытаетесь использовать несколько «не равных» для одного свойства. Есть ли способ сделать это?

Я обнаружил, что все свойства в выражении and_expression (включая вложенные or_expressions) должны иметь уникальное имя.

The reason why two parameters with the same property don't get parsed into the select options:

/IWCOR/CL_ODATA_EXPR_UTILS=>GET_FILTER_SELECT_OPTIONS takes the expression you pass and parses it into a table of select options.

The select option table returned is of type /IWCOR/IF_ODATA_TYPES=>EDM_SELECT_OPTION_T which is a HASHED TABLE .. WITH UNIQUE KEY property.

From: 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

Обычно я хочу, чтобы это исключало элементы с категорией «Ноутбук» и «Смартфон» из моего набора результатов, который я извлекаю из бэкэнда.

Можете ли вы поделиться фрагментом клиентского кода, который создает фильтр?

Dorad 12.02.2019 11:19

Разделение запроса на фильтры (it_filter_select_options) мной не изменено. Это стандартная функциональность (методы) sap gw - не знаю, где это делается. Позже вы можете получить доступ к таблице фильтров внутри методов DPC EXT.

ChristianR 12.02.2019 11:26

В ПОРЯДКЕ. Вы сказали, что «умная диаграмма позволяет пользователю создавать фильтры». Как это делается?

Dorad 12.02.2019 11:29
ссылка на сайт - при использовании смарт-чарта из коробки у вас есть кнопка настроек. Если вы нажмете ее, вы сможете сделать некоторые сортировки и фильтровать материал. То, что можно сортировать и фильтровать, исходит из метаданных. Метаданные создаются из службы, созданной в транзакции SEGW.
ChristianR 12.02.2019 11:42

Кроме того, Вы сказали, что «вы не можете комбинировать термины« NE »с« ИЛИ »». Запрос: (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. Я публикую возможный ответ сейчас. поправь меня, если я тебя не понял.

Dorad 12.02.2019 11:43

Это будет допустимо: `"Категория ne 'Смартфон' или Категория ne 'Ноутбук'" `. Но это не то, что я хочу, потому что оба термина «NE» должны быть объединены. Но когда он сочетается с «И», это вызывает проблемы ->, как уже упоминалось, возвращаемая таблица параметров выбора имеет тип /IWCOR/IF_ODATA_TYPES=>EDM_SELECT_OPTION_T, который является HASHED TABLE.. WITH UNIQUE KEY свойство.

ChristianR 12.02.2019 12:55

Что будет действительным? Запрос в вашем вопросе относится к оператору and, что разумно. Что вы имеете в виду под словом «комбинированный»? Range Table — это набор знаков, операторов и значений.

Dorad 12.02.2019 12:59

Извините, трудно описать то, что я хотел сказать. F.ex. Когда вы настраиваете два фильтра «EQ» для одного свойства (категории) -> оно автоматически преобразуется в: Категория eq «ABC» ИЛИ Категория eq «ABC». Но в случае нескольких «NE» вы не можете использовать «ИЛИ». (Вы должны использовать «И» -> и это приводит к этой проблеме)

ChristianR 12.02.2019 13:06

просто чистая логическая попытка, а как насчет not( Category eq 'Smartphone' or Category eq 'Notebook' ) and ...?

Sandra Rossi 12.02.2019 13:27

Похоже на ошибку. Если интеллектуальный элемент управления позволяет ввести это условие, сервер должен правильно его обработать. Если это не так, вам следует создать тикет с поддержкой SAP.

Florian 14.02.2019 11:04

@ Флориан Согласен. Фильтр (Category ne 'Smartphone' and Category ne 'Notebook') and Purchaser eq 'CompanyABC' and BuyDate eq datetime'2018-10-12T02:00:00' эквивалентен not ( Category eq 'Smartphone' or Category eq 'Notebook' ) and Purchaser eq 'CompanyABC' and BuyDate eq datetime'2018-10-12T02:00:00', поэтому его можно сохранить в SELECT-OPTIONS { Category, [{E EQ Smartphone},{E EQ Notebook}] },{ Purchaser, [{I EQ CompanyABC}] },{ BuyDate, [{I EQ 20181012020000}] }, чтобы код можно было улучшить, сделав его более толерантным. Но, возможно, E (исключения) не обрабатываются стандартным (?)

Sandra Rossi 14.02.2019 17:21

Да, возможно, эти вещи находятся в списке неподдерживаемых. Но если это так, умный элемент управления не должен предлагать эти опции в первую очередь.

Florian 14.02.2019 17:59
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
12
3 213
2

Ответы 2

Если внутри /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>.

Привет, Дорад, я попробовал то, что вы описали, но это заканчивается этой ошибкой: cx_no_check.

ChristianR 22.02.2019 10:40

Я не могу найти источник, но я помню, что несколько "ne" не поддерживаются. Разве это не то же самое, что происходит, когда вы делаете несколько негативов в SE16, отображается какое-то предупреждение?

Я нашел этот отрывок для Business ByDesign:

Excluding two values using the OR operator (for example: $filter=CACCDOCTYPE ne ‘1000’ or CACCDOCTYPE ne ‘4000’) is not possible.

Обходной путь, который я вижу, состоит в том, чтобы выбрать категории, которые вы активно хотите, а не те, которые вам не нужны в приложении 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.

Эй, дело в том, что функциональность «исключения» - это что-то. который выходит из коробки интеллектуального управления диаграммой. Таким образом, вызов автоматически запускается в этой форме с несколькими «NE». Ваша идея выбирать только то, что нужно, а не то, что не нужно, кажется хорошей. Но проблема в том, что я не могу выполнять запросы getEntity для каждой записи, которую хочу.

ChristianR 14.02.2019 10:15

Я понимаю. Положительный фильтр, подобный этому, должен работать: XYZ/SmartChartSet?$filter=(Category eq 'Ноутбук' или Category eq 'Watch') и Purchaser eq 'CompanyABC'

Mikael G 16.02.2019 18:33

Другие вопросы по теме