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学习笔记(三十八)流程1 - 操作(action)开发与配置详解的更多相关文章
- Dynamic CRM 2013学习笔记(十八)根据主表状态用JS控制子表自定义按钮
有时要根据主表的审批状态来控制子表上的按钮要不要显示,比如我们有一个需求审批通过后就不能再上传文件了. 首先打开Visual Ribbon Editor, 如下图,我们可以利用Enable Rules ...
- Dynamic CRM 2013学习笔记(十五)报表设计:报表入门、开发工具及注意事项
本文是关于CRM 2013报表开发入门介绍,包括开发工具的使用,以及不同于普通Reporting service的相关注意事项. 一.CRM报表简介 报表有两种,SQL-based报表和Fetch-b ...
- Dynamic CRM 2013学习笔记(十二)实现子表合计(汇总,求和)功能的通用插件
上一篇 Dynamic CRM 2013学习笔记(十一)利用Javascript实现子表合计(汇总,求和)功能 , 介绍了如何用js来实现子表合计功能,这种方法要求在各个表单上添加js方法,如果有很多 ...
- Dynamic CRM 2013学习笔记(十四)复制/克隆记录
经常有这样的需求,一个单据上有太多要填写的内容,有时还关联多个子单据,客户不想一个一个地填写,他们想从已有的单据上复制数据,克隆成一条新的记录.本文将介绍如何克隆一条记录,包括它的子单据以生成一条新的 ...
- Dynamic CRM 2013学习笔记(十)客户端几种查询数据方式比较
我们经常要在客户端进行数据查询,下面分别比较常用的几种查询方式:XMLHttpRequest, SDK.JQuery, SDK.Rest. XMLHttpRequest是最基本的调用方式,JQuery ...
- Dynamic CRM 2013学习笔记(十六)用JS控制Tab可见,可用
一个Form里经常会有好几个Tab,有时要根据一些条件设置哪些Tab可用,可见.下面就介绍下如何用JS对Tab进行控制. 1. 控制可见 function setTabVisableByName( ...
- Dynamic CRM 2013学习笔记(十九)自定义审批流1 - 效果演示
CRM的项目,审批流是一个必须品.为了更方便灵活地使用.配置审批流,我们自定义了一整套审批流.首先来看下它的效果: 1. 审批模板 这是一个最简单的审批流,首先指定审批实体,及相关字段,再配置流程节点 ...
- Dynamic CRM 2013学习笔记(二十六)报表设计:Reporting Service报表 动态参数、参数多选全选、动态列、动态显示行字体颜色
上次介绍过CRM里开始报表的一些注意事项:Dynamic CRM 2013学习笔记(十五)报表入门.开发工具及注意事项,本文继续介绍报表里的一些动态效果:动态显示参数,参数是从数据库里查询出来的:参数 ...
- Dynamic CRM 2013学习笔记(二十九)报表设计:reporting service 报表开发常见问题
在报表开发过程中,经常会遇到各种各样的问题,比如The report cannot be displayed. (rsProcessingAborted),一点有意义的提示都没有:再就是分页问题,经常 ...
- Dynamic CRM 2013学习笔记 系列汇总
这里列出所有 Dynamic CRM 2013学习笔记 系列文章,方便大家查阅.有任何建议.意见.需要,欢迎大家提交评论一起讨论. 本文原文地址: Dynamic CRM 2013学习笔记 系列汇总 ...
随机推荐
- MyBatis复习
一.对JDBC的总结 1.数据库连接,使用时就创建,不使用立即释放,对数据库进行频繁连接开启和关闭,造成数据库资源浪费,影响数据库性能. 解决方案:使用数据库连接池管理数据库连接. 2.将sql语句硬 ...
- Scala伴生类和伴生对象
单例对象与类同名时,这个单例对象被称为这个类的伴生对象,而这个类被称为这个单例对象的伴生类.伴生类和伴生对象要在同一个源文件中定义,伴生对象和伴生类可以互相访问其私有成员.不与伴生类同名的单例对象称为 ...
- XidianOJ 1182 Chinese Paladin – Qi’s troubles
题目描述 As we all know, Xiahou Jinxuan (Chinese Paladin 5 Prequel's protagonist) and Yue Jinzhao (Chine ...
- Java项目导出war包 security alert:integrity check error”
操作方法: 首先下载这个jar包 http://pan.baidu.com/s/1sk5uDzf 1.需要先把common/pluns 下的com.genuitec.eclipse.export.wi ...
- VC++ 将IP字符串转为 DWORD值
CString strIP="192.168.1.184"; DWORD dwAddress= ntohl( inet_addr(strIP)); m_IPAddr.SetAddr ...
- SQL时间戳的使用
SQL时间戳的使用 一直对时间戳这个概念比较模糊,相信有很多朋友也都会误认为:时间戳是一个时间字段,每次增加数据时,填入当前的时间值.其实这误导了很多朋友. 1.基本概念 时间戳:数据库中自动生成的唯 ...
- 117 FP页面无法查看
用户表示117 FP页面无法查看,提示如下错误: 跟进: 1.进入FP服务器可看到以下错误 这个错误的框就表示FP的一个进程报错,自动断掉了,需要重新跑一次EXIT,INIT,PLAN,EXPORT, ...
- Servlet 利用Cookie实现一周内不重复登录
import java.io.IOException;import java.io.PrintWriter; import javax.servlet.ServletException;import ...
- POJ 2010 - Moo University - Financial Aid 初探数据结构 二叉堆
考虑到数据结构短板严重,从计算几何换换口味= = 二叉堆 简介 堆总保持每个节点小于(大于)父亲节点.这样的堆被称作大根堆(小根堆). 顾名思义,大根堆的数根是堆内的最大元素. 堆的意义在于能快速O( ...
- linux或者windows下的文件拷贝
# 上代码 #!/usr/bin/env python # -*- coding:utf-8 -*- import os import shutil import tarfile base_dir ...