Dynamic CRM 2013学习笔记(三十八)流程1 - 操作(action)开发与配置详解

CRM 2013 里流程有4个类别:操作(action)、业务流程(business process flow)、对话(dialog)和工作流(workflow)。它们都是从 setting –> Process 进入,然后点击New按钮来创建:

这篇主要介绍操作:什么是操作、什么时候使用操作、如何创建以及如何调用

一、什么是操作

操作是CRM 2013 新增加的一个功能,用来扩展系统的标准功能。业务人员可以用它来实现业务逻辑,然后开发人员可以在系统事件里(比如update,create)来使用它。业务人员可以写业务逻辑,就像以前在工作流时一样。如果业务逻辑改变了,业务人员可以直接在操作里修改,而不需要开发人员的参与。 它可以针对某个实体,也可以是全局的(也就是不针对任何实体),也是在执行管道的30阶段执行,参与到数据库事物中,可以将多个步骤或者操作包含到操作中,支持输入和输出参数,支持在这个消息的Pre或者Post阶段调用其他的插件或者工作流,支持在C#或者JavaScript中调用它,但是它不支持在工作流中直接被调用,也不支持设定触发的范围,设置触发范围为组织级或者用户级。

二、什么时候使用操作

如果你想在一些条件下执行待定的一些步骤,比如一个case被打开多少天并且没有其它操作;我们能根据case打开的天数来实现业务逻辑,然后在case记录里执行它。我们可以发邮件到高级service manager,改变proirity,把case分配到队列里,所以的这些步骤都可以在一个流程里。在以前的版本里,我们用工作流来实现。

三、怎么创建操作

1. settings –> process, 点击New 按钮创建操作

2. 点击ok后,会弹出下面的界面:

3. 可以定义输入,输出参数,是否回滚等:

4. 添加步骤

  • 发送邮件:

  • 更新实体:

  • 创建队列:

  • 赋值:

最终效果图如下:

四、如何调用

1. 插件调用

消息里不是我们以前常用的update,create之类了。

public class ActionsSample :IPlugin 
{ 
    string priority = string.Empty; 
    public void Execute( IServiceProvider serviceProvider) 
    { 
        IPluginExecutionContext context = (IPluginExecutionContext) serviceProvider.GetService( typeof( IPluginExecution Context)); 
        EntityReference caseRecord = context.InputParameters[" Target"] as EntityReference; 
        EntityReference EscalatedBy = context.InputParameters[" EscalatedBy"] as EntityReference; 
        priority = context.OutputParameters[" Priority"]. ToString(); }
 
    } 
}

也可以在update或create之类的消息里,用下面的方法调用操作:

OrganizationRequest req = new OrganizationRequest("new_Escalat");
 
req["EscalatedBy"] = new EntityReference("systemuser", context.InitiatingUserId);
 
req["Target"] = new EntityReference(context.PrimaryEntityName, context.PrimaryEntityId);
 
OrganizationResponse response = service.Execute(req);

2. JS调用

界面上添加一个按钮,然后调用下面的function:

var requestXML = new XMLHttpRequest(); 
requestXML.onreadystatechange = ShowResponse; 
function Escalate() {// function for the command bar 
    var recordId = Xrm.Page.data.entity.getId(); var userId = Xrm.Page.context.getUserId();
    EscalateRequest( userId, recordId); 
}
 
function EscalateRequest( EscalatedById, CaseId) { 
    var postUrl = Xrm.Page.context.getClientUrl() + "/ XRMServices/ 2011/ Organization. svc/ web";
    // WebService Url var requestText = ""; requestText + = "< s:Envelope xmlns:s =\" http:// schemas.xmlsoap.org/ soap/ envelope/\" >"; 
    requestText + = " < s:Body >"; requestText + = " < Execute xmlns =\" http:// schemas.microsoft.com/ xrm/ 2011/ Contracts/ Services\" xmlns:i =\" http:// www.w3. org/ 2001/ XMLSchema-instance\" >"; 
    requestText + = " < request xmlns:a =\" http:// schemas.microsoft.com/ xrm/ 2011/ Contracts\" >"; 
    requestText + = " < a:Parameters xmlns:c =\" http:// schemas. datacontract.org/ 2004/ 07/ System.Collections.Generic\" >"; 
    requestText + = " < a:KeyValuePairOfstringanyType >" 
    requestText + = " < c:key > EscalatedBy </ c:key >" 
    requestText + = " < c:value i:type =\" a:EntityReference\" >" 
    requestText + = " < a:Id >" + EscalatedById + "</ a:Id >" 
    requestText + = " < a:LogicalName > systemuser </ a:LogicalName >" 
    requestText + = " < a:Name i:nil =\" true\" />" 
    requestText + = " </ c:value >" 
    requestText + = " </ a:KeyValuePairOfstringanyType >" 
    requestText + = " < a:KeyValuePairOfstringanyType >" 
    requestText + = " < c:key > Target </ c:key >" 
    requestText + = " < c:value i:type =\" a:EntityReference\" >" 
    requestText + = " < a:Id >" + CaseId + "</ a:Id >" 
    requestText + = " < a:LogicalName > incident </ a:LogicalName >" 
    requestText + = " < a:Name i:nil =\" true\" />"
    requestText + = " </ c:value >" 
    requestText + = " </ a:KeyValuePairOfstringanyType >" 
    requestText + = " </ a:Parameters >" 
    requestText + = " < a:RequestId i:nil =\" true\" />" 
    requestText + = " < a:RequestName > new_Escalate </ a:RequestName >" 
    requestText + = " </ request >" 
    requestText + = " </ Execute >" 
    requestText + = " </ s:Body >" 
    requestText + = "</ s:Envelope >" 
    requestXML.open(" POST", postUrl, true);// true is for async 
    requestXML.setRequestHeader(" Accept", "application/ xml, text/ xml, */*"); 
    requestXML.setRequestHeader(" Content-Type", "text/ xml; charset = utf-8"); 
    requestXML.setRequestHeader(" SOAPAction", "http:// schemas.microsoft.com/ xrm/ 2011/ Contracts/ Services/ IOrganizationService/ Execute"); 
    requestXML.send( requestText); } 
    
function ShowResponse() { 
    var x = requestXML.responseXML.getElementsByTagName(" a:KeyValuePairOfstringany Type"); 
    for (i = 0; i < x.length; i + +) { 
        if (x[ i]. childNodes[ 0]. textContent = = "Priority") 
        { alert(" The case has been assigned to " + x[ i]. childNodes[ 1]. textContent + " priority."); } } 
}

Dynamic CRM 2013学习笔记 系列汇总

时间: 2024-10-13 01:07:57

Dynamic CRM 2013学习笔记(三十八)流程1 - 操作(action)开发与配置详解的相关文章

Dynamic CRM 2013学习笔记(十八)根据主表状态用JS控制子表自定义按钮

有时要根据主表的审批状态来控制子表上的按钮要不要显示,比如我们有一个需求审批通过后就不能再上传文件了. 首先打开Visual Ribbon Editor, 如下图,我们可以利用Enable Rules –> CustomRule 用js来控制按钮是否显示:   js function: 首先用odata取出主表的状态,然后根据主表的状态来判断是否显示: var approvalStatus = null; function controlUpload(){ var marketingPlan =

Dynamic CRM 2013学习笔记(十五)报表入门、开发工具及注意事项

本文是关于CRM 2013报表开发入门介绍,包括开发工具的使用,以及不同于普通Reporting service的相关注意事项.   一.CRM报表简介 报表有两种,SQL-based报表和Fetch-based报表,区别如下: 区域 SQL-based 报表 Fetch-based 报表 Data Provider <DataProvider> 元素的值设置为SQL. 示例如下:<DataProvider>SQL</DataProvider> 报表RDL文件中的 &l

Dynamic CRM 2013学习笔记(十二)实现子表合计(汇总,求和)功能的通用插件

上一篇 Dynamic CRM 2013学习笔记(十一)利用Javascript实现子表合计(汇总,求和)功能 , 介绍了如何用js来实现子表合计功能,这种方法要求在各个表单上添加js方法,如果有很多实体要实现这个功能,有人觉得有点麻烦了,就不太喜欢这种方式,于是我写了一个通用的子表合计功能的通用插件,只用在注册插件时,填写不同的参数就可以实现这个功能了. 1. 首先看下效果: 2. 注册方法: 我们需要在子表上对create和update方法进行注册: 注册时要填写4个参数: 第一个参数是要被

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

经常有这样的需求,一个单据上有太多要填写的内容,有时还关联多个子单据,客户不想一个一个地填写,他们想从已有的单据上复制数据,克隆成一条新的记录.本文将介绍如何克隆一条记录,包括它的子单据以生成一条新的记录. 主要用到Microsoft.Xrm.Client.EntityExtensions.Clone方法来克隆数据,以及用OrganizationServiceContext来动态复制子单据的数据. 首先在界面上新加一个Clone的按钮,加一个new_clone的字段:点击按钮时,把new_clo

Dynamic CRM 2013学习笔记(十)客户端几种查询数据方式比较

我们经常要在客户端进行数据查询,下面分别比较常用的几种查询方式:XMLHttpRequest, SDK.JQuery, SDK.Rest. XMLHttpRequest是最基本的调用方式,JQuery和Rest的二种方式其实也是用的XMLHttpRequest,只不过是把它封装了一下 JQuery和Rest二种方式的接口一样,所以调用方式也一样 1. XMLHttpRequest 定义 1: function ODataRetrieve(oDataString) { 2: var ServerU

Dynamic CRM 2013学习笔记(十九)自定义审批流 - 效果演示

CRM的项目,审批流是一个必须品.为了更方便灵活地使用.配置审批流,我们自定义了一整套审批流.首先来看下它的效果: 1. 审批模板 这是一个最简单的审批流,首先指定审批实体,及相关字段,再配置流程节点,这里只有5个节点,而且没有规则节点(后面会介绍):   接着就是对上面的流程节点配置关系,这里就指定流程节点的走向:   运行一段时间后,可以查看审批的实例:   2. 操作审批流 审批流模板创建完后,我们就可以进行审批活动了. 开始的状态是Draft,这时可以提交审批: 点击Submit 按钮后

Dynamic CRM 2013学习笔记(十六)用JS控制Tab可见,可用

一个Form里经常会有好几个Tab,有时要根据一些条件设置哪些Tab可用,可见.下面就介绍下如何用JS对Tab进行控制. 1. 控制可见 function setTabVisableByName(tabName, flag) { var control = Xrm.Page.ui.tabs.get(tabName); control.setVisible(flag); } 这里flag是true或false 2. 控制可用 看了上面的可见代码,是不是以为可用也这么简单呢?其实我们把上面的setV

Dynamic CRM 2013学习笔记(十九)自定义审批流1 - 效果演示

CRM的项目,审批流是一个必须品.为了更方便灵活地使用.配置审批流,我们自定义了一整套审批流.首先来看下它的效果: 1. 审批模板 这是一个最简单的审批流,首先指定审批实体,及相关字段,再配置流程节点,这里只有5个节点,而且没有规则节点(后面会介绍): 接着就是对上面的流程节点配置关系,这里就指定流程节点的走向: 运行一段时间后,可以查看审批的实例: 2. 操作审批流 审批流模板创建完后,我们就可以进行审批活动了. 开始的状态是Draft,这时可以提交审批: 点击Submit 按钮后,会提示是否

Dynamic CRM 2013学习笔记(二十六)Reporting Service报表 动态参数、参数多选全选、动态列、动态显示行字体颜色

上次介绍过CRM里开始报表的一些注意事项:Dynamic CRM 2013学习笔记(十五)报表入门.开发工具及注意事项,本文继续介绍报表里的一些动态效果:动态显示参数,参数是从数据库里查询出来的:参数可以多选或全选:动态地显示列,列不是固定的:根据某一字段的值来动态地显示整行字体的颜色. 下面介绍详细的方法: 一.动态参数.参数多选全选 动态参数: 首先定义一个Dataset: SELECT DISTINCT new_countryId, new_codename AS name FROM ne

Dynamic CRM 2013学习笔记(三十二)自定义审批流3 - 节点及实体配置

上次介绍了<Dynamic CRM 2013学习笔记(十九)自定义审批流1 - 效果演示> 以及如何配置自定义审批流的按钮:<Dynamic CRM 2013学习笔记(二十一)自定义审批流2 - 配置按钮>,这次接着介绍如何配置审批流的节点及节点关系.     一. 模板头: 二.流程节点:        一共有三种节点:开始节点,中间节点,结束节点: 1.  开始节点: 2. 中间节点: .3.  结束节点:       三.流程节点关系:   四.实体配置 1.添加二个字段: