UI5 SearchField-来自多个属性名称的建议?

时间:2019-06-21 07:19:26

标签: javascript odata sapui5 abap

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

在SAP注释1671893 ODATA - convert $filter to ABAP select option中,它表示:

  

“ or_expression”中的所有属性都必须具有相同的名称。

     

有效:“名称为'Sven'或名称为'Hugo'”

     

无效:“名称等于'Sven'或年龄等于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”,       “信息”:{           “ lang”:“ de”,           “ value”:“内部Fehleraufgetreten。WendenSie sich an den系统管理员”       },       “内部错误”:{           “应用”:{               “ component_id”:“ removedByMe ”,               “ service_namespace”:“ MY_NAMESPACE ”,               “ service_id”:“ MY_SERVICE ”,               “ service_version”:“ 0001”           },           “ transactionid”:“ 0BE63D492E4D0210E005CF86AE1FC269”,           “ timestamp”:“ 20190621120505.9381020”,           “ Error_Resolution”:{               “ SAP_Transaction”:“对于后端管理员:在SAP Gateway集线器系统上运行事务/ IWFND / ERROR_LOG并搜索带有上述时间戳的条目以获取更多详细信息”,               “ SAP_Note”:“有关错误分析,请参阅SAP Note 1797736(https://service.sap.com/sap/support/notes/1797736)”           },           “错误详情”:[{               “代码”:“ / IWBEP / CX_MGW_TECH_EXCEPTION”,               “ message”:“ Interner Fehler aufgetreten。Wenden Sie sich an den Systemadministrator”,               “ propertyref”:“”,               “ severity”:“错误”,               “目标”:””}           ]}       }   }

/ IWFND / ERROR_LOG显示上面提到的注释

1 个答案:

答案 0 :(得分:0)

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

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

您的orFilter1orFilter2orFilter3不应是数组,因为它们每个都包含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
    })
);