Разработка
29
Окт
2

История изменений своими руками

Если Вас чем-то не устраивает стандартный Аудит CRM 2011, то можно написать свой. Для этих целей нужно задействовать в плагинах EntityImage. Есть два типа EntityImage – PreEntityImage и PostEntityImage. Они содержат «снимки» значений атрибутов до и после выполнения основного действия платформы (например, обновления). Вот эту разницу значений и нужно отлавливать, чтобы отследить изменения. Но, обо всем по порядку:

  • Создайте (в данном примере для объекта Организация) новое многострочное текстовое поле «Лог изменений» (new_changeslog), вынесите его на форму и сделайте доступным только для чтения (менять его будем через код);
  • Создайте плагин со следующим кодом:
    using System;
    using System.Text;
    using System.Diagnostics;
    using System.Linq;
    using System.ServiceModel;
    using Microsoft.Xrm.Sdk;
    using Microsoft.Xrm.Sdk.Query;
    using Microsoft.Xrm.Sdk.Messages;
    
    namespace audit
    {
        public class MyPlugin : IPlugin
        {
            public void Execute(IServiceProvider serviceProvider)
            {
                try
                {
                    IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
                    IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
                    IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
    
                    // Проверяем, что обновление не вызвано другим процессом
                    if (context.Depth > 1) return;
    
                    // Получаем снимки начальных и конечных  данных
                    Entity pre = context.PreEntityImages["Image"];
                    Entity post = context.PostEntityImages["Image"];
    
                    // Получаем текущее значение лога
                    string preChangesLog = pre.Contains("new_changeslog") ? pre["new_changeslog"].ToString() : "";
    
                    // Получаем ссылку на измененные данные
                    Entity target = context.InputParameters["Target"] as Entity;
    
                    StringBuilder sb = new StringBuilder(); 
                    
                    // Если было изменено Название заносим запись об этом в лог
                    if (target.Attributes.Contains("name"))
                    {
                        sb.AppendFormat("{0}\nНазвание: {1} -> {2}", preChangesLog, pre["name"], post["name"]);
                    }
    
                    // Если было изменена Головная организация заносим запись об этом в лог
                    if (target.Attributes.Contains("parentaccountid"))
                    {
                        EntityReference preParentAccountid = (EntityReference)pre["parentaccountid"];
                        EntityReference postParentAccountid = (EntityReference)post["parentaccountid"];
    
                        sb.AppendFormat("{0}\nГоловная организация: {1} -> {2}", preChangesLog, preParentAccountid.Name, postParentAccountid.Name);
                    }
    
                    // Обновляем лог
                    Entity updAcc = new Entity("account");
                    updAcc["accountid"] = context.PrimaryEntityId;
                    updAcc["new_changeslog"] = sb.ToString(); ;
                    service.Update(updAcc);
                }
                catch (FaultException<OrganizationServiceFault> ex)
                {
                    throw new InvalidPluginExecutionException("Ошибка: ", ex);
                }
            }
        }
    }
    

    Здесь происходит следующие:

    • Проверяем что обновление не вызвано другим процессом;
    • Получаем ссылки на снимки Pre и Post, а также получаем текущее значение лога;
    • Далее проверяем, изменились ли нужные нам поля и если да, то добавляем их старое и новое значение в лог;
    • Обновляем значение лога.
  • Зарегистрируйте плагин в CRM на Post шага Update (только полей name, parentaccountid) объекта Организация. Для этого шага зарегистрируйте снимок на Pre и Post с полями new_changeslog, name и parentaccountid.

Теперь после изменения нужных атрибутов в «лог» будут записываться исходные и новые значения.



Комментарии (2)
  • Aleks 29.10.2012

    А для четвертой версии, как можно просмотреть историю изменений?

  • slivka_83 29.10.2012

    Не понял вопрса? Тут паказан пример плагина. Если нужна история изменений, то написать похожий для 4-ки.

*

code