23.04.2012, 23:54 | #1 |
Участник
|
Получение данных из связанных сущностей
Всем доброго времени суток! Есть 2 сущности, марки автомобилей и их модели. Связаны отношением 1:N. Необходимо получить все модели определенной марки. При выполнении запроса вылезает ошибка, которая говорит, собственно, что произошла ошибка в запросе.
QueryExpression query = new QueryExpression(); query.EntityName = EntityName.Сущность_модель.ToString(); ColumnSet cols1 = new ColumnSet(); cols1.Attributes = new string[] { "Название модели" }; ConditionExpression condition = new ConditionExpression(); condition.AttributeName = "Марка"; condition.Operator = ConditionOperator.Equal; condition.Values = new string[] { "Форд"}; FilterExpression filter = new FilterExpression(); filter.FilterOperator = LogicalOperator.And; filter.Conditions = new ConditionExpression[] {condition }; query.ColumnSet = cols1; query.Criteria = filter; BusinessEntityCollection retrieved = service.RetrieveMultiple(query); foreach (new_model res in retrieved.BusinessEntities) { ....... } Ошибка вылезает вот в этом месте : BusinessEntityCollection retrieved = service.RetrieveMultiple(query); Поле "Марка" имеет тип lookup на сущности модели. Если убрать фильтр, то всё работает, но вытаскивает все модели всех марок. Что интересно, когда ищу марку по названию модели, всё работает как надо, а вот когда наоборот, когда пытаюсь получить модели по марке, то - ошибка описанная выше. Имена сущностей и полей написал на русском языке в запросе, для большей наглядности. CRM 4.0 Заранее спасибо за помощь! Последний раз редактировалось Taker1796; 23.04.2012 в 23:59. |
|
24.04.2012, 00:30 | #2 |
Участник
|
А текст ошибки в Трейсе какой?
|
|
24.04.2012, 00:35 | #3 |
Участник
|
Стоп. А раз это лукап, то Вы должны сюда вставить не название а GUID марки
condition.Values = new string[] { "Форд"}; |
|
24.04.2012, 01:34 | #4 |
Чайный пьяница
|
Цитата:
ЗЫ судя по коду вы используете WebReference от CRM сервисов. По своему опыту - скажу бросайте вы это дело. Советую использовать SDK сборки и DynamicEntity.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
|
За это сообщение автора поблагодарили: Taker1796 (1). |
24.04.2012, 10:11 | #5 |
Участник
|
А можете привести пример кода, чтобы получить GUID определенной марки?
|
|
24.04.2012, 10:33 | #6 |
Участник
|
QueryExpression query = new QueryExpression();
query.EntityName = EntityName.марка.ToString(); ColumnSet cols1 = new ColumnSet(); cols1.Attributes = new string[] { "маркаid" }; ConditionExpression condition = new ConditionExpression(); condition.AttributeName = "Имя марки"; condition.Operator = ConditionOperator.Equal; condition.Values = new string[] { "Форд"}; FilterExpression filter = new FilterExpression(); filter.FilterOperator = LogicalOperator.And; filter.Conditions = new ConditionExpression[] {condition }; query.ColumnSet = cols1; query.Criteria = filter; BusinessEntityCollection retrieved = service.RetrieveMultiple(query); foreach (new_mark res in retrieved.BusinessEntities) { Guid key = new_mark.new_markid; } как то так. Наверное. Я Ваш код переписал. Но разве нельзя в это место передать GUID? Еще можно построить запрос который вернет Вам все машины у которых название марки равно тому, которое Вы хотите. Для этого необзходимо использовать linkedentity. И Еще один самый простой для Вас вариант. Создайте такой запрос в расщиренном поиске. Сохраните его Дальше в таблице UserQuery найдите его. возьмите FetchXML и вызвовите из приложения. Это самый простой вариант как по мне. Минимальное программирование. В расширенном опсике Вы как рас сможете построить запрос такого рода. Дай мне все машины, которые связаны с марками у которых название, и равно тому, которое Вы захотите. В результе Ваш код будет выглядить так. string fetchQuery = ""; // Введите сюда Ваш запрос EntityCollection cars = service.RetrieveMultiple(new FetchExpression(fetchQuery)); Последний раз редактировалось g.Naukovych; 24.04.2012 в 10:40. |
|
|
За это сообщение автора поблагодарили: Taker1796 (1). |
24.04.2012, 10:42 | #7 |
Участник
|
Спасибо!
Кстати, на счет FetchXML, допустим я получил какой то результат в строку. Как из этой строки потом вытащить именно то что я искал, а то строка содержит xml |
|
24.04.2012, 10:52 | #8 |
Участник
|
Это для crm 2011.
__________________
Читайте SDK!!! |
|
|
За это сообщение автора поблагодарили: Taker1796 (1). |
24.04.2012, 10:55 | #9 |
Участник
|
Цитата:
|
|
|
За это сообщение автора поблагодарили: Taker1796 (1). |
24.04.2012, 11:08 | #10 |
Участник
|
Огромное спасибо всем)
|
|
24.04.2012, 17:29 | #11 |
Участник
|
У меня еще вопрос созрел)
Как получить данные из сущностей, связанных N:N ? Допустим есть Сущность1 и Сущность2. Мне нужно получить данные из Сущность2. Как это реализовать на c#? не используя FetchXML. Желательно кодом написать, а то я новичек в CRM, пока туговато с этим. |
|
24.04.2012, 18:09 | #12 |
Участник
|
Цитата:
Пример из SDK |
|
|
За это сообщение автора поблагодарили: Taker1796 (1). |
24.04.2012, 23:06 | #13 |
Участник
|
Спасибо, попробую! А как получить GUID открытой формы через c#?
|
|
25.04.2012, 11:14 | #14 |
Участник
|
|
|
25.04.2012, 11:43 | #15 |
Участник
|
Если через JavaScript, то crmForm.ObjectId
А как Вы прикрутите C# к форме я не знаю. Трогать страницы сайта нельзя. |
|
25.04.2012, 11:48 | #16 |
Участник
|
|
|
25.04.2012, 11:51 | #17 |
Участник
|
Цитата:
Напоминаю, что для получения данных лучше использовать хранимые процедуры, но их нельзя размешать в базе MSCRM. Нужно создать еще одну базу и воспользоваться синонимами или полным именем объекта и создать процедуру в уже новой БД. Последний раз редактировалось g.Naukovych; 25.04.2012 в 12:39. |
|
25.04.2012, 12:32 | #18 |
Участник
|
|
|
25.04.2012, 12:42 | #19 |
Участник
|
Думаю, что Вы пишите плагин.
Я на вопрос отвечу, но все же стоит указывать что и для чего, тем более когда у Вас несколько раз спрашивают. Когда у меня была задача узнать ID формы после которой сработал плагин я делал следующее: X++: private string GetParamFromUrl(string url, string param) { if (url == null || url == string.Empty || url == "") return string.Empty; Uri ur = new Uri(url); string[] querySegments = ur.Query.ToLower().Split('&'); string Guid = String.Empty; foreach (string segment in querySegments) { string[] parts = segment.Split('='); if (parts.Length > 0) { string key = parts[0].Trim(new char[] { '?', ' ' }); if (key.ToLower() == param.ToLower()) { Guid = parts[1].Trim(); Guid = Guid.Replace("{", "").Replace("}", "").Replace("%7b", "").Replace("%7d", "").Replace("=", ""); break; } } } return Guid; } string refererUrl = HttpContext.Current.Request.ServerVariables["HTTP_REFERER"]; if (string.IsNullOrEmpty(refererUrl)) return; string filterParam = GetParamFromUrl(refererUrl, "id"); Это очень полезная штука. Я её использую для фильтрации плагинов и для определения откуда именно сработал плагин, Так например у меня была задача при конвертации e-mail и звонка в обращение заполнить поля обращении определенным образом. Вт этот механизм мне здесь пригодился. Непомню почему именно этот, вроде остальные не помогли. Последний раз редактировалось g.Naukovych; 25.04.2012 в 12:47. |
|
25.04.2012, 13:00 | #20 |
Участник
|
Цитата:
Ваш способ, конечно, работает, НО в плагинах CRM существует context, в котором можно найти ID записи на которую бежит плагин. Колличество строчек кода при этом несопоставимо с Вашим. В Post Create, например, это выглядит так: Guid id = (Guid)context.OutputParameters.Properties[ParameterName.Id]; |
|
|
|