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

 

posted @ 2019-08-16 23:53  微软MVP(15-18)罗勇  阅读(879)  评论(0编辑  收藏  举报