sapui5 - FilterOperator 在使用引号时出现错误,相同的代码在系统/时间上有不同的行为

标签 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始终是字符串类型。 昨天在我们的开发系统上我看到了错误 “函数‘eq’(位置:8)使用的参数类型无效”

我注意到过滤器附加在 URL 中,nQObjid 的值周围没有单引号。奇怪,因为目前它被添加为过滤器运算符的值,它显然是一个字符串。我找不到任何相关问题,但我通过执行 value1: "'"+nQObjid+"'" 来解决(肮脏的)解决方法。

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

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

最佳答案

这可能无法解决您的问题,但对于评论来说太长了,这就是我在这里发布它的原因:

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

aUrlParams = ODataUtils._createUrlParamsArray(mUrlParams);

辅助类然后调用私有(private)方法:ODataUtils.js Line #72

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

这个私有(private)方法做了很多事情,最重要的是调用了另一个私有(private)方法,它实际上正在构建字符串 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 不知道的奇怪值,那么您的值将简单地转换为字符串(您的情况可能就是这种情况)。


为什么类型未定义或奇怪?那就是你进来的地方......你必须做一些调试才能找出实际值是什么。如果 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", {
        // ...
    });
}

关于sapui5 - FilterOperator 在使用引号时出现错误,相同的代码在系统/时间上有不同的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46338613/

相关文章:

sapui5 - 在 SAP Fiori 中添加自定义库作为依赖项

css - 如何将 MessagePage 内的按钮图标更改回正常大小?

android - SAPUI5 Android 应用程序 - 资源未加载

xml - SAPUI5:没有在 XML View 中创建动态过滤器的选项?

sapui5 - 导航时不触发函数 onExit

javascript - 无法在 Internet Explorer 中检索资源

javascript - SAPUI5:数据绑定(bind)到列表

Cordova 尝试从存储库获取插件而不是本地插件

SAPUI5应用程序无法加载ABAP存储库中的CSS文件

sapui5 - 如何从 XML View 中的扩展集合绑定(bind) OData $count