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
就这些配置,可以实现排他机制咯。
CRM2011 concurrency问题及解决方案的更多相关文章
- Dynamics CRM2011 导入解决方案报根组件插入错误的解决方法
今天在还原一个老版本的解决方案,在导入时报根组件插入问题"Cannot add a Root Component 38974590-9322-e311-b365-00155d810a00 o ...
- Microsoft Dynamics CRM2011 导入解决方案时,失败的原因小结
将大的自定义文件导入到 Microsoft Dynamics CRM 时发生超时? 如图: 首先: a.首先需要确认两面的CRM 环境是一致,比如都是Roll up 11等. b.然后确认导出解决方案 ...
- Concurrency != Parallelism
前段时间在公司给大家分享GO语言的一些特性,然后讲到了并发概念,大家表示很迷茫,然后分享过程中我拿来了Rob Pike大神的Slides <Concurrency is not Parallel ...
- Spike Notes on Lock based Concurrency Concepts
Motivation 承并发编程笔记Outline,这篇文章专注于记录学习基于锁的并发概念的过程中出现的一些知识点,为并发高层抽象做必要的准备. 尽管存在Doug Lee开山之作Concurrent ...
- Atitit ACID解决方案2PC(两阶段提交) 跨越多个数据库实例的ACID保证
Atitit ACID解决方案2PC(两阶段提交) 跨越多个数据库实例的ACID保证 1.1. ACID解决方案1 1.2. 数据库厂商在很久以前就认识到数据库分区的必要性,并引入了一种称为2PC( ...
- Microsoft Dynamics CRM2011 必备知识点
一.CRM基本知识 1.CRM2001 有几个服务端点? 答:对外公开的服务,如Web服务,WCF,Restful API 2.一个ERP系统,要访问CRM的数据,CRM2011有哪些现有的服务入口提 ...
- Java 编程要点之并发(Concurrency)详解
计算机用户想当然地认为他们的系统在一个时间可以做多件事.他们认为,他们可以工作在一个字处理器,而其他应用程序在下载文件,管理打印队列和音频流.即使是单一的应用程序通常也是被期望在一个时间来做多件事.例 ...
- Python Scrapy反爬虫常见解决方案(包含5种方法)
爬虫的本质就是“抓取”第二方网站中有价值的数据,因此,每个网站都会或多或少地采用一些反爬虫技术来防范爬虫.比如前面介绍的通过 User-Agent 请求头验证是否为浏览器.使用 JavaScript ...
- SharePoint 2010 使用沙盒解决方案隐藏页面中的”元素”
起因: 一朋友问我如何隐藏SharePoint 2010中"回收站"和"所有网站内容".我告诉他需要写点css,然后他就蒙圈了(他是英文专业). 解决方案: 一 ...
随机推荐
- react.js 从零开始(一)
React 是什么? 网络上的解释很多...我这里把他定义为 通过javascript 的形式组件化 html的框架... React 仅仅是 VIEW 层. React 提供了模板语法以及一些函数钩 ...
- HDU 1198 Farm Irrigation (并检查集合 和 dfs两种实现)
Farm Irrigation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- 从源码看Android中sqlite是怎么读DB的(转)
执行query 执行SQLiteDatabase类中query系列函数时,只会构造查询信息,不会执行查询. (query的源码追踪路径) 执行move(里面的fillwindow是真正打开文件句柄并分 ...
- 第7章 桥接模式(Bridge Pattern)
原文 第7章 桥接模式(Bridge Pattern) 定义: 在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能 ...
- who is the best?
Description There are N people want to choose the best person. Each person select the best person $a ...
- 从头开始学JavaScript (十二)——Array类型
原文:从头开始学JavaScript (十二)--Array类型 一.数组的创建 注:ECMAscript数组的每一项都可以保存任何类型的数据 1.1Array构造函数 var colors = ne ...
- TCO14 2C L2: CliqueGraph,graph theory, clique
称号:http://community.topcoder.com/stat?c=problem_statement&pm=13251&rd=16017 參考:http://apps.t ...
- hdu Online Judge
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1073 数据判断,主要是如何判断WA和PE,吸收字符! 代码: #include <stdio.h ...
- NET动态调用WebService
NET动态调用WebService 这不是一篇教你了解WebService的博文,也不是对WebService的深入理解, 这是一篇教你在开发过程中,如果动态的调用WebService一个方法. 在比 ...
- AlloyRenderingEngine
AlloyRenderingEngine燃烧的进度条 写在前面 Github: https://github.com/AlloyTeam/AlloyGameEngine HTML 5新增了progre ...