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

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

CRM2011 concurrency问题及解决方案的更多相关文章

  1. Dynamics CRM2011 导入解决方案报根组件插入错误的解决方法

    今天在还原一个老版本的解决方案,在导入时报根组件插入问题"Cannot add a Root Component 38974590-9322-e311-b365-00155d810a00 o ...

  2. Microsoft Dynamics CRM2011 导入解决方案时,失败的原因小结

    将大的自定义文件导入到 Microsoft Dynamics CRM 时发生超时? 如图: 首先: a.首先需要确认两面的CRM 环境是一致,比如都是Roll up 11等. b.然后确认导出解决方案 ...

  3. Concurrency != Parallelism

    前段时间在公司给大家分享GO语言的一些特性,然后讲到了并发概念,大家表示很迷茫,然后分享过程中我拿来了Rob Pike大神的Slides <Concurrency is not Parallel ...

  4. Spike Notes on Lock based Concurrency Concepts

    Motivation 承并发编程笔记Outline,这篇文章专注于记录学习基于锁的并发概念的过程中出现的一些知识点,为并发高层抽象做必要的准备. 尽管存在Doug Lee开山之作Concurrent ...

  5. Atitit ACID解决方案2PC(两阶段提交)  跨越多个数据库实例的ACID保证

    Atitit ACID解决方案2PC(两阶段提交)  跨越多个数据库实例的ACID保证 1.1. ACID解决方案1 1.2. 数据库厂商在很久以前就认识到数据库分区的必要性,并引入了一种称为2PC( ...

  6. Microsoft Dynamics CRM2011 必备知识点

    一.CRM基本知识 1.CRM2001 有几个服务端点? 答:对外公开的服务,如Web服务,WCF,Restful API 2.一个ERP系统,要访问CRM的数据,CRM2011有哪些现有的服务入口提 ...

  7. Java 编程要点之并发(Concurrency)详解

    计算机用户想当然地认为他们的系统在一个时间可以做多件事.他们认为,他们可以工作在一个字处理器,而其他应用程序在下载文件,管理打印队列和音频流.即使是单一的应用程序通常也是被期望在一个时间来做多件事.例 ...

  8. Python Scrapy反爬虫常见解决方案(包含5种方法)

    爬虫的本质就是“抓取”第二方网站中有价值的数据,因此,每个网站都会或多或少地采用一些反爬虫技术来防范爬虫.比如前面介绍的通过 User-Agent 请求头验证是否为浏览器.使用 JavaScript ...

  9. SharePoint 2010 使用沙盒解决方案隐藏页面中的”元素”

    起因: 一朋友问我如何隐藏SharePoint 2010中"回收站"和"所有网站内容".我告诉他需要写点css,然后他就蒙圈了(他是英文专业). 解决方案: 一 ...

随机推荐

  1. IT只忍者龟Photoshop简单人像的头发抠图过程

    一.导入素材,加入蒙版 1.导入美女图片 2.导入背景图片 如今须要将美女抠出来放在这个背景上,怎么办?一定会有人想到用通道,抽出.(备注:在ps6以后版本号,抽出已经没有这个选项了). 3.将美女图 ...

  2. Android IPC通信和AIDL技术应用

    首先我们了解一下 IPC和AIDL IPC:进程间通信 AIDL:Android Interface Definition Language,即Android接口定义语言. 为什么使用: Androi ...

  3. Python于*args 和**kwargs使用

    1,*args  当量list名单 def fun_args(farg, *args): print "arg:", farg for value in args: print & ...

  4. C#和Java中执行SQL文件脚本的代码(非常有用)

    原文:C#和Java中执行SQL文件脚本的代码(非常有用) 我们在做程序的时候有事后会涉及到利用sql文件 直接执行,可是在sql文件中有很多注释,我们要一句一句的执行首先必须的得把sql文件解析 去 ...

  5. 使用requirejs实现模块化编程

    > 序言 - -# 公司大了,业务多了,前端代码量也逐渐增大,我们渐渐的依赖js实现的交互越来越多,长期以来会导致我们的代码维护越来越困难,所以依赖的插件也越来越多..比如这样页面中有大量的js ...

  6. [2013山东ACM]省赛 The number of steps (可能DP,数学期望)

    The number of steps nid=24#time" style="padding-bottom:0px; margin:0px; padding-left:0px; ...

  7. Codeforces Round #266 (Div. 2)-C,D

    C - Number of Ways 直接暴力从前往后寻找.假设找到1/3sum的位置,那么标记++.找到2/3的位置,总数加上标记数. #include<stdio.h> #includ ...

  8. 【SICP练习】150 练习4.6

    练习4-6 原版的 Exercise 4.6. Let expressions are derived expressions, because (let (( ) - ( )) ) is equiv ...

  9. ORA-00911:无效字符错误

    ORA-00911:无效字符错误--造成构建环境的一个小错误 实施某功能脚本语句.编译时,出现了ORA-00911错误,当时有些疑惑,之前生产库使用是没有问题的,经过一番检查后发现原来是一个非常细微的 ...

  10. mac os x10.11.2系统eclipse无法读取环境变量的问题

    eclipse调试Android自动化脚本的时候一直无法找到adb,遇到这么坑的问题,折腾死了,记录一下. mac os x10.11.2系统GUI程序(eclipse)无法读取~/.bash_pro ...