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