Аддоны
28
Ноя
2

Аддон Мульти-поиск

Компонент Мульти-поиск является довольно типичным примером усложненного запроса. Мульти-поиск позволяет пользователю вводить значения для одного или более полей и искать совпадения по этим критериям. Основное отличие от быстрого поиска состоит в том, что здесь обеспечивается поиск различных критериев по различным полям.

  • Аддон представляет собой кастомную страницу интегрированную с Microsoft Dynamics CRM. В нем заложены следующие функции:
  • Может быть использован для любого объекта CRM, включая кастомные объекты;
  • Позволяет производить поиск по нескольким текстовым полям, включая поля связанных объектов;
  • Поиск по различным полям осуществляется по условию И. Т.е. если пользователь введет значения в больше чем одно поле, то в результат попадут строки совпавшие по всем введенными полям;
  • Чтобы инициировать поиск достаточно нажать Enter;
  • Представление результата поиска – родное CRM’ное представление, которое имеет все те же функциональные возможностей;
  • Никакого серверного кодирования – только JavaScript.

Установка

  • Решение состоит на HTML-страницы с JavaScript’ом и таблицей стилей CSS. Скачайе multisearch.zip и разрархивируйте эти файлы в папку <сайт CRM>\ISV;
  • Откройте расширенный поиск и нажмите Ctrl + N – это откроет новое окно расширенного поиска, но уже с адресной строкой. Составьте нужный запрос, отберите нужные поля и нажмите Найти. Отобразятся результаты поиска – введите в адресной строке:
    javascript:void( new function(){ prompt("Fetch Parameters:",getFetchParams());function getFetchParams(){ return "FetchXml:\n" + advFind.FetchXml + "\n\n" + "LayoutXml:\n" + advFind.LayoutXml + "\n\n" + "EntityName:\n" + advFind.EntityName + "\n\n" + "DefaultAdvancedFindViewId:\n" + advFind.DefaultAdvancedFindViewId } } )
    

    В выводе Вы получите примерно такие строки:

    FetchXml:
    <fetch version="1.0" output-format="xml-platform" mapping="logical" distinct="false"><entity name="contact"><attribute name="fullname"/><attribute name="parentcustomerid"/><attribute name="telephone1"/><attribute name="emailaddress1"/><attribute name="contactid"/><order attribute="fullname" descending="false"/><filter type="and"><condition attribute="ownerid" operator="eq-userid"/><condition attribute="statecode" operator="eq" value="0"/></filter></entity></fetch>
    
    LayoutXml:
    <grid name="resultset" object="2" jump="fullname" select="1" icon="1" preview="1"><row name="result" id="contactid"><cell name="fullname" width="300" /><cell name="emailaddress1" width="150" /><cell name="parentcustomerid" width="150" /><cell name="telephone1" width="125" /></row></grid>
    
    EntityName:
    contact
    
    DefaultAdvancedFindViewId:
    {00000000-0000-0000-00AA-000000666400}
    

    Скопируйте их куда-нибудь – они нам потом понадобится;


  • Откройте файл Search.htm в текстовом редакторе и замените в нем следующие переменные:
    • fetchBase – скопируйте в эту переменную значение FetchXml полученное в предыдущем щаге, но только до элемента <filter type=»and»>. Т.е. если у Вас такой FetchXml:
      <fetch version="1.0" output-format="xml-platform" mapping="logical" distinct="false"><entity name="contact"><attribute name="fullname"/><attribute name="parentcustomerid"/><attribute name="telephone1"/><attribute name="emailaddress1"/><attribute name="contactid"/><order attribute="fullname" descending="false"/><filter type="and"><condition attribute="ownerid" operator="eq-userid"/><condition attribute="statecode" operator="eq" value="0"/></filter></entity></fetch>

      то, в переменную fetchBase следует подставить:

      <fetch version="1.0" output-format="xml-platform" mapping="logical" distinct="false"><entity name="contact"><attribute name="fullname"/><attribute name="parentcustomerid"/><attribute name="telephone1"/><attribute name="emailaddress1"/><attribute name="contactid"/><order attribute="fullname" descending="false"/>
    • fetchLayout – посдставьте сюда LayoutXml полученное на предыдущем шаге;
    • fetchAccounts.Entity – имя объекта в котором производится поиск;
    • fetchAccounts.QueryId – скопируйте DefaultAdvancedFindViewId с предыдущего шага.
  • Теперь нужно сконфигурировать поля, которые Вы хотите использовать для поиска. По умолчанию есть шесть полей, но Вы можете добавить дополнительный поля. Для этого ячейке с заголовком необходимо присвоить класс fieldLabel, а ячейке с полем ввода класс field (проще всего скопировать и подправить).
    Чтобы указать, что поиск нужно производить по какому-либо полю основного объекта, то просто укажите в атрибуте id имя схемы этого поля в CRM. Например в строке:

    <td class="field"><input type="text" id="fullname" onkeypress="checkEnter(event);" /></td>

    Осуществляется поиск по полю fullname (полное имя).
    А чтобы осуществить поиск по связанному объекту нужно прописать в инпуте атрибуты id, linkedentity и linkedfield. Где:

    • id – имя схемы поля связанного объекта (по которому производится поиск);
    • linkedentity – имя связанного объекта;
    • linkedfield – имя лукапа связанного объекта, через который происходит его связь с основным объектом.

    Например, в строчке:

    <td class="field"><input type="text" id="name" onkeypress="checkEnter(event);" linkedentity="opportunity" linkedfield="customerid" /></td>

    происходит поиск по полю name, связанного объекта opportunity (Возможная сделка), а customerid это лукап через который связанный объект (в данном случаи это Возможная сделка) связан с основным объектом (в данном случаи это Контакт).
    Столбцы таблицы и строки могут быть конфигурированы как угодно. Однако, строго рекомендуется иметь по крайней мере две строки и сохранить Ясное и Вкладки поиска на поле младшего разряда каждой строки.


  • Экспортируйте SiteMap (Схема узла) и откройте его в текстовом редакторе. Добавьте в какую-либо область такую строчку:
    <SubArea Id="Search" Url="/../ISV/Search.htm?orgName=superfirma" Icon="/_imgs/ico_16_form.gif" Title="Мульти-поиск" />

    И замените в ней название организации на Вашу.
    Импортируйте обратно и пробуйте 🙂


Комментарии (2)
  • NatK 28.11.2009

    Добрый день. Подскажите, пожалуйста, каким образом можно устранить ошибку, возникающую при поиске по полям связанных объектов. При поиске по полям объекта все работает нормально, но если искать по полю связанного объекта (например, по фамилии ответственного за данный объект пользователя), то возникает следующая ошибка:
    Error Description:
    Server was unable to process request.

    Error Details:
    Server was unable to process request.

    Full Stack:
    [CrmException: Server was unable to process request.]
    в Microsoft.Crm.Application.Controls.AppGridUIProvider.Render(HtmlTextWriter output)
    в Microsoft.Crm.Application.Components.UI.DataGrid.RenderData(HtmlTextWriter output)
    в Microsoft.Crm.Application.Components.UI.DataGrid.RenderInnerHtml(HtmlTextWriter output)
    в Microsoft.Crm.Application.Components.UI.DataGrid.Render(HtmlTextWriter output)
    ……

    В логах:
    «System.Web.HttpUnhandledException».
    Error Number: 0x80631110
    Error Message: Server was unable to process request.
    Error Details: Server was unable to process request.
    Source File: Not available
    Line Number: Not available
    Request URL: http://crm/AdvancedFind/fetchData.aspx
    Stack Trace Info: [CrmException: Server was unable to process request.]
    в Microsoft.Crm.Application.Controls.AppGridUIProvider.Render(HtmlTextWriter output)
    в Microsoft.Crm.Application.Components.UI.DataGrid.RenderData(HtmlTextWriter output)
    в Microsoft.Crm.Application.Components.UI.DataGrid.RenderInnerHtml(HtmlTextWriter output)
    …….

    Как это можно исправить?

  • slivka_83 28.11.2009

    Может быть Вы неправильно написали сам запрос? можно его увидеть? Чтобы воспроизвести 🙂

*

code