Разработка
21
Июл
0

Создание XAML Бизнес-процессов

С приходом CRM 2011 кастомные Бизнес-процессы могут быть созданы с помощью Visual Studio Workflow Designer, использующем XAML. Посмотрим как это можем сделать…
Для этого примера реализуем следующую бизнес-логику: при деактивации Организации, деактивировать все дочерние Контакты.

Что нам понадобится:

  • Microsoft Visual Studio 2010;
  • MS CRM SDK 2011.

Начнем:

  1. Настройка проекта:
    • В Visual Studio создайте новый проект Activity Library на .NET Framework 4;
    • Добавьте в проект ссылки на следующие сборки:
      • Microsoft.Xrm.Sdk.dll
      • Microsoft.Xrm.Sdk.Workflow.dll
    • В свойствах проекта смените .NET Framework 4 Client Profile на .NET Framework 4;
    • Подпишите проект;



  1. Создание своего Workflow-действия:
    • Добавьте в проект новый .cs класс. В него поместите следующий код:
      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      
      using System.Activities;
      using Microsoft.Xrm.Sdk;
      using Microsoft.Xrm.Sdk.Query;
      using Microsoft.Xrm.Sdk.Workflow;
      using System.Runtime.Serialization;
      
      namespace contactDeactivate
      {
          public sealed class RetrieveMultiple : CodeActivity
          {
              [RequiredArgument]
              public InArgument<string> FetchXml { get; set; }
      
              public OutArgument<EntityCollection> EntityCollection { get; set; }
      
              protected override void Execute(CodeActivityContext context)
              {
                  IOrganizationServiceFactory osf = context.GetExtension<IOrganizationServiceFactory>();
                  IOrganizationService service = osf.CreateOrganizationService(Guid.Empty);
      
                  FetchExpression fe = new FetchExpression(FetchXml.Get(context));
                  EntityCollection.Set(context, service.RetrieveMultiple(fe));
              }
          }
      }
      

      Здесь мы просто выполняем RetrieveMultiple на основе FetchXml-запроса и получаем на выходе EntityCollection из Контактов. Обратите внимание, что здесь мы используем для OutArgument тип, который нельзя использовать в визуальном редакторе Бизнес-процессов CRM;

    • Соберите проект – это нужно, чтобы действие RetrieveMultiple появилось в списке в Toolbox’е;


  1. Создание XAML Бизнес-процесса
    • Сначала нам нужно сделать доступными стандартные Workflow-действия поставляемые в MS CRM SDK доступными для использования в VS.того раскройте док Toolbox — щелкните правой кнопкой мыши на группе General — Choose Items. В открывшемся окне на вкладке System.Activities Components щелкните Browse и выберите файл Microsoft.Xrm.Sdk.Workflow.dll. Все стандартные Workflow-действия CRM появятся в списке в Toolbox’е;
    • Дальше нам нужно переносить действия из Toolbox’а в XAML-дизайнер (т.е. в основную область). Для нашего примера нам вначале понадобится действие Workflow. Откройте XAML-файл его и перенесите действие Workflow в центр дизайнера.
      З.Ы. Если у действия, которое Вы поместили в дизайнер, есть красный или желтый восклицательный знак, это значит, что у этого шага есть требования, которые должны быть удовлетворены, или предупреждение. Наведите курсор на этот восклицательный знак, чтобы увидеть подсказку, которая Вам скажет, что от Вас требуется;
    • Теперь нам нужно задать переменные, которые могут хранить значения или ссылки на объекты, используемые в Бизнес-процессе. Для этого в левом нижнем углу дизайнера щелкните по Variables – внизу раскроется проектировщик переменных. В дизайнере выберите действие Workflow, а затем в проектировщике переменных щёлкните Create Variable и введите три переменные:
      • primaryEntity с типом EntityReference;
      • contactsToDeactivate с типом EntityCollection;
      • fetchXML с типом String.

      З.Ы. Если нужного типа нет в списке типов переменных, то щелкните Browse for Types – в открывшемся окне будут представлены типы переменных из DLL’ок.
      З.Ы.2 Дефолтное значение это либо буквальное значение или Visual Basic .NET выражение (например, DateTime.Now), которое будет преобразовано в соответствующие значение во время выполнения. Строковые значения должны быть заключены в двойные кавычки;

    • Внутрь Workflow поместите действие GerPrimaryEntity. Задайте для него следующие параметры:
      • PrimaryEntityReference: primaryEntity
    • После GetPrimaryEntity разместите действие RetrieveMultiple, которое мы ранее создали в .cs классе (чтобы оно появилось в тулбаре оно должно быть скомпилировано). Задайте для него следующие параметры:
      • EntityCollection: contactsToDeactivate
      • FetchXML:
        "<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>" &
        " <entity name='contact'>" &
        " <attribute name='fullname'/> " &
        " <attribute name='telephone1'/> " &
        " <attribute name='contactid'/>" &
        " <order attribute='fullname' descending='false'/>" &
        " <filter type='and'>" &
        " <condition attribute='parentcustomerid' operator='eq' value='{" + primaryEntity.Id.ToString() + "}'/>" &
        " </filter>" &
        " </entity>" &
        "</fetch>"
        

        Данный FetchXml отбирает дочерние Контактам по отношению к записи Организации, для которой выполняется Бизнес-процесс. Обратите внимание на то, что значение родительской записи Организации динамичное и получаем мы его из действия GerPrimaryEntity.

    • После RetrieveMultiple добавьте действие ForEach, которое будет циклично обрабатывать все Контакты, полученные на предыдущем шаге. Задайте для него следующие параметры:
      • TypeArgument: Microsoft.Xrm.Sdk.Entity
      • Values: contactsToDeactivate.Entities
      • В самом дизайнере в блоке рядом с надписью Foreach напишите «contact».
    • Внутрь действия ForEach поместите действие SetState. Ну, оно понятно деактивирует возвращенные Контакты. Сконфигурируйте его следующим образом:
      • Entity: contact;
      • EntityId: contact.Id
      • EntityName: contact.LogicalName
      • State: New OptionSetValue(1)
      • Status: New OptionSetValue(-1)
    • Скомпилируйте проект.




  1. Развертывание:
    • Зарегистрируйте сборку проекта в CRM. Задайте для XAML действия имя и имя группы. А вот для действия RetrieveMultiple в имени и имени группы оставьте пустые значения — это нужно для того, чтобы оно не отображалось в списке доступных шагов Бизнес-процесса;
    • Теперь можете идти в CRM и рисовать Бизнес-процесс с использование кастомного шага



Примечания:

  • Недостаток XAML Бизнес-процессов заключается в том, что они не могут быть созданы/обновлены через редактор Бизнес-процессов CRM. Вы можете только менять их статус (активнй/неактивный);
  • Преимуществом же XAML Workflow является то, что Вы больше не ограничены типами данных используемыми в In/OutArguments.
Комментарии (0)

*

code