Dynamics 365 Customer Engagement V9.X新引入的自动编号属性介绍
我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面的微软最有价值专家(Microsoft MVP),欢迎关注我的微信公众号 MSFTDynamics365erLuoYong ,回复352或者20190816可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!
以前系统为部分实体的部分字段做了自动编号,比如案例的编号等,其他的若要实现自动编号则需要开发写插件等,需要开发人员介入。从Dynamics 365 Customer Engagement V9.X版本为单行文本类型字段开始引入自动编号属性,目前尚无界面可以设置单行文本字段的改属性,当然能通过编程方式修改,但是我相信在很短时间内会实现界面可配置,目前PowerApps的Model-Driven App已经实现了界面可以配置。
本文主要根据官方文档:Create auto-number attributes 而写,具体以官方文档为准,本人的文章系自行实验撰写分享,读者请辩之。
此种字段是单行文本类型字段(不能更改为其他格式),增加了自动编号格式(AutoNumberFormat)这个属性,这个属性可以组合
- 固定文本;
- 随机字符,据我观察应该是大写英文字母和数字,最多6位随机字符,示例:{RANDSTRING:3}
- 流水号,流水号的唯一性由SQL Server负责,可以在定义时候指定最小位数,产生的流水号不足最小位数时前面自动补齐0,比如你指定了5位流水号,默认情况下流水号从1000开始,那么这里显示的第一个流水号便是 01000 ,示例:{SEQNUM:10}。因为流水号长度指定的最小长度,比如说5位,那么当流水号到达100000时会出现什么情况?情况就是自动编号的长度增加1位,不会被截断,也就是显示100000。
- 还有当前UTC时间格式化后的文本,示例:{DATETIMEUTC:yyyyMMddhhmmss}
还可以将现有的文本字段的属性改成自动编号以便应用自动编号。自动编号属性字段在表单上是只读的,保存后自动产生自动编号。
特性说了那么多,我这里用代码创建一个,因为官方推荐Web API,所以我就用Web API来创建,这个代码是为逻辑名称为ly_workorder的实体增加一个自动编号属性的单行文本字段ly_autonumber。
打开Dynamics 365 Customer Engagement,按F12打开开发者面板,在Console这个Tab中输入类似如下的代码。
var clientUrl = Xrm.Utility.getGlobalContext().getClientUrl();
var req = new XMLHttpRequest()
req.open("POST", encodeURI(clientUrl + "/api/data/v9.0/EntityDefinitions(LogicalName='ly_workorder')/Attributes"), true);
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 /* complete */) {
req.onreadystatechange = null;
if (this.status == 204) {
var alertStrings = { text: "操作成功!" };
var alertOptions = { height: 300, width: 400 };
Xrm.Navigation.openAlertDialog(alertStrings, alertOptions);
}
else {
Xrm.Navigation.openErrorDialog({ message: this.responseText });
}
}
};
var requestMsg = JSON.parse('{'+
'"AttributeType": "String",'+
'"AttributeTypeName": {'+
'"Value": "StringType"'+
'},' +
'"Description": {' +
'"@odata.type": "Microsoft.Dynamics.CRM.Label",' +
'"LocalizedLabels": [' +
'{' +
'"@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel",' +
'"Label": "编号",' +
'"LanguageCode": 2052' +
'}' +
']' +
'},' +
'"DisplayName": {' +
'"@odata.type": "Microsoft.Dynamics.CRM.Label",' +
'"LocalizedLabels": [' +
'{' +
'"@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel",' +
'"Label": "自动编号",' +
'"LanguageCode": 2052' +
'}' +
']' +
'},' +
'"RequiredLevel": {' +
'"Value": "None",' +
'"CanBeChanged": true,' +
'"ManagedPropertyLogicalName": "canmodifyrequirementlevelsettings"' +
'},' +
'"SchemaName": "ly_autonumber",' +
'"AutoNumberFormat": "WID-{SEQNUM:5}-{RANDSTRING:6}-{DATETIMEUTC:yyyyMMddhhmmss}",' +
'"@odata.type": "Microsoft.Dynamics.CRM.StringAttributeMetadata",' +
'"FormatName": {' +
'"Value": "Text"' +
'},' +
'"MaxLength": 100' +
'}');
req.send(JSON.stringify(requestMsg));
我这里执行截图如下:

执行成功后创建的字段如下:

此字段在界面上是只读的:

新建记录后保存后会给改字段赋值,我这里的一些示例如下:

当然,如果想这个字段流水号又从某个值开始可以设置的,设置示例代码如下:
var clientUrl = Xrm.Utility.getGlobalContext().getClientUrl();
var req = new XMLHttpRequest()
req.open("POST", encodeURI(clientUrl + "/api/data/v9.0/SetAutoNumberSeed"), true);
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 /* complete */) {
req.onreadystatechange = null;
if (this.status == 204) {
var alertStrings = { text: "操作成功!" };
var alertOptions = { height: 300, width: 400 };
Xrm.Navigation.openAlertDialog(alertStrings, alertOptions);
}
else {
Xrm.Navigation.openErrorDialog({ message: this.responseText });
}
}
};
var requestMsg = {};
requestMsg.EntityName = "ly_workorder";
requestMsg.AttributeName = "ly_autonumber";
requestMsg.Value = 1;
req.send(JSON.stringify(requestMsg));
可以看到自动编号中的流水号又从1开始了,值得一提的是,更改流水号的起始号码不会随着解决方案而迁移到新的环境,所以新的环境也需要设置下。
这样可以设置的话,可以自己部署一个定时程序,让每个周期,比如每月,每年从1开始设置流水号。
注意不会保证流水号会连号,中间可能空号,从目前来看,若是并发不大,生成的流水号是连号的。

如果要查看呢?可以参考 Query metadata using the Web API ,我这里直接列出方法:
https://demo.luoyong.me/api/data/v9.0/EntityDefinitions(LogicalName='ly_workorder')?$select=LogicalName&$expand=Attributes($select=AutoNumberFormat;$filter=LogicalName eq 'ly_autonumber')
最后提一下,PowerApps的解决方案编辑界面已经支持可视化设置此属性了,截图如下,就不用代码了,更方便,为它点赞。

最后提一下,实体的主属性,一般是前缀加上_name,也支持设置为自动编号格式了(以前只能为文本格式),这样更加方便了。
Dynamics 365 Customer Engagement V9.X新引入的自动编号属性介绍的更多相关文章
- Dynamics 365 Customer Engagement V9 活动源功能报错的解决方法
微软动态CRM专家罗勇 ,回复300或者20190120可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . 安装好Dynamic ...
- 下载Dynamics 365 Customer Engagement 工具
微软动态CRM专家罗勇 ,回复312或者20190311可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . 从Dynamics ...
- Dynamics 365 Customer Engagement的标准导入不支持并行导入了吗?
我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...
- 利用Dynamics 365 Customer Engagement的标准导入功能导入附件。
我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...
- Dynamics 365 Customer Engagement中插件的调试
微软动态CRM专家罗勇 ,回复319或者20190319可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . 本文主要根据官方的教 ...
- 嵌入Canvas App到Dynamics 365 Customer Engagement(Model-Driven App)中,创造更多可能!
我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...
- 利用Azure虚拟机安装Dynamics 365 Customer Engagement之五:安装SQL Server
我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...
- 利用Azure虚拟机安装Dynamics 365 Customer Engagement之二:创建域控虚拟机
我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...
- 如何让用户登录Dynamics 365 Customer Engagement后自动登录到Unified Interface App?
微软动态CRM专家罗勇 ,回复324或者20190422可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me! Dynamics 365 Customer Engagement ...
随机推荐
- TCP 的三次握手,四次挥手和重要的细节—干货满满,建议细读
最近把个人博客搭建好了,链接在这里:tobe的呓语,文章会先在博客和公众号更新~ 大家多多收藏啊 上一次讲了 UDP 协议,从这次开始,就要讲 TCP 协议了,因为 TCP 协议涉及到的东西很多,一篇 ...
- java内存模型和内存结构
java内存模型说的是多线程,网上可能会有写误导,并不是什么堆.栈.方法区,很多人都会搞混.说白了就是多线程中主线程和本地线程之间的一个数据可见性问题. jmm:java内存模型:jvm:java内存 ...
- 阿里巴巴主导的“华山版《Java 开发手册》”简介
1."83行代码计划"项目介绍(转自github): 2018年9月22日,在2018杭州云栖大会上,召开<码出高效:Java 开发手册>新书发布会,并宣布将图书所有收 ...
- 数理统计(一)——用Python进行方差分析
数理统计(一)——Python进行方差分析 iwehdio的博客园:https://www.cnblogs.com/iwehdio/ 方差分析可以用来推断一个或多个因素在其状态变化时,其因素水平或交互 ...
- C和C++从零开始系列(一)
今天开始写下一系列C和C++从入门开始的文章. 简单说几句C和C++的关系.C语言早于C++. C语言 贝尔实验室的Ken Thompson发明了 UNIX,当时有个B语言的.后来D.M.Ritchi ...
- Docker学习-jenkins+github实现持续集成和部署
上一篇介绍了docker环境搭建,本篇继续深入,结合jenkins利用docker-compose容器编排简单介绍下如何实现个人学习的持续集成/部署. 本篇学习曲线: 1.安装/运行jenkins容器 ...
- ARTS-S pytorch中backward函数的gradient参数作用
导数偏导数的数学定义 参考资料1和2中对导数偏导数的定义都非常明确.导数和偏导数都是函数对自变量而言.从数学定义上讲,求导或者求偏导只有函数对自变量,其余任何情况都是错的.但是很多机器学习的资料和开源 ...
- Orleans 序列化遇到的坑
真的是巨坑 搞明白问题的我简直无法用言语来描述我的心情 先上架构图 理想中的架构 服务随便上 网关只负责分发 然后跟随官方教程写遇到了序列化问题 以前有经验,不慌,以前稀里糊涂就搞定了. 再然后遇到一 ...
- 基于STM32 HID 游戏手柄开发调试
stm32自带usb接口,非常适合做hid设备,免驱开发也很方便. 使用stm32通过正确的报告描述符配置后,插入usb,电脑正确识别如下(设备和打印机) 可以通过右键,游戏控制器设置 通过选择属性 ...
- 布隆过滤器的demo
/** * 缓存击穿 * @author * */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = ...