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阶段,设置如下:
这个使用的代码如下:
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 InterfaceDynamics 365 for Sales: 门户网页模板的制作
为Dynamics 365写一个简单程序实现解决方案一键迁移