【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("程序运行完成,按任意键退出!");
推荐阅读
- 1. Nginx基本概述与部署
- K8s 离线作业(Job与CronJob)
- 一文解决 CoAP 协议设备与外部网络沟通难题
- MacBook安装使用XMind
- [计算机网络常见题汇总]1-10经典题目
- Tomcat详解#yyds干货盘点#
- 3.23练习题
- liunx定时任务crontab命令#yyds干货盘点#
- for循环语句#yyds干货盘点#