CRM2011 concurrency问题及解决方案
CRM2011对删除和添加操作会自动做判断,比如A打开纪录x,B也打开纪录x,然后B删除了纪录x,A去更新的话就会有提示。更新的话是后者覆盖前者,比如A打开纪录x,B打开纪录x,然后B把记录x中的字段y更新成了3,然后点保存,A把字段y更新成了5保存,最后5会覆盖3。这篇日志解决的问题就是当A改成5想保存的时候提示记录x已在某个时间点被某人更新过了,如果继续保存就会覆盖记录,否则放弃保存。
用js完成整个验证,然后注册form的onload和onsave达到目的,当然也要添加jquery和json2两个js类库
上js先
var previousModificationDateOnLoad; //var serverUrl = Xrm.Page.context.getServerUrl(); var serverUrl = document.location.protocol + "//" + document.location.host + "/" + Xrm.Page.context.getOrgUniqueName(); var ODATA_ENDPOINT = "/XRMServices/2011/OrganizationData.svc"; var recordId; var entityName; function getPreviousModificationDate() { recordId = Xrm.Page.data.entity.getId().replace('{','').replace('}',''); entityName = Xrm.Page.data.entity.getEntityName() + "Set"; previousModificationDateOnLoad = new Date(); retrieveRecord(recordId,entityName, function(data){ previousModificationDateOnLoad = data.ModifiedOn; previousModificationDateOnLoad = new Date(parseInt(/\/Date\((\d+).*/.exec(previousModificationDateOnLoad)[1])); },null, false); //alert(previousModificationDateOnLoad); } function validateConcurrency(ExecutionObj) { if(Xrm.Page.ui.getFormType()==1) { return; } var previousModificationDateOnSave, previousModifiedByOnSave; retrieveRecord(recordId,entityName, function(data){ previousModificationDateOnSave = data.ModifiedOn; //alert(previousModificationDateOnSave); previousModifiedByOnSave = data.ModifiedBy.Name; //alert(previousModifiedByOnSave); //change timestamp to date format previousModificationDateOnSave = new Date(parseInt(/\/Date\((\d+).*/.exec(previousModificationDateOnSave)[1])); //alert(previousModificationDateOnLoad + "\n"+previousModificationDateOnSave) if(previousModificationDateOnLoad < previousModificationDateOnSave) { var continueSave = confirm("The record was recently modified by "+previousModifiedByOnSave+ " On " + previousModificationDateOnSave + ".If you chose to save this record you will overwrite the recent changes made by "+ previousModifiedByOnSave+"\nAre you sure you want to save this record?"); if(!continueSave) { ExecutionObj.getEventArgs().preventDefault(); event.returnValue = false; } } //previousModificationDateOnLoad = previousModificationDateOnSave; },null, false); } function retrieveRecord(id, odataSetName,successCallback, errorCallback, aSync) { if(aSync==null || aSync==undefined) { aSync = true; } //alert(serverUrl +ODATA_ENDPOINT +"/"+odataSetName+"(guid'"+id+"')"); $.ajax({ type:"GET", contentType:"application/json;charset=utf-8", datatype:"json", async:aSync, url:serverUrl +ODATA_ENDPOINT +"/"+odataSetName+"(guid'"+id+"')", beforeSend:function(XMLHttpRequest){ XMLHttpRequest.setRequestHeader("Accept","application/json"); }, success:function(data,textStatus,XmlHttpRequest){ if(successCallback){ successCallback(data.d,textStatus,XmlHttpRequest); } }, error:function(XmlHttpRequest,textStatus,errorThrown){ alert("error"); if(errorCallback){ errorCallback(XmlHttpRequest,textStatus,errorThrown); } } }); }
CRM中的配置
然后选中validateConcurrency点击Edit,勾选Pass execution context as first parameter
就这些配置,可以实现排他机制咯。