课时四:Action操作
参考文档
语义说明
核心名词
FetchXML:是基于Xml的查询语言,可以把它简单理解成SQL语句,通过它可以查询Dynamics 365 CRM的数据。开发人员可以在WebAPI或者Organization Service执行FetchXML查询来获取数据,类似于SqlHelper.QueryTable(sql)
Action:Dynamics 365 流程中的一种,允许开发人员进行自定义开发,用来定制并组合各种业务逻辑,比如商机赢单、订单提交。我们可以把它简单理解成C#中的一个方法,有输入参数、输出参数。操作的注册模式分为两种:一个是全局,一个是绑定到实体,可以获取到实体ID
Web API:是客户端连接服务端的一种方式,拥有良好的平台兼容性,不管什么平台都可以调用,与开发语言无关。它是基于OData v4.0实现,提供了各种现代化的Restful Web服务
Organization Service:是客户端连接服务端的另外一种方式,它是基于WCF技术实现,数据传输采用XML,仅使用于.NET客户端
Action
操纵类似与我们常用的方法,用于扩展系统的标准功能,用来实现项目中的业务逻辑。操作可以针对单个实体,也可以是全局(也就是任意实体都可使用)全局方法/局部方法
工作流中可以调用操作,JS也可以调用操作,通过后端C#代码也可调用操作。始终在组织范围内执行操作,不支持执行限制到用户、业务部门或组织的范围。
和Plugin类似,都需要签名,注册到CRM中
自定义操作
新建Action流程
打开D365,进入我的流程中心

在流程中心页面,点击左上角新建按钮,输入流程名称(全英文),类别选择操作(Action),实体选择无(全局)/实体(局部),建议全局,点击确定创建

可选:定义输入参数及输出参数,完成后点击保存,发布,激活


新建Action项目
打开VS,新建类库项目(.NET 版本与D365版本对应)

新建类,继承IPlugin接口,并实现Execute方法

签名:右键项目,属性,签名,勾选为程序集签名,新建,填写文件名称,取消使用密码保护密钥文件,确定

编译:右键项目,清理,重新生成

注册/绑定Action
打开注册工具,登录,新建Assembly

在步骤一中选择Action项目编译的DLL文件

在步骤二中勾选添加(使用)的Action(一个类库可有多个action),点击选择添加


新建执行时机:找的上一步添加的类库集合,点击展开,右键添加的Action,选择添加Step

Message:与action流程名一致;Primary Entity:关联实体,若为实体则此Action为局部(实体),none为全局;其次,执行时期为PostOperation,完成

使用Action
JS调用
// 调用全局带参方法
function createEntity() {
var entity = new Object();
entity['name'] = '21586625'
entity['area'] = '21586625'
entity['phone'] = '21586625'
var req = new XMLHttpRequest();
req.open('post', Xrm.Page.context.getClientUrl() + "/api/data/v9.0/new_wyg_cone", false)
req.setRequestHeader("Accept", "application/json");
req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
req.setRequestHeader("OData-MaxVersion", "4.0");
req.setRequestHeader("OData-Version", "4.0");
req.onreadystatechange = function() {
if (this.readyState == 4) {
if (this.status == 200) alert(1)
}
}
req.send(JSON.stringify(entity));
}
调试Action
与插件(Plugin)方式一致,详情
接收参数
字符串类型

string name = context.InputParameters["name"].ToString();
string area = context.InputParameters["area"].ToString();
string phone = context.InputParameters["phone"].ToString();
整数类型

string name = context.InputParameters["name"].ToString();
int money = (int)context.InputParameters["money"];
int age = (int)context.InputParameters["age"];
布尔类型

string name = context.InputParameters["name"].ToString();
bool gender = (bool)context.InputParameters["gender"];
int age = (int)context.InputParameters["age"];
日期类型

string name = context.InputParameters["name"].ToString();
bool gender = (bool)context.InputParameters["gender"];
int age = (int)context.InputParameters["age"];
DateTime time = (DateTime)context.InputParameters["time"];
选择列表
Entity(实体)类型

// Entity类型的参数建议指定@data.type (可以不指定,若是lookup到具体实体,不是customer,partylist类型),格式为Microsoft.Dynamics.CRM.实体逻辑名称
// 需要指定记录主键值,还有需要用到的该记录的其他字段值
var cus = {}
cus['@data.type'] = 'Microsoft.Dynamics.CRM.new_customer'
cus.new_customerid = '1377FF4A-B494-E811-8ACD-005056948ABE'
cus.new_name = 'libai'
cus.new_area = '上海市'
entity['cus'] = cus
Entity cus = (Entity)context.InputParameters["cus"];
EntityReference(查找)类型

// EntityReference类型的参数指定记录ID就可以,在流程参数类型中已执行实体
var cus = {}
cus.new_customerid = '56C134ED-A433-EB11-B392-005056993F73'
entity['cus'] = cus
EntityReference cus = (EntityReference)context.InputParameters["cus"];
// or
var s = context.InputParameters["cus"];
EntityCollection(实体列表)类型

var cusitem = {}
cus['@data.type'] = 'Microsoft.Dynamics.CRM.new_customer'
cus.new_customerid = '1377FF4A-B494-E811-8ACD-005056948ABE'
cus.new_name = 'libai'
cus.new_area = '上海市'
entity['cus'] = [cusitem]
EntityCollection cus = (EntityCollection)context.InputParameters["cus"];
// or
var s = context.InputParameters["cus"];
课时四:Action操作的更多相关文章
- Spark练习之action操作开发
Spark练习之action操作开发 一.reduce 1.1 Java 1.2 Scala 二.collect 2.1 Java 2.2 Scala 三.count 3.1 Java 3.2 Sca ...
- spark transformation与action操作函数
一.Transformation map(func) 返回一个新的分布式数据集,由每个原元素经过函数处理后的新元素组成 filter(func) 返回一个新的数据集,经过fun函数处理后返回值为tru ...
- Spark常用函数讲解之Action操作
摘要: RDD:弹性分布式数据集,是一种特殊集合 ‚ 支持多种来源 ‚ 有容错机制 ‚ 可以被缓存 ‚ 支持并行操作,一个RDD代表一个分区里的数据集RDD有两种操作算子: Trans ...
- AJAX的来龙去脉(由来)-如何被封装出来的--ajax发送异步请求(四步操作)
<黑马程序员_超全面的JavaWeb视频教程vedio\JavaWeb视频教程_day23_ajax> \JavaWeb视频教程_day23_ajax\day23ajax_avi\14.打 ...
- 06、action操作开发实战
1.reduce: 2.collect: 3.count: 4.take: 5.saveAsTextFile: 6.countByKey: 7.foreach: package sparkcore.j ...
- Git 学习(四)操作修改和版本穿梭
Git 学习(四)操作修改和版本穿梭 之前的章节,已介绍了本地Git库创建.暂存区增.删.改,以及提交版本库:可回顾下命令操作: git add 和 git commit. 光有之前章节的操作,Git ...
- Docker学习(四): 操作容器
特别声明: 博文主要是学习过程中的知识整理,以便之后的查阅回顾.部分内容来源于网络(如有摘录未标注请指出).内容如有差错,也欢迎指正! =============系列文章============= 1 ...
- Spark RDD概念学习系列之Pair RDD的action操作
不多说,直接上干货! Pair RDD的action操作 所有基础RDD 支持的行动操作也都在pair RDD 上可用
- Spark RDD概念学习系列之action操作
不多说,直接上干货! action操作
- EOS基础全家桶(十)交易Action操作
简介 区块链上的所有操作都是通过交易(Transaction)上链的,无论你是转账交易还是发起的智能合约的调用,而EOS和传统区块链不同的是EOS在一个交易里可以发起多个行为(Action),这使得E ...
随机推荐
- LWJGL3的内存管理,第一篇,基础知识
LWJGL3的内存管理,第一篇,基础知识 为了讨论LWJGL在内存分配方面的设计,我将会分为数篇随笔分开介绍,本篇将主要介绍一些大方向的问题和一些必备的知识. 何为"绑定(binding)& ...
- Rename object in TFS[Unable to import Trying to import Table MFATable_test1 with ID 50003 ID already held by Table MFATable1 ]
You can get this error message while renaming object that is checked out from TFS. Unable to import ...
- Pyston v2.0 发布,解决 Python 慢速的救星
Pyston 自从 2017 年发布 0.6.1 版本后,已经淡出了人们的视线三年多了,导致现在新人都很少听过它的大名. 前两天(2020年10月28日)Pyston 在官方博客上(https://b ...
- 《.NET 5.0 背锅案》第2集:码中的小窟窿,背后的大坑,发现重要嫌犯 EnyimMemcachedCore
在第1集的剧情中,主角是".NET 5.0 正式版 docker 镜像",它有幸入选第1位嫌疑对象,不是因为它的嫌疑最大,而是它的验证方法最简单,只需要再进行一次发布即可.我们在周 ...
- Vue单元测试vue2-jest-coverage的package.json 配置
依赖的版本很重要,不要出错了 devDependencies:{ "babel-core": "^6.26.3", "babel-jest" ...
- C#高级编程之泛型三(协变与逆变)
为何引入协变.逆变 我们知道一个子类对象可以赋值给一个基类对象 Animal animal = new Animal(); Animal cat = new Cat(); 那如果是用在泛型里面能行嘛? ...
- 微软面试题: LeetCode 4. 寻找两个正序数组的中位数 hard 出现次数:3
题目描述: 给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2.请你找出并返回这两个正序数组的中位数. 进阶:你能设计一个时间复杂度为 O(log (m+n)) 的算法解决 ...
- 一个Wpf的开发框架
引言 本框架使用Prism做MVVM,优点咱就不说了,主要了容器注入,消息和DI,比自己写省很多事.网上有很多标准的MVVM的使用方法,但是没有形成一个系统级的框架.本框架从登录到具体业务的使用,还有 ...
- Leetcode 1329. 将矩阵按对角线排序 题解
首先遍历对角线元素,顺序为: 先从第一列的最后一行到第一行 然后从第一行的第一列到最后一列 遍历的同时记录坐标和数值,对数值进行排序,然后坐标顺序放回. class Solution: def dia ...
- Apache Shiro 1.2.4反序列化漏洞(CVE-2016-4437)复现
Apache Shiro 1.2.4反序列化漏洞(CVE-2016-4437)复现 环境搭建 docker pull medicean/vulapps:s_shiro_1 docker run -d ...