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方式查看下当前编码字段是否生效:
到此,调整一个字符字段为自增字段完成。