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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 04.04.2008, 11:36   #1  
Lithium is offline
Lithium
Участник
 
20 / 10 (1) +
Регистрация: 17.07.2007
Выборка данных из нескольких сущностей, MS CRM 3
Пишу веб-службу, которая должна возвращать для заданной организации список ее сервисных обращений (дата создания, заголовок, код, текущий статус), и в случае если обращение разрешилось - кол-во затраченного времени, описание решения проблемы, имя инженера, кто занимался обращением.
Проблема в том,что поля которые нужно выбрать, раскиданы по разным сущностям (incident и incidentresolution).

Пишу следующий код:
X++:
Guid GUID = newGuid(p_guid);
QueryExpression query = newQueryExpression();
query.EntityName = EntityName.incident.ToString();
ColumnSet cols = newColumnSet();

cols.Attributes = newstring[] { "ticketnumber", "title","createdon","statecode" };
OrderExpression order = newOrderExpression();
order.OrderType = OrderType.Descending;
order.AttributeName = "createdon";
query.ColumnSet = cols;
query.Orders = newOrderExpression[] { order };
query.Criteria = newFilterExpression();
ConditionExpression exp = newConditionExpression();
exp.AttributeName = "customerid";
exp.Operator = ConditionOperator.Equal;
exp.Values = newobject[] { GUID.ToString() };
query.Criteria.Conditions = newConditionExpression[] { exp };
LinkEntity le = newLinkEntity();
le.LinkFromEntityName = EntityName.incident.ToString();
le.LinkFromAttributeName = "incidentid";
le.LinkToEntityName = EntityName.incidentresolution.ToString();
le.LinkToAttributeName = "incidentid";
le.JoinOperator = JoinOperator.LeftOuter;
query.LinkEntities = newLinkEntity[] { le };/**/
 
BusinessEntityCollection returned = srv.RetrieveMultiple(query);
if (returned.BusinessEntities.Length > 0)
{
Incident[] p = newIncident[returned.BusinessEntities.Length];
int i = 0;
foreach (BusinessEntity be in returned.BusinessEntities)
{
incident inc = (incident)be;
p[i].Code = inc.ticketnumber;
p[i].Date = inc.createdon.date;
if (inc.title != null)
p[i].Title = inc.title;
else p[i].Title = "отсутствует";
if (inc.statecode.ToString() != null)
p[i].Status = inc.statecode.Value.ToString();
else p[i].Status = "не определен";
i++;
}
return p;
}
else
{
Incident ic;
ic.Code = "";
ic.Date = "";
ic.Status = "";
ic.Title = "нет обращений";
returnnewIncident[] { ic };
}
он работает, но выбирает данные только из одно сущности. стоит только добавить в ColumnSet поле из incidentresolution - работать перестает.

Как произвести такую выборку??
Старый 04.04.2008, 11:42   #2  
Lithium is offline
Lithium
Участник
 
20 / 10 (1) +
Регистрация: 17.07.2007
Сорри, из VS код плохо копируется Вот так лучше:

X++:
Guid GUID = new Guid(p_guid);
            QueryExpression query = new QueryExpression();
            query.EntityName = EntityName.incident.ToString();
            ColumnSet cols = new ColumnSet();
                      
            cols.Attributes = new string[] { "ticketnumber", "title","createdon","statecode" 
};
            OrderExpression order = new OrderExpression();
            order.OrderType = OrderType.Descending;
            order.AttributeName = "createdon";
            query.ColumnSet = cols;
            query.Orders = new OrderExpression[] { order };
            query.Criteria = new FilterExpression();
            ConditionExpression exp = new ConditionExpression();
            exp.AttributeName = "customerid";
            exp.Operator = ConditionOperator.Equal;
            exp.Values = new object[] { GUID.ToString() };
            query.Criteria.Conditions = new ConditionExpression[] { exp };
            LinkEntity le = new LinkEntity();
            le.LinkFromEntityName = EntityName.incident.ToString();
            le.LinkFromAttributeName = "incidentid";
            le.LinkToEntityName = EntityName.incidentresolution.ToString();
            le.LinkToAttributeName = "incidentid";
            le.JoinOperator = JoinOperator.LeftOuter;
            query.LinkEntities = new LinkEntity[] { le };/**/

            BusinessEntityCollection returned = srv.RetrieveMultiple(query);
            if (returned.BusinessEntities.Length > 0)
            {
                Incident[] p = new Incident[returned.BusinessEntities.Length];
                int i = 0;
                foreach (BusinessEntity be in returned.BusinessEntities)
                {
                    incident inc = (incident)be;
                    p[i].Code = inc.ticketnumber;
                    p[i].Date = inc.createdon.date;
                    if (inc.title != null)
                        p[i].Title = inc.title;
                    else p[i].Title = "отсутствует";
                    if (inc.statecode.ToString() != null)
                        p[i].Status = inc.statecode.Value.ToString();
                    else p[i].Status = "не определен";
                    i++;
                }
                return p;
            }
            else
            {
                Incident ic;
                ic.Code = "";
                ic.Date = "";
                ic.Status = "";
                ic.Title = "нет обращений";
                return new Incident[] { ic };
            }
Старый 04.04.2008, 15:39   #3  
Lithium is offline
Lithium
Участник
 
20 / 10 (1) +
Регистрация: 17.07.2007
Неужели никто не сталкивался с такой задачей?
Старый 04.04.2008, 16:23   #4  
Likefire is offline
Likefire
Заноза в заднице
Аватар для Likefire
MCBMSS
Лучший по профессии 2009
 
547 / 50 (3) ++++
Регистрация: 22.10.2007
Адрес: Москва
Записей в блоге: 1
Сорри за ламерский вопрос: а пробовали для одной сущности объявлять свой ColumnSet, а для другой - свой? Ну или хотя бы переопределять по новой перед вызовом другой сущности? Я сделал вот так примерно:
X++:
Guid actId = new Guid("22BA1110-2802-DD11-9DA4-00188B2E715F");
 
ColumnSet cols = new ColumnSet();
cols.Attributes = new string [] { "activitytypecode", "ownerid" }; //определяю атрибуты для выборки действия
 
activitypointer currActivity = (activitypointer)service.Retrieve(EntityName.activitypointer.ToString(), actId, cols);
Guid ownId = new Guid(currActivity.ownerid.Value.ToString());
 
cols.Attributes = new string[] { "fullname", "cust_manager" }; // определяю атрибуты для выборки пользователя
 
systemuser currOwner = (systemuser)service.Retrieve(EntityName.systemuser.ToString(), ownId, cols);
__________________
Лень мудрого человека - это необходимое средство нейтрализации кипучей активности руководящих им дураков!

Последний раз редактировалось Likefire; 04.04.2008 в 16:29.
Старый 04.04.2008, 17:58   #5  
Lithium is offline
Lithium
Участник
 
20 / 10 (1) +
Регистрация: 17.07.2007
Цитата:
Сообщение от Likefire Посмотреть сообщение
Сорри за ламерский вопрос: а пробовали для одной сущности объявлять свой ColumnSet, а для другой - свой? Ну или хотя бы переопределять по новой перед вызовом другой сущности? Я сделал вот так примерно:
X++:
Guid actId = new Guid("22BA1110-2802-DD11-9DA4-00188B2E715F");
 
ColumnSet cols = new ColumnSet();
cols.Attributes = new string [] { "activitytypecode", "ownerid" }; //определяю атрибуты для выборки действия
 
activitypointer currActivity = (activitypointer)service.Retrieve(EntityName.activitypointer.ToString(), actId, cols);
Guid ownId = new Guid(currActivity.ownerid.Value.ToString());
 
cols.Attributes = new string[] { "fullname", "cust_manager" }; // определяю атрибуты для выборки пользователя
 
systemuser currOwner = (systemuser)service.Retrieve(EntityName.systemuser.ToString(), ownId, cols);
Вот видимо так и придется делать Получать сначала список всех обращений, затем список разрешений обращений и самому их сопоставлять...
Просто у вас в примере одна запись выбирается, а у меня-то их м.б. много, геморно получается, ну да ничего, разгребем
Единственное, что вызывает опасения, это производительность веб-метода при таком подходе..
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Microsoft Dynamics CRM Team Blog: Building Rich-Client Dashboards for Microsoft Dynamics CRM with Windows Presentation Foundation Blog bot Dynamics CRM: Blogs 1 31.03.2009 13:24
Мир CRM: Улучшение Dynamics CRM 4.0 производительности и безопасности данных под SQL Server 2008 Blog bot Dynamics CRM: Blogs 0 03.02.2009 02:07
Microsoft Dynamics CRM Team Blog: List Web Part for Microsoft Dynamics CRM 4.0 Deployment Scenarios Blog bot Dynamics CRM: Blogs 0 30.01.2009 22:05
Microsoft Dynamics CRM Team Blog: Microsoft Dynamics CRM 4.0 Bookshelf Blog bot Dynamics CRM: Blogs 1 22.01.2009 04:46
Microsoft Dynamics CRM Team Blog: Reports for CRM 4.0 using SQL Server 2008 and Report Builder 2.0 Blog bot Dynamics CRM: Blogs 0 11.11.2008 08:05
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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