【问题标题】:Auto-populate custom entity using javascript without knowing the guid value of the parent entity in Dynamics 365在不知道 Dynamics 365 中父实体的 guid 值的情况下使用 javascript 自动填充自定义实体
【发布时间】:2020-09-19 07:59:28
【问题描述】:

我刚开始使用客户端脚本,虽然这可能是我另一个去谷歌搜索社区的问题,但相信我,我已经折磨了谷歌和社区,但将我的查询链接到一个单元总是失败,让我描述一下问题陈述,让您有更好的想法。

我创建了两个名为 cts_agent 和 cts_cases 的自定义实体,现在我需要自动填充 cts_cases 的所有字段,这些字段是只读属性字段,但映射到 cts_agent 实体表单的代理 ID(整数)除外。

如果它是一个实体引用字段,我可以使用查询表达式从 agent_form 获取详细信息并在我的 cts_form 中自动填充详细信息,但我需要编写一个 js 查询,它可以获取代理 id 并为我获取那些细节。获取详细信息后将以 json 格式呈现,我需要在我的 cts_cases 表单中填充详细信息,这也是我无法解决的另一个问题,guid 值的动态检索和使用 json 自动填充 cts_cases 是我的我面临的两个障碍。我已经为静态版本编写了代码:

var req = new XMLHttpRequest();

req.open("GET", Xrm.Page.context.getClientUrl() + "/api/data/v9.1/cts_agents(00000000-0000-0000-0000-000000000000)?$select=cts_addressline1,cts_addressline2,cts_addressline3,cts_city,cts_country,cts_email,cts_fax,cts_mobilenumber,cts_name,cts_phonenumber,cts_state,cts_zipcode", true);

req.setRequestHeader("OData-MaxVersion", "4.0");

req.setRequestHeader("OData-Version", "4.0");

req.setRequestHeader("Accept", "application/json");

req.setRequestHeader("Content-Type", "application/json; charset=utf-8");

req.setRequestHeader("Prefer", "odata.include-annotations=\"*\"");

req.onreadystatechange = function() {

if (this.readyState === 4) {

    req.onreadystatechange = null;

    if (this.status === 200) {

        var result = JSON.parse(this.response);

        var cts_addressline1 = result["cts_addressline1"];

        var cts_addressline2 = result["cts_addressline2"];

        var cts_addressline3 = result["cts_addressline3"];

        var cts_city = result["cts_city"];

        var cts_country = result["cts_country"];

        var cts_email = result["cts_email"];

        var cts_fax = result["cts_fax"];

        var cts_mobilenumber = result["cts_mobilenumber"];

        var cts_name = result["cts_name"];

        var cts_phonenumber = result["cts_phonenumber"];

        var cts_state = result["cts_state"];

        var cts_zipcode = result["cts_zipcode"];

        var cts_zipcode_formatted = result["cts_zipcode@OData.Community.Display.V1.FormattedValue"];

    } else {

        Xrm.Utility.alertDialog(this.statusText);

    }

}

};

req.send();

【问题讨论】:

  • 您的用例是什么,例如来自代理表单 - 单击功能区按钮或 onSave,您正在尝试使用代理表单详细信息创建案例?然后您在表单中有代理记录 ID。只需在上面的代码中填写该 guid 而不是零。所以你在这两个实体之间没有关系?没有查找?在任何情况下,您都可以通过传递参数打开另一个实体(案例)表单,在加载新案例表单时,您可以使用上述代码填写字段

标签: javascript json dynamics-crm customization dynamics-crm-webapi


【解决方案1】:

您可以在参数中配置过滤器。 您还可以使用可用的Xrm.WebApi 函数来简化查询语法

$filter=agentid eq 123
//where agentid is your integer identifier field

例子:

Xrm.WebApi.retrieveMultipleRecords("cts_agent","?$select=cts_addressline1,cts_addressline2,cts_addressline3,cts_city,cts_country,cts_email,cts_fax,cts_mobilenumber,cts_name,cts_phonenumber,cts_state,cts_zipcode&$filter=agentid eq 123")
.then(
result => {
//you read the results here - retrieve multiple returns an array of records.
if(result.entities.length > 0)
{
var cts_addressline1 = result.entities[0].cts_addressline1;
//etc...
}
},
err => {
console.error(err);
});

如果您想要代理唯一 ID (guid),您可以从 result.entities[0].cts_agentid 获取它

【讨论】:

  • 感谢您的帮助,但我在 Xrm.page 和 Xrm.WebApi 之间有点困惑,我应该使用哪个以及为什么
  • Xrm.Page 用于读取表单上可用的数据(如字段值、控件信息、实体信息) 注意 Xrm.Page 已弃用,您应该使用 formContext 代替,请参见此处:docs.microsoft.com/en-us/power-platform/… Xrm.WebApi 函数纯粹用于查询 Web Api。它充当 XmlHttpRequests 的简化包装器,就像您在 OP 中一样。
  • 您示例中的主要问题是您查询的数据错误。仅当您有用于记录的 guid 时才使用 /cts_agents(guid)。但在您的情况下,您正在使用整数值进行查询。因此,您应该将查询替换为:“/cts_agents?$filter= integerfield eq 123&$select=cts_addressline1,..” 在这种情况下,返回值是一个数组。使用 Xrm.WebApi 只会简化你的语法。
  • 感谢 ef_ 帮助我,为我指明了正确学习和实现代码的方向。
【解决方案2】:

guid 值的动态检索和使用 json 自动填充 cts_cases 是我面临的两个障碍

您从第一部分的另一个答案中获得了帮助。如前所述,您将能够使用您知道的任何属性值(唯一)查询实体记录。

对于第二部分——一旦你得到了 guid,你就可以将它作为参数传递给Xrm.Navigation.openForm,它可以用来打开 cts_cases 实体表单,并在使用这个参数加载表单时——从代理中提取详细信息记录并将 json 中的属性值分配给打开的 cts_cases 表单字段。或者,您也可以在打开表单时将值(在最小属性的情况下)作为参数传递。 Read more

var entityFormOptions = {};
entityFormOptions["entityName"] = "cts_cases";

// Set default values for the Contact form
var formParameters = {};
formParameters["cts_addressline1"] = result["cts_addressline1"]
//other attributes go here

// Open the form.
Xrm.Navigation.openForm(entityFormOptions, formParameters).then(
    function (success) {
        console.log(success);
    },
    function (error) {
        console.log(error);
    });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-09
    • 2016-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多