Кастомизация
13
Фев
24

Нестандартные представления

Предположим Вам нужно вывести в представление Контакты, которые проживают в той же стране, что и текущий пользователь.

Ни через Расширенный поиск, ни через редактор общих представлений Вы такой запрос не построите, т.к. они поддерживает только проверку наличия связи между объектами.

Но в целом FetchXml позволяет создавать подобные запросы:

<fetch mapping="logical">
  <entity name="contact">
    <attribute name="fullname" />
    <link-entity name="systemuser" from="address1_country" to="address1_country">
      <filter>
        <condition attribute="systemuserid" operator="eq-userid" />
      </filter>
    </link-entity>
  </entity>
</fetch>

Но Вы можете создать подобное представление двумя способами…

Быстрый и не поддерживаемый

  • Создайте новое представление для объекта Контакт (или можете использовать какое-либо существующее);
  • Откройте SQL Server Management Studio и Выполните такой SQL-запрос:
    -- Обновляем Fetch-запрос
    update dbo.UserQueryBase -- для общего представления используйте dbo.SavedQueryBase 
    set FetchXml = '<fetch mapping="logical"><entity name="contact"><attribute name="address1_country" /><attribute name="fullname" /><link-entity name="systemuser" from="address1_country" to="address1_country"><filter><condition attribute="systemuserid" operator="eq-userid" /></filter></link-entity></entity></fetch>'
    where Name = 'Контакты из той же страны' -- Название представления
    
    -- Обновляем столбцы
    update dbo.UserQueryBase -- для общего представления используйте dbo.SavedQueryBase 
    set 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="address1_country" width="150" /></row></grid>'
    where Name = 'Контакты из той же страны' -- Название представления
    

    В котором замените имя представления на Ваше, а также поменяйте FetchXml-запрос и LayoutXml (столбцы которые хотите видеть в представлении) на Ваши;

  • Готово, можете идти смотреть на Ваше представление 🙂



Долгий и поддерживаемый

  • Содайте в Visual Studio консольное приложение, подключите к нему CRM’ные сборки:
    • Microsoft.Crm.Sdk.dll
    • Microsoft.Crm.SdkTypeProxy.dll

    и:

    • System.Web.Services
  • Поместите в главное окно такой код:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    using Microsoft.Crm.Sdk;
    using Microsoft.Crm.SdkTypeProxy;
    using Microsoft.Crm.Sdk.Query;
    using System.Net;
    using System.Web.Services;
    
    namespace ConsoleApplication2
    {
        class Program
        {
            static void Main(string[] args)
            {
                // Конфигурируем CrmService
                CrmAuthenticationToken myToken = new CrmAuthenticationToken();
                myToken.OrganizationName = "superfirma";
                myToken.AuthenticationType = 0;
                CrmService myService = new CrmService();
                myService.Credentials = System.Net.CredentialCache.DefaultCredentials;
                myService.Url = "http://win-n22hj23d1b1/MSCrmServices/2007/CrmService.asmx";
                myService.CrmAuthenticationTokenValue = myToken;
    
                // Составляем запрос для создания нового представления
                userquery q = new userquery(); // Для общего представления используйте savedquery
                q.name = "Контакты из моей страны";
                q.returnedtypecode = "contact";
                q.querytype = new CrmNumber();
                q.querytype.Value = 0;
    
                q.fetchxml = @"<fetch mapping=""logical""><entity name=""contact""><attribute name=""address1_country"" /><attribute name=""address1_stateorprovince"" /><attribute name=""fullname"" /><link-entity name=""systemuser"" from=""address1_country"" to=""address1_country""><filter><condition attribute=""systemuserid"" operator=""eq-userid"" /></filter></link-entity></entity></fetch>";
                q.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=\"address1_country\" width=\"150\"/><cell name=\"parentcustomerid\" width=\"150\"/><cell name=\"emailaddress1\" width=\"150\"/><cell name=\"telephone1\" width=\"125\"/></row></grid>";
    
                // Выполняем запрос
                myService.Create(q); 
            }
        }
    }
    

    Этот код подключается к MS CRM, определяет новое пользовательское представление и отправляет запрос на его создание в CRM. Как и для предыдущего случая Вам необходимо изменить fetchxml и layoutxml;

  • Запустите проект: нажмите F5 или щелкните по зеленой кнопке на панели инструментов. После того как он отработает, новое представление появится в списке представлений объекта Контакт.



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


Комментарии (24)
  • Дмитрий 13.02.2011

    А для таких представлений расширенный поиск, экспорт в Excel и другие стандартные возможности будут работать?

  • Дмитрий 13.02.2011

    В CRM есть такой «зверь» как Price List Item, который не поддаётся кастомизации и для которого нельзя сделать представления и т.п. С помощью таких нестандартных представлений можно сделать представление, в котором выведена такая информация:
    1. Продукт.Название
    2. Продукт.Поле1
    3. Продукт.Поле2
    4. Позиция прайс-листа.Стоимость
    То есть несколько полей из объекта «Продукт» и стоимость этого продукта в определённом прайс-листе (пусть прайс-лист будет даже «зашит» в запросе). Стандартными средствами это сделать не получается.

  • slivka_83 13.02.2011

    1. Для таких представлений не будет работать Расширенный поиск, фильрация по буквам, про остальное не знаю (нада проверять);
    2. Теоретически если можно построить Fetch-запрос, то и можно вывести в представлении, но опять таки же нада проверять… 🙂

  • Дмитрий 13.02.2011

    А есть возможность создать таким образом системное представление, которое будет доступно всем польщователям?

  • slivka_83 13.02.2011

    Можно 🙂
    Для этого нада править в БД табличку SavedQueryBase, а программироать объект savedquery 🙂

  • Николай 13.02.2011

    Может немного не по теме, но также связано с кастомизированием стандартных представлений.

    Проблема в следующем, нужно сделать представление эккаунтов, по которым нету никаких действий. Обратная проблема (отобрать эккаунты, у которых есть хоть какое-нибудь действие ) решается достаточно просто и средствами Расширенного поиска. Эту пытаюсь решить уже два дня простым способом, не выходит:(
    Visual Studio запускать уж очень не хочется. C помощь FetchXML решить ее также не удалось.
    Может быть у кого-нибудь есть просто решение?

  • slivka_83 13.02.2011

    Добрый день.

    C помощью FetchXML такой запрос не написать 🙁
    Если Вам нужно именно представление, то можно написать бизнес-процесс (а лучше плагин), который при созаднии действия будет проставлять «флажок» в связанном Бизнес-партнере. Ну, и соответственно по нему уже будете ориентироваться 🙂

  • Dmitry 13.02.2011

    Привет!

    подскажи полиз: возможно ли каким-то образом получить ссылку на системное представление?

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

  • slivka_83 13.02.2011

    Ссылку на представление можно получить, открыв его и перейдя Другие действия — Копировать ярлык 🙂

  • Дмитрий 13.02.2011

    Привет!

    есть страничка которая отображает представления /Workplace/home_activities.aspx

    используя кастомизацию, можно указать по умолчанию представления какого объекта будут загружаться, например:

    установит тип записи контракт от кампании.

    интересно: можно ли как-то указать в urle представления какого объекта нужно отображать?

  • slivka_83 13.02.2011

    Добрый день 🙂 да можно когда Вы копируете URL представления через Другие действия — Копировать ярлык — Из текущего представления, то в нем указываете GUID представления:

    <server_crm>/superfirma/Workplace/home_activities.aspx?type=email&viewid=%7bCC98CB1F-6552-4FD8-9E2F-39A1CAD2F710%7d

    Соответственно если указано представление Электронной почты, то и объектом буде электронная почта 🙂

  • Aliwer 13.02.2011

    Скажите пожалуйста, мне нужно организовать запрос, который удовлетворяет каким-то условиям, но этот запрос не возможно выполнить с помощью «Расширенного поиска. Написал Fetch запрос все работает, но выводит на консоль. Вопрос: Как сделать так, чтобы этот Fetch запрос сохранился и чтоб можно было смотреть в списке «Сохраненные представления» ?

    Заранее спасибо !

  • Aliwer 13.02.2011

    Добрый день
    А что нужно поменять в коде «Долгий и поддерживаемый » чтоб заработала в CRM 2011 ?

    Спасибо !

  • Aliwer 13.02.2011

    Скажите пожалуйста, когда я пишу эту строчу: SavedQuery view = new SavedQuery();
    то компилятор выдает ошибку.

  • slivka_83 13.02.2011

    Ой, мне еще не приходилось сталкиваться в представлениями в CRM 2011 🙂 Поэтому пока ничем помочь не могу 🙂

  • Sergey 13.02.2011

    А такой вопрос, если надо передать условие поиска в сохраненное представление. Скажем при условиях поиска для сущности Контакт «Полное имя = Иван, Иванович Иванов», мне из бизнес процесса в это сохраненное представление с таким условием поиска надо передать другие ФИО. Может есть идеи?

  • slivka_83 13.02.2011

    Что-то не понял что Вы пытаетесь сделать?

  • Uberz 13.02.2011

    ошибка 1:
    using System.Web.Services;
    Имя типа или пространства имен «Services» отсутствует в пространстве имен «System.Web» (пропущена ссылка на сборку?)

    ошибка 2:
    myService.Credentials = System.Net.CredentialCache.DefaultCredentials;
    myService.Url = «http://win-22hj23d1b1/MSCrmServices/2007/CrmService.asmx»;

    Microsoft.Crm.SdkTypeProxy.CrmService не содержит определения для Credentials и не был найден метод расширения Credentials принимающий тип Microsoft.Crm.SdkTypeProxy.CrmService в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку)
    Таже ошибка для Url.

    фреймворки все стоят, в консольной сборке используется .NET Framework 3.5
    версия файла microsoft.crm.sdktypeproxy.dll — 4.0.7333.3021 (вроде последняя)

    google не помог…

  • slivka_83 13.02.2011

    И что это все такое? 🙂 откуда? как? 🙂

    У Вас и вправда такой URL «http://win-22hj23d1b1/…»

  • Uberz 13.02.2011

    да это еще перед компиляцией такие ошибки подчеркивает красным, и при компиляции указывает на первую. В обозревателей объектов, урл не такой, просто с Вашего кода копипастил, имя сервера там естественно другое. Но уверен, что даже если бы было и такое, то все равно он ругается на то что у него нет поля куда записать URL 🙂
    Если в обозревателе объектов смотреть на Microsoft.Crm.SdkTypeProxy.dll, то там в CrmService действительно нет Credentials и Url.

    Похоже на то, что у меня либо библиотеки не те либо что-то еще не установлено. Но SDK последняя и фреймворке все на месте, а что еще нужно я не вкурсе )

  • Uberz 13.02.2011

    вопрос решил System.Web.Services.dll не была подключена… надо лучше высыпаться 🙂

    другой вопрос: должен ли работать такой fetch запрос?

    или join внутри join’а не выполняется в crm 4.0?

  • Uberz 13.02.2011
    <fetch mapping="logical" count="50" version="1.0">
      <entity name="activitypointer">
        <attribute name="prioritycode" />
        <attribute name="scheduledend" />
        <attribute name="subject" />
        <link-entity name="quote" from="quoteid" to="regardingobjectid" link-type="outer">
          <attribute name="name" />
          <link-entity name="account" from="accountid" to="customerid">
            <attribute name="name" />
          </link-entity>
        </link-entity>
      </entity>
    </fetch>
    
  • slivka_83 13.02.2011

    Вот эти утилитки помогут Вам составить и тут же проверить любой FetchXML запрос:
    http://mmcrm.ru/?p=1295
    http://mmcrm.ru/?p=987
    http://mmcrm.ru/?p=494

  • Uberz 13.02.2011

    Большое спасибо!

*

code