Press "Enter" to skip to content

K2 SharePoint Event Process – отслеживание изменения 1 поля в списке SharePoint

0
Очень часто нам необходимо запускать процесс только в том случае, когда в списке или библиотеке SharePoint изменяется не весь элемент, а только лишь 1 поле. Сегодня я постараюсь рассказать, как можно этого достичь с помощью К2 и небольшого кусочка кода.

Предположим у нас есть список в SharePoint со следующими полями:



И нам необходимо предпринимать какие-то действия только лишь при изменении поля Column1. Для этого сделаем следующие действия:
1. Создадим пустой процесс и добавим ассоциацию с SharePoint Event Process. В мастере выберем событие Item Updated:


После этого в процессе у нас появится XML поля со следующей структурой:

C помощью этих данных мы получим значение поля Column1 до обновления элемента списка SharePoint и после. Сравнив оба значения, мы сможем понять, изменилось ли поле или нет.

2. Добавим в процесс следующие поля данных – Column1Before и Column2After:

3. Добавим в процесс один Activity и в него добавим ServerEvent. Нажмем на ServerEvent правой кнопкой мыши и перейдем к коду данного события.

4. Добавим следующий код:

//Создаю XML документ из полей XML EventDetails
XmlDocument AllFields = new XmlDocument();
AllFields.LoadXml(K2.ProcessInstance.XmlFields[“EventDetails”].Value);


//Т.к. данные внутри разделов Before и After хранятся в формате CDATA, то делаем следующие манипуляции:
XmlCDataSection cdataBefore=
AllFields.DocumentElement.SelectSingleNode(@”/EventDetails/Fields/Before”).ChildNodes[0] as XmlCDataSection;
XmlCDataSection cdataAfter =                AllFields.DocumentElement.SelectSingleNode(@”/EventDetails/Fields/After”).ChildNodes[0] as XmlCDataSection;

//Создаем еще XML документы из контента полей After и Before:
XmlDocument docBefore = new XmlDocument();
docBefore.LoadXml(“<Before>”+cdataBefore.InnerText+”</Before>”);
XmlDocument docAfter = new XmlDocument();
docAfter.LoadXml(“<After>” + cdataAfter.InnerText + “</After>”);

//Передаем значения поля Column1 в поля процесса:
K2.ProcessInstance.DataFields[“Column1Before”].Value =                docBefore.DocumentElement.SelectSingleNode(@”/Before/Column1″).InnerText;


K2.ProcessInstance.DataFields[“Column1After”].Value =
docAfter.DocumentElement.SelectSingleNode(@”/After/Column1″).InnerText;


5. Публикуем процесс и проверяем:



Получив значение поля до изменения и после, вы можете их сравнивать и предпринимать соответствующие действия.

Спасибо за внимание!

Leave a Reply

Your email address will not be published. Required fields are marked *

thirteen + 20 =