В прошлый раз мы поставили задачу, с научиться использовать веб сервисы Crm на конкретном примере - функция отбора позиций прайс листа для заказа.
Для полного решения задачи нужно сделать следующее:
1 - форма должна открываться из формы заказа\ком предложения
2 - форма должна использовать веб сервисы црм
3 - форма получив код заказа \ ком предложения должна загружать доступные по прайс листу продукты, показывать их стоимость и количество
4 - форма должна добавлять указанные продукты к заказу.
В прошлый раз мы выполнили шаги 2 и частично 3. Сегодня мы закроем 3 шаг.
Мы загружали данные по прайс листу, а нам нужно иметь количество и артикул. Для этого нужно обращаться к таблице продуктов. Запросы через веб сервисы - QueryExpression и QueryByAttribute позволяют получать только одну таблицу. Нам нужно 2. Поэтому мы создадим дата сет, загрузим поотдельности каждую таблицу и после этого "склеим" их через DataRelation.
Недостатком такого метода является то что мы грузим все доступные продукты что явно неоптимально. Оптимизировать мы можем задачу через запрос грузящий только продукты участвующие в прайс листе, либо используя SQL. Пока же рассмотрим как работает данный пример:
//грузим продукты с ценами по прайс листу с учетом их артикулов и количества
DataTable GetProductsForPrice(Guid pricelevelid)
{
#region old variant
/*
DataTable dt = new DataTable();
dt.Columns.Add("id");
dt.Columns.Add("productnumber");
dt.Columns.Add("name");
dt.Columns.Add("quantityonhand");
dt.Columns.Add("price");
DataTable product = new DataTable();
dt.Columns.Add("productid");
dt.Columns.Add("productnumber");
dt.Columns.Add("quantityonhand");
QueryByAttribute qeb = new QueryByAttribute();
qeb.EntityName = EntityName.productpricelevel.ToString();
qeb.ColumnSet = new AllColumns();
qeb.Attributes = new string[] { "pricelevelid"};
qeb.Values = new string[] { pricelevelid.ToString() };
WsAdapter ws = new WsAdapter();
//коллекция позиций прайс листа
BusinessEntityCollection bec = ws.Service.RetrieveMultiple(qeb);
foreach (productpricelevel pl in bec.BusinessEntities)
{
DataRow row = dt.NewRow();
row["id"] = pl.productid.Value;
row["name"] = pl.productid.name;
row["price"] = pl.amount.Value;
row["quantityonhand"] = 100;
row["productnumber"] = 1;
dt.Rows.Add(row);
}
return dt;
*/
#endregion
#region new variant
//таблица позиций прайс листа
DataTable priceline = new DataTable("priceline");
priceline.Columns.Add("productid");
priceline.Columns.Add("name");
priceline.Columns.Add("price");
priceline.Columns.Add("uomidname");
//таблица продуктов
DataTable product = new DataTable("product");
product.Columns.Add("productid");
product.Columns.Add("productnumber");
product.Columns.Add("quantityonhand");
//создаем дата сет
DataSet ds = new DataSet();
ds.EnforceConstraints = false;
//добавляем таблицы
ds.Tables.AddRange(new DataTable[] { product, priceline });
//добавляем связь
ds.Relations.Add(new DataRelation("product2priceline", product.Columns["productid"], priceline.Columns["productid"]));
//добавляем нужные столбцы в таблицу позиций прайс листа
priceline.Columns.Add("quantityonhand", typeof(decimal), "Parent(product2priceline).quantityonhand");
priceline.Columns.Add("productnumber", typeof(string), "Parent(product2priceline).productnumber");
//создаем црм запрос по атрибуту для позиций указанного прайс листа
QueryByAttribute qeb = new QueryByAttribute();
qeb.EntityName = EntityName.productpricelevel.ToString();
qeb.ColumnSet = new AllColumns();
qeb.Attributes = new string[] { "pricelevelid" };
qeb.Values = new string[] { pricelevelid.ToString() };
//создаем црм запрос по атрибуту для всех активных продуктов
QueryByAttribute qebproduct = new QueryByAttribute();
qebproduct.EntityName = EntityName.product.ToString();
qebproduct.ColumnSet = new AllColumns();
qebproduct.Attributes = new string[] { "statecode" };
qebproduct.Values = new string[] { ProductState.Active.ToString() };
WsAdapter ws = new WsAdapter();
//коллекция позиций прайс листа
BusinessEntityCollection bec = ws.Service.RetrieveMultiple(qeb);
//коллекция продуктов
BusinessEntityCollection becproduct = ws.Service.RetrieveMultiple(qebproduct);
//заполняем первую таблицу
foreach (productpricelevel pl in bec.BusinessEntities)
{
DataRow row = priceline.NewRow();
row["productid"] = pl.productid.Value;
row["name"] = pl.productid.name;
row["price"] = pl.amount.Value;
row["uomidname"] = pl.uomid.name;
priceline.Rows.Add(row);
}
//заполняем таблицу продуктов
foreach (product p in becproduct.BusinessEntities)
{
DataRow row = product.NewRow();
row["productid"] = p.productid.Value;
if(p.quantityonhand != null)
{
row["quantityonhand"] = p.quantityonhand.Value;
}
row["productnumber"] = p.productnumber;
product.Rows.Add(row);
}
//т.к. мы создали релейшно то столбцы количество и артикул заполнятся автоматически, возвращаем итоговую таблицу
return priceline;
#endregion
}
[699x210]