07.12.2009, 11:43 | #1 |
Участник
|
Отправка уведомления пользователю о результате работы бизнес-процесса
Собственно вот какая задача:
Есть бизнес-процесс, который, грубо говоря, выполняет поиск по заданному фильтру в определенном интернет-контенте(для каждой записи сущности свой контент). Если этот поиск успешен, то какому-либо ответственному лицу нужно отослать сообщение об этом, со ссылкой на запись, для которой выполнялся поиск по фильтру. Каким образом это лучше всего реализовать в рамках CRM? |
|
07.12.2009, 12:15 | #2 |
Чайный пьяница
|
Цитата:
Сообщение от Tarasov E
Собственно вот какая задача:
Есть бизнес-процесс, который, грубо говоря, выполняет поиск по заданному фильтру в определенном интернет-контенте(для каждой записи сущности свой контент). Если этот поиск успешен, то какому-либо ответственному лицу нужно отослать сообщение об этом, со ссылкой на запись, для которой выполнялся поиск по фильтру. Каким образом это лучше всего реализовать в рамках CRM?
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
|
За это сообщение автора поблагодарили: Tarasov E (1). |
24.12.2009, 11:17 | #3 |
Участник
|
Все сделал как в в вашем примере, создалось письмо, но URL в письме не было.
Код: [CrmWorkflowActivity("Сканировать", "Сканирование WEB-ресурсов")] public class Activity1 : SequenceActivity { protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext) { IContextService contextService = (IContextService)executionContext.GetService(typeof(IContextService)); IWorkflowContext workflowContext = contextService.Context; ICrmService service = workflowContext.CreateCrmService(); Guid _entityid = workflowContext.PrimaryEntityId; string _entitytype = workflowContext.PrimaryEntityName; TargetRetrieveDynamic targetRetrieve = new TargetRetrieveDynamic(); targetRetrieve.EntityName = _entitytype; targetRetrieve.EntityId = _entityid; RetrieveRequest retrieve = new RetrieveRequest(); retrieve.Target = targetRetrieve;//из какой записи берем retrieve.ColumnSet = new AllColumns();//что берем retrieve.ReturnDynamicEntities = true;//о_О RetrieveResponse retrieved = (RetrieveResponse)service.Execute(retrieve); DynamicEntity retrievedEntity = (DynamicEntity)retrieved.BusinessEntity; string url = retrievedEntity.Properties.Contains("new_url") ? (string)retrievedEntity["new_url"] : string.Empty.Normalize(); string startParse = retrievedEntity.Properties.Contains("new_startparse") ? (string)retrievedEntity["new_startparse"] : string.Empty.Normalize(); string endParse = retrievedEntity.Properties.Contains("new_endparse") ? (string)retrievedEntity["new_endparse"] : string.Empty.Normalize(); string folder = retrievedEntity.Properties.Contains("new_history") ? (string)retrievedEntity["new_history"] : string.Empty; string filtr = retrievedEntity.Properties.Contains("new_filtr") ? (string)retrievedEntity["new_filtr"] : string.Empty; string Code = CreateCode(startParse.Normalize(), endParse.Normalize(), ConnectToSite(url)); String[] filt_strs = filtr.Split(' '); bool flag = false; foreach(var str in filt_strs) { flag = Code.Contains(str); if (flag) break; } if (flag) { //I need organization name for Url Creation organization org = (organization)service.Retrieve(EntityName.organization.ToString(), workflowContext.OrganizationId, new ColumnSet(new string[] { "name" })); string orgname = org.name; url = string.Format("{0}{1}/CRMReports/viewer/drillopen.aspx?ID={2}&LogicalName={3}", new object[] { //I retrieve url of crm server with MSCRMServices part and clear it ((string)(Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\MSCRM").GetValue("ServerUrl"))).Replace("MSCRMServices", ""), orgname, _entityid, _entitytype}); return ActivityExecutionStatus.Closed; } Save(Code, folder); //Здесь выполняется пользовательская логика return base.Execute(executionContext); } //Задание свойства вывода public static DependencyProperty urlProperty = DependencyProperty.Register("url", typeof(string), typeof(Activity1)); [CrmOutput("url")] public string url { get { return (string)base.GetValue(urlProperty); } set { base.SetValue(urlProperty, value); } } |
|
24.12.2009, 11:27 | #4 |
Чайный пьяница
|
Цитата:
Сообщение от Tarasov E
Все сделал как в в вашем примере, создалось письмо, но URL в письме не было.
Код: [CrmWorkflowActivity("Сканировать", "Сканирование WEB-ресурсов")] public class Activity1 : SequenceActivity { protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext) { IContextService contextService = (IContextService)executionContext.GetService(typeof(IContextService)); IWorkflowContext workflowContext = contextService.Context; ICrmService service = workflowContext.CreateCrmService(); Guid _entityid = workflowContext.PrimaryEntityId; string _entitytype = workflowContext.PrimaryEntityName; TargetRetrieveDynamic targetRetrieve = new TargetRetrieveDynamic(); targetRetrieve.EntityName = _entitytype; targetRetrieve.EntityId = _entityid; RetrieveRequest retrieve = new RetrieveRequest(); retrieve.Target = targetRetrieve;//из какой записи берем retrieve.ColumnSet = new AllColumns();//что берем retrieve.ReturnDynamicEntities = true;//о_О RetrieveResponse retrieved = (RetrieveResponse)service.Execute(retrieve); DynamicEntity retrievedEntity = (DynamicEntity)retrieved.BusinessEntity; string url = retrievedEntity.Properties.Contains("new_url") ? (string)retrievedEntity["new_url"] : string.Empty.Normalize(); string startParse = retrievedEntity.Properties.Contains("new_startparse") ? (string)retrievedEntity["new_startparse"] : string.Empty.Normalize(); string endParse = retrievedEntity.Properties.Contains("new_endparse") ? (string)retrievedEntity["new_endparse"] : string.Empty.Normalize(); string folder = retrievedEntity.Properties.Contains("new_history") ? (string)retrievedEntity["new_history"] : string.Empty; string filtr = retrievedEntity.Properties.Contains("new_filtr") ? (string)retrievedEntity["new_filtr"] : string.Empty; string Code = CreateCode(startParse.Normalize(), endParse.Normalize(), ConnectToSite(url)); String[] filt_strs = filtr.Split(' '); bool flag = false; foreach(var str in filt_strs) { flag = Code.Contains(str); if (flag) break; } if (flag) { //I need organization name for Url Creation organization org = (organization)service.Retrieve(EntityName.organization.ToString(), workflowContext.OrganizationId, new ColumnSet(new string[] { "name" })); string orgname = org.name; url = string.Format("{0}{1}/CRMReports/viewer/drillopen.aspx?ID={2}&LogicalName={3}", new object[] { //I retrieve url of crm server with MSCRMServices part and clear it ((string)(Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\MSCRM").GetValue("ServerUrl"))).Replace("MSCRMServices", ""), orgname, _entityid, _entitytype}); return ActivityExecutionStatus.Closed; } Save(Code, folder); //Здесь выполняется пользовательская логика return base.Execute(executionContext); } //Задание свойства вывода public static DependencyProperty urlProperty = DependencyProperty.Register("url", typeof(string), typeof(Activity1)); [CrmOutput("url")] public string url { get { return (string)base.GetValue(urlProperty); } set { base.SetValue(urlProperty, value); } }
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
24.12.2009, 11:37 | #5 |
Участник
|
Вот и он:
|
|
24.12.2009, 14:38 | #6 |
Чайный пьяница
|
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
28.12.2009, 09:32 | #7 |
Участник
|
|
|
28.12.2009, 10:32 | #8 |
Чайный пьяница
|
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
28.12.2009, 10:44 | #9 |
Участник
|
Собственно вот. Код шага "Сканировать" я почти полностью прикреплял выше. Именно у из него как свойство вывода должна браться ссылка на запись.
|
|
28.12.2009, 10:52 | #10 |
Чайный пьяница
|
Всмотрелся внимательно в Ваш код и увидел там такие строки:
public static DependencyProperty urlProperty = DependencyProperty.Register("url", typeof(string), typeof(Activity1)); [CrmOutput("url")] public string url { get { return (string)base.GetValue(urlProperty); } set { base.SetValue(urlProperty, value); } } ... string url = retrievedEntity.Properties.Contains("new_url") ? (string)retrievedEntity["new_url"] : string.Empty.Normalize(); ... url = string.Format("{0}{1}/CRMReports/viewer/drillopen.aspx?ID={2}&LogicalName={3}", new object[] { //I retrieve url of crm server with MSCRMServices part and clear it ((string)(Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\MSCRM").GetValue("ServerUrl"))).Replace("MSCRMServices", ""), orgname, _entityid, _entitytype}); Получается, что есть накладка - статическое свойство класса и локальная переменная. Попробуйте локальную переменную переименовать. Вероятно, что последняя приведённая строка модифицирует не свойство, а локальную переменную.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
|
За это сообщение автора поблагодарили: Tarasov E (1). |
28.12.2009, 11:05 | #11 |
Участник
|
Действительно, проблема крылась в этом! Спасибо огромное)
|
|
|
|