Разработка
26
Сен
2

Left Join в Представлениях

C выпуском CRM 2013 появилась возможность делать left outer join с помощью FetchXML. Но к сожалению, ее невозможно задать через визуальный интерфейс CRM – только непосредственно в коде. Поэтому Вы не можете ее использовать в Представлениях или Расширенном поиске. Но, к счастью, параметры запроса для Представлений можно менять программно и задавать для него любой поддерживаемый FetchXM-запрос.
Для примера, отберем Интересы, для которых нет ни одного звонка (чтобы найти и наказать менеджера за то, что профукал клиента 🙂 ). FetchXML в этом случаем будет примерно таким:

<fetch mapping='logical'>
  <entity name='lead'>
    <attribute name='fullname' />
    <link-entity name='phonecall' from='regardingobjectid' to='leadid' link-type='outer' />
    <filter type='and'>
      <condition entityname='phonecall' attribute='activityid' operator='null' />
    </filter>
  </entity>
</fetch>

З.Ы. Ключевыми моментами здесь являются link-type=’outer’и operator=’null’. Можете составить нужный FetchXML с помощью расширенного поиска, а затем подкорректировать его.

Начнем:

  • Создайте новое Представление с названием «Интересы без Звонков». Скопируйте его GUID (ручками из URL);
  • Создайте такое и выполните такое консольное приложение, которое просто обновляет запрос нужного Представления:
    using System;
    using System.Collections.Generic;
    
    using Microsoft.Xrm.Sdk;
    using Microsoft.Xrm.Sdk.Query;
    using Microsoft.Xrm.Sdk.Client;
    using Microsoft.Crm.Sdk.Messages;
    
    using System.ServiceModel;
    using System.ServiceModel.Description;
    using System.Runtime.Serialization;
    
    namespace LeftJoin
    {
        class Program
        {
            static void Main(string[] args)
            {
                ClientCredentials credentials = new ClientCredentials();
                credentials.Windows.ClientCredential = new System.Net.NetworkCredential("Administrator", "1qaz@WSX", "D2012");
                Uri uri = new Uri("http://win-ebu0m4kvf06/superfirma/XRMServices/2011/Organization.svc");
                OrganizationServiceProxy proxy = new OrganizationServiceProxy(uri, null, credentials, null);
                proxy.ServiceConfiguration.CurrentServiceEndpoint.Behaviors.Add(new ProxyTypesBehavior());
                IOrganizationService service = (IOrganizationService)proxy;
    
                Entity savedQuery = new Entity("savedquery");
                savedQuery["savedqueryid"] = new Guid("bdc765df-f144-e411-93f8-000c29eaf228");
                savedQuery["fetchxml"] = @"<fetch mapping='logical'><entity name='lead'><attribute name='fullname' /><link-entity name='phonecall' from='regardingobjectid' to='leadid' link-type='outer' /><filter type='and'><condition entityname='phonecall' attribute='activityid' operator='null' /></filter></entity></fetch>";
    
                service.Update(savedQuery);
            }
        }
    }
    
  • Затем опубликуйте изменения.



З.Ы. В последующем редактировать запрос такого Представления не получится, также он не подтягивается в Расширенный поиск.

Комментарии (2)
  • Кирилл 26.09.2014

    Добрый день, такой метод можно использовать для фильтрации представлений гридов, находящихся на форме? Т.е. к примеру: На форме А находится грид Б, необходимо отфильтровать записи грида Б по значению полей формы А. До 6 роллапа crm 2011, если я не ошибаюсь можно было создавать динамические представления для гридов на форме, сейчас такой возможности нет.

  • slivka_83 26.09.2014

    Здравствуйте.
    Не припомню, чтобы для вложенных Представлений можно было поддерживаемым способом задавать фильтрацию — всегда ансапорт.
    Соответственно и сейчас так же — если Представлению можно скормить fetch, то теоретически должен «скушать» и новую его версию…

*

code