29.10.2009, 11:42 | #21 |
Участник
|
Компилятор проглотил
Так...теперь что я имею: в свойствах стэпа у меня есть лукап на какую либо запись из сущности new_web. Но я так понял тогда я буду получать значения полей из конкретной записи, а не из той на изменение которой среагирует бизнес-процесс? Последний раз редактировалось Tarasov E; 29.10.2009 в 11:44. |
|
29.10.2009, 11:47 | #22 |
Чайный пьяница
|
Зависит от того каким образом Вы будете данное поле лукапа заполнять...
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
29.10.2009, 11:56 | #23 |
Участник
|
Тоесть? При изменении значения поля какой либо записи из сущности new_web у меня запускается бизнес процесс. Как нужно заполнить поле лукапа, чтобы в экшэне я получал значения полей именно записи на которую сработал бизнес-процесс?
|
|
29.10.2009, 12:13 | #24 |
Чайный пьяница
|
Цитата:
Код: IContextService contextService = (IContextService)executionContext.GetService(typeof(IContextService)); IWorkflowContext workflowContext = contextService.Context; Guid _entityid = workflowContext.PrimaryEntityId; string _entitytype = workflowContext.PrimaryEntityName;
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
29.10.2009, 12:54 | #25 |
Участник
|
Эх...Ну может в будущем пригодится
Цитата:
Сообщение от a33ik
Запись, инициировавшую бизнес процесс можно получить из контекста плагина. При помощи такого кода можно получить тип и идентификатор записи, которая вызвала запуск Workflow:
Код: IContextService contextService = (IContextService)executionContext.GetService(typeof(IContextService)); IWorkflowContext workflowContext = contextService.Context; Guid _entityid = workflowContext.PrimaryEntityId; string _entitytype = workflowContext.PrimaryEntityName; Код: IMetadataService metadataService = workflowContext.CreateMetadataService(); RetrieveEntityRequest req = new RetrieveEntityRequest(); req.LogicalName = "new_web"; RetrieveEntityResponse resp = (RetrieveEntityResponse)metadataService.Execute(req); string myString = resp.EntityMetadata.PrimaryField; Я так понял данный код дает доступ ко всем полям записи new_web, но как получить значение конкретного поля? |
|
29.10.2009, 13:12 | #26 |
Чайный пьяница
|
Цитата:
Сообщение от Tarasov E
Эх...Ну может в будущем пригодится
А если использовать такой метод, то каким образом выцепляются значения полей скажем сущности new_web. В SDK откопал следующее: Код: IMetadataService metadataService = workflowContext.CreateMetadataService(); RetrieveEntityRequest req = new RetrieveEntityRequest(); req.LogicalName = "new_web"; RetrieveEntityResponse resp = (RetrieveEntityResponse)metadataService.Execute(req); string myString = resp.EntityMetadata.PrimaryField; Я так понял данный код дает доступ ко всем полям записи new_web, но как получить значение конкретного поля? Всё на самом деле проще...
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
29.10.2009, 14:20 | #27 |
Участник
|
Цитата:
Сообщение от a33ik
Метадата сервис Вам не за чем. Вам неоходимо RetrieveRequest использовать, а в качестве таргета использовать TargetRetrieveDynamic.
Всё на самом деле проще... Код: //получение контекста IContextService contextService = (IContextService)executionContext.GetService(typeof(IContextService)); IWorkflowContext workflowContext = contextService.Context; //Без этой строки не работало RetrieveResponse)service.Execute(retrieve); ICrmService service = contextService.Context.CreateCrmService(false); //Получаем идентификатор записи, породившей запуск бизнес-процесса Guid _entityid = workflowContext.PrimaryEntityId; string _entitytype = workflowContext.PrimaryEntityName; //указываем, какие атрибуты надо получить из CRM ColumnSet cols = new ColumnSet(); cols.AddColumns(new string[] {"new_url"}); //Указываем ID записи, у которой надо получить атрибуты TargetRetrieveDynamic targetRetrieve = new TargetRetrieveDynamic(); targetRetrieve.EntityId = _entityid; //устанавливаем свойства метода RetrieveResponse RetrieveRequest retrieve = new RetrieveRequest(); retrieve.Target = targetRetrieve;//из какой записи берем retrieve.ColumnSet = cols;//что берем retrieve.ReturnDynamicEntities = true;//о_О RetrieveResponse retrieved = (RetrieveResponse)service.Execute(retrieve); 1. Не уверен в этой строке:ICrmService service = contextService.Context.CreateCrmService(false);. Точнее говоря не совсем понял зачем она, но без нее не работало (RetrieveResponse)service.Execute(retrieve); 2. Как я понял значение поля "new_url" будет хранить переменная retrieved? Или я еще ничего не получил? 3. Можно ли писать так cols.AddColumns(new string[] {"new_url", "new_comment"}); для передачи сразу всех атрибутов, и если да, то как потом поотдельности их выдирать? |
|
29.10.2009, 14:38 | #28 |
Чайный пьяница
|
Пара корректив:
Код: ColumnSet cols = new ColumnSet(); cols.AddColumns(new string[] {"new_url"}); Код: ColumnSet cols = new AllColumns(); Код: TargetRetrieveDynamic targetRetrieve = new TargetRetrieveDynamic(); targetRetrieve.EntityId = _entityid; Код: targetRetrieve.EntityName = _entitytype;
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
29.10.2009, 14:50 | #29 |
Участник
|
Цитата:
Цитата:
Error 1 Cannot implicitly convert type 'Microsoft.Crm.Sdk.Query.AllColumns' to 'Microsoft.Crm.Sdk.Query.ColumnSet'
А в случае с AllColumns() - на выходе должен массив значений колонок? или в каком виде мы их получим? |
|
29.10.2009, 15:01 | #30 |
Чайный пьяница
|
Приношу свои извинения. Лопухнулся. Для получения всего перечня колонок строку
Код: retrieve.ColumnSet = cols;//что берем Код: retrieve.ColumnSet = new AllColumns();//что берем Цитата:
На выходе после выполнения вызова вебсервиса вы получите DynamicEntity по записи, которую запросили и в пропертях будут лежать все запрошенные свойства записи (в случае AllColumns - просто все заполненные) - есть такой ньюанс, что даже если поле было запрошено, а в базе оно пустое - null, в коллеции свойств этого свойства не будет.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit Последний раз редактировалось a33ik; 29.10.2009 в 15:05. |
|
29.10.2009, 15:13 | #31 |
Участник
|
Я имел ввиду следующее: Имея вышеуказанный код и желание передать на вход какой либо процедуры "X" значение некоторых полей (new_url, new_comment, new_startparse, new_enparse), что нужно передавать как входные параметры для процедуры "X"?
|
|
29.10.2009, 15:31 | #32 |
Чайный пьяница
|
Цитата:
Код: DynamicEntity retrievedEntity = (DynamicEntity)retrieved.BusinessEntity; Код: string url = retrievedEntity.Properties.Containes("new_url") ? (string)retrievedEntity["new_url"] : string.Empty;
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
|
За это сообщение автора поблагодарили: Tarasov E (1). |
29.10.2009, 15:45 | #33 |
Чайный пьяница
|
Будьте внимательны. Сравните мой код:
Код: DynamicEntity retrievedEntity = (DynamicEntity)retrieved.BusinessEntity; string url = retrievedEntity.Properties.Containes("new_url") ? (string)retrievedEntity["new_url"] : string.Empty; Код: RetrieveResponse retrieved = (RetrieveResponse)service.Execute(retrieve); DynamicEntity entity = (DynamicEntity)retrieved.BusinessEntity; string url = retrieved.Properties.Containes("new_url") ? (string)retrieved["new_url"] : string.Empty;
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
29.10.2009, 15:47 | #34 |
Участник
|
Извините, разобрался и удалил сообщение одновременно с тем как Вы писали ответ...
Вставил как раз таки из вашего кода Код: string url = retrievedEntity.Properties.Containes("new_url") ? (string)retrievedEntity["new_url"] : string.Empty; Код: string url = retrievedEntity.Properties.Contains("new_url") ? (string)retrievedEntity["new_url"] : string.Empty; Последний раз редактировалось Tarasov E; 29.10.2009 в 15:51. |
|
02.11.2009, 09:22 | #35 |
Участник
|
Доброе утро! Стал проверять передались ли параметры из CRM. Добавил код создания файла, и чтобы туда загонялся переданный параметр:
Код: namespace BP_CRMScaner { [CrmWorkflowActivity("Выполнить сканирование1", "Сканирование WEB-ресурсов")] public class Activity1 : SequenceActivity { protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext) { //получение контекста IContextService contextService = (IContextService)executionContext.GetService(typeof(IContextService)); IWorkflowContext workflowContext = contextService.Context; //Зачем нужна эта строка? ICrmService service = contextService.Context.CreateCrmService(false); //Получаем идентификатор записи, породившей запуск бизнес-процесса Guid _entityid = workflowContext.PrimaryEntityId; string _entitytype = workflowContext.PrimaryEntityName; //указываем, какие атрибуты надо получить из CRM //ColumnSet cols = new ColumnSet(); //cols.AddColumns(new string[] {"new_url"}); //Указываем ID записи, у которой надо получить атрибуты TargetRetrieveDynamic targetRetrieve = new TargetRetrieveDynamic(); targetRetrieve.EntityName = _entitytype; targetRetrieve.EntityId = _entityid; //устанавливаем свойства метода RetrieveResponse 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; StreamWriter Sw = new StreamWriter("\\\\Uch5\\SHARE\\1.txt"); Sw.WriteLine(url); Sw.Close(); //Здесь выполняется пользовательская логика return base.Execute(executionContext); } Последний раз редактировалось Tarasov E; 02.11.2009 в 10:04. |
|
02.11.2009, 10:36 | #36 |
Чайный пьяница
|
Цитата:
Сообщение от Tarasov E
Доброе утро! Стал проверять передались ли параметры из CRM. Добавил код создания файла, и чтобы туда загонялся переданный параметр:
Код: namespace BP_CRMScaner { [CrmWorkflowActivity("Выполнить сканирование1", "Сканирование WEB-ресурсов")] public class Activity1 : SequenceActivity { protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext) { //получение контекста IContextService contextService = (IContextService)executionContext.GetService(typeof(IContextService)); IWorkflowContext workflowContext = contextService.Context; //Зачем нужна эта строка? ICrmService service = contextService.Context.CreateCrmService(false); //Получаем идентификатор записи, породившей запуск бизнес-процесса Guid _entityid = workflowContext.PrimaryEntityId; string _entitytype = workflowContext.PrimaryEntityName; //указываем, какие атрибуты надо получить из CRM //ColumnSet cols = new ColumnSet(); //cols.AddColumns(new string[] {"new_url"}); //Указываем ID записи, у которой надо получить атрибуты TargetRetrieveDynamic targetRetrieve = new TargetRetrieveDynamic(); targetRetrieve.EntityName = _entitytype; targetRetrieve.EntityId = _entityid; //устанавливаем свойства метода RetrieveResponse 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; StreamWriter Sw = new StreamWriter("\\\\Uch5\\SHARE\\1.txt"); Sw.WriteLine(url); Sw.Close(); //Здесь выполняется пользовательская логика return base.Execute(executionContext); }
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
03.11.2009, 10:31 | #37 |
Участник
|
|
|
03.11.2009, 10:36 | #38 |
Чайный пьяница
|
А шаг Workflow удачно выполнился?
Попробуйте создавать файл на сервере для начала.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
03.11.2009, 10:58 | #39 |
Участник
|
|
|
03.11.2009, 11:33 | #40 |
Чайный пьяница
|
Врядли. С точки зрения работы с файловой системы - все работы выполняются в контексте учётной записи под которой запущен асинхронный сервис CRM.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|