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

Posted luoyong0201

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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阶段,设置如下:

Dynamics



这个使用的代码如下:


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=0 />
<condition attribute=statecode operator=eq value=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("程序运行完成,按任意键退出!");
Dynamics 365 Online-Unified User Interface

Dynamics 365 for Sales: 门户网页模板的制作

Dynamics 365-关于Solution的那些事

为Dynamics 365写一个简单程序实现解决方案一键迁移

尝试 Web API Dynamics 365 CRM - 403-禁止错误

Dynamics 365Online 如何在21v中提交工单