Очень часто возникает необходимость сделать так, чтобы лукап представлял нам уже отфильтрованные данные. Например такие, которые мы можем составить с помощью встроенного инструмента в 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);
Получаем:

Прямо на этом окне (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

06.10.2009 в 12:01
Спасибо за статью! Только в приведенном коде для файла lookupsingle.aspx, вероятно, ошибка. Код ведь серверный на C# приведен, сверху должно быть
06.10.2009 в 12:02
Обрезалось предыдущее сообщение… у скрипта должен стоять параметр runat=server, вместо атрибута яваскрипта..
06.10.2009 в 12:09
Не обязательно, достаточно разместить данный код именно в начале файла. Попробуйте