Расширенная функциональность
02
Апр
5

CRM 2015 или найди 10 отличий… Разработка

Вместе c CRM 2015 вышел и новый SDK. Скачать его можно тут: http://www.microsoft.com/en-us/download/details.aspx?id=44567. Вот какие нововведения нас ждут:

C#

Программный Расчет полей Свертки

Как Вы уже знаете, пересчет значение поля Свертки происходит в нескольких случаях. Также его можно выполнить программно:

// Запрос на перерасчет поля Свертки
CalculateRollupFieldRequest crfr = new CalculateRollupFieldRequest
{
    Target = new EntityReference("new_class", classId), // Целевой объект и запись
    FieldName = "new_totalstudents" // Поле Свертки
};

// Выполняем запрос
CalculateRollupFieldResponse response = (CalculateRollupFieldResponse)service.Execute(crfr);

Кастомный расчет цен

Механизм расчета цен и скидок в CRM можно полностью перенести на плечи кастомного кода. Стандартный механизм расчета цен отключается в настройках CRM, а подробный пример кастомного расчета цен можно посмотреть на MSDN: https://msdn.microsoft.com/en-us/library/dn817877.aspx

Новые сообщения

Deployment Service и Organization Service обзавелись новыми очень интересными сообщениями:

Сообщение Описание
AddCrmDatabaseRequest Добавляет базу данных CRM в Ваше развертывание из бэкапа БД или из отделенной базы данных.
DeleteOrganizationRequest Удаляет организацию CRM.
RetrieveMonitoringResultsRequest Возвращает результаты работы сервиса мониторинга.
RetrieveUserMappingRequest Возвращает информацию о сопоставлении существующих пользователях организации. Вы можете ее использовать, чтобы сопоставить пользователей из текущей организации с пользователями из целевой организации.

Organization Service

RetrieveCurrentOrganizationRequest – возвращает информаицю об организации из Organization Service . В предыдущих версиях CRM эту же информацию можно было получить только из Discovery Service.

2007 SDK SOAP Endpoint

Этой конечной точки больше не существует. Но Вы пока можете использовать конечную точку от CRM 2013.

Отмененные

Ряд сообщений SDK были помечены к удалению в будущих версиях CRM. Поэтому, если Вы планируете обновляться до следующих версий CRM, то Вам потихоньку нужно от них избавляться. Полный перечень удаляемых сообщений можно посмотреть здесь: https://community.dynamics.com/crm/b/crmbacklog/archive/2015/02/11/crm-2015-new-and-deprecated-messages-in-the-organization-web-service.aspx

JavaScript

Процессы

Пространство имен Xrm.Page.data и Xrm.Page.ui обзавелись новыми подпространствами (process) для управления контролом Процессов.

Описание Код
Сворачивание области Процесса
Xrm.Page.ui.process.setDisplayState("collapsed"); // "expanded"
Скрытие области Процесса
Xrm.Page.ui.process.setVisible(false);
Возвращает информацию о включенных Процессах, которые пользователь может выбрать
Xrm.Page.data.process.getEnabledProcesses(callbackFunction(enabledProcesses));
Возвращает активный Процесс
var procObj = Xrm.Page.data.process.getActiveProcess();
procObj.getId();
procObj.getName();
procObj.getStages(); // Возвращаем коллецию стадий
procObj.isRendered(); // Проверяем отрисован ли процесс
Устанавливает активный Процесс
Xrm.Page.data.process.setActiveProcess(processId, callbackFunction);
Возвращает активную стадию
var actStg = Xrm.Page.data.process.getActiveStage();
actStg.getCategory().getValue(); // Получаем категорию
actStg.getEntityName();
actStg.getId();
actStg.getName();
actStg.getStatus(); // Возвращает "active" или "inactive"

var stpColl = actStg.getSteps(); // Возвращаем коллекцию шагов
stpColl.forEach(function (step, i) {
    step.getName(); // Возвращает имя шага
    step.getAttribute(); // Возвращает логическое имя шага
    step.isRequired(); // Требует ли шаг заполнения
})
Устанавливает активную стадию
Xrm.Page.data.process.setActiveStage(stgGUID, callbackFunction);

// В функцию передается результат смены стадии
function onSetActiveStage(returnStatus) {
    switch (returnStatus) {
        case "success":
            break;
        case "crossEntity":
            alert("crossEntity!");
            break;
        case "unreachable":
            alert("unreachable stage");
            break;
        case "invalid":
            alert("invalid stage");
            break;
    }
}
Перемещение на следующий этап
Xrm.Page.data.process.moveNext(callbackFunction);

// В функцию передается результат смены стадии
function onMoveNext(returnStatus) {
    switch (returnStatus) {
        case "success":
            break;
        case "crossEntity":
            alert("crossEntity!");
            break;
        case "end":
            alert("Last stage");
            break;
        case "invalid":
            alert("invalid stage");
            break;
    }
}
Перемещение на предыдущий этап
Xrm.Page.data.process.movePrevious(callbackFunction);
Добавление/удаление обработчиков событий при смене Стадии
Xrm.Page.data.process.addOnStageChange(funcionName);
Xrm.Page.data.process.removeOnStageChange(funcionName);

Примечание: через интерфейс таких обработчиков не задать.

Добавление/удаление обработчиков событий при выборе Стадии
Xrm.Page.data.process.addOnStageSelected(funcionName);
Xrm.Page.data.process.removeOnStageSelected(functionName);

Примечание: через интерфейс таких обработчиков не задать.

Возвращает информацию об Этапах:
— Этапы, которые уже были завершены;
— Текущий активный Этап;
— Допустимые этапы, доступные для текущего активного Этапа.
var activePathCollection = Xrm.Page.data.process.getActivePath();

activePathCollection.forEach(function (stage, n) {
    stage.getName();
})

Вся «линейка» методов и свойств пространства имен Xrm.Page.data.process представлена на картинке:

Удалены…

… следующие JS-методы:

  • context.getServerUrl
  • context.isOutLookClient
  • context.isOutlookOnline

FetchXML

Новые операторы

С введением новой функции иерархий в CRM 2015 FetchXML обзавелся новыми операторами, которые позволяют отбирать данные в рамках какой-либо иерархии. Причем эти запросы имеют пределы рекурсии, чтобы смягчить возможные проблемы производительности или бесконечного цикла.

Оператор Описание Предел рекурсии
Сворачивание области ПроцессаAbove Возвращает все записи выше по иерархии, относительно той, на которую ссылаются. 100
AboveOrEqual Возвращает запись, на которую ссылаются, а также все записи выше по иерархии. 100
Under Возвращает все записи ниже по иерархии, относительно той, на которую ссылаются. 10
UnderOrEqual Возвращает запись, на которую ссылаются, а также все записи ниже по иерархии. 10
NotUnder Возвраты все записи не ниже записи, на которую ссылаются в иерархии. 10
eq-owneduseroruserhierarchy Используется в иерархической модели безопасности: текущей пользователь или его подчиненная иерархия.
eq-useroruserhierarchyandteams Используется в иерархической модели безопасности: текущей пользователь или его Рабочая группа или его подчиненная иерархия или их Рабочие группы.

Пример:

<fetch version="1.0" output-format="xml-platform" mapping="logical" distinct="false"> 
  <entity name="account"> 
    <attribute name="name" /> 
    <attribute name="accountid" /> 
    <order attribute="name" descending="false" /> 
    <filter type="and"> 
      <condition attribute="accountid" operator="eq-or-under" value="{7696AC99-3E76-E411-810A-E83935C2E3BA}" /> 
    </filter> 
  </entity> 
</fetch>

В C# все эти операторы имеют эквивалент, который может использоваться при составлении запросов QueryExpression.

Примечание: в Расширенном поиске представлены не все операторы, доступные через код.

Агрегация дочерних записей

Используя в FetchXML запросе в атрибут rowaggregate значение CountChildren можно подсчитать количество дочерних записей. Пример:

<fetch distinct='false' no-lock='false' mapping='logical'>
  <entity name='account'>
    <attribute name='name' />
    <attribute name='accountid' />
    <attribute name='accountid' rowaggregate='CountChildren' alias='AccountChildren'/>
    <filter type='and'>
      <condition attribute='accountid' operator='under' value='{0}' />
    </filter>
  </entity>
</fetch>

Отчеты

Свершилось! Нам больше не нужно писать отчеты в допотопной Visual Studio 2008. Теперь это можно делать в чуть более продвинутой Visual Studio 2010 и в почти новейшей Visual Studio 2012 🙂

Чтобы писать отчеты в Visual Studio 2012 Вам понадобится SQL Server Data Tools — Business Intelligence for Visual Studio 2012. После его установки в VS станут доступны шаблоны Business Intelligence.


P.S. Хотя в документации об этом ни слова, отчет, написанный в VS 2013, CRM нормально скушал.

Комментарии (5)
  • Андрей 02.04.2015

    Видать чтото вы упустили, Вячеслав. Я разрабатываю отчёты в 2010 студии ещё с времён 2011 CRM.

  • slivka_83 02.04.2015

    Может быть каким то хакерским способом. VS 2010 упоминается начиная только с CRM 2013 — http://www.microsoft.com/en-us/download/details.aspx?id=40322 — да и то Business Intelligence Development Studio нужно ставить от 2008 скуля, что подразумевает установку 2008 студии.
    А в CRM 2011 есть только отсылка к 2008 студии — https://msdn.microsoft.com/en-us/library/gg327981%28v=crm.5%29.aspx.

  • Андрей 02.04.2015

    C CRM 2011 начал работать с 2012 года, когда уже был доступен SQL 2012. BIDS для SQL 2012 — на основании движка VS 2010. Оттуда и ноги растут. А мануалы и практика зачастую особенно в случае MS расходятся.

  • salex 02.04.2015

    Привет! Не подскажете, почему в VS2013 + CRM 2015 Report Authoring Extension при создании датасорса в списке невозможно выбрать тип коннекшена Fetch? Судя по последнему скриншоту, Вам удалось создать репорт в VS2013, я тоже хочу 🙂

  • slivka_83 02.04.2015

    Добрый день.
    На скрине у меня VS 2012 (хотя и в VS 2013 отчет создать у меня получилось). И Report Authoring Extension я не ставил. И Fetch-отчеты никогда не писал (а если повезет, то никогда и не придется 🙂 ). Так что по Вашему вопросу не подскажу.

*

code