【问题标题】:Cannot access statecode or statuscode of related Entity Via JS无法通过JS访问相关实体的状态码或状态码
【发布时间】:2018-07-29 11:23:11
【问题描述】:

您好所有专家(我会在某一天,很快!) 这是一个问题。 我想在报价实体中获取相关价格级别(价目表实体)的状态码或状态码。(相关一个) 我已经在引用实体(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?​​p>

更新 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;

谢谢大家。

【问题讨论】:

    标签: javascript dynamics-crm dynamics-crm-2011 crm


    【解决方案1】:

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

    更新:
    您可以使用 2011 兼容的CRM REST Builder 来构建查询、测试和精确的 sn-p 可以在 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 + "'";
    

    【讨论】:

    • 您好,先生,谢谢您的回复。你有这方面的样本吗?有链接吗?
    • @T_O 你能确认你的 crm 版本吗?您标记了 2011 年和 2013 年
    • 我的版本是 Dynamic 2011 先生。
    • 您好,先生,请查看我的更新。它现在给了我错误 404。
    • @T_O 这不是网络 API。这是 OData。你下载了Rest builder吗?您可以检查所有架构名称,例如实体名称吗?
    【解决方案2】:

    Lookup 控件包含目标实体的IDName

    在您的情况下,查找控件是 pricelevelid 控件

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


    在 CRM 365 中执行此操作

    这里是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); }
    );
    

    【讨论】:

      猜你喜欢
      • 2021-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-28
      • 1970-01-01
      • 1970-01-01
      • 2011-04-26
      相关资源
      最近更新 更多