Код плагина:
Код:
using System;
using System.Collections.Generic;
using Microsoft.Win32;
using Microsoft.Crm.Sdk;
using Microsoft.Crm.SdkTypeProxy;
using Microsoft.Crm.SdkTypeProxy.Metadata;
using Microsoft.Crm.Sdk.Query;
namespace AKAutoNumber
{
public class AKAutoNumber : IPlugin
{
private string _secureInformation;
private string _unsecureInformation;
private static object _sync = new object();
public AKAutoNumber(string unsecureInfo, string secureInfo)
{
_secureInformation = secureInfo;
_unsecureInformation = unsecureInfo;
}
// Related SDK topic: Writing a Plug-in
public void Execute(IPluginExecutionContext context)
{
DynamicEntity entity = null;
if (context.InputParameters.Properties.Contains(ParameterName.Target) &&
context.InputParameters.Properties[ParameterName.Target] is DynamicEntity)
{
entity = (DynamicEntity)context.InputParameters.Properties[ParameterName.Target];
}
else
{
return;
}
try
{
lock (_sync)
{
// simple query to get incremental settings for this entity
CrmAuthenticationToken token = new CrmAuthenticationToken();
token.AuthenticationType = AuthenticationType.AD;
token.OrganizationName = context.OrganizationName;
CrmService service = new CrmService();
service.UseDefaultCredentials = true;
service.Url = (string)(Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\MSCRM").GetValue("ServerUrl")) + "/2007/crmservice.asmx";
service.CrmAuthenticationTokenValue = token;
IncrementalNumbering setting = IncrementalNumbering.GetSettings(service, entity.Name);
if (setting != null && !entity.Properties.Contains(setting.PropertyName))
{
int next = setting.CurrentPosition + 1;
StringProperty increment = new StringProperty(setting.PropertyName,setting.Prefix.ToString()+ next.ToString());
entity.Properties.Add(increment);
// keep track of the latest id inside the custom entity
setting.Increment(service, next);
}
}
}
catch (System.Web.Services.Protocols.SoapException ex)
{
throw new InvalidPluginExecutionException(
String.Format("An error occurred in the {0} plug-in.",
this.GetType().ToString()),
ex);
}
}
}
}
Код вспомагательного класа
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Crm.Sdk;
using Microsoft.Crm.SdkTypeProxy;
using Microsoft.Crm.Sdk.Query;
namespace AKAutoNumber
{
public class IncrementalNumbering
{
public const string SchemaName = "do_universalnumber";
public class Fields
{
public const string Id = "do_universalnumberid";
public const string EntityName = "do_name";
public const string PropertyName = "do_attribute";
public const string CurrentPosition = "do_count";
public const string Prefix = "do_prefix";
}
public Guid Id { get; set; }
public string EntityName { get; set; }
public string PropertyName { get; set; }
public string Prefix { get; set; }
public int CurrentPosition { get; set; }
public IncrementalNumbering() { }
public IncrementalNumbering(DynamicEntity entity)
{
this.Id = (entity.Properties[Fields.Id] as Key).Value;
this.EntityName = entity.Properties[Fields.EntityName].ToString();
this.PropertyName = entity.Properties[Fields.PropertyName].ToString();
this.Prefix = entity.Properties[Fields.Prefix].ToString();
this.CurrentPosition = (entity.Properties[Fields.CurrentPosition] as CrmNumber).Value;
}
public void Increment(CrmService service, int next)
{
this.CurrentPosition = next; // set before calling ToDynamic
TargetUpdateDynamic target = new TargetUpdateDynamic();
target.Entity = this.ToDynamic();
UpdateRequest request = new UpdateRequest();
request.Target = target;
service.Execute(request);
}
// see if there are any increment settings for this entity
public static IncrementalNumbering GetSettings(CrmService service, string entityName)
{
IncrementalNumbering setting = null;
QueryExpression query = new QueryExpression();
query.EntityName = IncrementalNumbering.SchemaName;
query.ColumnSet = new AllColumns();
query.Criteria = new FilterExpression();
query.Criteria.FilterOperator = LogicalOperator.And;
ConditionExpression condition1 = new ConditionExpression();
condition1.AttributeName = IncrementalNumbering.Fields.EntityName;
condition1.Operator = ConditionOperator.Equal;
condition1.Values = new object[] { entityName };
query.Criteria.AddCondition(condition1);
RetrieveMultipleRequest request = new RetrieveMultipleRequest();
request.Query = query;
request.ReturnDynamicEntities = true;
RetrieveMultipleResponse response = service.Execute(request) as RetrieveMultipleResponse;
BusinessEntityCollection results = response.BusinessEntityCollection;
if (results.BusinessEntities.Count > 0) // no error checkig to see if there are 2 incrementors set for the same entity
{
setting = new IncrementalNumbering(results.BusinessEntities[0] as DynamicEntity);
}
return setting;
}
// should include rest of the fields, but leave it for now
public DynamicEntity ToDynamic()
{
DynamicEntity entity = new DynamicEntity(IncrementalNumbering.SchemaName);
PropertyCollection properties = new PropertyCollection();
properties.Add(new KeyProperty(Fields.Id, new Key(this.Id)));
properties.Add(new CrmNumberProperty(Fields.CurrentPosition, new CrmNumber(this.CurrentPosition)));
entity.Properties = properties;
return entity;
}
}
}