Я создаю приложение 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_OPTIONStakes 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_Twhich is aHASHED TABLE .. WITH UNIQUE KEYproperty.
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
Обычно я хочу, чтобы это исключало элементы с категорией «Ноутбук» и «Смартфон» из моего набора результатов, который я извлекаю из бэкэнда.
Разделение запроса на фильтры (it_filter_select_options) мной не изменено. Это стандартная функциональность (методы) sap gw - не знаю, где это делается. Позже вы можете получить доступ к таблице фильтров внутри методов DPC EXT.
В ПОРЯДКЕ. Вы сказали, что «умная диаграмма позволяет пользователю создавать фильтры». Как это делается?
Кроме того, Вы сказали, что «вы не можете комбинировать термины« 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. Я публикую возможный ответ сейчас. поправь меня, если я тебя не понял.
Это будет допустимо: `"Категория ne 'Смартфон' или Категория ne 'Ноутбук'" `. Но это не то, что я хочу, потому что оба термина «NE» должны быть объединены. Но когда он сочетается с «И», это вызывает проблемы ->, как уже упоминалось, возвращаемая таблица параметров выбора имеет тип /IWCOR/IF_ODATA_TYPES=>EDM_SELECT_OPTION_T, который является HASHED TABLE.. WITH UNIQUE KEY свойство.
Что будет действительным? Запрос в вашем вопросе относится к оператору and, что разумно. Что вы имеете в виду под словом «комбинированный»? Range Table — это набор знаков, операторов и значений.
Извините, трудно описать то, что я хотел сказать. F.ex. Когда вы настраиваете два фильтра «EQ» для одного свойства (категории) -> оно автоматически преобразуется в: Категория eq «ABC» ИЛИ Категория eq «ABC». Но в случае нескольких «NE» вы не можете использовать «ИЛИ». (Вы должны использовать «И» -> и это приводит к этой проблеме)
просто чистая логическая попытка, а как насчет not( Category eq 'Smartphone' or Category eq 'Notebook' ) and ...?
Похоже на ошибку. Если интеллектуальный элемент управления позволяет ввести это условие, сервер должен правильно его обработать. Если это не так, вам следует создать тикет с поддержкой SAP.
@ Флориан Согласен. Фильтр (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 (исключения) не обрабатываются стандартным (?)
Да, возможно, эти вещи находятся в списке неподдерживаемых. Но если это так, умный элемент управления не должен предлагать эти опции в первую очередь.





Если внутри /iwcor/cl_odata_expr_utils=>get_filter_select_options есть ошибка, из-за которой он не может обрабатывать несколько фильтров 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 с измененным запросом.rt_select_options, снова заменив COMPONENT_<i> на <COMPONENT>.Привет, Дорад, я попробовал то, что вы описали, но это заканчивается этой ошибкой: cx_no_check.
Я не могу найти источник, но я помню, что несколько "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 для каждой записи, которую хочу.
Я понимаю. Положительный фильтр, подобный этому, должен работать: XYZ/SmartChartSet?$filter=(Category eq 'Ноутбук' или Category eq 'Watch') и Purchaser eq 'CompanyABC'
Можете ли вы поделиться фрагментом клиентского кода, который создает фильтр?