我的 CRM 实例中有一个自动编号插件。基本上,前缀是当前年份。所以我希望它像这样工作,如果年份不是当前年份,则用当前年份更新它。
new_prefix是包含年份的字段,如果与当前年份不同,我需要更改该年份。该插件目前可以使用,我只是想更改年份(如果年份不同)。这也一直告诉我代码太多而细节太少。
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Client;
using System.Xml.Linq;
using System;
using System.Linq;
using System.Globalization;
namespace UGKCK.CRM.PlugIns
{
public class AutoNumbering : IPlugin
{
#region Secure/Unsecure Configuration Setup
private string _secureConfig = null;
private string _unsecureConfig = null;
public AutoNumbering(string unsecureConfig, string secureConfig)
{
_secureConfig = secureConfig;
_unsecureConfig = unsecureConfig;
}
#endregion
public void Execute(IServiceProvider serviceProvider)
{
ITracingService tracer = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
IOrganizationServiceFactory factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
IOrganizationService service = factory.CreateOrganizationService(context.UserId);
OrganizationServiceContext orgService = new OrganizationServiceContext(service);
try
{
Entity entity = (Entity)context.InputParameters["Target"];
Entity autoNumberingRecord = RetrieveAutoNumbering(orgService, entity);
UpdateNumber(service, autoNumberingRecord, entity);
UpdateNextNumber(service, autoNumberingRecord);
}
catch (Exception e)
{
throw new InvalidPluginExecutionException(e.Message);
}
}
private Entity RetrieveAutoNumbering(OrganizationServiceContext orgService, Entity entity)
{
Entity retrievedAutoNumber = (from an in orgService.CreateQuery("new_autonumbering")
where (String)an["new_entity"] == entity.LogicalName
select an).FirstOrDefault();
Entity autoNumber = new Entity("new_autonumbering");
autoNumber.Id = retrievedAutoNumber.Id;
autoNumber["new_prefix"] = retrievedAutoNumber["new_prefix"];
autoNumber["new_nextnumber"] = retrievedAutoNumber["new_nextnumber"];
return autoNumber;
}
private void UpdateNumber(IOrganizationService service, Entity autoNumberingRecord, Entity target)
{
var prefix = autoNumberingRecord.Attributes["new_prefix"].ToString();
var number = autoNumberingRecord.Attributes["new_nextnumber"].ToString();
if (target.LogicalName == "new_servicerequest")
{
target["new_servicerequestnumber"] = prefix + "-" + number;
}
else if (target.LogicalName == "contact")
{
target["new_contactnumber"] = prefix + "-" + number;
}
service.Update(target);
}
private void UpdateNextNumber(IOrganizationService service, Entity autoNumberingRecord)
{
var currentNumber = (int)autoNumberingRecord.Attributes["new_nextnumber"];
var nextNumber = currentNumber + 1;
autoNumberingRecord["new_nextnumber"] = nextNumber;
service.Update(autoNumberingRecord);
}
}
}
Run Code Online (Sandbox Code Playgroud)
DateTime.Now.Year将为您提供当前年份。
由于您似乎可以使用此插件来处理其正常的自动编号任务,再加上动态更新前缀,因此您可以做的是添加一个方法来检查前缀,并在必要时将其设置为当前年份,然后再执行其他操作。
private void setPrefix(Entity autoNumberingRecord)
{
var year = DateTime.Now.Year;
if(autoNumberingRecord["new_prefix"] != year)
{
autoNumberingRecord["new_prefix"] = year;
}
}
Run Code Online (Sandbox Code Playgroud)
然后从主 try 子句中调用它:
Entity entity = (Entity)context.InputParameters["Target"];
Entity autoNumberingRecord = RetrieveAutoNumbering(orgService, entity);
setPrefix(autoNumberingRecord);
UpdateNumber(service, autoNumberingRecord, entity);
UpdateNextNumber(service, autoNumberingRecord);
Run Code Online (Sandbox Code Playgroud)
这样,当您更新目标记录上的号码以及更新 autoNumberingRecord 时,就会正确设置前缀。
由于您总是希望前缀为当前年份,因此您可以每次都设置它,但我想如果您正在审核记录或其他内容,除非有必要,否则您可能希望避免设置该字段。
话虽如此,我可能会采取使用早期绑定类并向 AutoNumberingRecord 类添加一个名为 Prefix 的属性的方法,其中包括 new_prefix 字段的比较和更新逻辑。
| 归档时间: |
|
| 查看次数: |
17790 次 |
| 最近记录: |