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,也支持设置为自动编号格式了(以前只能为文本格式),这样更加方便了。