2017-09-22 1 views
0

Hallo alle, Ich möchte einen oData Get-Service mit Filter von SAPUI5 ausführen. Die OData url würde wie folgt aussehen:?Aufrufen von oData mit Mehrfachfilter von SAPUI5

/sap/opu/OData/MAT_SRV/Get_MATSet $ ​​filter = (Plant eq 'A1HG') und (Materialtyp eq 'PS01') und ((Materialnummer eq ‚61345280 ‚) oder (Materialnummer eq '61.345.280'))

Hier habe ich für ODATA Service (oDataFilter im Beispiel unterhalb des Filterarray angelegt), wie folgt:

var oPlant = new sap.ui.model.Filter("Plant", sap.ui.model.FilterOperator.EQ, 'A1HG'); 

var oPlantFilter = new sap.ui.model.Filter({ 
     filters: [oPlant], 
     and: true 
}); 

var oMatType = new sap.ui.model.Filter("MaterialType", sap.ui.model.FilterOperator.EQ, 'PS01'); 

var oMatTypeFilter = new sap.ui.model.Filter({ 
     filters: [oMatType], 
     and: true 
}); 

var oMaterialNumberFilter = this._getMatNumbers();//GET ALL MATERIAL NUMBER FILTERS SEPERATED By OR 

var oDataFilter = new sap.ui.model.Filter({ 
    filters: [oPlantFilter, oMatTypeFilter, oMaterialNumberFilter], 
    and: true });//ADDING AND TO ALL FILTERS 

BackEndModel.read("/Get_MATSet", { 
    filters: oDataFilter, 
    success: jQuery.proxy(this.fSuccess, this), 
    error: jQuery.proxy(this.fError, this) }); 

_getMatNumbers: function() { 
    var aTokens = this.byId("Mat_MultiInput").getTokens();//ITERATE THROUGH EACH VALUES ENTERED BY USER 
    var aMatFilter = []; 
    for (var i in aTokens) { 
     aMatFilter.push(new sap.ui.model.Filter("MaterialNumber", sap.ui.model.FilterOperator.EQ, aTokens[i].getKey())); 
    } 
    var oFilter = new sap.ui.model.Filter({ filters: aMatFilter, and: false }); 
    return oFilter; 
} 

Allerdings habe ich die Folgefehler während der Ausführung: "Kann Eigenschaft sPath von undefi nicht lesen ned ".

Kann mir bitte jemand sagen, was ich hier falsch mache? Oder führen Sie mit dem Filterausdruck, der an den oData-Service übergeben werden soll, der den in der oData-URL genannten Filterwerten entspricht?

Grüße,

Faddy

+0

Wo ist ** oOrderNumbers ** Filterobjekt? .Es ist nicht Ihr Code und in der Anfrage. aber vorhanden im ** oDataFilter ** Filter. –

+0

Sorry, das war ein Tippfehler. Ich habe es jetzt geändert. Bitte überprüfen Sie –

+0

Kann mir bitte jemand hier helfen? Ich habe versucht, es mit Chrome zu debuggen. Was ich sehen kann ist: der folgende Filter verursacht den Fehler var oDataFilter = neu sap.ui.model.Filter ({filters: [oPlantFilter, oMatTypeFilter, oMaterialNumberFilter] und: true}); // HINZUFÜGEN UND ZU ALLEN FILTER Hier habe ich keinen sPath definiert, daher beschwert er sich darüber. Allerdings habe ich diesen Filter verwendet, um alle anderen Filterbedingungen mit "und" Operator zu kombinieren, also habe ich keinen sPath oder ich weiß nicht, welcher sPath hier erwähnt werden soll. Grüße, Faddy –

Antwort

1

sah ich mit Filtern einer meiner Codierungen und fand "my" oDataFilter ein Array zu sein. Also versuchen Sie dies:

var oDataFilter = new Array(new sap.ui.model.Filter({ 
     filters: [oPlantFilter, oMatTypeFilter, oMaterialNumberFilter], 
     and: true })); 
+0

Ja, das ist die richtige Antwort (obwohl ich 'new Array' nicht verwenden würde). Der 'filters' -Parameter in der read-Methode erwartet eigentlich ein Array [im Gegensatz zur' filter'-Methode aus der Bindung] (https://stackoverflow.com/questions/43467187/how-to-concatenate-two-sap-ui -Modell-Filter-in-JSON-Modell/43468201 # comment73991902_43468196). Andernfalls löst UI5 den Fehler aus. – boghyon

+0

Futu - Du bist wirklich mein Retter. Deine Lösung war der Fang, den ich nirgends sehen konnte. Vielen Dank für Ihren Vorschlag.Es funktionierte –

+0

@SAPLearner Bitte, [akzeptieren] (https://meta.stackexchange.com/a/5235) diese Antwort, um andere zu informieren, dass Ihr Problem durch diese Antwort gelöst wurde. – boghyon

0

Da in Ihrem oPlantFilter und oMatTypeFilter nur ein Filterkriterien enthält ypu sie direkt in der oDataFilter verwenden können, wie unten gezeigt. Ich hoffe, es wird Ihnen helfen, das Problem zu lösen. Und noch eine Sache konzentrieren sich auf die Pfad oder Eigenschaft Name mit ihrem Datentyp.

var oPlantFilter = new sap.ui.model.Filter("Plant", sap.ui.model.FilterOperator.EQ, 'A1HG'); 
var oMatTypeFilter = new sap.ui.model.Filter("MaterialType", sap.ui.model.FilterOperator.EQ, 'PS01'); 
var oMaterialNumberFilter = this._getMatNumbers(); 

var oDataFilter = new sap.ui.model.Filter({ 
    filters: [oPlantFilter, oMatTypeFilter, oMaterialNumberFilter], 
    and: true 
}); 

BackEndModel.read("/Get_MATSet", { 
    filters: oDataFilter, 
    success: jQuery.proxy(this.fSuccess, this), 
    error: jQuery.proxy(this.fError, this) 
}); 

_getMatNumbers: function() { 
    var aTokens = this.byId("Mat_MultiInput").getTokens(); 
    var aMatFilter = []; 
    for (var i in aTokens) { 
     aMatFilter.push(new sap.ui.model.Filter("MaterialNumber", sap.ui.model.FilterOperator.EQ, aTokens[i].getKey())); 
    } 
    var oFilter = new sap.ui.model.Filter({ 
     filters: aMatFilter, 
     and: false 
    }); 
    return oFilter; 
} 
Verwandte Themen