Dynamics CRM v9.0实体自动编码功能的三种实现方式

1、系统已经为部分实体的部分字段做了自动编号,详细见下图设置:
在这里插入图片描述
选择“自动编码”,选择对应的实体进行设置:
在这里插入图片描述
2、通过注册插件方式实现:
创建一个字符串类型的字段,在插件中实现定义编码的规则,在实体保存前触发,生成响应的编码并存储。详细参考Dynamic插件写法。
需要注意点:如果在这里面有查记录数操作,需要考虑权限问题。

3、通过系统提供的Api方式实现:

var clientUrl = Xrm.Utility.getGlobalContext().getClientUrl();
var req = new XMLHttpRequest()
req.open("POST", encodeURI(clientUrl + "/api/data/v9.0/EntityDefinitions(LogicalName='opportunity')/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": "new_autonumber",' +
    '"AutoNumberFormat": "OP{DATETIMEUTC:yyyyMMdd}{SEQNUM:4}",' +
    '"@odata.type": "Microsoft.Dynamics.CRM.StringAttributeMetadata",' +
    '"FormatName": {' +
    '"Value": "Text"' +
    '},' +
    '"MaxLength": 100' +
    '}');
req.send(JSON.stringify(requestMsg));

这种方式会在系统中创建一个逻辑名称为“new_autonumber”,显示名称为“编号”,编码格式为"OP{DATETIMEUTC:yyyyMMdd}{SEQNUM:4}"的字段。
这边因为之前已经添加了编码字段,并且编码字段在多个地方使用,不能直接删除了重新建立。所以采用了以下方式进行修改:

    var req = new XMLHttpRequest()
    req.open("PUT", encodeURI(clientURL + "/api/data/v9.1/EntityDefinitions(" + entityMetadataId + ")/Attributes(" + item.MetadataId + ")"), 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 /* complete */) {
            req.onreadystatechange = null;
            if (this.status == 204) {
                console.log("第" + (index + 1) + "个字段" + item.AttributeName + "修改成功!");
            }
            else {
                var error = JSON.parse(this.response).error;
                Xrm.Utility.alertDialog("修改出错." + error.message);
            }
        }
    };
    var sendData = {
        AutoNumberFormat: {
            Value: "OP{DATETIMEUTC:yyyyMMdd}{SEQNUM:4}"
        }
    };
    req.send(JSON.stringify(sendData));

通过上面的方法更改,一直不起作用。通过查找相关的表,找到了Attribute相关的记录,通过SQL修改直接修改这表记录的值,具体如下:
在这里插入图片描述
同时记得在数据库的序列中创建字段对应的序列,参考脚本如下,注意序列的命名和实体加字段对应上:

CREATE SEQUENCE [dbo].[__lead__new_autonumber] 
 AS [bigint]
 START WITH 1000
 INCREMENT BY 1
 MINVALUE -9223372036854775808
 MAXVALUE 9223372036854775807
 CACHE 
GO

记得修改完成后重启下Dynamic网站。
可以通过api方式查看下当前编码字段是否生效:
在这里插入图片描述
到此,调整一个字符字段为自增字段完成。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值