关注本人微信和易信公众号: 微软动态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. DataTable实现分组

    有时候我们从数据库中查询出来数据之后,需要按照DataTable的某列进行分组,可以使用下面的方法实现,代码如下: using System; using System.Collections.Gen ...

  2. 利用Azure虚拟机安装Dynamics 365 Customer Engagement之十一:SQL Server配置Always On后D365的配置更改

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

  3. SAP depreciation key config

    正常折旧 Configure 1.分配总帐科目 spro进入后台配置 –> Financial Accounting(New) –> Asset Accounting –> Depr ...

  4. ios 10 访问设置问题

    ios 10 访问设置问题 从ios8之api支持访问设置通过访问UIApplicationOpenSettingsURLString来跳转设置 NSURL*url=[NSURL URLWithStr ...

  5. 自己用到的解决Python3.6.5+Django2.0集成xadmin后台点击添加或者内容详情报 list index out of range 的错误的办法如下:

    Python3.6.5 Django2.0 这是Django版本与xadmin兼容的问题 解决办法如下: 注释掉如下代码: def render(self, name, value, attrs=No ...

  6. 2019 CVPR 基于GAN的ImageCaptioning论文

    1.MSCap: Multi-Style Image Captioning with Unpaired Stylized Text 生成多种风格的caption 当前的image captioning ...

  7. Python 列表生成式 & 字典生成式

    Python 列表生成式 & 字典生成式 通过生成式可以更加简洁地生成列表和字典 列表生成式 对比 直接生成数据后加入列表示例: user_list = list() for i in ran ...

  8. Vue STOP&SELF方法使用

    stop属性:停止冒泡只执行到此处 self:只执行当前 代码: <!doctype html> <html lang="en"> <head> ...

  9. Codeforces Round #602 (Div. 2, based on Technocup 2020 Elimination Round 3) D2. Optimal Subsequences (Hard Version) 数据结构 贪心

    D2. Optimal Subsequences (Hard Version) This is the harder version of the problem. In this version, ...

  10. git 添加add readme.txt 报fatal: pathspec 'readme.txt' did not match any files错误

    刚刚接触git版本管理器,跟着廖雪峰老师的git教程学习,在创建一个新的文件时,使用的是$ git add readme.txt指令,但是报出fatal: pathspec 'readme.txt' ...