|
|
#21 |
|
Участник
|
Компилятор проглотил
![]() Так...теперь что я имею: в свойствах стэпа у меня есть лукап на какую либо запись из сущности new_web. Но я так понял тогда я буду получать значения полей из конкретной записи, а не из той на изменение которой среагирует бизнес-процесс? Последний раз редактировалось Tarasov E; 29.10.2009 в 11:44. |
|
|
|
|
#22 |
|
Чайный пьяница
|
Зависит от того каким образом Вы будете данное поле лукапа заполнять...
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
|
|
|
#23 |
|
Участник
|
Тоесть? При изменении значения поля какой либо записи из сущности new_web у меня запускается бизнес процесс. Как нужно заполнить поле лукапа, чтобы в экшэне я получал значения полей именно записи на которую сработал бизнес-процесс?
|
|
|
|
|
#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 |
|
|
|
|
#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, но как получить значение конкретного поля? |
|
|
|
|
#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 |
|
|
|
|
#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"}); для передачи сразу всех атрибутов, и если да, то как потом поотдельности их выдирать? |
|
|
|
|
#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 |
|
Участник
|
Цитата:
Цитата:
Error 1 Cannot implicitly convert type 'Microsoft.Crm.Sdk.Query.AllColumns' to 'Microsoft.Crm.Sdk.Query.ColumnSet'
А в случае с AllColumns() - на выходе должен массив значений колонок? или в каком виде мы их получим? |
|
|
|
|
#30 |
|
Чайный пьяница
|
Приношу свои извинения. Лопухнулся. Для получения всего перечня колонок строку
Код: retrieve.ColumnSet = cols;//что берем Код: retrieve.ColumnSet = new AllColumns();//что берем Цитата:
На выходе после выполнения вызова вебсервиса вы получите DynamicEntity по записи, которую запросили и в пропертях будут лежать все запрошенные свойства записи (в случае AllColumns - просто все заполненные) - есть такой ньюанс, что даже если поле было запрошено, а в базе оно пустое - null, в коллеции свойств этого свойства не будет.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit Последний раз редактировалось a33ik; 29.10.2009 в 15:05. |
|
|
|
|
#31 |
|
Участник
|
Я имел ввиду следующее: Имея вышеуказанный код и желание передать на вход какой либо процедуры "X" значение некоторых полей (new_url, new_comment, new_startparse, new_enparse), что нужно передавать как входные параметры для процедуры "X"?
|
|
|
|
|
#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). | |
|
|
#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 |
|
|
|
|
#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. |
|
|
|
|
#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. |
|
|
|
|
#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 |
|
|
|
|
#37 |
|
Участник
|
|
|
|
|
|
#38 |
|
Чайный пьяница
|
А шаг Workflow удачно выполнился?
Попробуйте создавать файл на сервере для начала.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
|
|
|
#39 |
|
Участник
|
|
|
|
|
|
#40 |
|
Чайный пьяница
|
Врядли. С точки зрения работы с файловой системы - все работы выполняются в контексте учётной записи под которой запущен асинхронный сервис CRM.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
|