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

就这些配置,可以实现排他机制咯。

posted @ 2014-05-23 17:57  nickycookie  阅读(763)  评论(0编辑  收藏  举报