1

我们有一个要求,我们必须检索实体的元数据。确切要求:我正在读取具有“实体模式名称”的表单上的字段值。有了这个,我需要获取该实体的主键模式名称。可能吗?如果是这样,请帮助我。例如:在该字段中,如果我输入 "lead" ,该 web api 应该获取我 "leadid" 并将其存储在另一个字段中。2. 如果我输入 "incident" ,那个 web api 应该得到我 "incidentid"

4

3 回答 3

1

您不需要为此检索实体元数据,对于活动以外的实体,主键始终是“实体模式名称”+“id”。如果您想要一个通用的解决方案,您应该能够从元数据中获取此信息:

https://crmaddress/api/data/v9.1/EntityDefinitions(LogicalName='account')

并简单地获取结果的“PrimaryIdAttribute”,因此示例代码将是:

fetch("/api/data/v9.1/EntityDefinitions(LogicalName='account')")
   .then(response => response.json())
   .then(data => console.log(data.PrimaryIdAttribute));
于 2017-06-07T07:13:08.090 回答
1

是的,我同意如果它是主键模式名称,则无需检索,因为对于每个实体,它的实体模式名称 + id(Lead + id = Leadid)。但是,我们觉得这不是一个好习惯。我们通过以下代码实现了这一点......它运行良好。当我们提供正确的实体模式名称时,它会自动将该主 ID 属性填充到另一个字段中。new_primarykey - 我在表单上的 new_entityschemaname 字段中输入实体架构名称时填充主键架构名称。

function getPrimaryKey() {
    var Oldprimary = Xrm.Page.data.entity.attributes.get("new_primarykey").getValue();
    var req = new XMLHttpRequest();
    var entityName = Xrm.Page.data.entity.attributes.get("new_entityschemaname").getValue();
    var url = Xrm.Page.context.getClientUrl() + "/api/data/v8.2/" + "EntityDefinitions?$select=PrimaryIdAttribute&$filter=SchemaName eq '" + entityName + "'";
    req.open("GET", url, false);
    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 () {
        Xrm.Page.data.entity.attributes.get("new_primarykey").setValue("");
        if (this.readyState === 4) {
           
              
            
            req.onreadystatechange = null;
            if (this.status === 200) {
                var results = JSON.parse(this.response);
                var primarykey = results.value[0].PrimaryIdAttribute;
                Xrm.Page.data.entity.attributes.get("new_primarykey").setValue(primarykey);
 
            }
            else {
                Xrm.Utility.alertDialog("Error");
            }
        }
    }
    req.send();
};
 

在此处输入图像描述

于 2017-06-07T18:14:16.590 回答
0

首先感谢分享。我目前正在处理表单级别的全局按钮,该按钮应该获取特定实体的主键。我也从 entityName + "id" 开始,但这会在电子邮件等活动实体上失败。所以我开始实现上述内容。

当您通过 javascript 中的表单获取实体的逻辑名称时:

var entityName = Xrm.Page.data.entity.getEntityName();

例如,您会得到“机会”,当您将其添加为 var 时entityNamegetPrimaryKey这将失败,因为SchemaName实体的 是机会而不是机会。也用于帐户等。

所以我的建议是当你使用.getEntityName()toLogicalName而不是SchemaNamewhich 会导致以下 URL:

var url = Xrm.Page.context.getClientUrl() + "/api/data/v8.2/" + "EntityDefinitions?$select=PrimaryIdAttribute&$filter=LogicalName eq '" + entityName + "'";
于 2018-04-06T08:19:09.517 回答