crm 2016 javaScript通过Fetch获取查找名称

时间:2016-06-23 19:45:25

标签: javascript dynamics-crm microsoft-dynamics dynamics-crm-2016

我尝试从Entity获取Lookup字段(无论类型) 使用fetchXml但我没有在结果中获得查找文本;

例如

(帐户实体,所有者字段):

var fetchXml = "<fetch mapping='logical'>" +
            "<entity name='account'>" +
                "<all-attributes />" +
                "<filter>" +
                    "<condition attribute='accountid' operator='eq' value='{475B158C-541C-E511-80D3-3863BB347BA8}' />" +
                "</filter>" +
            "</entity></fetch>";

var fetchResult = XrmServiceToolkit.Soap.Fetch(fetchXml);
var owner = fetchResult[0].attributes["ownerid"];

结果[ logicalName missing ]:

enter image description here

我找到了使用linkEntity的解决方案,但对我来说这不是一个好的解决方案,因为我需要一个通用函数

如果我直接从表单中获取字段,我将获得所有信息: 的 Xrm.Page.getAttribute( “OWNERID”)。的getValue()[0] enter image description here

1 个答案:

答案 0 :(得分:2)

我发现您使用的是 XrmServiceToolkit CRM 2016 。我对这个工具组合有同样的问题

我发现其他人(不是我)已经报告并解决了这个问题。请参阅this bug

似乎从CRM返回的XML已更改为包含2个新节点,这打破了XrmServiceToolkit读取选项集值的方式。

错误报告包含可能的修复方法。我将它包含在这里供将来参考

原始XrmServiceToolkit具有此代码

case "a:EntityReference":
    entRef = new xrmEntityReference();
    entRef.type = sType.replace('a:', '');
    var oChildNodes = tempNode.childNodes;
    entRef.id = getNodeText(oChildNodes[0]);
    entRef.logicalName = getNodeText(oChildNodes[1]);
    entRef.name = getNodeText(oChildNodes[2]);
    obj[sKey] = entRef;
    break;

您可以看到它明确提到oChildNodes[0]; oChildNodes[1];和oChildNodes[2] - 这会导致你遇到的错误。

更新的代码是:

case "a:EntityReference":
    entRef = new xrmEntityReference();
    entRef.type = sType.replace('a:', '');
    var oChildNodes = tempNode.childNodes;
    for (var n = 0; n < oChildNodes.length; n++) {
        var currentNodeName = oChildNodes[n].nodeName;
        switch (currentNodeName) {
            case "a:Id":
                entRef.id = getNodeText(oChildNodes[n]);
                break;
            case "a:Name":
                entRef.name = getNodeText(oChildNodes[n]);
                break;
            case "a:LogicalName":
                entRef.logicalName = getNodeText(oChildNodes[n]);
                break;
        }
    }
    obj[sKey] = entRef;
    break;