Кастомизация
12
Дек
0

Фильтрация лукапов в CRM 2011

Объектная модель форм CRM 2011 позволяет в некоторых границах управлять отображаемой информацией в диалоговых полях Lookup. Всего имеется три метода для управления полями типа Lookup:

addCustomView Добавляет новое Представление в список выбора Представлений диалогового окна лукапа.
setDefaultView Задает дефолтное Представление для Диалогового окна лукапа. Методу необходимо передать GUID этого представления.
getDefaultView Возвращает GUID текущего дефолтного Представления диалогового окна лукапа.

Как Вы уже поняли, фильтровать отображаемые данные мы будем с помощью метода addCustomView. В целом для этого нужно выполнить следующие шаги:

  • Определить FetchXML запрос;
  • Определить макет Представления;
  • «Прикрепить» новое Представление к лукапу.

Рассмотрим это на примере…

Задача: отфильтровать записи Контактов в лукапе Основной контакт на форме Организации. Для этого повесим на онлоад формы такой скрипт:

function filterLookup() {
    var viewId = "{C0F1DD64-1BF3-450D-BCDE-DF4732DE1606}"; // "Генерируем" ID для нового представления
    var entityName = "contact"; // Имя объекта
    var viewDisplayName = "Директора"; // Задаем название нового представления
    var setDefault = true; // Определяем, будет ли наше новое представление деолтным при открытии диалогового окна лукапа

    // Create the Advanced find query and download the fetch xml
    var fetchXml = "" +
    "<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>" +
        "<entity name='contact'>" +
            "<attribute name='fullname' />" +
            "<attribute name='contactid' />" +
            "<order attribute='fullname' descending='false' />" +
            "<filter type='and'>" +
                "<condition attribute='jobtitle' operator='eq' value='Директор'/>" +
            "</filter>" +
        "</entity>" +
    "</fetch>";

    // Определяем представление фильтрованного лукапа
    var layoutXml = "" +
    "<grid name='resultset' object='1' jump='name' select='1' icon='1' preview='1'>" +
        "<row name='result' id='contactid'>" +
            "<cell name='fullname' width='100' />" +
            "<cell name='jobtitle' width='100' />" +
        "</row>" +
    "</grid>";

    // Задаем имя лукапа и задаем кастомное Представление для него
    var lookupControl = Xrm.Page.ui.controls.get('primarycontactid');
    lookupControl.addCustomView(viewId, entityName, viewDisplayName, fetchXml, layoutXml, setDefault);

    // Отключаем смену Представлений в диалоговом окне лукапа
    // document.getElementById("primarycontactid").disableViewPicker = 1;
    var primСontact = crmForm.all["primarycontactid"];
    primСontact.setAttribute("disableViewPicker", "1")
}

Что здесь происходит:

  • Сначала мы задаем в виде строки произвольный GUID, который будет использоваться в качестве идентификатора для нашего Представления. Этот GUID взят абсолютно «с потолка»;
  • Задаем имя объекта, записи которого будут отображаться в новом Представлении;
  • Задаем имя нового Представления, которое будет отображаться в ниспадающем списке в диалоговом окне лукапа;
  • Определяем, будет ли новое Представление дефолтным, при открытии диалогового окна лукапа (также по дефолтному окну лукапа фильтруются записи при автозаполнении лукапа);
  • Задаем FetchXML запрос. Тут мы просто отбираем Контакты, которых Должность = Директор;
  • Определяем макет Представления с двумя столбцами;
  • Получаем ссылку на интересующий нас лукап и с помощью метода addCustomView цепляем к нему новое Представление;
  • С помощью «исторического» способа из CRM 4 отключаем возможность менять Представления в диалоговом окне лукапа.

Ну, и осталось вызвать функцию filterLookup в нужном месте.


Примечания:

  • Чтобы иметь возможность прикрепить новое Представление к лукапу, в его настройках в пункте «Выбор представления» должна быть выбрана одна из следующих опцией:
    • Показать все представления;
    • Показать выбранные представления.

    Если в этой опции будет выбрано «Выключить», то при добавлении нового Представления в лукап Вы не сможете его выбрать, поскольку всегда будет отображаться только дефолтное Представление заданное в настройках этого лукапа. Соответственно тут нельзя говорить о полной фильтрации: даже если выбрать «Показать выбранные представления» и указать в нем только одно Представление и добавить к лукапу новое Представление с помощью кода, то всегда будет выбор как минимум двух Представлений. Тут у нас есть два варианта:

    • Использовать неподдерживаемый способ и отключить возможность выбирать Представления в диалоговом окне лукапа:
      var lkpCtrl = crmForm.all["<lookup_name>"];
      lkpCtrl.setAttribute("disableViewPicker", "1")
      

      или

      document.getElementById(["<lookup_name>").disableViewPicker = 1;
      
    • Задать фильтрацию того системного Представления, которое Вы выберите при указании опции «Показать выбранные представления»;
  • Незабываем, что строить FetchXML запросы теперь можно с помощью расширенного поиска;
  • Функция автозаполнения будет работать в соответствии с заданным по умолчанию Представлением. В том числе и заданным с помощью кода.
Комментарии (0)

*

code