关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复168或者20151104可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me!
以前的博文 微软Dynamics CRM 2013介绍系列之二十三:操作(Action)的开发与配置 简单介绍了Dynamics CRM 2013起新增一种新的流程类型--操作,英文是action,没有做实验证实,操作中所有的步骤是否是同一个事务?是否存在可选的选项?如果不是的话,Microsoft Dynamics CRM Online 2015 Update 1 的更新中包括了一个新的消息叫做 ExecuteTransactionRequest 用来在同一个事务中执行多个消息应该是个补充,我因为没有CRM Online 2015 Update 1环境,而Dynamics CRM 2015本地部署的版本又一直没有出Update 1功能包,所以暂时无法演示给这个消息给大家看。相信待到今年出来Dynamics CRM 2016出来后是可以演示的。
 
在解决方案中,我们建立一个简单的流程,如下:我这里选择的实体是 无(全局) ,这样执行起来方便点。
我先增加两个简单的字符串类型的参数如下:
 
我这里增加两个简单的类型为 创建记录 的步骤,步骤一创建的客户为本操作的参数AccountName1的值,步骤二创建的客户为本操作的参数 AccoutName2 的值。

然后激活这个操作,这样我们就可以调用这个操作了。

我目前阶段只能通过代码来调用这个操作。因为在Dynamics CRM 2015中还不支持直接在工作流中调用操作,而到了Dynamics CRM 2015 Update 1则支持了。代码如下:
static void Main(string[] args)
{
var service = GetOrganizationService();
var whoAmIReq = new WhoAmIRequest();
var whoAmIResp = service.Execute(whoAmIReq) as WhoAmIResponse;
OrganizationRequest req = new OrganizationRequest("new_TestAction");
req["AccountName1"] = "测试创建的客户一";
req["AccountName2"] = "测试创建的客户二";
req["Target"] = new EntityReference("systemuser", whoAmIResp.UserId);
service.Execute(req);
Console.WriteLine("程序运行完成!");
Console.ReadKey();
}
运行代码后真的创建了两个客户如下:
 
为了测试我将这两个新建的客户删除,然后我在创建客户时间上注册了一个实时工作流来让创建客户产生异常:
 
激活工作流以后,如果我手工创建客户名称包括 二 的客户会报错如下:
 
当然用代码来执行也会报错,我还是执行前面的代码,代码会跑出异常如下:
这个时候我去刷新下客户界面看看第一个步骤增加的 测试创建的客户一 是否增加,发现没有增加。是我的代码没有处理异常吗?我用异常处理块将代码包括起来还是同样的错误。看来至少两个CRM操作是在同一个事务中。
细心的朋友可能会发现,定义操作的时候有个选项默认是选中的,那就是启用回滚选项,如下:
所以我在想,如果我去掉这个选中,也就是不选中 启用回滚 ,会不会就不在同一事务中了?于是我这样修改后激活去测试下:
 
然后我去执行前面相同的代码,结果是创建了 测试创建的客户一,没有创建 测试创建的客户二 ,看来是没有回滚,也就是这个选项还是很重要的。
 我们继续做一个小实验,就是在前面两个步骤以后加一个调用自定义工作流活动的步骤,这个自定义工作流活动我只是简单的下载一个链接的文件作为第二个客户的附件而已,代码如下:稍微注意下,如果输入类型是EntityReference,需要通过ReferenceTarget属性指定是那个实体。
public sealed class GetNoteContent : CodeActivity
{
[RequiredArgument]
[Input("要添加附件的客户")]
[ReferenceTarget("account")]
public InArgument<EntityReference> InAccount { get; set; } protected override void Execute(CodeActivityContext executionContext)
{
IOrganizationServiceFactory serviceFactory = executionContext.GetExtension<IOrganizationServiceFactory>();
IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId); try
{
// TODO: Implement your custom Workflow business logic.
using (WebClient client = new WebClient())
{
byte[] responseBytes = client.DownloadData(@"http://www.luoyong.me/GetAnnotationDocument.ashx?AnnotationId=B39F0691-C377-E511-80ED-000D3A800514");
var annotationEntity = new Entity("annotation");
annotationEntity["documentbody"] = Convert.ToBase64String(responseBytes);
annotationEntity["subject"] = "微软MVP罗勇用代码增加的带附件的注释标题";
annotationEntity["notetext"] = "微软MVP罗勇用代码增加的带附件的注释内容";
annotationEntity["filename"] = "附件.pdf";
annotationEntity["mimetype"] = "application/pdf";
annotationEntity["isdocument"] = true;
annotationEntity["objectid"] = InAccount.Get(executionContext);
service.Create(annotationEntity);
}
}
catch (FaultException<OrganizationServiceFault> e)
{
tracingService.Trace("Exception: {0}", e.ToString()); // Handle the exception.
throw;
} tracingService.Trace("Exiting GetNoteContent.Execute(), Correlation Id: {0}", context.CorrelationId);
}
}
同时我还禁用然后删除了之前创建的自定义工作流,这样创建第二个客户才能成功。修改了测试的操作,增加了一个调用自定义工作流活动的步骤如下:
我先测试 启用回滚的情况,测试结果发现两个客户创建成功,且第二个客户也增加了附件。
 
正常的能成功,我就稍微修改下自定义工作流活动的代码,故意把URL搞错,然后测试,抛出了如下异常:
 
然后我们去看创建的客户,发现没有创建客户。

如果我将操作的 启用回滚 选项去掉,然后激活测试结果如下,可以看到客户创建了,但是附件没有创建。

然后我还测试下,将这个创建附件的步骤放到第二步,且是为第一个创建的客户添加附件:
当没有选中 启用回滚 选项的时候测试结果是:客户一创建成功,第二个步骤出错,没有回滚整个操作,第三个步骤没有执行。
 
如果我选中 启用回滚 选项的话,测试结果是回滚了整个操作所做的事情。
 所以稍微总结下就是,操作如果选中了 启用回滚 这个选项,操作的所有步骤都是一个事务,如果没有选中,则是成功的会commit,失败的当然失败,后面的步骤不会执行。可以用来保证一次多个操作的事务性。
当我要删除创建的测试工作流活动的时候,又碰到使用SDK的插件注册工具(PluginRegistration)删除自定义工作流活动的时候登陆以后出现空白的情况,按照帖子 CRM SDK 2015 Plugin registration tool not working的说法,是语言包的问题,我得解决办法就是把插件注册工具文件夹中的除了 en, en-us 文件夹外所有的语言包都删除掉:
当然还可以用Developer Toolkit来删除,如下,自己再删除源文件和 RegisterFile.crmregister 文件中的相应内容即可:

Dynamics CRM中的操作(action)是否是一个事务(transaction)?的更多相关文章

  1. Dyanmics CRM您无法登陆系统。原因可能是您的用户记录或所属的业务部门在Microoft Dynamics CRM中已被禁用

    当在操作CRM时,做不论什么的写操作包含创建数据.更新数据.都会提示以下截图中的错误:"您无法登陆系统.原因可能是您的用户记录或所属的业务部门在Microoft Dynamics CRM中已 ...

  2. Dynamics CRM中一个查找字段引发的【血案】

    摘要: 本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复267或者20180311可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyon ...

  3. 在Dynamics CRM中使用Bootstrap

    我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...

  4. 在Dynamics CRM中自定义一个通用的查看编辑注释页面

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复162或者20151016可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me! 注释在CRM中的显示是比较特别, ...

  5. Dynamics CRM中的地址知多D?

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复169或者20151105可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me! CRM中的地址以前不是很了解,定 ...

  6. Dynamics CRM中的注释(Note)及RollupRequest消息初探

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复161或者20151015可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me! 注释,这个实体的架构名称是Ann ...

  7. Dynamics CRM 中Web API中的深度创建(Deep Insert)

    我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...

  8. 您无法登陆系统。原因可能是您的用户记录或所属的业务部门在Microoft Dynamics CRM中已被禁用

    问题发生在CRM 4.0 上 1 用户所在办事处及办事处上级被禁用. 2 如果已经重新启用了,还是报这个错误. 可以把停用的办事处及相关下级再重新--停用--启用一次试试. 3 如果还是报错,查看是否 ...

  9. Microsoft Dynamics CRM 2011 JS操作集锦

    1.Xrm.Page.context 用户ID:getUserId() 用户角色:getUserRoles() 用户语言:getUserLcid() 组织名称:getOrgUniqueName() 组 ...

随机推荐

  1. zabbix snmp监控与主被模式

    1.snmp基础介绍 snmp全称是简单网络管理协议 为什么要用? 路由器交换机无法安装agent程序,但是都提供snmp服务端, 我们可以使用zabbix的snmp方式监控snmp服务端的数据 2. ...

  2. JS基础语法---创建对象---三种方式创建对象:调用系统的构造函数;自定义构造函数;字面量的方式

    创建对象三种方式: 调用系统的构造函数创建对象 自定义构造函数创建对象(结合第一种和需求通过工厂模式创建对象) 字面量的方式创建对象 第一种:调用系统的构造函数创建对象 //小苏举例子: //实例化对 ...

  3. HTML——CSS基础

    一.引入CSS样式表 1.行内式 通过标记的style属性来设置元素的样式.基本语法如下: <标记名 style="属性1:属性值1; 属性2:属性值2; 属性3:属性值3;" ...

  4. 通过C#代码调用Dynamics 365 Web API执行批量操作

    我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...

  5. 中文版 Apple 官方 Swift 教程《The Swift Programming Language》

    简介 欢迎使用 Swift 关于 Swift 版本兼容性 Swift 初见 Swift 版本历史记录 Swift 教程 基础部分 基本运算符 字符串和字符 集合类型 控制流 函数 闭包 枚举 类和结构 ...

  6. mssql sqlserver 添加表注释和添加列注释的方法分享

     转自: http://www.maomao365.com/?p=8919 摘要: 下文讲述使用sql脚本对数据表或数据列添加注释(备注说明)的方法分享,如下所示: 实验环境:sql server 2 ...

  7. poj 1979 Red and Black 题解《挑战程序设计竞赛》

    地址 http://poj.org/problem?id=1979 Description There is a rectangular room, covered with square tiles ...

  8. Java入门程序HelloWorld

    程序开发步骤说明 开发环境已经搭建完毕,可以开发我们第一个Java程序了.Java程序开发三步骤:编写.编译.运行.如下图所示 详解: 编写源程序:通俗来说就是我们通过Java的语法自己写的代码 编译 ...

  9. USACO Max Flow

    洛谷 P3128 [USACO15DEC]最大流Max Flow 洛谷传送门 JDOJ 3027: USACO 2015 Dec Platinum 1.Max Flow JDOJ传送门 Descrip ...

  10. Codechef November Challenge 2019 Division 1

    Preface 这场CC好难的说,后面的都不会做QAQ 还因为不会三进制位运算卷积被曲明姐姐欺负了,我真是太菜了QAQ PS:最后还是狗上了六星的说,期待两(三)场之内可以上七星 Physical E ...