AXForum  
Вернуться   AXForum > Microsoft Dynamics CRM > Dynamics CRM: Разработка
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 23.04.2012, 23:54   #1  
Taker1796 is offline
Taker1796
Участник
Аватар для Taker1796
 
112 / 11 (1) +
Регистрация: 22.04.2012
Получение данных из связанных сущностей
Всем доброго времени суток! Есть 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  
g.Naukovych is offline
g.Naukovych
Участник
MCBMSS
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
405 / 130 (5) +++++
Регистрация: 23.03.2011
А текст ошибки в Трейсе какой?
__________________
Мой блог https://procrm.tv
Старый 24.04.2012, 00:35   #3  
g.Naukovych is offline
g.Naukovych
Участник
MCBMSS
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
405 / 130 (5) +++++
Регистрация: 23.03.2011
Стоп. А раз это лукап, то Вы должны сюда вставить не название а GUID марки
condition.Values = new string[] { "Форд"};
__________________
Мой блог https://procrm.tv
Старый 24.04.2012, 01:34   #4  
a33ik is offline
a33ik
Чайный пьяница
Аватар для a33ik
MCP
MCBMSS
Злыдни
Соотечественники
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,243 / 896 (36) +++++++
Регистрация: 02.07.2008
Адрес: Greenville, SC
Цитата:
Сообщение от g.Naukovych Посмотреть сообщение
Стоп. А раз это лукап, то Вы должны сюда вставить не название а GUID марки
condition.Values = new string[] { "Форд"};
Абсолютно согласен с коллегой. Для того чтобы фильтровать по названиям - вам прийдётся джоиниться к сущности через LinkEntity и в эту LinkEntity добавлять фильтр по названию.

ЗЫ судя по коду вы используете WebReference от CRM сервисов. По своему опыту - скажу бросайте вы это дело. Советую использовать SDK сборки и DynamicEntity.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством.

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit
За это сообщение автора поблагодарили: Taker1796 (1).
Старый 24.04.2012, 10:11   #5  
Taker1796 is offline
Taker1796
Участник
Аватар для Taker1796
 
112 / 11 (1) +
Регистрация: 22.04.2012
А можете привести пример кода, чтобы получить GUID определенной марки?
Старый 24.04.2012, 10:33   #6  
g.Naukovych is offline
g.Naukovych
Участник
MCBMSS
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
405 / 130 (5) +++++
Регистрация: 23.03.2011
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));
__________________
Мой блог https://procrm.tv

Последний раз редактировалось g.Naukovych; 24.04.2012 в 10:40.
За это сообщение автора поблагодарили: Taker1796 (1).
Старый 24.04.2012, 10:42   #7  
Taker1796 is offline
Taker1796
Участник
Аватар для Taker1796
 
112 / 11 (1) +
Регистрация: 22.04.2012
Спасибо!

Кстати, на счет FetchXML, допустим я получил какой то результат в строку. Как из этой строки потом вытащить именно то что я искал, а то строка содержит xml
Старый 24.04.2012, 10:52   #8  
Konstantin Katsovich is offline
Konstantin Katsovich
Участник
Аватар для Konstantin Katsovich
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
243 / 57 (2) ++++
Регистрация: 22.10.2008
Адрес: Israel
Цитата:
Сообщение от g.Naukovych Посмотреть сообщение
EntityCollection cars = service.RetrieveMultiple(new FetchExpression(fetchQuery));
Это для crm 2011.
__________________
Читайте SDK!!!
За это сообщение автора поблагодарили: Taker1796 (1).
Старый 24.04.2012, 10:55   #9  
Ksani is offline
Ksani
Участник
Аватар для Ksani
MCBMSS
 
27 / 17 (1) ++
Регистрация: 31.08.2009
Адрес: Солнечная Страна
Цитата:
Сообщение от Taker1796 Посмотреть сообщение
Спасибо!

Кстати, на счет FetchXML, допустим я получил какой то результат в строку. Как из этой строки потом вытащить именно то что я искал, а то строка содержит xml
Для работы с XML можно использовать XPath http://www.w3schools.com/xpath/default.asp
За это сообщение автора поблагодарили: Taker1796 (1).
Старый 24.04.2012, 11:08   #10  
Taker1796 is offline
Taker1796
Участник
Аватар для Taker1796
 
112 / 11 (1) +
Регистрация: 22.04.2012
Огромное спасибо всем)
Старый 24.04.2012, 17:29   #11  
Taker1796 is offline
Taker1796
Участник
Аватар для Taker1796
 
112 / 11 (1) +
Регистрация: 22.04.2012
У меня еще вопрос созрел)
Как получить данные из сущностей, связанных N:N ?
Допустим есть Сущность1 и Сущность2. Мне нужно получить данные из Сущность2. Как это реализовать на c#? не используя FetchXML. Желательно кодом написать, а то я новичек в CRM, пока туговато с этим.
Старый 24.04.2012, 18:09   #12  
Ksani is offline
Ksani
Участник
Аватар для Ksani
MCBMSS
 
27 / 17 (1) ++
Регистрация: 31.08.2009
Адрес: Солнечная Страна
Цитата:
Сообщение от Taker1796 Посмотреть сообщение
У меня еще вопрос созрел)
Как получить данные из сущностей, связанных N:N ?
Допустим есть Сущность1 и Сущность2. Мне нужно получить данные из Сущность2. Как это реализовать на c#? не используя FetchXML. Желательно кодом написать, а то я новичек в CRM, пока туговато с этим.
Для хранения связи N:N в CRM используется третья таблица, имя которой - это имя связи и хранися в ней ID Сущности1 и ID Сущности2 (Чтобы было понятнее - это Сущность3, которая находится между Сущностью1 и Сущностью2),. Т.е. чтобы написать запрос Вам нужно использовать link-entity или в FetchXML, или в QueryExpression.
Пример из SDK
За это сообщение автора поблагодарили: Taker1796 (1).
Старый 24.04.2012, 23:06   #13  
Taker1796 is offline
Taker1796
Участник
Аватар для Taker1796
 
112 / 11 (1) +
Регистрация: 22.04.2012
Спасибо, попробую! А как получить GUID открытой формы через c#?
Старый 25.04.2012, 11:14   #14  
Ksani is offline
Ksani
Участник
Аватар для Ksani
MCBMSS
 
27 / 17 (1) ++
Регистрация: 31.08.2009
Адрес: Солнечная Страна
Цитата:
Сообщение от Taker1796 Посмотреть сообщение
Спасибо, попробую! А как получить GUID открытой формы через c#?
Эээээ. А где Вы хотите его получить? В плагине? В аджаксе? Еще где-то?

И, может быть, Вы все таки почитаете SDK прежде чем начинать что-то программировать в CRM?
Старый 25.04.2012, 11:43   #15  
g.Naukovych is offline
g.Naukovych
Участник
MCBMSS
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
405 / 130 (5) +++++
Регистрация: 23.03.2011
Если через JavaScript, то crmForm.ObjectId

А как Вы прикрутите C# к форме я не знаю. Трогать страницы сайта нельзя.
__________________
Мой блог https://procrm.tv
Старый 25.04.2012, 11:48   #16  
Taker1796 is offline
Taker1796
Участник
Аватар для Taker1796
 
112 / 11 (1) +
Регистрация: 22.04.2012
Цитата:
Сообщение от g.Naukovych Посмотреть сообщение
Если через JavaScript, то crmForm.ObjectId

А как Вы прикрутите C# к форме я не знаю. Трогать страницы сайта нельзя.
Нет, мне надо через c#.


id = new Guid(Request.QueryString["id"]); вроде так это делается
Старый 25.04.2012, 11:51   #17  
g.Naukovych is offline
g.Naukovych
Участник
MCBMSS
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
405 / 130 (5) +++++
Регистрация: 23.03.2011
Цитата:
Сообщение от Taker1796 Посмотреть сообщение
У меня еще вопрос созрел)
Как получить данные из сущностей, связанных N:N ?
Допустим есть Сущность1 и Сущность2. Мне нужно получить данные из Сущность2. Как это реализовать на c#? не используя FetchXML. Желательно кодом написать, а то я новичек в CRM, пока туговато с этим.
Я обычно на CRM 4.0 делаю это через БД. И работает быстрее и мне проще. Не знаю как это для начинающего, но у нас во всех проектах используется получение данных из БД. Не обновление(это запрещено), а получение.

Напоминаю, что для получения данных лучше использовать хранимые процедуры, но их нельзя размешать в базе MSCRM. Нужно создать еще одну базу и воспользоваться синонимами или полным именем объекта и создать процедуру в уже новой БД.
__________________
Мой блог https://procrm.tv

Последний раз редактировалось g.Naukovych; 25.04.2012 в 12:39.
Старый 25.04.2012, 12:32   #18  
Ksani is offline
Ksani
Участник
Аватар для Ksani
MCBMSS
 
27 / 17 (1) ++
Регистрация: 31.08.2009
Адрес: Солнечная Страна
Цитата:
Сообщение от Taker1796 Посмотреть сообщение
Нет, мне надо через c#.


id = new Guid(Request.QueryString["id"]); вроде так это делается
Вы так и не ответили где Вы это хотите?
Старый 25.04.2012, 12:42   #19  
g.Naukovych is offline
g.Naukovych
Участник
MCBMSS
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
405 / 130 (5) +++++
Регистрация: 23.03.2011
Думаю, что Вы пишите плагин.
Я на вопрос отвечу, но все же стоит указывать что и для чего, тем более когда у Вас несколько раз спрашивают.

Когда у меня была задача узнать 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 и звонка в обращение заполнить поля обращении определенным образом.
Вт этот механизм мне здесь пригодился. Непомню почему именно этот, вроде остальные не помогли.
__________________
Мой блог https://procrm.tv

Последний раз редактировалось g.Naukovych; 25.04.2012 в 12:47.
Старый 25.04.2012, 13:00   #20  
Ksani is offline
Ksani
Участник
Аватар для Ksani
MCBMSS
 
27 / 17 (1) ++
Регистрация: 31.08.2009
Адрес: Солнечная Страна
Цитата:
Сообщение от g.Naukovych Посмотреть сообщение
Когда у меня была задача узнать ID формы после которой сработал плагин я делал следующее:
Зачем Вы сбиваете с правильного пути новичка?

Ваш способ, конечно, работает, НО в плагинах CRM существует context, в котором можно найти ID записи на которую бежит плагин. Колличество строчек кода при этом несопоставимо с Вашим.
В Post Create, например, это выглядит так:
Guid id = (Guid)context.OutputParameters.Properties[ParameterName.Id];
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
CRM 2011, жесткие тормоза при открытии связанных с организацией сущностей mistah Dynamics CRM: Администрирование 8 20.04.2012 21:10
Копирование атрибутов vs использование атрибутов из связанных сущностей ashuron Dynamics CRM: Разработка 4 14.02.2012 20:46
Получение данных из CRM 4.0 через web service в стороннем приложении datfi Dynamics CRM: Разработка 3 18.10.2009 20:31
Фильтрация при добавлении связанных сущностей OlegaN Dynamics CRM: Разработка 1 20.07.2009 11:09
Выборка данных из нескольких сущностей, MS CRM 3 Lithium Dynamics CRM: Разработка 4 04.04.2008 17:58

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 00:58.