|
|
#1 |
|
Участник
|
Выборка данных из нескольких сущностей, 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 };
}Как произвести такую выборку??
|
|
|
|
|
#2 |
|
Участник
|
Сорри, из 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 }; } |
|
|
|
|
#3 |
|
Участник
|
Неужели никто не сталкивался с такой задачей?
|
|
|
|
|
#4 |
|
Заноза в заднице
|
Сорри за ламерский вопрос: а пробовали для одной сущности объявлять свой 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. |
|
|
|
|
#5 |
|
Участник
|
Цитата:
Сообщение от 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); Получать сначала список всех обращений, затем список разрешений обращений и самому их сопоставлять...Просто у вас в примере одна запись выбирается, а у меня-то их м.б. много, геморно получается, ну да ничего, разгребем Единственное, что вызывает опасения, это производительность веб-метода при таком подходе.. |
|
|
|
|
|