无法通过 JS 访问相关实体的状态码或状态码

Cannot access statecode or statuscode of related Entity Via JS

各位专家大家好(总有一天,我会的!) 这是一个问题。 我想在报价实体中获取相关价格水平(价目表实体)的状态代码或状态代码。(相关的) 我在引用实体(OnLoad)中尝试过 JS:

    var priceLevelStatusCode=Xrm.Page.getAttribute("pricelevelid").getValue()[0].statuscode;
alert(priceLevelStatusCode );

但是它在警告框中显示我未定义! 但是当我尝试这个时:

    var priceLevelStatusCode=Xrm.Page.getAttribute("pricelevelid").getValue()[0].name;
alert(priceLevelStatusCode );

它在报价中为我提供了正确的价目表名称。 问题是什么?如何获取Pricelist的statecode或statuscode?

更新 1:

我知道应该调用 OData,所以我这样做了:

function autoAlarm() { 
    var pricelevelid = Xrm.Page.getAttribute("pricelevelid").getValue()[0].id;
    oDataPath = Xrm.Page.context.getClientUrl() + "/XRMServices/2011/Organizationdata.svc"
    var Odata = oDataPath + "/PricelevelSet?$select=name,statecode&$filter=PricelevelId eq guid'" + pricelevelid + "'";
    try {
    var retrieveReq = new XMLHttpRequest();
    retrieveReq.open("GET", Odata);
    retrieveReq.setRequestHeader("Accept", "application/json");
    retrieveReq.setRequestHeader("Content-Type", "application/json; charset=utf-8");
    retrieveReq.onreadystatechange = function () {
    retrieveReqCallBack(this);
    }
    retrieveReq.send();
    }
    catch (err) {
    var text = "There was an error on this page.\n\n";
    text += "Error description: " + err.message + "\n\n";
    text += "Click OK to continue.\n\n";
    alert(text);
    }
    }


    function retrieveReqCallBack(retrieveEntityReq) {
    var PrefixText = ""
    if (retrieveEntityReq.readyState == 4) {
    retrieveEntityReq.onreadystatechange = null;
    alert(retrieveEntityReq.status);
    if (retrieveEntityReq.status == 200) {
    var retrievedEntity = JSON.parse(retrieveEntityReq.responseText).d;

    alert(retrievedEntity.hasOwnProperty("statuscode"));
    alert(retrievedEntity.statuscode);
    }
    }
    }

但现在它给了我错误 404(我想没有找到!)。 我哪里做错了?

更新 2:

我解决了错误号 404。 这是因为区分大小写。 现在,当我要检索值时,它会显示 Undefined.

这是我的新代码:

    function autoAlarm() { 
var pricelevel = Xrm.Page.getAttribute("pricelevelid").getValue()[0].id;
var pricelevelid = pricelevel.replace("{","").replace("}","");
oDataPath = Xrm.Page.context.getClientUrl() + "/XRMServices/2011/OrganizationData.svc"
var Odata = oDataPath + "/PriceLevelSet?$select=Name,StateCode&$filter=PriceLevelId eq guid'" + pricelevelid + "'";

    try {
    var retrieveReq = new XMLHttpRequest();
    retrieveReq.open("GET", Odata);
    retrieveReq.setRequestHeader("Accept", "application/json");
    retrieveReq.setRequestHeader("Content-Type", "application/json; charset=utf-8");
    retrieveReq.onreadystatechange = function () {
    retrieveReqCallBack(this);
    }
    retrieveReq.send();
    }
    catch (err) {
    var text = "There was an error on this page.\n\n";
    text += "Error description: " + err.message + "\n\n";
    text += "Click OK to continue.\n\n";
    alert(text);
    }
    }

    function retrieveReqCallBack(retrieveEntityReq) {
    var PrefixText = ""
    if (retrieveEntityReq.readyState == 4) {
    retrieveEntityReq.onreadystatechange = null;
    alert(retrieveEntityReq.status);
    if (retrieveEntityReq.status == 200) {
    var retrievedEntity = JSON.parse(retrieveEntityReq.responseText).d;
    alert(retrievedEntity.hasOwnProperty("StateCode"));
    alert(retrievedEntity.StateCode);
    }
    }
    }

首先显示false(代码:alert(retrievedEntity.hasOwnProperty("StatusCode")); 然后显示 undefiend。 当我在浏览器中转到 Odata URL 时,我看到了状态和状态代码:

        <d:StateCode m:type="Microsoft.Crm.Sdk.Data.Services.OptionSetValue">
      <d:Value m:type="Edm.Int32">0</d:Value>
    </d:StateCode>
    <d:OrganizationId m:type="Microsoft.Crm.Sdk.Data.Services.EntityReference">
      <d:Id m:type="Edm.Guid">f52acfb9-78de-402a-a9c2-8229836f0b7e</d:Id>
      <d:LogicalName>organization</d:LogicalName>
      <d:Name>xxxxx</d:Name>
    </d:OrganizationId>
    <d:StatusCode m:type="Microsoft.Crm.Sdk.Data.Services.OptionSetValue">
      <d:Value m:type="Edm.Int32">100001</d:Value>
    </d:StatusCode>

有人可以帮忙吗?

(已解决)更新 3:

我终于可以得到 statecode,这是代码:

  function autoAlarm() { 
var pricelevel = Xrm.Page.getAttribute("pricelevelid").getValue()[0].id;
var pricelevelid = pricelevel.replace("{","").replace("}","");
oDataPath = Xrm.Page.context.getClientUrl() + "/XRMServices/2011/OrganizationData.svc"
var Odata = oDataPath + "/PriceLevelSet?$select=Name,StateCode&$filter=PriceLevelId eq guid'" + pricelevelid + "'";

    try {
    var retrieveReq = new XMLHttpRequest();
    retrieveReq.open("GET", Odata);
    retrieveReq.setRequestHeader("Accept", "application/json");
    retrieveReq.setRequestHeader("Content-Type", "application/json; charset=utf-8");
    retrieveReq.onreadystatechange = function () {
    retrieveReqCallBack(this);
    }
    retrieveReq.send();
    }
    catch (err) {
    var text = "There was an error on this page.\n\n";
    text += "Error description: " + err.message + "\n\n";
    text += "Click OK to continue.\n\n";
    alert(text);
    }
    }

    function retrieveReqCallBack(retrieveEntityReq) {
    var PrefixText = ""
    if (retrieveEntityReq.readyState == 4) {
    retrieveEntityReq.onreadystatechange = null;

    if (retrieveEntityReq.status == 200) {
   var retrievedEntity = JSON.parse(retrieveEntityReq.responseText).d;
   var priceLevelStateCode=retrievedEntity.results[0].StateCode.Value;
   alert(priceLevelStateCode);
    }
  }
}

我的错误是 Json Array,真正的方法是这样的:

   var priceLevelStateCode=retrievedEntity.results[0].StateCode.Value;

谢谢大家

Pricelevel 是引用中的查找,您可以使用 Xrm.Page.getAttribute("pricelevelid").getValue()[0] 获取该相关实体记录的 ID 和名称(显示文本)。对于任何其他属性 (ex.statecode),您必须进行 Web api 调用以使用 Id 键从数据库中获取它。

更新:
您可以使用 2011 compatible CRM REST Builder 来构建查询,测试和精确代码段可以在 CRM 表单 js 库中使用。在 Dev CRM 实例中下载并导入此托管解决方案并立即构建查询。

可以使用

OrganizationData.svc 并通过包装在 XMLHttpRequest 中检索必要的属性。 Read more

样本:

var pricelevelid = Xrm.Page.getAttribute("pricelevelid").getValue()[0].id;

var Odata = oDataPath + "/PriceLevelSet?$select=name,statecode&$filter=PriceLevelId eq guid'" + pricelevelid + "'";

Lookup 控件包含目标实体的 IDName

在您的情况下,Lookup 控件是 pricelevelid 控件

如果您想从相关价格水平记录中获取更多信息,您需要检索特定记录。


在 CRM 365 中执行此操作

这是关于如何使用此方法的 link 到 MSDN Article,但基本上你提供:

  • 实体名称(在您的例子中 pricelevel
  • 记录的 ID(您可以从查找控件中获取)
  • 选项(强烈建议至少指定要检索的列)
  • 操作成功时执行的函数
  • 操作失败时执行的函数

应该是这样的:

var pricelevelid = Xrm.Page.getAttribute("pricelevelid").getValue()[0].id;
Xrm.WebApi.retrieveRecord(
  "pricelevel", 
  pricelevelid, 
  "?$select=name,statuscode",
  function(record) { alert (record.name); },
  function(err) { alert(err); }
);