В третьей версии мной часто применялся фильтр для записей, доступных из поля Lookup. Это позволяло, например, ограничить возможность выбора главного контакта организации из списка тех контактов, у которых указанна эта организация.

К сожалению это была неподдерживаемая кастомизация и как каждая неподдерживаемая кастомизация рисковала перестать работать в 4й версии. Что в принципе и случилось. К счастью не все потеряно :). Наши западные коллеги обнаружили, что CRM теперь просто не передает фильтр в диалог LookupSingle и это можно “вылечить” исправлениями в файле CRMWeb_controlslookuplookupsingle.aspx.

Рассмотрим способ использования фильтров в Microsoft CRM 4.0 на примере фильтрации контактов, о которой я писал выше:

1. Необходимо вставить в CRMWeb_controlslookuplookupsingle.aspx следующий код вверху файла.

<script runat=”server”>
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
crmGrid.PreRender += new EventHandler(crmGrid_PreRender);
}

void crmGrid_PreRender(object sender, EventArgs e)
{
if( Request["search"] + “” != “” && Request["browse"] + “” == “1″ )
{
crmGrid.AddParameter(”fetchxml”, Request["search"] );
crmGrid.Parameters.Remove(”searchvalue”);
}
}
</script>

2. В форме организации на событие OnLoad вставить следующий код :

var field = crmForm.all.primarycontactid;
if(crmForm.ObjectId == null)
{
field.Disabled = true;
}
else
{
field.lookupbrowse = 1;

field.AddParam(”search”,
“<fetch mapping=’logical’><entity name=’contact’>”
+ “<filter><condition attribute=’parentcustomerid’ operator=’eq’ value=’”
+ crmForm.ObjectId
+ “‘ /></filter></entity></fetch>”);
}

Единственное отличие этого кода от того, что использовался в 3ке - теперь мы используем параметр search для передачи фильтра.

Напоминаю, что это неподдерживаемая кастомизация и вы используете ее на свой страх и риск.