【问题标题】:How to filter odata service with mutiple filter input values from Filterbar control & bind the filtered result set to Table如何使用过滤器栏控件中的多个过滤器输入值过滤 odata 服务并将过滤后的结果集绑定到表
【发布时间】:2020-08-25 16:49:26
【问题描述】:

我需要用多个过滤项过滤odata服务并将结果集绑定到表。整个操作将在单击搜索按钮时发生。下面是我的 Onsearch 事件代码,它在读取函数中失败并且没有返回结果并且无法将其绑定到表。有人可以请我帮忙吗?

控制器代码

onFinalFilter: function (oEvent) {

debugger; 
var oPlant = this.getView().byId("plant").getValue();

var oName1 = this.getView().byId("name1").getValue();

var oName2 = this.getView().byId("name2").getValue();

var oState = this.getView().byId("State").getValue();

var oCity = this.getView().byId("city").getValue();

var oZip = this.getView().byId("zip").getValue();

var oCompanyCode = this.getView().byId("companyCode").getValue();

var p = new Filter("WERKS", FilterOperator.EQ, oPlant);

var n1 = new Filter("NAME1", FilterOperator.EQ, oName1);

var n2 = new Filter("NAME2", FilterOperator.EQ, oName2);

var s = new Filter("STATE", FilterOperator.EQ, oState);

var c = new Filter("CITY", FilterOperator.EQ, oCity);

var cc = new Filter("BUKRS", FilterOperator.EQ, oCompanyCode);

var zip = new Filter("PSTCODE", FilterOperator.EQ, oZip);

var finalFilter = new Filter({filters:[p,n1,n2,c,s,zip,cc], and:true});

var oModel = new sap.ui.model.odata.v2.ODataModel("/sap/opu/odata/sap/ZSM_PLANTSRCH_SRV/"); sap.ui.getCore().setModel(oModel);

var oModel2 = new sap.ui.model.json.JSONModel();

oModel.read("/PLANTSRCHSet", {

filters: finalFilter, 

success: function (oData, oResponse)

{ var data = oData; oModel2.setData(data); this.getView().byId("table1").setModel(oModel2, "key2"); },

error: function (oError) { //alert("error"); } });

}

查看

控制台日志

过滤栏片段

【问题讨论】:

  • 你已经尝试过什么,你在哪里卡住了?该问题没有显示任何研究工作,但听起来更像是“给我你的代码”请求。

标签: javascript odata sapui5 sap-fiori


【解决方案1】:

1.View.xml

    <fb:FilterGroupItem  name="Name of the Property" label="Company">
                    <fb:control>
                        <Input type="Text"/>
                    </fb:control>               
                </fb:FilterGroupItem>
  • 名称应该是您的 oData 服务的 EntitySet 的相应属性
  1. Controller.js - 准备你的过滤器
        _search: function (oEvt) {
            // All your filters of the filterbar
            var aSelectionSet = oEvt.getParameter("selectionSet");
            //Loop through them all
            var aFilters = aSelectionSet.reduce(function (aResult, oControl) {
                //Check via oControl.getValue() || oControl.getSelectedKey() || oControl.getMetadata().getName() what to do
                if (oControl.getValue()) { //sap.m.Input - single filter
                    aResult.push(new Filter({
                        path: oControl.getName(),
                        operator: FilterOperator.EQ,
                        value1: oControl.getValue()
                    }));
                } else if (oControl.getMetadata().getName() === "sap.m.MultiInput") { // sap.m.MultiInput - multiple Filter
                    var aTokens = oControl.getTokens();
                    var aTokenFilter = [];
                    for (var i = 0; i < aTokens.length; i++) {
                        aTokenFilter.push(new Filter({
                            path: oControl.getName(),
                            operator: FilterOperator.EQ,
                            value1: aTokens[i].getProperty("key")
                        }));
                    }
                    if (aTokenFilter.length > 0) {
                        aResult.push(new Filter({
                            filters: aTokenFilter,
                            and: false
                        }));
                    }
                }
                return aResult;
            }, []);
            if (aFilters.length > 0) {
                this._filterTable(new Filter({
                    filters: aFilters,
                    and: true
                }));
            } else {
                this._filterTable();
            }
        },
  • sap.m.ComboBox 尚无逻辑
  1. Controller.js - 过滤器
        _filterTable: function (oFilter) {
        this._oTable.getBinding("items").filter(oFilter);
        }

Example

【讨论】:

  • 感谢您的回复。我还需要对过滤栏输入文件进行验证。如上面的代码 aResult 包含所有过滤器,我如何对单个值进行验证,例如 if name ,基于输入值的城市字段需要进行 vlaidation 检查,如果通过则将推送到过滤器。如果你能在这方面提供帮助,那就太好了。提前致谢
  • 您可以验证预过滤。 -->How can i add validation to an input field<--。在_search 方法中,您可以通过oControl.getValueState() 检查验证。就像@Boghyon Hoffmann 提到的那样,请随时使用 CodeSnippet 和更具体的问题更新您的问题
  • 最初尝试获取 filtergroupitems 值,但无法弄清楚将过滤器参数传递给服务。现在尝试了不同的方法,但它也失败了。也更新了问题。以前的代码是:-var oJsonData = []; var oItems = oEvent.getSource().getFilterGroupItems(); for (var i = 0; i
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-23
  • 2017-05-19
  • 2019-12-25
  • 2019-06-19
  • 1970-01-01
  • 1970-01-01
  • 2014-08-06
相关资源
最近更新 更多