Разработка
01
Окт
0

Снимки для Бизнес-процессов

Иногда требуется проверять в Бизнес-процессе предыдущее значений, которое было до изменения записи (т.е. до запуска Бизнес-процесса). А через интерфейс можно получить доступ только к текущему значению записи. По-хорошему у Бизнес-процессов нет пре- и пост-снимков, которые являются прерогативами Шагов Плагинов (коих у сборок Бизнес-процессов нет). Но CRM использует внутренние PreEntityImages и PostEntityImages для хранения копии атрибутов записи. Которые можно «незаконным» 🙂 способом задейсвовать в кастомных шага. Напишите кастомный шаг с таким кодом:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Activities;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Workflow;

namespace image
{
    public class image : CodeActivity
    {
        protected override void Execute(CodeActivityContext context)
        {
            // Получаем контект Бизнес-процесса, IOrganizationService и preImage
            IWorkflowContext workflowContext = context.GetExtension<IWorkflowContext>();
            IOrganizationServiceFactory serviceFactory = context.GetExtension<IOrganizationServiceFactory>();
            IOrganizationService service = serviceFactory.CreateOrganizationService(workflowContext.UserId);

            // Создаем примечание и присоединяем его к текущей записи
            Entity note = new Entity("annotation");
            note.Attributes.Add("objectid", new EntityReference(workflowContext.PrimaryEntityName, workflowContext.PrimaryEntityId));
            note.Attributes.Add("objecttypecode", workflowContext.PrimaryEntityName);
            
            StringBuilder sb = new StringBuilder();
            sb.AppendFormat("******************** PreEntityImages\r\n");

            // Просматриваем PreImages
            foreach (string imageName in workflowContext.PreEntityImages.Keys)
            {
                sb.AppendFormat("[{0}]\r\n", imageName);
                Entity image = (Entity)workflowContext.PreEntityImages[imageName];
                foreach (string attributeName in image.Attributes.Keys)
                {
                    sb.AppendFormat("- {0} - {1}\r\n", attributeName, image.Attributes[attributeName].ToString());
                }
            }

            sb.AppendFormat("******************** PostEntityImages\r\n");

            // Просматриваем PostImages
            foreach (string imageName in workflowContext.PostEntityImages.Keys)
            {
                sb.AppendFormat("[{0}]\r\n", imageName);
                Entity image = (Entity)workflowContext.PostEntityImages[imageName];
                
                foreach (string attributeName in image.Attributes.Keys)
                {
                    sb.AppendFormat("- {0} - {1}\r\n", attributeName, image.Attributes[attributeName].ToString());
                }
            }

            note.Attributes.Add("notetext", sb.ToString());
            service.Create(note);
        }
    }
}

Код создает Примечание и присоединяет его к записи, для которой сработал Бизнес-процесс. Текст Примечания содержит список атрибутов и их значений в PreEntityImage и PostEntityImage.

В результат в PreEntityImages содержится два снимка:

  • Первый называется аналогично называнию объекта;
  • Второй называется PreBusinessEntity.

В PostEntityImages также содержится два снимка:

  • Первый называется аналогично называнию объекта;
  • Второй называется PostBusinessEntity

Оба Пре-снимка кажется содержат одинаковые данные, также, как и Пост-снимки.

Примечания:

  • Как и со снимками в плгинах, снимки в Бизнес-процессах содержат значения в наборе Attributes только для тех атрибутов, которые содержат значения в CRM. Например, если адрес электронной почты Организации будет отсутствовать до обновления, то атрибут emailaddress1 будет существовать только в PostEntity Images;
  • Если Бизнес-процесс инициирован операцией создания, только PostEntity Images будет создан коллеския PreEntityImages будет пустой);
  • Если Бизнес-процесс запущен в ручную, то только PreEntity Images будет создан (коллеския PostEntityImages будет пустой).

З.Ы. Использование PreEntity и PostEntity в Бизнес-процессах не поддерживается, со всем вытекающим….



Комментарии (0)

*

code