FilterOperator使用引号时的错误,相同的代码跨系统/时间的不同行为

时间:2017-09-21 08:04:25

标签: sapui5

this.getView().getModel().read("/QualificationProficiencySet", {
    filters: [new sap.ui.model.Filter({
        path: "Qobjid",
        operator: sap.ui.model.FilterOperator.EQ,
        value1: nQObjid
    })],
    success: function(data) {
        that._profData = data.results;
        that._oQuickView.setModel(new sap.ui.model.json.JSONModel(that._profData), "proficiencyModel");
        // delay because addDependent will do a async rerendering and the actionSheet will immediately close without it.
        jQuery.sap.delayedCall(200, that, function() {
            that._oQuickView.openBy(oLink);
        });
    },
    error: function(evt) {}
});

nQObjid的类型为string - always。 昨天在我们的开发系统上,我看到了错误 "Invalid parametertype used at function 'eq' (Position: 8)"

我注意到过滤器附加在网址中,而nQObjid的值没有单引号。很奇怪,因为此时它被添加为过滤器运算符的值,它显然是一个字符串。我无法找到任何相关问题,但我通过value1: "'"+nQObjid+"'"设置了(脏)解决方法。

直到今天,这个系统都没有改变代码,但突然引号是网关内部值的一部分。所以我再次移除"'"并进行测试,有效。然后我将解决方案转移到生产中,以发现我现在在"Invalid parametertype used at function 'eq'..生产中遇到了同样的问题。另一个正在生产的用户没有这个问题,所以我有点迷失。

类似问题:new SAPUI5 updat to 1.42 has odata bug "Invalid Parameters...

1 个答案:

答案 0 :(得分:5)

这可能无法解决您的问题,但评论时间太长,这就是我在此发帖的原因:

在执行读取请求时,框架正在调用辅助类:V2 ODataModel.js Line #4231

aUrlParams = ODataUtils._createUrlParamsArray(mUrlParams);

然后助手类调用私有方法:ODataUtils.js Line #72

return "$filter=" + this._createFilterParams(aFilters, oMetadata, oEntityType);

这个私有方法正在做一堆东西,最重要的是调用另一个实际构建字符串的私有方法ODataUtils.js Line #128

sFilterParam = that._createFilterSegment(oFilter.sPath, oMetadata, oEntityType, oFilterSegment.operator, oFilterSegment.value1, oFilterSegment.value2, sFilterParam);

此方法的第一件事就是格式化您的价值,我想这就是问题发生的地方:ODataUtils.js Line #393

oValue1 = this.formatValue(oValue1, sType);

formatValue函数获取您的值及其Edm.Type,并根据该类型执行不同的操作。如果你的objectId是一个字符串,那么它应该在开头和结尾放置单引号:ODataUtils.js Line #468

sValue = "'" + String(vValue).replace(/'/g, "''") + "'";

如果类型未定义或UI5不知道的某些奇怪的值,那么您的值只是强制转换为String(这可能就是您的情况)。

为什么类型未定义或奇怪?你进来的地方......你必须做一些调试才能找出实际值。如果UI5代码不可读,您可以将sap-ui-debug=true作为URL参数:

my.sap.system.com:8000/sap/bc/ui5_ui5/sap/ztest/index.html?sap-ui-debug=true

如果这是一个时间问题(由于某种原因未加载元数据),那么将代码包装在Promise中可能会有所帮助:

var oModel = this.getView().getModel();
oModel.metadataLoaded().then(function() {
    oModel.read("/QualificationProficiencySet", {
        // ...
    });
}