我们在内部部署了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。
我在这里有两个问题:
是否可以导出/导入保留GUID的实体数据?
如果我在DEV和TEST中不能拥有相同的GUID,我怎样才能使JScript正常工作?
提前感谢您提供任何帮助/反馈。
答案 0 :(得分:6)
对您的GUID进行硬编码是非常糟糕的做法,并且您发现了它的问题。 如上所述,我们不能拥有相同的GUID,但我们的名称相同。因此,我们必须使用JScript和jQuery查询国家/地区的名称以检索GUID。
为了从客户端(或实体表单)退出信息:
让我们看一下查询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资源。
的详细信息答案 1 :(得分:4)
确实可以导出和导入记录及其guid,而不是原生。您必须构建一个可以为您导出数据的应用程序,然后通过目标环境中的CRM API创建相同的记录。您只需要清除对create(createon,statecode等)无效的字段,并指定相同的Guid。然后,CRM将使用该Guid创建记录。
旧4.0 Configuration Data Tool就是这样做的。我不记得它是否适用于2011年组织,但它可能是一个起点。