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中的配置

CRM2011 concurrency问题及解决方案

 CRM2011 concurrency问题及解决方案

 CRM2011 concurrency问题及解决方案

然后选中validateConcurrency点击Edit,勾选Pass execution context as first parameter

CRM2011 concurrency问题及解决方案

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

你可能感兴趣的:(concurrency)