Dynamic CRM 2013学习笔记(十四)复制/克隆记录

经常有这样的需求,一个单据上有太多要填写的内容,有时还关联多个子单据,客户不想一个一个地填写,他们想从已有的单据上复制数据,克隆成一条新的记录。本文将介绍如何克隆一条记录,包括它的子单据以生成一条新的记录。

主要用到Microsoft.Xrm.Client.EntityExtensions.Clone方法来克隆数据,以及用OrganizationServiceContext来动态复制子单据的数据。

首先在界面上新加一个Clone的按钮,加一个new_clone的字段;点击按钮时,把new_clone字段设为clone以触发插件,插件里完成数据的复制工作,并再次把new_clone字段设成新数据的id,new_clone的onchange事件会调用Xrm.Utility.openEntityForm("new_marketing_plan", cloneValue);来打开新的数据。

 

下面看下实现方法:

 

1. 界面上js:

  1: //clone field change event
  2: function openNewEntity() {
  3:     var clone = Xrm.Page.getAttribute("new_clone");
  4:     var cloneValue = clone.getValue();
  5:     if (cloneValue != "clone" && cloneValue != "") {
  6:         clone.setSubmitMode("always");
  7:         clone.setValue("");
  8:         Xrm.Page.data.entity.save();
  9:         Xrm.Utility.openEntityForm("new_marketing_plan", cloneValue);
 10:     }
 11: }
 12:
 13: //clone button click event
 14: function clone() {
 15:     var clone = Xrm.Page.getAttribute("new_clone");
 16:     clone.setSubmitMode("always");
 17:     clone.setValue("clone");
 18:     Xrm.Page.data.entity.save();
 19: }

2. 主单据复制:

  1: new_marketing_plan newMP = (new_marketing_plan)Microsoft.Xrm.Client.EntityExtensions.Clone(curEnt, true);
  2: new_marketing_plan mp = new new_marketing_plan() { Id = newMP.Id };
  3:
  4: Guid newMPid = Guid.NewGuid();
  5: newMP.Attributes.Remove("new_marketing_planid");
  6: newMP.Attributes.Remove("new_name");
  7: newMP.new_approval_status = new OptionSetValue(1);
  8: newMP.new_clone = "";
  9: newMP.EntityState = null;
 10: newMP.Id = newMPid;
 11: adminService.Create(newMP);

 

3. 子表复制:

我这里有9个子表,所以抽出了一个方法以方便使用, 以后要是子单据有变化,只用改下这里的entNames就行了。

  1: string entNames = "new_print_plan,new_radio_plan,new_bill_board,new_tv_plan,new_btl_posm,new_btl_poe_fixed,new_promotion_girls,new_promotion_events,new_digital_plan";
  2: foreach (string entName in entNames.Split(‘,‘))
  3: {
  4: CloneRelatedEntities(adminService, newMPid, entName, "new_marketing_planid", mp);
  5: }
  6:
  7: curEnt["new_clone"] = newMPid.ToString();
  8: adminService.Update(curEnt);

 

  1: private void CloneRelatedEntities(IOrganizationService adminService, Guid newEntityId, string subEntityName, string filterName, Entity parentEntity)
  2: {
  3:     try
  4:     {
  5:         using (OrganizationServiceContext svcContext = new OrganizationServiceContext(adminService))
  6:         {
  7:             var ents = svcContext.CreateQuery(subEntityName).Where(e => e[filterName] == parentEntity[filterName]).ToList();
  8:             foreach (var ent in ents)
  9:             {
 10:                 var newEnt = Microsoft.Xrm.Client.EntityExtensions.Clone(ent);
 11:                 newEnt.Attributes[filterName] = new EntityReference(subEntityName, newEntityId);
 12:                 newEnt.Id = Guid.NewGuid();
 13:                 newEnt.EntityState = null;
 14:                 adminService.Create(newEnt);
 15:             }
 16:         }
 17:     }
 18:     catch (Exception ex)
 19:     {
 20:         throw new InvalidPluginExecutionException(MethodBase.GetCurrentMethod().Name + " " + ex.Message);
 21:     }
 22: }

 

4. 注意事项

  • 当我完成Unit Test,注册完插件后,报了下面的错:

Could not load file or assembly ‘Microsoft.Xrm.Client, Version=6.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35‘ or one of its dependencies. The system cannot find the file specified

原来这个Client dll在服务器上是没有的,需要我们手动copy上去。从我们本机的“SDK\Bin”里copy到服务器上的“program files\Microsoft Dynamics CRM\CRMWeb\bin”下即可。

 

  • 再点击Clone按钮,又报了一个错:

This workflow job was canceled because the workflow that started it included an infinite loop. Correct the workflow logic and try again. For information about workflow logic, see Help

原来出现死循环了,解决方法很简单,在插件的开始处加上下面代码就行了:

            if (context.Depth > 1)

            {

                return;

            }

 

 

 

Dynamic CRM 2013学习笔记 系列汇总

时间: 2024-10-02 04:36:29

Dynamic CRM 2013学习笔记(十四)复制/克隆记录的相关文章

Dynamic CRM 2013学习笔记(四十六)简单审批流的实现

前面介绍过自定义审批流: Dynamic CRM 2013学习笔记(十九)自定义审批流1 - 效果演示 Dynamic CRM 2013学习笔记(二十一)自定义审批流2 - 配置按钮 Dynamic CRM 2013学习笔记(三十二)自定义审批流3 - 节点及实体配置 Dynamic CRM 2013学习笔记(三十三)自定义审批流4 - 规则节点 -有分支的流程处理 Dynamic CRM 2013学习笔记(三十四)自定义审批流5 - 自动邮件通知 Dynamic CRM 2013学习笔记(三十

Dynamic CRM 2013学习笔记(四十二)流程5 - 实时/同步工作流(Workflow)用法图解

实时工作流跟插件一样,也是用事件执行管道来执行,能在pre,post或核心操作中执行.跟插件一样,不能在创建之前和删除之后执行.如果执行过程中有异常发生,会取消并回滚整个操作.实时工作流里所有的活动和子流程都是一个事务,不像异步工作流里,子流程是单独的一个事务.不能使用等待或并行等待条件步骤.如果执行成功,就看不到执行的log.实时工作流能被转到异步工作流,还能再转回实时工作流.下面详细介绍如何创建一个实时工作流.   一.创建实时工作流 1. 打开 Setting > Process, 点击N

Dynamic CRM 2013学习笔记(四十四)CRM技术支持

有时我们经常遇到一些CRM的问题,一时又无法解决,这时我们可能要找下外援,下面列出一些基本的技术支持.   1. CRM 论坛 https://community.dynamics.com/crm/f/117.aspx   2. Office 365       3. CRM自带的帮助   4. 微软官方支持 http://www.microsoft.com/dynamics/customer/en-US/service-plans.aspx   5. 第三方合作者 http://dynamic

Dynamic CRM 2013学习笔记(四十)流程3 - 对话(Dialog)用法图解

我们将用对话来实现一个简单的满意度调查,下一个问题依赖于上一个问题.对话是同步的,不同于工作流既可以是同步也可以是异步的:对话可以跟用户互动:对话只能手动开始:对话只支持 .Net Framework 4.0.   一.创建对话 1. 打开 Settings > Process, 点击New 按钮 2. 输入Process Name,选择Dialog   3. 点击ok后,就可以看到对话的设计界面 输入参数是用于把参数从父对话传到子对话:变量用于存储计算的数据或字符串以便后面的页面使用.   4

Dynamic CRM 2013学习笔记(四)单据编号及插件批量注册工具

Dynamic CRM 2013学习笔记(一)插件输入实体参数解析 Dynamic CRM 2013学习笔记(二)插件基本用法及调试 Dynamic CRM 2013学习笔记(三)快速创建实体 EntityCreater 基本上每个实体form上都会有单据编号,而且不同的实体编号要求还不太一样,这时就需要一个通用的单据编号插件,可配置以应对不同的需求. 下面简单介绍下实现步骤: 1. 创建二个实体,以保存各实体所要求的不同单据规则及当前流水号 2. 为不同的实体配置各自的单据规则 3. 编写及注

Dynamic CRM 2013学习笔记(四十三)流程6 - 自定义流程活动

当我们在流程里添加步骤时,有一些默认的步骤,像创建.更新.发邮件等,但如果你想加一个里面没有的步骤,比如发SMS消息,或者调用一个外部的web service,怎么办?这时就只能自定义一个流程活动了.下面将详细介绍如何创建一个自定义的流程活动.   1. 打开vs2012,新建一个项目:   需要引用CRM 的二个dll :  Microsoft.Xrm.Sdk;  Microsoft.Xrm.Sdk.Workflow;   2. 删除默认的 Activity1. xaml ,新建一个类: us

Dynamic CRM 2013学习笔记(四十一)流程4 - 异步工作流(Workflow)用法图解

在CRM 2013 里,工作流被分成二类:异步工作流和实时工作流.异步工作流依赖一个windows 服务: Microsoft Dynamics CRM Asynchronous Processing Service , 这个服务必须在CRM 服务器上运行,否则异步工作流不会运行.异步工作流有可能不会立即执行,如果想要立即执行的工作流,可以考虑用实时工作流.CRM 里把它当作实体,所以可以在高级查找里查找它,还可以基于它生成报表.下面详细介绍如何使用异步工作流. 为了使用工作流,要注意权限是否打

Dynamic CRM 2013学习笔记(七)追踪、监控及性能优化

本文将介绍CRM的三个内容追踪.监控及性能优化.追踪是CRM里一个很有用的功能,它能为我们的CRM调试或解决错误.警告提供有价值的信息:我们可以用window的性能监控工具来了解CRM的性能状况:最后就是对CRM及其DB进行性能调整以让CRM达到最佳状态.   一.追踪 有二种追踪方式,一种是部署级,这种方式追踪所有的CRM 服务器上的角色.服务,默认情况,log文件在C:\crmdrop\logs:另一种是服务器级追踪,这种方式只追踪当前机器上运行的服务器角色.服务.默认情况,log文件在C:

Dynamic CRM 2013学习笔记 系列汇总

这里列出所有 Dynamic CRM 2013学习笔记 系列文章 Dynamic CRM 2013学习笔记(一)插件输入实体参数解析 Dynamic CRM 2013学习笔记(二)插件基本用法及调试 Dynamic CRM 2013学习笔记(三)快速创建实体 EntityCreater Dynamic CRM 2013学习笔记(四)单据编号及插件批量注册工具 Dynamic CRM 2013学习笔记(五)禁止修改审批通过后的单据 Dynamic CRM 2013学习笔记(六)备份和恢复 Dyna