Очень часто возникает необходимость сделать так, чтобы лукап представлял нам уже отфильтрованные данные. Например такие, которые мы можем составить с помощью встроенного инструмента в MS CRM – «Расширенного поиска». Один из методов фильтрации я уже описывал здесь «Фильтрация в Microsoft Dynamics CRM 4.0«. На основе такого метода не получится выполнить сложную фильтрацию.

В данном посте я расскажу вам как осуществить такую фильтрации для лукапа с помощью FetchXml, сформировав fetch-запрос с помощью «Расширенного поиска».

Меняем файл lookupsingle.aspx (unsupported)

Первое, что необходимо сделать это изменить файл lookupsingle.aspx. Обычно он находится здесь CRMWeb\_controls\lookup\lookupsingle.aspx и в самом начале файла вставляем этот код:

<script type="text/javascript">
protected override void OnLoad( EventArgs e )
{
      base.OnLoad(e);
      crmGrid.PreRender += new EventHandler( crmgrid_PreRender );
}

void crmgrid_PreRender( object sender , EventArgs e )
{
    // As we don’t want to break any other lookups, ensure that we use workaround only if
    // search parameter set to fetch xml.
    if (crmGrid.Parameters["search"] != null && crmGrid.Parameters["search"].StartsWith("<fetch"))
   {
        crmGrid.Parameters.Add("fetchxml", crmGrid.Parameters["search"]);
       // searchvalue needs to be removed as it’s typically set to a wildcard ‘*’
        crmGrid.Parameters.Remove("searchvalue");
        // Icing on a cake - ensure that user cannot create new contact outside of the account
        // and then select it.
        this._showNewButton = false;
    }
}
</script>

Примечание: это неподдерживая кастомизация, не забудьте сделать копию оригинального файла lookupsingle.aspx

Используем расширенный поиск для составления нужного нам фильтра

Составляем необходимый фильтр с помощью «Расширенного поиска», фильтр может быть сколь угодно сложным. Я же рассмотрю пока что простой пример.

Например: Найти все контакты конкретной организации

Фильтр расширенного поиска

Фильтр готов! Жмем Найти. Если результат вас устраивает жмем F11 и в строку адреса вставляем следующий код:

javascript:alert(resultRender.FetchXml.value);

или этот

javascript:alert(document.all.FetchXml.value);

Получаем:

F11+popup

Прямо на этом окне (popup) жмете ctrl+c и весь код будет скопирован в буфер, после чего вставьте его в текстовый редактор, блокнот например.

Такой результат:

—————————

Сообщение с веб-страницы

—————————

<fetch version=»1.0″ output-format=»xml-platform» mapping=»logical» distinct=»false»><entity name=»contact»><attribute name=»do_accountbusinessunit»/><attribute name=»parentcustomerid»/><attribute name=»department»/><attribute name=»ownerid»/><attribute name=»jobtitle»/><attribute name=»do_city»/><attribute name=»fullname»/><attribute name=»emailaddress1″/><attribute name=»contactid»/><order attribute=»fullname» descending=»false»/><filter type=»and»><condition attribute=»parentcustomerid» operator=»eq» uiname=»11″ uitype=»account» value=»{CF5D35B3-C91E-DE11-B4A6-001517817114}»/></filter></entity></fetch>

—————————

ОК

—————————

Здесь присутствует очень много лишнего, оставляем только главное для нас. А именно: условия фильтрации: <filter type=»and»><condition attribute=»parentcustomerid» operator=»eq» uiname=»11″ uitype=»account» value=»{CF5D35B3-C91E-DE11-B4A6-001517817114}«/>, в котором наш гуид организации заменим на crmForm.all.do_accountid.DataValue[0].id  – это гуид, полученный из лукапа организации.

Вставляем следующий код с переработанным нашим фильтром.

var field1 = crmForm.all.do_contactid;
 field1.Disabled = false;
    // Ensure that search box is not visible in a lookup dialog
    field1.lookupbrowse = 1;

    field1.AddParam("search",
"<fetch mapping='logical'><entity name='contact'>"
+"<filter type='and'><condition attribute='parentcustomerid' operator='eq' uitype='account'  value='"
+crmForm.all.do_accountid.DataValue[0].id
+"'/></filter></entity></fetch>");

Минус данного метода:

  • приходится править оригинальный системный файл
  • исчезает окно поиска по отфильтрованным записям, поэтому если записей возвращается очень много будет неудобно искать нужную

Плюсы:

  • Фильтрация очень проста в реализации. Основная часть «ложится на плечи» Расширенного поиска, который, по сути, формирует нужный нам Fetch-запрос.
  • Метод покрывает бОльшую часть задач по фильтрованным лукапам

Использовались эти материалы:

http://crm.georged.id.au/post/2008/02/16/Filtering-lookup-data-in-CRM-4.aspx

http://ronaldlemmen.blogspot.com/2009/02/using-advanced-find-for-fetchxml.html