CRM 2011 - 使用JScript设置默认值

时间:2012-02-10 06:25:12

标签: dynamics-crm-2011

我们在内部部署了CRM 2011。 Contact实体已自定义为使用查找自定义实体Country而不仅仅是文本字段。创建新联系人时,我们希望默认情况下将国家/地区字段设置为加拿大。我有以下功能:

            function SetDefaultCountryCode(countryFieldId) {

                var _canadaId = "{FC167B4D-1C3B-E111-8904-F2EA3FE25706}";

                var countryControl = Xrm.Page.getAttribute(countryFieldId);

                // only attempt the code if the control exists on the form
                if (countryControl != null) {
                    var currentCountry = countryControl.getValue();

                    // if country is not specified, then set it to the default one (Canada) 
                    if (currentCountry == null) {
                        var defaultCountry = new Object();
                        defaultCountry.entityType = "cga_country";
                        defaultCountry.id = _canadaId;
                        defaultCountry.name = "Canada";
                        var countryLookupValue = new Array();
                        countryLookupValue[0] = defaultCountry;

                        countryControl.setValue(countryLookupValue);
                    }
                }
            }

在OnLoad表单上,我调用了这样的函数:

    // set Country fields to Canada if not set
    SetDefaultCountryCode('cga_address1country');

我们有两台服务器 - DEV和TEST。这个JScript在DEV中运行良好。当我在TEST中运行它时它不起作用,因为TEST中的Canada具有不同的id(GUID) - 当我手动创建它时。我希望我可以从DEV导出Country实体值并在TEST中导入它们,保留它们的GUID。不幸的是,这不起作用。我将数据导出到Excel文件,它具有国家/地区的GUID。我还会在导入之前删除TEST中的任何现有国家/地区记录。当我尝试导入它时导入成功但不创建任何记录。如果我在excel文件中添加一个新行而没有指定Guid,它将导入它。在我看来,导入功能并不意味着保留记录的GUID。但这也意味着我的脚本不起作用,因为它取决于GUID。

我在这里有两个问题:

  1. 是否可以导出/导入保留GUID的实体数据?

  2. 如果我在DEV和TEST中不能拥有相同的GUID,我怎样才能使JScript正常工作?

  3. 提前感谢您提供任何帮助/反馈。

2 个答案:

答案 0 :(得分:6)

对您的GUID进行硬编码是非常糟糕的做法,并且您发现了它的问题。 如上所述,我们不能拥有相同的GUID,但我们的名称相同。因此,我们必须使用JScript和jQuery查询国家/地区的名称以检索GUID。

为了从客户端(或实体表单)退出信息:

  1. 我们将使用/使用REST端点(在浏览器中测试)。
  2. 上传jQuery lib。
  3. 上传Json2 lib。
  4. 使用jQuery库中的AJAX函数。
  5. 定义您的实体,列和标准。
  6. 让我们看一下查询REST端点。

     http://yourHostName/yourOrg/XRMServices/2011/OrganizationData.svc/new_CountrytSet?$select=new_Name,new_CountryId&$filter=new_Name eq 'Canada'
    

    获取此URL,替换您的实际值并将其粘贴到浏览器中,您会发现响应以XML格式返回。如果有任何错误,请确保实体名称及其属性为 case senisitve

    在看到您的结果后,我们将使用AJAX调用来调用此URL。

    $.ajax({
                    type: "GET",
                    contentType: "application/json; charset=utf-8",
                    datatype: "json",
                    url: 'http://yourHostName/yourOrg/XRMServices/2011/OrganizationData.svc/new_CountrytSet?$select=new_Name,new_CountryId&$filter=new_Name eq 'Canada'',
                    beforeSend: function (XMLHttpRequest) {
                        //Specifying this header ensures that the results will be returned as JSON.             
                        XMLHttpRequest.setRequestHeader("Accept", "application/json");
                    },
                    success: function (data) {
                        if (data.d && data.d.results) {
                            //var _canadaId = "{FC167B4D-1C3B-E111-8904-F2EA3FE25706}"; no longer be used
                            var _canadaId = data.d.results[0].ContactId;
    
                            // now we have the GUID of Canada, now I can continue my process
    
                        }
    
                    },
                    error: function (XmlHttpRequest) {
    
                        alert("Error : " + XmlHttpRequest.status + ": " + XmlHttpRequest.statusText + ": " + JSON.parse(XmlHttpRequest.responseText).error.message.value);
                    }
    
                });
    

    但在将代码复制到表单之前,必须从here下载jQuery lib。 然后将其作为Web资源上载,将此Web资源添加到Form load libs。

    以下是表单加载事件处理程序中的完整代码:

    var context = GetGlobalContext();
    
    // retireve the invoice record id (Opened Form)
    var invoiceId = context.getQueryStringParameters().id;
    var customerId;
    
    //Retrieve the server url, which differs on-premise from on-line and 
    //shouldn't be hard-coded.
    // this will return something like http://yourHostName/yourOrg
    var serverUrl = context.getServerUrl();
    
    
    //The XRM OData end-point
    var ODATA_ENDPOINT = "/XRMServices/2011/OrganizationData.svc";
    
    var odataUri = serverUrl + ODATA_ENDPOINT;
    
    function SetDefaultCountryCode(countryFieldId, odataUri) {
    
        odataUri = odataUri + '/ContactSet?$select=ContactId,FullName&$filter=FullName eq \'Ahmed Shawki\'';
        $.ajax({
            type: "GET",
            contentType: "application/json; charset=utf-8",
            datatype: "json",
            url: odataUri,
            beforeSend: function (XMLHttpRequest) {
                //Specifying this header ensures that the results will be returned as JSON.             
                XMLHttpRequest.setRequestHeader("Accept", "application/json");
            },
            success: function (data) {
                if (data.d && data.d.results) {
                    //var _canadaId = "{FC167B4D-1C3B-E111-8904-F2EA3FE25706}"; no longer be used
                    var _canadaId = data.d.results[0].ContactId;
    
                    var countryControl = Xrm.Page.getAttribute(countryFieldId);
    
                    // only attempt the code if the control exists on the form
                    if (countryControl != null) {
                        var currentCountry = countryControl.getValue();
    
                        // if country is not specified, then set it to the default one (Canada) 
                        if (currentCountry == null) {
                            var defaultCountry = new Object();
                            defaultCountry.entityType = "cga_country";
                            defaultCountry.id = _canadaId;
                            defaultCountry.name = "Canada";
                            var countryLookupValue = new Array();
                            countryLookupValue[0] = defaultCountry;
    
                            countryControl.setValue(countryLookupValue);
                        }
                    }
                }
    
            },
            error: function (XmlHttpRequest) {
    
                alert("Error : " + XmlHttpRequest.status + ": " + XmlHttpRequest.statusText + ": " + JSON.parse(XmlHttpRequest.responseText).error.message.value);
            }
    
        });
    
    }
    

    还有一件事,不要忘记在表单属性上选中“将执行上下文作为第一个参数”框。

    编辑:除了将jQuery库添加到表单加载事件处理程序之外,还将Json2 lib添加为Web资源。

    有关REST Endpoint

    的详细信息

答案 1 :(得分:4)

确实可以导出和导入记录及其guid,而不是原生。您必须构建一个可以为您导出数据的应用程序,然后通过目标环境中的CRM API创建相同的记录。您只需要清除对create(createon,statecode等)无效的字段,并指定相同的Guid。然后,CRM将使用该Guid创建记录。

旧4.0 Configuration Data Tool就是这样做的。我不记得它是否适用于2011年组织,但它可能是一个起点。