пятница, 3 августа 2012 г.

Плагин для проверки возможности удаления сущности

Задача: Необходимо реализовать плагин, который запрещает удаление сущности при выполнении некоторого условия на связанную сущность.

Решение: Реализован плагин на событие Delete сущности new_grmember со снимком PreImage.

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 PreDeleteGrmember
{
    public class GrmemberDeleteHandler : IPlugin
    {
        #region Члены IPlugin

        public void Execute(IPluginExecutionContext context)
        {
            if (context.MessageName != MessageName.Delete || !(context.PreEntityImages.Contains("PreImage")) || !(context.PreEntityImages["PreImage"] is DynamicEntity))
                return;

            DynamicEntity _grmember = (DynamicEntity)context.PreEntityImages["PreImage"];

            if (!_grmember.Properties.Contains("new_contractid"))
                return;

            Lookup customer = (Lookup)_grmember["new_contractid"];

            if (customer.type != EntityName.opportunity.ToString())
                return;

            Guid opportunityid = customer.Value;

            string[] fields = new string[] { "new_status" };

            ICrmService crmservice = context.CreateCrmService(true);

            RetrieveRequest request = new RetrieveRequest();
            request.ColumnSet = new ColumnSet(fields);
            request.ReturnDynamicEntities = true;

            TargetRetrieveDynamic target = new TargetRetrieveDynamic();
            target.EntityId = opportunityid;
            target.EntityName = EntityName.opportunity.ToString();

            request.Target = target;

            DynamicEntity _opportunity = (DynamicEntity)((RetrieveResponse)crmservice.Execute(request)).BusinessEntity;

            Picklist status = (Picklist)_opportunity["new_status"];

            if (status.Value.ToString() == "2")
                throw new InvalidPluginExecutionException("Вы не можете удалить этот объект!");

        }

        #endregion
    }
}

Комментариев нет:

Отправить комментарий