• Авторизация


1 шаг работы с Microsoft CRM. Часть 2 27-08-2008 09:41 к комментариям - к полной версии - понравилось!


В прошлый раз мы поставили задачу, с научиться использовать веб сервисы 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]
вверх^ к полной версии понравилось! в evernote


Вы сейчас не можете прокомментировать это сообщение.

Дневник 1 шаг работы с Microsoft CRM. Часть 2 | Чарубаэль - Дневник | Лента друзей Чарубаэль / Полная версия Добавить в друзья Страницы: раньше»