You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SAPUI5 ODataModel V2使用read方法带筛选器时出现“无法读取undefined的substr属性”错误

SAPUI5 ODataModel V2使用read方法带筛选器时出现“无法读取undefined的substr属性”错误

看起来你遇到的问题大概率是重复的$filter参数导致OData服务解析出错啦!我帮你拆解下问题原因和解决办法:

问题根源

从你贴出的生成URL能看到,里面出现了两个$filter参数:

$filter=substringof(%271001%27,to_SalesOrder/SoldToParty)%20eq%20true&$expand=to_SalesOrder&$inlinecount=allpages&$filter=Material%20eq%20%271%27

这完全不符合OData的URL规范——OData请求里只能有一个$filter参数,多个筛选条件需要用and/or逻辑合并到同一个$filter里。这种重复参数会让OData服务返回异常响应,进而导致前端框架在解析响应时抛出“无法读取undefined的substr属性”这类底层错误。

修正后的代码实现

你需要把多个筛选条件组合成一个Filter对象,然后通过ODataModel的filters属性传递,而不是手动拼接URL参数。这样框架会自动帮你生成合规的OData请求:

// 先确保导入了Filter和FilterOperator
// import Filter from "sap/ui/model/odata/Filter";
// import FilterOperator from "sap/ui/model/odata/FilterOperator";

let selectedMaterial = this.getModel("appSettings").getProperty("/selectedLineItemMaterial");
let selectedSoldToParty = this.getModel("salesDoc").getProperty("/SoldToParty");
this.oSalesContractModel = this.getModel("SalesContract"); 

if (selectedMaterial) {
    // 用AND逻辑组合两个筛选条件
    const oCombinedFilter = new Filter({
        filters: [
            new Filter({ 
                path: "to_SalesContract/SoldToParty", 
                operator: FilterOperator.Contains, 
                value1: selectedSoldToParty 
            }),
            new Filter({ 
                path: "Material", 
                operator: FilterOperator.EQ, 
                value1: selectedMaterial 
            })
        ],
        and: true // 默认就是AND逻辑,可省略
    });

    this.oSalesContractModel.read('A_SalesContractItem', {
        urlParameters: {
            "$expand": "to_SalesContract",
            "$inlinecount": "allpages"
        },
        filters: oCombinedFilter, // 这里传递组合后的筛选器
        success: (oResponse) => {
            // 成功获取数据后的处理逻辑
            console.log("数据读取成功", oResponse);
        },
        error: (oError) => {
            // 错误处理逻辑
            console.error("读取数据失败", oError);
        }
    });
}

关键注意点

  • 永远不要手动在urlParameters里添加$filter,一定要用ODataModel提供的filters属性传递筛选条件,框架会自动处理参数拼接、编码和逻辑组合。
  • 确认你已经正确导入了Filter和FilterOperator类,避免因未导入导致的其他错误。

备注:内容来源于stack exchange,提问作者MarcL

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 11:19:31