День добрый!
Сегодня мы попробуем создать первое приложение для MS CRM.
За основу взял следующую задачу.
Задание
В CRM практически все операции осуществляются через открытие формы для создания или изменения объекта.
Это неудобно при массовых операциях.
Например, нам нужно добавить к заказу несколько позиций - товаров и услуг. Делать это каждый раз заново долго, если у нас все настроено по умолчанию, и не нужно менять ничего в карточке продукта для заказа, то мы можем упросить задачу пользователя. Для этого мы создадим форму - массовое добавление продуктов к заказу.
Цель формы - она запускается из карточки заказа, получив код заказа запрашивает прайс лист который для него указан и выводит все продукты из прайс листа, с указанием количества доступного на складе.
Сама задача не самая сложная но и не самая простая. Чтобы ее выполнить нужно
-подключиться к веб сервису системы
-знать требуемые объекты для выполнения задачи
-знать как работать с запросами в CRM.
-знать как интегрировать полученное решение в систему.
Пока мы выполним первую задачу, но чтобы был виден хоть какой то результат посмотрим вкратце суть 2 и 3.
1 сложность. Нам нужно работающее решение не только для заказа но и например коммерческого предложения. Поэтому нужно сразу учесть возможность этого.
2 сложность. Цены содержатся в таблице позиции по прайс листу, а количество в другой таблице - продукты.
Либо будем делать сложный запрос либо придется использовать SQL.
Поэтому на первом этапе мы сделаем следующее:
Зайдем в систему,
По коду заказа узнаем его прайс лист
Загрузим все позиции прайс листа.
Итак,
1.
создаем новый проект в Visual Studio. Тип - веб сайт.
2.
Добавляем веб службу
На закладке Solution, добавляем ссылку на веб службу:
http://
<servername>:<port>/mscrmservices/2007/crmservice.asmx, где servername и порт - название вашей машины с серверной частью Crm, и порт на котором стоит Crm.
У меня почему то возникло сообщение что нужно запрашивать http://
<servername>:<port>/mscrmservices/2007/crmservicewsdl.aspx, что я и сделал.
Укажите псевдоним веб службы, советую CrmSdk, и нажмите кнопку добавить веб службу.
3. Создайте класс - адаптер к веб службе, это удобно чтобы каждый раз не писать код.
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using CrmSdk;
/// <summary>
/// Summary description for WsAdapter
/// </summary>
public class WsAdapter
{
public CrmService Service;
public void Init()
{
//аутентификация
CrmAuthenticationToken token = new CrmAuthenticationToken();
//тип аутентификации и - Active Directory authentication
token.AuthenticationType = 0;
//т.к. у нас несколько организаций на сервере, то нужно указать нужную. добавляем в web.config
//название организации и считываем его здесь
token.OrganizationName = System.Configuration.ConfigurationManager.AppSettings["OrgName"];
//создаем веб службу црм
Service = new CrmService();
//указываем ссылку на веб службу
Service.Url = System.Configuration.ConfigurationManager.AppSettings["CrmSdk.CrmServiceWsdl"];
//указываем аутентификацию
Service.CrmAuthenticationTokenValue = token;
//явно определяем учетную запись под которой заходим, если нужно использовать текущую то написали бы
//System.Net.CredentialCache.DefaultCredentials;
Service.Credentials = new System.Net.NetworkCredential("CRMGuest","2675832145","crmdev1");
}
public WsAdapter()
{
Init();
}
}
Теперь вам достаточно создавать объект класса WsAdapter, и использовать его поле - Service.
Рассмотрим простейший пример. Мы получили код заказа, и нам нужно узнать какой прайс лист в нем указан.
Для этого мы используем метод Retrieve, аргументами будут код заказа, название типа объекта заказ, а также столбцы которые мы должны получить. С учетом этого получим следующий код:
//грузим продукты для заказа\компредложения по прайс листу
void LoadProductsForPrice(Guid objectid, string objecttypename)
{
if (objectid != Guid.Empty)
{
//по идее лучше добавить такой вызов в каждую ветку -
//меньше вероятности что возникнет ошибка, напрмер если указано несуществующий тип сущности
//создаем веб службу
WsAdapter ws = new WsAdapter();
//делаем запрос объекта - указываем название типа объекта его код а также требуемые столбцы
BusinessEntity be = ws.Service.Retrieve(objecttypename, objectid, new AllColumns());
//код прайс листа который нам нужно получить
Guid pricelevelid = Guid.Empty;
//полученный объект be - нужно привести к нужному типу, чтобы мы могли обратиться к полю где хранится прайс лист
switch (objecttypename)
{
//если заказ
case "salesorder":
salesorder so = (salesorder)be;
if (so.pricelevelid != null)
pricelevelid = so.pricelevelid.Value;
break;
//если коммерческое предложение
case "quote":
quote quote = (quote)be;
if (quote.pricelevelid!= null)
pricelevelid = quote.pricelevelid.Value;
break;
default:
LabelInfo.Text = "Неизвестен тип объекта к которому нужно добавлять товары\\услуги";
break;
}
if (pricelevelid != Guid.Empty)
{
//запрашиваем все возможные продукты из прайс листа для данного ком предложения
GVProducts.DataSource = GetProductsForPrice(pricelevelid);
//обновляем сетку
GVProducts.DataBind();
}
}
else
{
LabelInfo.Text = "Неизвестен объект к которому нужно добавлять товары\\услуги";
}
}
Функция GetProductsForPrice - это запрос по прайс листу. Ее мы рассмотрим в следующий раз. А пока результат запроса:
(названия продуктов странные - тестовая база)
[698x158]