【转】Dynamics CRM 365零基础入门学习(三)Dynamics 通过Web API 来调用自定义的Action(使用插件)

今天想实现一个Search Product的功能,首先要将数据展示在页面,然后前端根据查询需求进行处理。之前是在salesforce中实现的,可以定义一个Search Product的页面,然后在页面中访问查询数据的Webservice即可。但是在Dynamic 365中并没有这种直接调用的方式,最终找到一种方式就是,前端页面通过Js调用工作流中的Action,而在Action上绑定了插件。


实现效果

这里写图片描述

(1) 实现html页面并导入系统

在设置中找到自定义项,然后进去自定义系统,选择Web资源,然后将之前做好的页面上传到系统。
这里写图片描述

(2) 自定义Action

首先新建一个action,实体设置上可以设置为全局的,也可以单独设定某个实体。

注意:

注册该action,方法同插件注册,在注册step时message选择我们的action的唯一名称,很多人在这一步的message里不显示action的名字,确保两点:第一你的action激活了,第二你的插件注册器是在你激活action后再打开的。
这里写图片描述
设置好action,这边设置了两个输入参数和一个输出参数,设置完后保存并且激活。

(3) 开发Plugin项目

这里我们简单介绍一下插件的基本用法
1. 要继承IPlugin,并实现Excute方法。
2. 从Service provider里获取执行上下文
3. 我们可以检查出发插件的实体名称
4. 还可以检查触发的事件,是creat, update还是delete
5. 输入参数里获取触发的实体
6. 通过service factory获取IOrganizationService,当CreateOrganizationService方法的参数为null时,表示的是系统用户,当参数为context.UserId 或Guid.Empty时,表示的是当前用户
7. 最后是DoAction方法,插件的逻辑就可以在这里实现了。
以下是实现插件的代码:

public void Execute(IServiceProvider serviceProvider){IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);//传入两个参数String InParameters1 = context.InputParameters["InParameters1"] as String;String InParameters2 = context.InputParameters["InParameters2"] as String;//查询//EntityReference entityRef = context.InputParameters["Target"] as EntityReference;string fetchProductXml = @"<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'><entity name='new_be_eligible_pn__c'><attribute name='new_be_eligible_pn__cid' /><attribute name='new_name' /><attribute name='createdon' /><attribute name='new_value_category__c' /><attribute name='new_is_tp_part__c' /><attribute name='new_country__c' /><attribute name='new_available_quantity_flag__c' /><order attribute='new_name' descending='false' /><filter type='and'><condition attribute='new_country__c' operator='eq' value='Italy' /></filter><link-entity name='new_product' from='new_productid' to='new_product__c' link-type='inner' alias='a_e79f28ae2899e811a96f000d3a828e6c'><attribute name='new_wifi__c' /><attribute name='new_warranty__c' /><attribute name='new_type__c' /><attribute name='new_sub_series__c' /><attribute name='new_series__c' /><attribute name='new_screen_size__c' /><attribute name='new_name' /><attribute name='new_product_hierarchy__c' /><attribute name='new_description' /><attribute name='new_productcode' /><attribute name='new_os__c' /><attribute name='new_memory__c' /><attribute name='new_hdd__c' /><attribute name='new_cpu__c' /><attribute name='new_brand__c' /><attribute name='new_battery__c' /><filter type='and'><filter type='or'><condition attribute='new_type__c' operator='like' value='%PC System Unit%' /><condition attribute='new_type__c' operator='eq' value='Non System Unit' /></filter></filter></link-entity><link-entity name='new_product_sales_country__c' from='new_product_sales_country__cid' to='new_psc__c' link-type='inner' alias='a_c278acd92899e811a96f000d3a828e6c'><attribute name='new_currencyisocode' /><attribute name='new_channel_price__c' /><filter type='and'><condition attribute='new_sales_status__c' operator='like' value='%12%' /></filter></link-entity></entity></fetch>";EntityCollection products = service.RetrieveMultiple(new FetchExpression(fetchProductXml));//传出参数context.OutputParameters["OutParameters"] = products;//遍历productsforeach (var pair in products.Entities){foreach (var pa in pair.Attributes){Console.WriteLine(pa.Key + ": " + pa.Value);}}Console.WriteLine(products);}

(4)数据查询方式,本篇使用FetchXML

在以上的代码实现中,我使用了FetchXML的方式实现,对于多条件跨表查询,返回多条记录很方便。常用的结构如下,
SDK中有很多类似的案例。
这里写图片描述
其中XML这块我们可以使用高级查询来自动生成
这里写图片描述
最后我们可以导出XML文件

(5)Js调用自定义的Action

这里写图片描述

最后可以看到输出结果:

这里写图片描述

总结:

在on-premises的开发中我们往往把复杂的业务处理逻辑封装成接口供前端js调用,但在online的开发中这样的开发方式无疑增加了成本(需另外架设服务器,添置域名,配置https协议证书等),通过web api调用action给我们提供了新的可行的方式。实现了需求。在下一章我们将分享如何调试插件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/437775.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python 必会技巧】copy 模块中 copy() 与 deepcopy() 函数的区别

Python 中赋值语句不复制对象&#xff0c;而是在目标和对象之间创建绑定关系。对于自身可变或者包含可变项的集合对象&#xff0c;开发者有时会需要生成其副本用于改变操作&#xff0c;进而避免改变原对象。copy 模块提供了通用的浅层复制 copy() 和深层复制 deepcopy() 操作。…

【转】Dynamics CRM 365零基础入门学习(四)Dynamics 使用profiler插件调试流程

今天我们介绍一种在dynamics开发中经常会用到的调试操作&#xff0c;其中一种调试方式即是profile调试。以下是我在项目开发中记录的调试流程&#xff0c;可供参考使用。 1、打开插件注册工具&#xff0c;会看到install Profile,点击即可安装。 2、在插件注册器中选择要调试的s…

【Python 必会技巧】利用 utf-8-sig 编码格式解决写入 csv 文件乱码问题

先举个例子&#xff0c;分别以不指定编码、指定编码为 utf-8、指定编码为 utf-8-sig 三种方式来做比较&#xff0c;再将写入 csv 文件和 txt 文件来做个对比 一、不指定编码方式&#xff0c;直接存入 csv 文件 import csvwith open(test.csv, w) as fp:writer csv.writer(fp)…

【转】Dynamics CRM 365零基础入门学习(五)权限管理

一&#xff1a;安全角色 Microsoft Dynamics 365中的安全角色是各种实体的特权和访问级别矩阵。 它们根据其功能分组在不同的选项卡下。 这些组包括&#xff1a;核心记录&#xff0c;营销&#xff0c;销售&#xff0c;服务&#xff0c;业务管理&#xff0c;服务管理&#xff0…

【Python 必会技巧】使用 zip() 函数对序列进行压缩和解压操作

zip() 函数用于将可迭代的对象作为参数&#xff0c;将对象中对应的元素打包成一个个元组&#xff0c;然后返回由这些元组组成的列表。 如果各个迭代器的元素个数不一致&#xff0c;则返回列表长度与最短的对象相同。 利用 * 号操作符&#xff0c;可以将元组解压为列表。 zip…

【转】Dynamics CRM 365零基础入门学习(七)Dynamics 365 DataMigrationUtility tool使用

SDK里有个工具叫DataMigrationUtility&#xff0c;这个工具适合两个CRM系统之间的数据迁移。例如&#xff1a;在项目上线之初会做数据初始化的工作&#xff0c;一般这个工作会在UAT开始前完成&#xff0c;当UAT完成之后再把这部分初始化数据迁移到生产环境。那我费了半天劲把数…

【Python 标准库学习】日期和时间处理库 — datetime

欢迎加入 Python 官方文档翻译团队&#xff1a;https://www.transifex.com/python-doc/ datetime 模块提供了可以通过多种方式操作日期和时间的类。在支持日期时间数学运算的同时&#xff0c;实现的关注点更着重于如何能够更有效地解析其属性用于格式化输出和数据操作。 datet…

【Python 标准库学习】数据科学计算库 — math

欢迎加入 Python 官方文档翻译团队&#xff1a;https://www.transifex.com/python-doc/ math 模块官方文档&#xff1a;https://docs.python.org/3/library/math.html math 模块包含的函数按照用途可分为&#xff1a;数论与表示函数、幂函数与对数函数、三角函数、角度转换、双…

【转】Dynamics 365中的应用程序介绍

本人微信和易信公众号&#xff1a;微软动态CRM专家罗勇 &#xff0c;回复275或者20180630可方便获取本文&#xff0c;同时可以在第一间得到我发布的最新的博文信息&#xff0c;follow me&#xff01;我的网站是 www.luoyong.me 。 Dynamics 365引入了应用程序&#xff0c;为啥…

【Python 标准库学习】伪随机数生成库 — random

欢迎加入 Python 官方文档翻译团队&#xff1a;https://www.transifex.com/python-doc/ 随机函数在很多科学计算中都会用到&#xff0c;比如生成一系列随机数来计算平均值、高斯分布、伽马分布、贝塔分布、对数正态分布等。 几乎所有模块函数都依赖于基本函数 random() &#…

【转】Dynamics 365中配置和使用文件夹级别的跟踪(folder-level tracking)

本人微信和易信公众号&#xff1a;微软动态CRM专家罗勇 &#xff0c;回复274或者20180630可方便获取本文&#xff0c;同时可以在第一间得到我发布的最新的博文信息&#xff0c;follow me&#xff01;我的网站是 www.luoyong.me 。 Dynamics 365与Office 365可以方便紧密的集成…

【Python 标准库学习】多种操作系统接口和常用路径操作库 — os 与 os.path

欢迎加入 Python 官方文档翻译团队&#xff1a;https://www.transifex.com/python-doc/ os 模块简介&#xff1a;主流操作系统有 Windows、UNIX、Mac OS 等&#xff0c;os 模块为多种操作系统的访问提供了相关功能的支持&#xff0c;涉及对文件相关操作功能的实现、系统访问 Pa…

【转】Dynamics 365Online 如何启用手机端APP的离线功能

隐约记得365自带的手机app是支持离线功能的&#xff0c;但实际尝试后发现不行&#xff0c;断开网络后直接提示下图这样&#xff0c;无法操作了 然后就去查询了下最新版的Online设置离线的方式&#xff0c;步骤还挺多的&#xff0c;本篇即来分享下 第一步&#xff0c;首先要确定…

【Python 标准库学习】系统相关的参数和函数库 — sys

欢迎加入 Python 官方文档翻译团队&#xff1a;https://www.transifex.com/python-doc/ sys 模块提供了与 Python 解释器紧密相关的一些变量和函数&#xff0c;这些变量可能被解释器使用&#xff0c;也可能由解释器提供 sys 模块官方文档&#xff1a;https://docs.python.org/…

【转】Microsoft Teams快速上手系列-01Teams的前世今生

说到Teams&#xff0c;这到底是一个什么产品&#xff1f;有人说它是团队协作工具&#xff0c;有人说它是云视频系统&#xff0c;有人说它是Hub&#xff0c;还有人说它是微软有史以来发展最快的一个产品&#xff0c;还有人说它完全是一个高效办公神器。其实都是对的。 Teams集成…

【Python 标准库学习】时间相关的函数库 — time

欢迎加入 Python 官方文档翻译团队&#xff1a;https://www.transifex.com/python-doc/ time 模块提供了各种时间相关的函数&#xff0c;该模块中的大多数函数是调用了所在平台 C 语言库的同名函数&#xff0c;这些函数的语义因平台而异&#xff0c;可能会在不同的平台有不同的…

【转】响应式详解

一两年以前&#xff0c;我发现&#xff0c;很多人都被响应式搞得很懵逼。 现在&#xff0c;我依然发现&#xff0c;还是有很多人&#xff0c;依旧被响应式搞得很懵逼。 所以&#xff0c;我也很懵逼。 到底是哪个环节出了问题&#xff0c;让这么多学习前端的同学对于这个响应…

【Python 标准库学习】容器数据类型库 — collections

欢迎加入 Python 官方文档翻译团队&#xff1a;https://www.transifex.com/python-doc/ collections 模块实现了特定目标的容器&#xff0c;以提供Python标准内建容器 dict , list , set , 和 tuple 的替代选择。 collections 模块官方文档&#xff1a;https://docs.python.or…

【Python 标准库学习】安全哈希与摘要算法库 — hashlib

欢迎加入 Python 官方文档翻译团队&#xff1a;https://www.transifex.com/python-doc/ hashlib 模块针对不同的安全哈希和消息摘要算法实现了一个通用的接口。提供了常见的摘要算法&#xff0c;如MD5&#xff0c;SHA1等等。 摘要算法又称哈希算法、散列算法&#xff0c;摘要算…

【Python 必会技巧】[i for i in range(1,10)] — 列表解析式,列表中使用 for 循环

经常会看到类似于 [i for i in range(1,10)] 的表达式&#xff0c;这种表达式称为列表解析&#xff08;List Comprehensions&#xff09;&#xff0c;类似的还有字典解析、集合解析等等。 列表解析式是将一个列表&#xff08;实际上适用于任何可迭代对象&#xff09;转换成另一…