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

如何利用Dynamics 365的retrieveRecord函数获取Lookup字段名称值?

解决Dynamics 365中Lookup字段名称获取与赋值问题

核心问题说明

你当前的代码仅获取了Lookup字段的ID(_kk_paymentterms_value这类字段存储的是关联记录ID),但Dynamics 365中设置Lookup字段需要完整的实体引用对象,包含三个属性:id(关联记录ID)、name(关联记录名称)、entityType(关联实体的逻辑名称)。同时注意:Xrm.WebApi.retrieveRecord是异步方法,不能直接同步赋值,必须通过then/catch或async/await处理结果。

方案一:通过$expand关联查询(推荐,单次API调用)

利用OData的$expand语法,在检索主记录时同时获取关联Lookup记录的名称,无需额外API请求。

代码示例

// 注意:导航属性名称需根据实际实体定义调整(可在Dynamics 365解决方案的实体字段中查看“关联名称”)
Xrm.WebApi.retrieveRecord(
    sellTo[0].entityType, 
    customerId, 
    '?$select=name,_kk_paymentterms_value,_kk_shippingmethod_value,_kk_freightterms_value&$expand=kk_paymentterms,kk_shippingmethod,kk_freightterms'
)
.then(function(result) {
    // 构建每个Lookup字段的完整实体引用对象
    const paymentTermsLookup = {
        id: result._kk_paymentterms_value,
        name: result.kk_paymentterms.name,
        entityType: result.kk_paymentterms["@odata.type"].split('.')[1] // 从OData类型中提取实体逻辑名
    };

    const shippingMethodLookup = {
        id: result._kk_shippingmethod_value,
        name: result.kk_shippingmethod.name,
        entityType: result.kk_shippingmethod["@odata.type"].split('.')[1]
    };

    const freightTermsLookup = {
        id: result._kk_freightterms_value,
        name: result.kk_freightterms.name,
        entityType: result.kk_freightterms["@odata.type"].split('.')[1]
    };

    // 示例:用上述对象设置其他实体的Lookup字段
    // Xrm.WebApi.updateRecord("目标实体逻辑名", "目标记录ID", {
    //     "_kk_targetpaymentterms_value": paymentTermsLookup,
    //     "_kk_targetshippingmethod_value": shippingMethodLookup,
    //     "_kk_targetfreightterms_value": freightTermsLookup
    // });
})
.catch(function(error) {
    console.error("检索记录失败: ", error.message);
});

导航属性名称确认方法

在Dynamics 365的解决方案中:

  1. 打开主实体(即sellTo[0].entityType对应的实体)
  2. 找到kk_paymentterms这类Lookup字段
  3. 查看字段的关联名称,这就是$expand需要用的导航属性名(通常和字段名前缀一致,比如字段_kk_paymentterms_value的关联名称是kk_paymentterms)

方案二:单独检索Lookup记录名称(多次API调用)

如果已经获取了Lookup字段的ID,可单独调用retrieveRecord获取对应记录的名称,适合场景复杂的情况。

代码示例

// 先获取主记录的Lookup ID
Xrm.WebApi.retrieveRecord(
    sellTo[0].entityType, 
    customerId, 
    '?$select=_kk_paymentterms_value,_kk_shippingmethod_value,_kk_freightterms_value'
)
.then(function(result) {
    const paymentTermsId = result._kk_paymentterms_value;
    const shippingMethodId = result._kk_shippingmethod_value;
    const freightTermsId = result._kk_freightterms_value;

    // 并行请求三个Lookup记录的名称
    return Promise.all([
        Xrm.WebApi.retrieveRecord("kk_paymentterm", paymentTermsId, '?$select=name'),
        Xrm.WebApi.retrieveRecord("kk_shippingmethod", shippingMethodId, '?$select=name'),
        Xrm.WebApi.retrieveRecord("kk_freightterm", freightTermsId, '?$select=name')
    ]);
})
.then(function(lookupResults) {
    // 构建Lookup对象(注意需提前保留ID变量,可通过闭包或Promise传递)
    const paymentTermsLookup = {
        id: paymentTermsId,
        name: lookupResults[0].name,
        entityType: "kk_paymentterm"
    };

    // 后续设置字段逻辑...
})
.catch(function(error) {
    console.error("操作失败: ", error.message);
});

关键注意事项

  • 所有Xrm.WebApi方法都是异步的,必须使用异步语法处理结果,不能直接同步赋值。
  • 实体逻辑名称需与Dynamics 365中定义的一致,避免拼写错误。

内容的提问来源于stack exchange,提问作者Kostas Karagiannis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 23:45:32