Dynamics 365中定制包括一个流水号但不会产生重复编号的功能

【Dynamics 365中定制包括一个流水号但不会产生重复编号的功能】追风赶月莫停留,平芜尽处是春山。这篇文章主要讲述Dynamics 365中定制包括一个流水号但不会产生重复编号的功能相关的知识,希望能为你提供帮助。
我是微软Dynamics 365 & Power Platform方面的工程师/顾问罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面的微软最有价值专家(Microsoft MVP),欢迎关注我的微信公众号 MSFTDynamics365erLuoYong ,回复433或者20210131可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!
有的项目喜欢编号,当然简单的编号可以考虑使用标准的自动编号功能,可以参考我之前的博文  ??Dynamics 365 Customer Engagement V9.X新引入的自动编号属性介绍??  。
我今天要做个客制化,需求是每月从1开始编号,希望编号不会重复,是否连续没有那么重要,如何做呢?
可以考虑这个官方文档  ??Scalable Customization Design: Auto-numbering example?? 提供的思路,大致的做法就是利用锁来做,同时利用一个辅助字段。我这里不多解释了,请参考官方文档。
我具体做法是使用了一个插件,注册在需要生成编号的实体的Create消息的Pre Operation阶段,设置如下:





这个使用的代码如下:


using System;
using System.ServiceModel;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;
namespace CRM.Plugins

public class TestPreCreate : IPlugin

public void Execute(IServiceProvider serviceProvider)

ITracingService tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext)); if (context.InputParameters.Contains("Target") & & context.InputParameters["Target"] is Entity)

Entity currentEntity = (Entity)context.InputParameters["Target"];
IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory)); //对编号设置信息的读取更改使用SYSTEM账号进行
IOrganizationService orgAdminSvc = serviceFactory.CreateOrganizationService(null);
//IOrganizationService orgSvc = serviceFactory.CreateOrganizationService(context.UserId);
var groupName = DateTime.UtcNow.AddHours(8).Year.ToString() + DateTime.UtcNow.AddHours(8).Month.ToString().PadLeft(2, 0); string fetchXml = string.Format(@"< fetch version=1.0 top=1 mapping=logical distinct=false>
< entity name=ly_autonumber>
< attribute name=ly_autonumberid />
< filter type=and>
< condition attribute=ly_name operator=eq value=https://www.songbingjia.com/android/0 />
< condition attribute=statecode operator=eq value=https://www.songbingjia.com/android/0 />
< /filter>
< /entity>
< /fetch> ", groupName); var autonumberEC = orgAdminSvc.RetrieveMultiple(new FetchExpression(fetchXml)); if (autonumberEC.Entities.Count == 1)

autonumberEC.Entities[0]["ly_subsidiaryfield"] = DateTime.UtcNow.Ticks.ToString();
orgAdminSvc.Update(autonumberEC.Entities[0]); //再查一次当前编号很重要,否则会出现重复编号
var currentStep = orgAdminSvc.Retrieve(autonumberEC.Entities[0].LogicalName, autonumberEC.Entities[0].Id, new ColumnSet("ly_currentstep")).GetAttributeValue< int> ("ly_currentstep");
autonumberEC.Entities[0]["ly_currentstep"] = currentStep + 1;
currentEntity["ly_no"] = $"groupName-(currentStep + 1).ToString().PadLeft(6, 0)";
orgAdminSvc.Update(autonumberEC.Entities[0]);

else

throw new InvalidPluginExecutionException("请联系系统管理员先配置好分组!");







然后如何测试呢?我这里启动5个程序,每个程序用  ExecuteMultipleRequest 消息向Dynamics 365来创建500条记录,使用的代码如下:


class Program

static void Main(string[] args)

try

Console.WriteLine($"要开始,输入Y继续");
var input = Console.ReadLine().ToString().ToUpper();
if (input == "Y")

CrmServiceClient.MaxConnectionTimeout = new TimeSpan(10, 0, 0);
CrmServiceClient crmSourceSvc = new CrmServiceClient(ConfigurationManager.AppSettings["ConnStr"]);
if (!crmSourceSvc.IsReady)

throw new Exception("连接ConnStr失败!" + crmSourceSvc.LastCrmError);

else

Console.WriteLine($"程序连接到Dynamics 365/Power Apps环境 crmSourceSvc.ConnectedOrgFriendlyName成功!");

ExecuteMultipleResponse multiRep;
ExecuteMultipleRequest multiReqs = new ExecuteMultipleRequest()

Settings = new ExecuteMultipleSettings()

ContinueOnError = true,
ReturnResponses = true
,
Requests = new OrganizationRequestCollection()
;
for (int i = 0; i < 500; i++)

CreateRequest req = new CreateRequest();
var createEntity = new Entity("new_testentity");
createEntity["new_name"] = DateTime.UtcNow.AddHours(8).Ticks.ToString();
req.Target = createEntity;
multiReqs.Requests.Add(req);

multiRep = (ExecuteMultipleResponse)crmSourceSvc.Execute(multiReqs);
foreach (var Rep in multiRep.Responses)

if (Rep.Fault != null)

Console.WriteLine(Rep.Fault.Message);



else

Console.WriteLine("你选择了取消程序运行!");

Console.WriteLine("程序运行完成,按任意键退出!");

    推荐阅读