AXForum  
Zurück   AXForum > Microsoft Dynamics CRM > Dynamics CRM: Разработка
All
Kennwort vergessen?
Registrieren Forum Rules Hilfe Benutzerliste Heutige Beiträge Suchen

 
 
Themen-Optionen Thema durchsuchen Ansicht
Alt 23.04.2012, 23:54   #1  
Taker1796 ist offline
Taker1796
Участник
Benutzerbild von Taker1796
 
112 / 11 (1) +
Registriert seit: 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

Заранее спасибо за помощь!

Geändert von Taker1796 (23.04.2012 um 23:59 Uhr)
Alt 24.04.2012, 00:30   #2  
g.Naukovych ist offline
g.Naukovych
Участник
MCBMSS
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
405 / 130 (5) +++++
Registriert seit: 23.03.2011
А текст ошибки в Трейсе какой?
__________________
Мой блог https://procrm.tv
Alt 24.04.2012, 00:35   #3  
g.Naukovych ist offline
g.Naukovych
Участник
MCBMSS
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
405 / 130 (5) +++++
Registriert seit: 23.03.2011
Стоп. А раз это лукап, то Вы должны сюда вставить не название а GUID марки
condition.Values = new string[] { "Форд"};
__________________
Мой блог https://procrm.tv
Alt 24.04.2012, 01:34   #4  
a33ik ist offline
a33ik
Чайный пьяница
Benutzerbild von a33ik
MCP
MCBMSS
Злыдни
Соотечественники
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3.243 / 896 (36) +++++++
Registriert seit: 02.07.2008
Ort: Greenville, SC
Zitat:
Zitat von g.Naukovych Beitrag anzeigen
Стоп. А раз это лукап, то Вы должны сюда вставить не название а GUID марки
condition.Values = new string[] { "Форд"};
Абсолютно согласен с коллегой. Для того чтобы фильтровать по названиям - вам прийдётся джоиниться к сущности через LinkEntity и в эту LinkEntity добавлять фильтр по названию.

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

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit
This post has been rated by: Taker1796 (1).
Alt 24.04.2012, 10:11   #5  
Taker1796 ist offline
Taker1796
Участник
Benutzerbild von Taker1796
 
112 / 11 (1) +
Registriert seit: 22.04.2012
А можете привести пример кода, чтобы получить GUID определенной марки?
Alt 24.04.2012, 10:33   #6  
g.Naukovych ist offline
g.Naukovych
Участник
MCBMSS
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
405 / 130 (5) +++++
Registriert seit: 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

Geändert von g.Naukovych (24.04.2012 um 10:40 Uhr)
This post has been rated by: Taker1796 (1).
Alt 24.04.2012, 10:42   #7  
Taker1796 ist offline
Taker1796
Участник
Benutzerbild von Taker1796
 
112 / 11 (1) +
Registriert seit: 22.04.2012
Спасибо!

Кстати, на счет FetchXML, допустим я получил какой то результат в строку. Как из этой строки потом вытащить именно то что я искал, а то строка содержит xml
Alt 24.04.2012, 10:52   #8  
Konstantin Katsovich ist offline
Konstantin Katsovich
Участник
Benutzerbild von Konstantin Katsovich
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
243 / 57 (2) ++++
Registriert seit: 22.10.2008
Ort: Israel
Zitat:
Zitat von g.Naukovych Beitrag anzeigen
EntityCollection cars = service.RetrieveMultiple(new FetchExpression(fetchQuery));
Это для crm 2011.
__________________
Читайте SDK!!!
This post has been rated by: Taker1796 (1).
Alt 24.04.2012, 10:55   #9  
Ksani ist offline
Ksani
Участник
Benutzerbild von Ksani
MCBMSS
 
27 / 17 (1) ++
Registriert seit: 31.08.2009
Ort: Солнечная Страна
Zitat:
Zitat von Taker1796 Beitrag anzeigen
Спасибо!

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

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

А как Вы прикрутите C# к форме я не знаю. Трогать страницы сайта нельзя.
__________________
Мой блог https://procrm.tv
Alt 25.04.2012, 11:48   #16  
Taker1796 ist offline
Taker1796
Участник
Benutzerbild von Taker1796
 
112 / 11 (1) +
Registriert seit: 22.04.2012
Zitat:
Zitat von g.Naukovych Beitrag anzeigen
Если через JavaScript, то crmForm.ObjectId

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


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

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

Geändert von g.Naukovych (25.04.2012 um 12:39 Uhr)
Alt 25.04.2012, 12:32   #18  
Ksani ist offline
Ksani
Участник
Benutzerbild von Ksani
MCBMSS
 
27 / 17 (1) ++
Registriert seit: 31.08.2009
Ort: Солнечная Страна
Zitat:
Zitat von Taker1796 Beitrag anzeigen
Нет, мне надо через c#.


id = new Guid(Request.QueryString["id"]); вроде так это делается
Вы так и не ответили где Вы это хотите?
Alt 25.04.2012, 12:42   #19  
g.Naukovych ist offline
g.Naukovych
Участник
MCBMSS
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
405 / 130 (5) +++++
Registriert seit: 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

Geändert von g.Naukovych (25.04.2012 um 12:47 Uhr)
Alt 25.04.2012, 13:00   #20  
Ksani ist offline
Ksani
Участник
Benutzerbild von Ksani
MCBMSS
 
27 / 17 (1) ++
Registriert seit: 31.08.2009
Ort: Солнечная Страна
Zitat:
Zitat von g.Naukovych Beitrag anzeigen
Когда у меня была задача узнать ID формы после которой сработал плагин я делал следующее:
Зачем Вы сбиваете с правильного пути новичка?

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

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
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

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Gehe zu

Рейтинг@Mail.ru
Alle Zeitangaben in WEZ +3. Es ist jetzt 19:39 Uhr.
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.