关注本人微信和易信公众号: 微软动态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. VS2019 .Net Core 3.0 Web 项目启用动态编译

    VS2019 中 .Net Core 3.0 项目默认没有启用动态编译, 这导致按F5调试的时候,修改了 HTML 代码,在浏览器上刷新没有效果. 启用动态编译方法如下: 1. 安装 Microsof ...

  2. C# 使用GDI绘制雷达图

    最近项目要用C#实现画一个雷达图,搜了搜网上竟然找不到C#画雷达图的解决方案,那么自己实现一个吧 实现效果如下图: 代码如下: public static class RadarDemo { ; ; ...

  3. go-爬段子

    爬取搞笑的段子,横向爬取+纵向爬取 横向爬取爬页数,纵向爬取,爬每页的内容 package main import ( "fmt" "io" "net ...

  4. Python:有参装饰器与多个装饰器装饰一个函数

    有参装饰器 def timmerout(flag1): #flag1 =flag def timmer(f): def inner(*args,**kwargs): if flag1: start_t ...

  5. NTP and Chrony在RHEL

    在RHEL7上,Chrony已经代替了NTP来做时间同步服务. 1 服务器上操作 yum -y install chrony vim /etc/chrony.conf # Allow NTP clie ...

  6. Redis之高可用、集群、云平台搭建(非原创)

    文章大纲 一.基础知识学习二.Redis常见的几种架构及优缺点总结三.Redis之Redis Sentinel(哨兵)实战四.Redis之Redis Cluster(分布式集群)实战五.Java之Je ...

  7. sqlserver实现分隔字符串

    sqlserver 使用函数实现分隔字符串 create function dbo.fn_split ( @str_source nvarchar(max), ) ) returns @temp ta ...

  8. linux下Oracle与swap分区大小配置规划

    Oracle于Linux系统---交换空间大小规划 分三种常用情况(1)实际内存为1GB~2GB建议交换空间为内存的1.5倍 (2)实际内存为2GB~8GB建议交换空间与内存相同 (3)实际内存超过8 ...

  9. 获取当前Linux的外网地址

    有时候我们在测试配置外网IP是不是成功时,我们需要使用一些命令,使用 ssh 登录可以查看ip, 还有一种可以使用命令: curl ifconfig.me 进行方便获取,公网IP:真的是非常好的服务: ...

  10. Python:判断列表中含有字符串且组成新的列表打印输出-Dotest董浩

    '''题一:判断列表中含有字符串且组成新的列表打印输出知识点:列表.列表的增删改查.for循环.if判断'''#@Author:Dotest软件测试#@QQ:1274057839names = ['D ...