我在预约表格中有自定义的javascript。功能区上有一个按钮。按钮应该更改状态代码然后保存表单。但是当我尝试保存时,如果有一个字段发生了变化,表单就不会保存。以下是我的代码;
Xrm.Page.data.entity.save();
var newStatus = 3;
var json = new JSonObject();
var data = json.SetState(Xrm.Page.data.entity.getId(), Xrm.Page.data.entity.getEntityName(), 1, newStatus);
if (data != true)
alert("Error!");
else {
Xrm.Page.data.entity.save('saveandclose');
//window.parent.location.reload();
}
我尝试了一切。首先保存然后setState然后再次保存等。如果代码是这样的,它会导致错误,即#34;无法更新已关闭或已取消的活动"。如果首先保存然后重新加载然后重新加载然后保存然后重新加载,则更改的字段不会获得最后一个值。它获取从保存按钮手动保存的先前值。
答案 0 :(得分:1)
function changeRecordStatus(RECORD_ID,stateCode,statusCode) {
// create the SetState request
var request = "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">";
request += "<s:Body>";
request += "<Execute xmlns=\"http://schemas.microsoft.com/xrm/2011/Contracts/Services\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">";
request += "<request i:type=\"b:SetStateRequest\" xmlns:a=\"http://schemas.microsoft.com/xrm/2011/Contracts\" xmlns:b=\"http://schemas.microsoft.com/crm/2011/Contracts\">";
request += "<a:Parameters xmlns:c=\"http://schemas.datacontract.org/2004/07/System.Collections.Generic\">";
request += "<a:KeyValuePairOfstringanyType>";
request += "<c:key>EntityMoniker</c:key>";
request += "<c:value i:type=\"a:EntityReference\">";
request += "<a:Id>" + RECORD_ID + "</a:Id>";
request += "<a:LogicalName>cmic_systemusersalesterritoryassociation</a:LogicalName>";
request += "<a:Name i:nil=\"true\" />";
request += "</c:value>";
request += "</a:KeyValuePairOfstringanyType>";
request += "<a:KeyValuePairOfstringanyType>";
request += "<c:key>State</c:key>";
request += "<c:value i:type=\"a:OptionSetValue\">";
request += "<a:Value>"+stateCode+"</a:Value>";
request += "</c:value>";
request += "</a:KeyValuePairOfstringanyType>";
request += "<a:KeyValuePairOfstringanyType>";
request += "<c:key>Status</c:key>";
request += "<c:value i:type=\"a:OptionSetValue\">";
request += "<a:Value>"+statusCode+"</a:Value>";
request += "</c:value>";
request += "</a:KeyValuePairOfstringanyType>";
request += "</a:Parameters>";
request += "<a:RequestId i:nil=\"true\" />";
request += "<a:RequestName>SetState</a:RequestName>";
request += "</request>";
request += "</Execute>";
request += "</s:Body>";
request += "</s:Envelope>";
//send set state request
$.ajax({
type: "POST",
contentType: "text/xml; charset=utf-8",
datatype: "xml",
url: Xrm.Page.context.getServerUrl() + "/XRMServices/2011/Organization.svc/web",
data: request,
beforeSend: function (XMLHttpRequest) {
XMLHttpRequest.setRequestHeader("Accept", "application/xml, text/xml, */*");
XMLHttpRequest.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/Execute");
},
success: function (data, textStatus, XmlHttpRequest) {
Xrm.Page.ui.close();
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert(errorThrown);
}
});
}
我使用上面提到的函数异步更改RecordStatus
创建一个如下所示的函数名AppointmentOnSave()
并在其中调用上述函数:
function AppointmentOnSave(){
var AppointmentGuid = Xrm.Page.data.entity.getId();
var StateCode = 1;
var StatusCode= 3;
Xrm.Page.data.entity.save( "saveandclose");
changeRecordStatus(AppointmentGuid,StateCode,StatusCode); //Mark Completed
}
这是第二种方法而且很简单: 试试这个:
首先需要将这三个javascript文件添加为CRM
中的webresource jquery1.4.1.min.js
json2.js
SDK.JQuery.js
这些文件位于Script文件夹下的SDK中(sdk \ samplecode \ js \ restendpoint \ jqueryrestdataoperations \ jqueryrestdataoperations \ scripts)
然后:
function AppointmentOnSave(){
var AppointmentGuid = Xrm.Page.data.entity.getId();
var StateCode = 1;
var StatusCode= 3;
var Appoinment= {};
Appoinment.StateCode=1;
Appoinment.StatusCode=3;
setTimeout(function(){
SDK.JQuery.updateRecord(
AppointmentGuid ,
Appoinment,
"task",
function success (msg) {
alert(msg);
},
function failed (error) {
alert(error);
}
);
}, 500);at
Xrm.Page.data.entity.save( "saveandclose");
}