AXForum  
Вернуться   AXForum > Microsoft Dynamics CRM > Dynamics CRM: Разработка
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 26.10.2009, 09:10   #1  
Tarasov E is offline
Tarasov E
Участник
Аватар для Tarasov E
 
100 / 11 (1) +
Регистрация: 01.09.2009
Бизнес-процесс: применение определенного алгоритма к каждой записи CRMGrid
Доброе утро! Нужно создать бизнес-процесс, который бы пробегал по всем записям данной сущности и если у записи определенный атрибут установлен в Активен, то получить из этой записи определенные атрибуты, как параметры и выполнить заданный алгоритм. Начал писать правило для бизнес-процесса, для этого воспользовался примером из книги Майка Снайдера:
Код:
using System;
using System.Workflow.ComponentModel;
using System.Workflow.Activities;
using Microsoft.Crm.Workflow;

namespace BP_CRMScaner
{
    [CrmWorkflowActivity("Выполнить сканирование", "Сканирование WEB-ресурсов")]
    public partial class Activity1 : SequenceActivity
    {
        protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)
        {
            //получение контекста
            IContextService contextService = (IContextService)executionContext.GetService(typeof(IContextService));
            IWorkflowContext ctx = contextService.Context;
            //Здесь выполняется пользовательская логика

            //Доступ к свойствам ввода и вывода осуществляется следующим образом
            this.InputExample = "foo";
            this.OutputExample = this.InputExample + "bar";

            return base.Execute(executionContext);
        }
        //Задание свойств ввода
        public static DependencyProperty InputExampleProperty = DependencyProperty.Register("InputExample", typeof(string), typeof(Activity1));
        [CrmInput("InputExample")]
        public string InputExample
        {
            get
            {
                return (string)base.GetValue(InputExampleProperty);
            }
            set
            {
                base.SetValue(InputExampleProperty, value);
            }
        }
        //Задание свойства вывода
        public static DependencyProperty OutputExampleProperty = DependencyProperty.Register("OutputExample", typeof(string), typeof(Activity1));
        [CrmOutput("OutputExample")]
        public string OutputExample
        {
            get
            {
                return (string)base.GetValue(OutputExampleProperty);
            }
            set
            {
                base.SetValue(OutputExampleProperty, value);
            }
        }
    }
}
Не знаю как сделать так, чтобы процесс пробегался по каждой записи и из нее получал значения определенных атрибутов. Ранее извлекал параметры с помощью SOAP запроса по GUID и передавал их asp странице. Как мне быть в случае с workflow activity?

Последний раз редактировалось Tarasov E; 26.10.2009 в 09:31.
Старый 26.10.2009, 09:39   #2  
Артем Enot Грунин is offline
Артем Enot Грунин
Moderator
Аватар для Артем Enot Грунин
MCBMSS
Злыдни
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,912 / 623 (28) +++++++
Регистрация: 16.08.2007
Адрес: Пермь!
Записей в блоге: 151
Опишите задачу на конкретном примере, пожалуйста. Мне кажется что вы не верно понимаете суть бизнес процессов. БП используются для обработки различных событий, а не для обработки базы.
Чтобы вычитать запись по определенными критериями нужно использовать метод CrmService.RetrieveMultiple, а не перебирать все записи.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия.

MS Certified Dirty Magic Professional
Старый 26.10.2009, 09:52   #3  
Tarasov E is offline
Tarasov E
Участник
Аватар для Tarasov E
 
100 / 11 (1) +
Регистрация: 01.09.2009
Описываю более подробно: Есть сущность new_web с множеством записей. У каждой записи есть набор атрибутов: периодичность сканирования, стутус(активно, отключено) и атрибуты-парметры, которые необходимо передать на выполнение в определенный алгоритм. Так вот, нужен бизнес-процесс, который раз в "Периодичность" обращается к записи(у каждой записи периодичность своя, хотя на начальном этапе можно попробовать задать общую периодичность в самом БП), получает атрибуты-параметры и выполняет определенный алгоритм, результатом которого будет создание некоторых файлов на диске.
Ниже прикрепляю скрин: при запуске бизнес процесса, если состояние "Активно", из записи (я полагаю по GUID) мы получаем определенные атрибуты и выполняем алгоритм.
Миниатюры
Нажмите на изображение для увеличения
Название: AXforum9.JPG
Просмотров: 284
Размер:	37.4 Кб
ID:	5285  
Старый 26.10.2009, 10:07   #4  
Артем Enot Грунин is offline
Артем Enot Грунин
Moderator
Аватар для Артем Enot Грунин
MCBMSS
Злыдни
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,912 / 623 (28) +++++++
Регистрация: 16.08.2007
Адрес: Пермь!
Записей в блоге: 151
БП не умеет стартовать по расписанию. Проще написать windows службу, которая будет выполнять все описанные выше операции.

p.s. Очень и очень странная задача для CRM системы! В чем суть сканирования, если не секрет?
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия.

MS Certified Dirty Magic Professional
Старый 26.10.2009, 10:23   #5  
Tarasov E is offline
Tarasov E
Участник
Аватар для Tarasov E
 
100 / 11 (1) +
Регистрация: 01.09.2009
Суть в том, чтобы просканировав заданные сайты - получать только интересующую информацию с их вэб-ресурсов. Допустим только новости, а весь остальной мусор отбрасывать.
А если немного схитрить: сделать 2 поля: дата сканирования и периодичность. за 24 часа до наступления "Дата сканирования" выполнить бизнес-процесс и прибавить к "Дата сканирования" периодичность. Как то так? И кстати да, неверно понял, мне на самом деле не нужно пробегать по всем записям из CRMGrid'а, ведь бизнес-процесс будет реагировать на "Дату сканирования" каждой записи в отдельности".

Последний раз редактировалось Tarasov E; 26.10.2009 в 11:01.
Старый 27.10.2009, 09:05   #6  
slivka_83 is offline
slivka_83
Консультант-джедай
Аватар для slivka_83
MCBMSS
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
1,683 / 374 (16) ++++++
Регистрация: 18.12.2008
Адрес: default city
Цитата:
Сообщение от Tarasov E Посмотреть сообщение
Суть в том, чтобы просканировав заданные сайты - получать только интересующую информацию с их вэб-ресурсов. Допустим только новости, а весь остальной мусор отбрасывать.
А если немного схитрить: сделать 2 поля: дата сканирования и периодичность. за 24 часа до наступления "Дата сканирования" выполнить бизнес-процесс и прибавить к "Дата сканирования" периодичность. Как то так? И кстати да, неверно понял, мне на самом деле не нужно пробегать по всем записям из CRMGrid'а, ведь бизнес-процесс будет реагировать на "Дату сканирования" каждой записи в отдельности".
http://mmcrm.ru/?p=596
http://mmcrm.ru/?p=385
__________________
Крокодил, крокожу и буду крокодить.
Человек человеку - волк , а зомби зомби - зомби.
Экстремал и буду экстремать!
Блога
За это сообщение автора поблагодарили: Tarasov E (1).
Старый 27.10.2009, 11:53   #7  
Tarasov E is offline
Tarasov E
Участник
Аватар для Tarasov E
 
100 / 11 (1) +
Регистрация: 01.09.2009
Цитата:
Сообщение от AndreyS Посмотреть сообщение
Я поддерживаю Артема с его предложением написать Windows службу.
Цитата:
Сообщение от slivka_83 Посмотреть сообщение
Появился вопрос по первому способу:
Можно ли при обновление - параметр обновления брать из другого поля, чтобы для каждой записи была своя периодичность выполнения бизнес процесса?
Например как-нибудь так: {час.:new_period.DataValue После ...и т.д}
То что мне нужно более понятно обрисовано на скрине
Миниатюры
Нажмите на изображение для увеличения
Название: AXforum10.JPG
Просмотров: 466
Размер:	58.2 Кб
ID:	5294  
Старый 26.10.2009, 11:46   #8  
Артем Enot Грунин is offline
Артем Enot Грунин
Moderator
Аватар для Артем Enot Грунин
MCBMSS
Злыдни
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,912 / 623 (28) +++++++
Регистрация: 16.08.2007
Адрес: Пермь!
Записей в блоге: 151
Ну, реализация задач с повторением уже не раз обсуждалась, попробуйте поискать эти топики. Скажу сразу - нужно долго извращаться. В CRM 5.0 они заявлены как стандартный функционал.
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия.

MS Certified Dirty Magic Professional
Старый 26.10.2009, 15:51   #9  
AndreyS is offline
AndreyS
Moderator
Сотрудники Microsoft Dynamics
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
283 / 61 (3) ++++
Регистрация: 18.05.2006
Я поддерживаю Артема с его предложением написать Windows службу.
Старый 27.10.2009, 09:59   #10  
Tarasov E is offline
Tarasov E
Участник
Аватар для Tarasov E
 
100 / 11 (1) +
Регистрация: 01.09.2009
Цитата:
Сообщение от AndreyS Посмотреть сообщение
Я поддерживаю Артема с его предложением написать Windows службу.
Ну тут уже не от меня зависит, мне была поставлена задача реализовать все в рамках CRM...
Старый 27.10.2009, 12:17   #11  
Артем Enot Грунин is offline
Артем Enot Грунин
Moderator
Аватар для Артем Enot Грунин
MCBMSS
Злыдни
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,912 / 623 (28) +++++++
Регистрация: 16.08.2007
Адрес: Пермь!
Записей в блоге: 151
Можно: нужно писать кастомный степ для плагина, который прибавит к дате произвольное число дней и запишет в нужную ячейку.
Еще раз повторяю: вы пытаетесь использовать workflow не по назначению! Ожидание и повторение - не его конек! Требуют хранить расписание в CRM - ради бога, храните. Но заведите стандартный сервис, который будет читать из CRM данные по расписанию, выполнять сканирование и заливать данные обратно. Кучу времени себе сэкономите!
__________________
http://fixrm.wordpress.com, снятие/наведение порчи. Быстро, дорого, гарантия.

MS Certified Dirty Magic Professional
За это сообщение автора поблагодарили: Tarasov E (1).
Старый 27.10.2009, 13:19   #12  
Tarasov E is offline
Tarasov E
Участник
Аватар для Tarasov E
 
100 / 11 (1) +
Регистрация: 01.09.2009
Хорошо, про кастомный стэп понятно...вернемся все же к первой части вопроса: как в workflow activity получить данные из полей формы, для их обработки?
Старый 27.10.2009, 13:27   #13  
a33ik is offline
a33ik
Чайный пьяница
Аватар для a33ik
MCP
MCBMSS
Злыдни
Соотечественники
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,243 / 896 (36) +++++++
Регистрация: 02.07.2008
Адрес: Greenville, SC
Цитата:
Сообщение от Tarasov E Посмотреть сообщение
Хорошо, про кастомный стэп понятно...вернемся все же к первой части вопроса: как в workflow activity получить данные из полей формы, для их обработки?
Точно так же - при прмрщи кастомного экшена.
Регистрируете инпут проперти - лукапом на сущность из которой планируете получить данные, в коде степа при помощи Retrieve вычитываете данную сущность, суммируете дату и период, на выход (output property) отдаёте полученную суммированием дату. Собственно всё.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством.

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit
Старый 27.10.2009, 14:19   #14  
Tarasov E is offline
Tarasov E
Участник
Аватар для Tarasov E
 
100 / 11 (1) +
Регистрация: 01.09.2009
Цитата:
Сообщение от a33ik Посмотреть сообщение
Точно так же - при прмрщи кастомного экшена.
Регистрируете инпут проперти - лукапом на сущность из которой планируете получить данные, в коде степа при помощи Retrieve вычитываете данную сущность, суммируете дату и период, на выход (output property) отдаёте полученную суммированием дату. Собственно всё.
Тоесть если я правильно понял то пример из первого сообщения
Код:
public static DependencyProperty InputExampleProperty = DependencyProperty.Register("InputExample", typeof(string), typeof(Activity1));
        [CrmInput("InputExample")]
        public string InputExample
        {
            get
            {
                return (string)base.GetValue(InputExampleProperty);
            }
            set
            {
                base.SetValue(InputExampleProperty, value);
            }
надо переделать так, чтобы тип вводимых параметров был лукап на пользовательскую сущность(new_web в моем случае)?
Далее мы уже с помощью retrieve сможем выдирать атрибуты и обрабатывать как нам угодно?
А что за тип данных должен, чтобы в настройках стэпа указать ссылку на сущность? typeof(Lookup) почему то он не понимает...

Последний раз редактировалось Tarasov E; 27.10.2009 в 14:22.
Старый 27.10.2009, 14:30   #15  
a33ik is offline
a33ik
Чайный пьяница
Аватар для a33ik
MCP
MCBMSS
Злыдни
Соотечественники
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,243 / 896 (36) +++++++
Регистрация: 02.07.2008
Адрес: Greenville, SC
Цитата:
Сообщение от Tarasov E Посмотреть сообщение
Тоесть если я правильно понял то пример из первого сообщения
Код:
public static DependencyProperty InputExampleProperty = DependencyProperty.Register("InputExample", typeof(string), typeof(Activity1));
        [CrmInput("InputExample")]
        public string InputExample
        {
            get
            {
                return (string)base.GetValue(InputExampleProperty);
            }
            set
            {
                base.SetValue(InputExampleProperty, value);
            }
надо переделать так, чтобы тип вводимых параметров был лукап на пользовательскую сущность(new_web в моем случае)?
Далее мы уже с помощью retrieve сможем выдирать атрибуты и обрабатывать как нам угодно?
А что за тип данных должен, чтобы в настройках стэпа указать ссылку на сущность? typeof(Lookup) почему то он не понимает...
Посмотрите это и сделайте по аналогии. Единственное отличие - то что лукап ссылается на тип команда (team).
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством.

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit
За это сообщение автора поблагодарили: Tarasov E (1).
Старый 27.10.2009, 14:31   #16  
Tarasov E is offline
Tarasov E
Участник
Аватар для Tarasov E
 
100 / 11 (1) +
Регистрация: 01.09.2009
Цитата:
You can use the System.Workflow.ComponentModel.PersistOnClose...
Пока ищу вот этого зверя. Я на правильном пути?
Старый 29.10.2009, 11:26   #17  
Tarasov E is offline
Tarasov E
Участник
Аватар для Tarasov E
 
100 / 11 (1) +
Регистрация: 01.09.2009
Спасибо, a33ik, с библиотеками разобрался, сделал как было указано выше:
Код:
namespace BP_CRMScaner
{
    [CrmWorkflowActivity("Выполнить сканирование", "Сканирование WEB-ресурсов")]
    public class Activity1 : SequenceActivity
    {
        protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)
        {
            //получение контекста
            IContextService contextService = (IContextService)executionContext.GetService(typeof(IContextService));
            IWorkflowContext ctx = contextService.Context;
            //Здесь выполняется пользовательская логика

            return base.Execute(executionContext);
        }
        //Задание свойств ввода
        public static DependencyProperty ScanProperty = DependencyProperty.Register("Scaner", typeof(Lookup), typeof(Activity1));
        [CrmInput("Субъект сканирования")]
        [CrmReferenceTarget("new_web")]
        public Lookup Scaner
        {
            get
            {
                return (Lookup)base.GetValue(ScanProperty);
            }
            set
            {
                base.SetValue(ScanProperty, value);
            }
        }
        
    }
}
На что меня обругали так:
Цитата:
Error 1 Could not create activity of type 'BP_CRMScaner.Activity1'. System.ArgumentException: Type 'BP_CRMScaner.Activity1' does not define a static dependency property with name 'ScanerProperty'.
Parameter name: ownerType
at System.Workflow.ComponentModel.DependencyProperty.ValidateAndRegister(String name, Type propertyType, Type ownerType, PropertyMetadata defaultMetadata, Type validatorType, Boolean isRegistered)
at System.Workflow.ComponentModel.DependencyProperty.Register(String name, Type propertyType, Type ownerType)
at BP_CRMScaner.Activity1..cctor()
В чем проблема? Вроде все делал по образцу
Старый 29.10.2009, 11:31   #18  
a33ik is offline
a33ik
Чайный пьяница
Аватар для a33ik
MCP
MCBMSS
Злыдни
Соотечественники
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,243 / 896 (36) +++++++
Регистрация: 02.07.2008
Адрес: Greenville, SC
Цитата:
Сообщение от Tarasov E Посмотреть сообщение
Спасибо, a33ik, с библиотеками разобрался, сделал как было указано выше:
Код:
namespace BP_CRMScaner
{
    [CrmWorkflowActivity("Выполнить сканирование", "Сканирование WEB-ресурсов")]
    public class Activity1 : SequenceActivity
    {
        protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)
        {
            //получение контекста
            IContextService contextService = (IContextService)executionContext.GetService(typeof(IContextService));
            IWorkflowContext ctx = contextService.Context;
            //Здесь выполняется пользовательская логика

            return base.Execute(executionContext);
        }
        //Задание свойств ввода
        public static DependencyProperty ScanProperty = DependencyProperty.Register("Scaner", typeof(Lookup), typeof(Activity1));
        [CrmInput("Субъект сканирования")]
        [CrmReferenceTarget("new_web")]
        public Lookup Scaner
        {
            get
            {
                return (Lookup)base.GetValue(ScanProperty);
            }
            set
            {
                base.SetValue(ScanProperty, value);
            }
        }
        
    }
}
На что меня обругали так:

В чем проблема? Вроде все делал по образцу
Попробуйте такое:

Код:
namespace BP_CRMScaner
{
    [CrmWorkflowActivity("Выполнить сканирование", "Сканирование WEB-ресурсов")]
    public class Activity1 : SequenceActivity
    {
        protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)
        {
            //получение контекста
            IContextService contextService = (IContextService)executionContext.GetService(typeof(IContextService));
            IWorkflowContext ctx = contextService.Context;
            //Здесь выполняется пользовательская логика

            return base.Execute(executionContext);
        }
        //Задание свойств ввода
        public static DependencyProperty ScanerProperty = DependencyProperty.Register("Scaner", typeof(Lookup), typeof(Activity1));
        [CrmInput("Субъект сканирования")]
        [CrmReferenceTarget("new_web")]
        public Lookup Scaner
        {
            get
            {
                return (Lookup)base.GetValue(ScanerProperty);
            }
            set
            {
                base.SetValue(ScanerProperty, value);
            }
        }
        
    }
}
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством.

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit
Старый 29.10.2009, 11:42   #19  
Tarasov E is offline
Tarasov E
Участник
Аватар для Tarasov E
 
100 / 11 (1) +
Регистрация: 01.09.2009
Цитата:
Сообщение от a33ik Посмотреть сообщение
Попробуйте такое:
Компилятор проглотил
Так...теперь что я имею: в свойствах стэпа у меня есть лукап на какую либо запись из сущности new_web. Но я так понял тогда я буду получать значения полей из конкретной записи, а не из той на изменение которой среагирует бизнес-процесс?

Последний раз редактировалось Tarasov E; 29.10.2009 в 11:44.
Старый 29.10.2009, 11:47   #20  
a33ik is offline
a33ik
Чайный пьяница
Аватар для a33ik
MCP
MCBMSS
Злыдни
Соотечественники
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,243 / 896 (36) +++++++
Регистрация: 02.07.2008
Адрес: Greenville, SC
Цитата:
Сообщение от Tarasov E Посмотреть сообщение
Компилятор проглотил
Так...теперь что я имею: в свойствах стэпа у меня есть лукап на какую либо запись из сущности new_web. Но я так понял тогда я буду получать значения полей из конкретной записи, а не из той на изменение которой среагирует бизнес-процесс?
Зависит от того каким образом Вы будете данное поле лукапа заполнять...
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством.

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Бизнес-процесс висит в состоянии ожидания Evgenia_f Dynamics CRM: Функционал 70 21.12.2009 18:53
Странности бизнес-процесса на изменение атрибутов записи SLK Dynamics CRM: Функционал 6 19.05.2009 08:14
Событие "Назначение записи" для бизнес-процесса Lazarus Dynamics CRM: Функционал 1 22.01.2009 19:54
Работает неопубликованный бизнес-процесс sergeyjb Dynamics CRM: Разработка 1 22.12.2008 09:16
Бизнес-процесс и список ожидания Evgenia_f Dynamics CRM: Разработка 16 07.10.2008 16:22

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 01:08.