Ui5 SearchField - предложения от нескольких имен свойств? - PullRequest
1 голос
/ 21 июня 2019

Я импортировал справку по поиску O2USERNAME в качестве службы oData в ABAP. Мне бы хотелось, чтобы в UI5 было поле для интерактивного предложения, но я могу заставить работать только один фильтр за раз. Цель состоит в том, чтобы получить предложения от Bname, NameLast и NameFirst.

В SAP-ноте 1671893 ODATA - конвертировать $ filter в опцию выбора ABAP , там говорится:

Все свойства в выражении or_express должны иметь одинаковые имена.

Действительный: "name eq 'Sven' или name eq 'Hugo'"

Неправильно: "имя-экв" Свен "или возраст-экв 20" "

Но это именно то, что мне нужно. Есть ли обходной путь, известный этому?

Вот мой взгляд:

<SearchField id="searchField" width="50%" placeholder="search for..." enableSuggestions="true"
           search="onSearch" suggest="onSuggest"
           suggestionItems="{ path: '/O2usernameSet', sorter: { path: 'NameLast' } }">
    <suggestionItems>
        <SuggestionItem text="{Bname}" description="{path:'NameLast'} {path:'NameFirst'}"
             key="{Bname}"/>
    </suggestionItems>
</SearchField>

и мой контроллер:

onSuggest: function (oEvent) {
    var searchField = oEvent.getSource(),
        sQuery = searchField.getProperty("value"),
        filters1,filters2 = [],
        oBinding = searchField.getBinding("suggestionItems");
        filters2 = new Filter({
                                filters1: [
                                    new Filter("Bname", FilterOperator.Contains, sQuery.toUpperCase())
                                     , new Filter("NameLast", FilterOperator.Contains, sQuery) ,
                                     , new Filter("NameFirst", FilterOperator.Contains, sQuery) 

                                ],
                                and: false
                            });
    oBinding.filter(filters2);

    oBinding.attachEventOnce('dataReceived', function (parentEvent) {
        searchField.suggest();
    }.bind(null, oEvent));
}

Ошибка с бэкэнда с правильно настроенным фильтром:

Произошла следующая проблема: сбой HTTP-запроса500, внутренняя ошибка сервера, {"ошибка": { "Код": "/ IWBEP / CM_MGW_RT / 032", "сообщение":{ «Языки»: «де», "value": "Interner Fehler aufgetreten. Wenden Sie sich and den Systemadministrator" }, "Innererror": { "приложение":{ "Component_id": " removedByMe ", "Service_namespace": " MY_NAMESPACE ", "Service_id": " MY_SERVICE ", "Service_version": "0001" }, "TransactionID": "0BE63D492E4D0210E005CF86AE1FC269", "Временная метка": "20190621120505.9381020", "Error_Resolution": { "SAP_Transaction": "Для администраторов бэкэнда: запустите транзакцию / IWFND / ERROR_LOG в системе-концентраторе SAP Gateway и найдите записи с отметкой времени для получения более подробной информации", "SAP_Note": "См. SAP-ноту 1797736 для анализа ошибок (https://service.sap.com/sap/support/notes/1797736)" }, "errordetails": [{ "Код": "/ IWBEP / CX_MGW_TECH_EXCEPTION", "message": "Interner Fehler aufgetreten. Wenden Sie sich and den Systemadministrator", "Propertyref": "", «Тяжесть»: «ошибка», "Цель": ""} ]} } }

/ IWFND / ERROR_LOG раскрывает указанное выше примечание

1 Ответ

0 голосов
/ 21 июня 2019

Можно ли иметь несколько текстовых фрагментов для каждого типа фильтра?Я имею в виду, можете ли вы, например, сказать, что NameFirst содержит 'Sven' или 'Hugo' или NameLast содержит 'LastName' или 'LastName2'?

Если да, мне придется скорректировать свой ответ, если нет:

ваши orFilter1, orFilter2, orFilter3 не должны быть массивами, поскольку они содержат по 1 объекту Filter каждый,

Во-вторых, в вашей части filter.push есть небольшая ошибка.Более точно, когда вы создаете «конечный» фильтр.

При создании фильтра, содержащего несколько правил фильтра, допускаются следующие обозначения:

new sap.ui.model.Filter(aFilters, bAnd);

Обратите внимание, что aFiltersмассив объектов-фильтров здесь

Но вы даете 4 параметра, и я не думаю, что это сработает.

Итак, вернемся к вашему коду, как только вы изменили свойorFilter-массив для объектов, попробуйте это:

filter.push(new sap.ui.model.Filter({
        filters: [orFilter3, orFilter2, orFilter1], // equals aFilters in previous code sample
        and: false // equals bAnd in  previous code sample
    })
);
...