首页 > 解决方案 > Ui5 SearchField - 来自多个属性名称的建议?

问题描述

我已将搜索帮助O2USERNAME作为 ABAP 中的 oData 服务导入。我想在 UI5 中有一个实时建议字段,但我一次只能让一个过滤器工作。目标是从BnameNameLast获得建议NameFirst

在 SAP Note 1671893 ODATA - convert $filter to ABAP select option中,它说:

'or_expression' 中的所有属性必须具有相同的名称。

有效:“name eq 'Sven' 或 name eq 'Hugo'”

无效:“姓名 eq 'Sven' 或年龄 eq 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 request failed500,Internal Server Error,{"error":{ "code":"/IWBEP/CM_MGW_RT/032", "message":{ "lang":"de", "value":" Inner Fehler aufgetreten. Wenden Sie sich an den Systemadministrator" }, "innererror":{ "application":{ "component_id":" removedByMe ", "service_namespace":" MY_NAMESPACE ", "service_id":" MY_SERVICE", "service_version":"0001" }, "transactionid":"0BE63D492E4D0210E005CF86AE1FC269", "timestamp":"20190621120505.9381020", "Error_Resolution":{ "SAP_Transaction":"对于后端管理员:在 SAP 网关上运行事务 /IWFND/ERROR_LOG集线器系统并搜索带有上述时间戳的条目以了解更多详细信息", "SAP_Note":"请参阅 SAP Note 1797736 进行错误分析 ( https://service.sap.com/sap/support/notes/1797736 )" }, " errordetails":[{ "code":"/IWBEP/CX_MGW_TECH_EXCEPTION", "message":"Interner Fehler aufgetreten.Wenden Sie sich an den Systemadministrator", "propertyref":"", "severity":"error", "target":""} ]} } }

/IWFND/ERROR_LOG 揭示了上面提到的注释

标签: javascriptodatasapui5abap

解决方案


每种类型的过滤器是否可以有多个文本片段?我的意思是你可以说 NameFirst 包含“Sven”或“Hugo”或 NameLast 包含“LastName”或“LastName2”吗?

如果是,我将不得不调整我的答案,如果不是:

您的orFilter1, orFilter2,orFilter3不应该是数组,因为它们每个都包含 1 个 Filter 对象,

其次,您的 filter.push 部分有一个小错误。在创建“最终”过滤器时更准确。

创建包含多个过滤器规则的过滤器时,允许使用以下表示法:

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

请注意,aFilters 是此处的过滤器对象数组

但是你给出了 4 个参数,我认为这行不通。

所以回到你的代码,一旦你将 orFilter-arrays 更改为对象,试试这个:

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
    })
);

推荐阅读