02.04.2014, 17:47 | #1 |
Участник
|
При создании генерировать идентификатор
Добрый день!
При создании Evaluating Object нужно чтобы наверху вместо Information, было название Object'a, так как после создания, если я поменяю Object на другой, то всё появляется, но мне вот нужно именно при создании. Ниже даю код плагина, делаю всё это на Post-operation, Create и Update. Код: public class EvalObjectsAIU : IPlugin { public void Execute(IServiceProvider serviceProvider) { var process = new EvalObjectsAIUProcess(serviceProvider); process.LoadEntity(); if (!process.ValidateEntityName("bf_evaluatingobject")) return; if (!process.ValidateMessage(MessageName.Update)) return; process.Run(); } } class EvalObjectsAIUProcess : bf_PluginProcess { public override void Execute() { if (TargetEntity.Contains("regardingobjectid")) { string uniq = ""; int uniqLength = 1024; Entity record = crmService.Retrieve(TargetEntity.LogicalName, TargetEntity.Id, new ColumnSet("subject", "regardingobjectid")); if (record.Contains("regardingobjectid")) { uniq = record.GetAttributeValue<EntityReference>("regardingobjectid").Name; RetrieveEntityRequest rerq = new RetrieveEntityRequest { LogicalName = record.GetAttributeValue<EntityReference>("regardingobjectid").LogicalName, RetrieveAsIfPublished = true }; RetrieveEntityResponse rers = (RetrieveEntityResponse)crmService.Execute(rerq); uniq = rers.EntityMetadata.DisplayName.UserLocalizedLabel.Label + " " + "[" + uniq + "]"; } if (!record.Contains("subject") || record["subject"].ToString() != uniq) { uniq = string.Format("{0}", uniq.Length > uniqLength ? (uniq.Substring(0, uniqLength - 3) + "...") : uniq); record["subject"] = uniq; crmService.Update(record); } } |
|
02.04.2014, 23:35 | #2 |
Участник
|
Пробовали поменять степ на Pre-operation Create? Должно решить проблему.
|
|
03.04.2014, 09:24 | #3 |
Участник
|
Да я пробывал, но тогда выдаёт Error: bf_evaluatingobject with id does not exist, прикрепляю errorlog
|
|
03.04.2014, 13:05 | #4 |
Участник
|
Честно говоря я немного не понимаю вашу оббертку стандартного функционала
Что у вас в bf_PluginProcess, какую энтити используете и тд. Если вы используете Pre-Image на Pre-Create, то его там нет На чистом сдк должно работать вот так: public void Execute(IServiceProvider serviceProvider) { IPluginExecutionContext context = (IPluginExecutionContext) serviceProvider.GetService(typeof(IPluginExecutionContext)); Entity yourEntityName= (Entity)context.InputParameters["Target"] if(yourEntityName.Attributes.Contains("subject")) yourEntityName.Attributes["subject"] = yourEntityName.GetAttributeValue<EntityReference>["regardingobjectid"].Name; } Ошибка у вас из-за того, что на данный момент вызова Update еще не был создан данный рекорд. На пре стейдже не нужно использовать Update, так как на этом этапе еще не произошли манипуляции и транзакции в базу. Вы имитируете добавления поля, как буд-то его добавил пользователь, а не вы. |
|
03.04.2014, 15:41 | #5 |
Участник
|
Цитата:
Сообщение от maksii
Честно говоря я немного не понимаю вашу оббертку стандартного функционала
Что у вас в bf_PluginProcess, какую энтити используете и тд. Если вы используете Pre-Image на Pre-Create, то его там нет На чистом сдк должно работать вот так: public void Execute(IServiceProvider serviceProvider) { IPluginExecutionContext context = (IPluginExecutionContext) serviceProvider.GetService(typeof(IPluginExecutionContext)); Entity yourEntityName= (Entity)context.InputParameters["Target"] if(yourEntityName.Attributes.Contains("subject")) yourEntityName.Attributes["subject"] = yourEntityName.GetAttributeValue<EntityReference>["regardingobjectid"].Name; } Ошибка у вас из-за того, что на данный момент вызова Update еще не был создан данный рекорд. На пре стейдже не нужно использовать Update, так как на этом этапе еще не произошли манипуляции и транзакции в базу. Вы имитируете добавления поля, как буд-то его добавил пользователь, а не вы. Вот код: Код: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.Xrm.Sdk; using Bum.Survey.CRM.Plugin.BaseLib; namespace Bum.Survey.CRM.Plugin { public class EvalObjectCreateTest : IPlugin { public void Execute(IServiceProvider serviceProvider) { var process = new EvalObjectCreateTestProcess(serviceProvider); process.LoadEntity(); if (!process.ValidateEntityName("bf_evaluatingobject")) return; if (!process.ValidateMessage(MessageName.Create, MessageName.Update)) return; process.Run(); } } class EvalObjectCreateTestProcess : bf_PluginProcess { public override void Execute() { IPluginExecutionContext context = (IPluginExecutionContext) serviceProvider.GetService(typeof(IPluginExecutionContext)); Entity yourEntityName = (Entity)context.InputParameters["Target"]; if(yourEntityName.Attributes.Contains("subject")) yourEntityName.Attributes["subject"] = yourEntityName.GetAttributeValue<EntityReference>("regardingobjectid").Name; } public EvalObjectCreateTestProcess(IServiceProvider serviceProvider) : base(serviceProvider) { } } } Код: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.Xrm.Sdk.Messages; using Microsoft.Xrm.Sdk.Metadata; using Microsoft.Xrm.Sdk; using Microsoft.Xrm.Sdk.Query; namespace Bum.Survey.CRM.Plugin.BaseLib { public static class MessageName { public const string Create = "Create"; public const string Update = "Update"; public const string Delete = "Delete"; public const string RetrieveMultiple = "RetrieveMultiple"; public const string Retrieve = "Retrieve"; } public static class ParameterName { public const string Target = "Target"; public const string id = "id"; public const string Query = "Query"; public const string BusinessEntityCollection = "BusinessEntityCollection"; public const string BusinessEntity = "BusinessEntity"; } public class bf_PluginError : Exception { public bf_PluginError(string message) : base(message) { } } public abstract class bf_PluginProcess { IServiceProvider _serviceProvider; public IServiceProvider serviceProvider { get { return _serviceProvider; } } IPluginExecutionContext _executionContext; public IPluginExecutionContext executionContext { get { if (_executionContext == null) _executionContext = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext)); return _executionContext; } } IOrganizationServiceFactory _serviceFactory; public IOrganizationServiceFactory serviceFactory { get { if (_serviceFactory == null) _serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory)); return _serviceFactory; } } IOrganizationService _crmService; public IOrganizationService crmService { get { if (_crmService == null) _crmService = serviceFactory.CreateOrganizationService(executionContext.UserId); return _crmService; } } ITracingService _tracingService; public ITracingService tracingService { get { if (_tracingService == null) _tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService)); return _tracingService; } } public bf_PluginProcess(IServiceProvider serviceProvider) { _serviceProvider = serviceProvider; } Entity _entity; public Entity TargetEntity { get { return _entity; } } EntityReference _entity_key; public EntityReference TargetKey { get { return _entity_key; } } public void LoadEntity() { if (executionContext.InputParameters.Contains(ParameterName.Target)) { if (executionContext.InputParameters[ParameterName.Target] is Entity) { _entity = (Entity)executionContext.InputParameters[ParameterName.Target]; _entity_key = new EntityReference(_entity.LogicalName, _entity.Id); } else if (executionContext.InputParameters[ParameterName.Target] is EntityReference) { _entity_key = (EntityReference)executionContext.InputParameters[ParameterName.Target]; } } if (executionContext.MessageName == MessageName.Create) { if (executionContext.OutputParameters.Contains(ParameterName.id)) _entity_key.Id = (Guid)executionContext.OutputParameters[ParameterName.id]; } } public void RequeryTarget() { RequeryTarget(new ColumnSet(true)); } public void RequeryTarget(ColumnSet columnSet) { _entity = crmService.Retrieve(TargetKey.LogicalName, TargetKey.Id, columnSet); } public bool ValidateEntityName(string logicalName) { return _entity_key.LogicalName == logicalName; } public bool ValidateMessage(params string[] messages) { return messages.Contains(executionContext.MessageName); } abstract public void Execute(); public void Run() { try { Execute(); } catch (System.Exception ex) { throw new InvalidPluginExecutionException( String.Format("An error occurred in the {0} plug-in: {1}", this.GetType().ToString(), ex.ToString()), ex); } } public Dictionary<int, string> GetOptionSet(string entityName, string optionSetName) { RetrieveAttributeRequest req = new RetrieveAttributeRequest(); req.EntityLogicalName = entityName; req.LogicalName = optionSetName; RetrieveAttributeResponse res = (RetrieveAttributeResponse)_crmService.Execute(req); Dictionary<int, string> result = new Dictionary<int, string>(); foreach (var r in ((PicklistAttributeMetadata)res.AttributeMetadata).OptionSet.Options) { result.Add(r.Value.Value, r.Label.UserLocalizedLabel.Label); } return result; } } public static class DateTimeExt { public static string ConvertToCulturalString(this DateTime dt) { return dt.ToLocalTime().ToString("dd.MM.yyyy"); } } } |
|
03.04.2014, 16:34 | #6 |
Участник
|
Для уточнения, вы поменяли степ на Pre и скопипастили мой код?
|
|
03.04.2014, 16:37 | #7 |
Участник
|
Я сомневаюсь, что мой код будет работать, хотя вроде должен.
Ну а так, если я правильно понял: Было: Код: if (!record.Contains("subject") || record["subject"].ToString() != uniq) { uniq = string.Format("{0}", uniq.Length > uniqLength ? (uniq.Substring(0, uniqLength - 3) + "...") : uniq); record["subject"] = uniq; crmService.Update(record); } Код: if (!record.Contains("subject") || record["subject"].ToString() != uniq) { uniq = string.Format("{0}", uniq.Length > uniqLength ? (uniq.Substring(0, uniqLength - 3) + "...") : uniq); record["subject"] = uniq; if(executionContext.MessageName == MessageName.Update) { crmService.Update(record); } } Код: Entity yourEntityName = (Entity)executionContext.InputParameters["Target"]; if(yourEntityName.Attributes.Contains("subject")) yourEntityName.Attributes["subject"] = yourEntityName.GetAttributeValue<EntityReference>("regardingobjectid").Name; if(executionContext.MessageName == MessageName.Update) { crmService.Update(yourEntityName ); } |
|
03.04.2014, 17:01 | #8 |
Участник
|
Цитата:
Сообщение от maksii
Я сомневаюсь, что мой код будет работать, хотя вроде должен.
Ну а так, если я правильно понял: Было: Код: if (!record.Contains("subject") || record["subject"].ToString() != uniq) { uniq = string.Format("{0}", uniq.Length > uniqLength ? (uniq.Substring(0, uniqLength - 3) + "...") : uniq); record["subject"] = uniq; crmService.Update(record); } Код: if (!record.Contains("subject") || record["subject"].ToString() != uniq) { uniq = string.Format("{0}", uniq.Length > uniqLength ? (uniq.Substring(0, uniqLength - 3) + "...") : uniq); record["subject"] = uniq; if(executionContext.MessageName == MessageName.Update) { crmService.Update(record); } } Код: Entity yourEntityName = (Entity)executionContext.InputParameters["Target"]; if(yourEntityName.Attributes.Contains("subject")) yourEntityName.Attributes["subject"] = yourEntityName.GetAttributeValue<EntityReference>("regardingobjectid").Name; if(executionContext.MessageName == MessageName.Update) { crmService.Update(yourEntityName ); } Код: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.Xrm.Sdk; using Bum.Survey.CRM.Plugin.BaseLib; using Microsoft.Xrm.Sdk.Query; using Microsoft.Xrm.Sdk.Messages; namespace Bum.Survey.CRM.Plugin { public class EvalObjectCreateTest : IPlugin { public void Execute(IServiceProvider serviceProvider) { var process = new EvalObjectCreateTestProcess(serviceProvider); process.LoadEntity(); if (!process.ValidateEntityName("bf_evaluatingobject")) return; if (!process.ValidateMessage(MessageName.Create, MessageName.Update)) return; process.Run(); } } class EvalObjectCreateTestProcess : bf_PluginProcess { public override void Execute() { if (TargetEntity.Contains("regardingobjectid")) { string uniq = ""; int uniqLength = 1024; Entity record = crmService.Retrieve(TargetEntity.LogicalName, TargetEntity.Id, new ColumnSet("subject", "regardingobjectid")); if (record.Contains("regardingobjectid")) { uniq = record.GetAttributeValue<EntityReference>("regardingobjectid").Name; RetrieveEntityRequest rerq = new RetrieveEntityRequest { LogicalName = record.GetAttributeValue<EntityReference>("regardingobjectid").LogicalName, RetrieveAsIfPublished = true }; RetrieveEntityResponse rers = (RetrieveEntityResponse)crmService.Execute(rerq); uniq = rers.EntityMetadata.DisplayName.UserLocalizedLabel.Label + " " + "[" + uniq + "]"; } if (!record.Contains("subject") || record["subject"].ToString() != uniq) { uniq = string.Format("{0}", uniq.Length > uniqLength ? (uniq.Substring(0, uniqLength - 3) + "...") : uniq); record["subject"] = uniq; if (executionContext.MessageName == MessageName.Update) { crmService.Update(record); } } } Entity yourEntityName = (Entity)executionContext.InputParameters["Target"]; if (yourEntityName.Attributes.Contains("subject")) yourEntityName.Attributes["subject"] = yourEntityName.GetAttributeValue<EntityReference>("regardingobjectid").Name; if (executionContext.MessageName == MessageName.Update) { crmService.Update(yourEntityName); } } public EvalObjectCreateTestProcess(IServiceProvider serviceProvider) : base(serviceProvider) { } } } |
|
03.04.2014, 17:30 | #9 |
Участник
|
хехе, не, это у меня тупняк.
Ошибка не тут случайно падает? Код: Entity record = crmService.Retrieve(TargetEntity.LogicalName, TargetEntity.Id, new ColumnSet("subject", "regardingobjectid")); Да и смысла тянуть ее нет, так как в таргете у тебя уже есть эти данные. Попробуй так; Инициализируй Entity record дальше Код: if (executionContext.MessageName == MessageName.Update) { record = crmService.Retrieve(TargetEntity.LogicalName, TargetEntity.Id, new ColumnSet("subject", "regardingobjectid")); } else { record = TargetEntity; } Мой кусок кода у тебя лишний будут, его можно удалить впринципе, либо удали свой и проверь работает ли мой. |
|
|
За это сообщение автора поблагодарили: a33ik (2), Lavdislav (1). |
03.04.2014, 17:45 | #10 |
Участник
|
Цитата:
Сообщение от maksii
хехе, не, это у меня тупняк.
Ошибка не тут случайно падает? Код: Entity record = crmService.Retrieve(TargetEntity.LogicalName, TargetEntity.Id, new ColumnSet("subject", "regardingobjectid")); Да и смысла тянуть ее нет, так как в таргете у тебя уже есть эти данные. Попробуй так; Инициализируй Entity record дальше Код: if (executionContext.MessageName == MessageName.Update) { record = crmService.Retrieve(TargetEntity.LogicalName, TargetEntity.Id, new ColumnSet("subject", "regardingobjectid")); } else { record = TargetEntity; } Мой кусок кода у тебя лишний будут, его можно удалить впринципе, либо удали свой и проверь работает ли мой. |
|
04.04.2014, 09:34 | #11 |
Участник
|
Цитата:
Код: public override void Execute() { Entity record = crmService.Retrieve(TargetEntity.LogicalName, TargetEntity.Id, new ColumnSet("subject", "regardingobjectid")); if (TargetEntity.Contains("regardingobjectid")) { string uniq = ""; int uniqLength = 1024; if (executionContext.MessageName == MessageName.Update) { record = crmService.Retrieve(TargetEntity.LogicalName, TargetEntity.Id, new ColumnSet("subject", "regardingobjectid")); } else { record = TargetEntity; } if (record.Contains("regardingobjectid")) { uniq = record.GetAttributeValue<EntityReference>("regardingobjectid").Name; RetrieveEntityRequest rerq = new RetrieveEntityRequest { LogicalName = record.GetAttributeValue<EntityReference>("regardingobjectid").LogicalName, RetrieveAsIfPublished = true }; RetrieveEntityResponse rers = (RetrieveEntityResponse)crmService.Execute(rerq); uniq = rers.EntityMetadata.DisplayName.UserLocalizedLabel.Label + " " + "[" + uniq + "]"; } if (!record.Contains("subject") || record["subject"].ToString() != uniq) { uniq = string.Format("{0}", uniq.Length > uniqLength ? (uniq.Substring(0, uniqLength - 3) + "...") : uniq); record["subject"] = uniq; if (executionContext.MessageName == MessageName.Update) { crmService.Update(record); } } } } |
|
04.04.2014, 12:33 | #12 |
Участник
|
Код: Entity record = crmService.Retrieve(TargetEntity.LogicalName, TargetEntity.Id, new ColumnSet("subject", "regardingobjectid")); Код: Entity record = new Entity(); |
|
04.04.2014, 14:27 | #13 |
Участник
|
Ты даже не предстовляешь как я рад, 2 дня я дрюкал этот код (бедный), но с твоей помощью при создании появляется именно то, что мне надо.)) Спасибо тебе огромное, респект!
|
|
04.04.2014, 14:32 | #14 |
Участник
|
Обращайся, если что. Все начинали с подобных ошибок.
|
|