AXForum  
Вернуться   AXForum > Microsoft Dynamics CRM > Dynamics CRM: Разработка
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 26.11.2014, 19:10   #1  
magicandy is offline
magicandy
Участник
 
111 / 12 (1) ++
Регистрация: 15.07.2014
CRM 2013. Подмена fetch сабгрида
Коллеги, приветствую.
На форме Аккаунта имеется сабгрид, отображающий все связанные с ним действия (activity). В рамках реализации более сложной задачи пытаюсь сделать подмену данных этого сабгрида. А именно, чтобы сабгрид отображал действия контактов, связанных с данным аккаунтом.
Сгенерил фетч, Подгрузил скрипт. В результате ясно видно, что первоначально в сабгриде отображаются изначальные данные, затем он рефрешится, но данных никаких не выводит "No activity records found". А должен. Абсолютно точно, что фетч корректный и 146% возвращающий ответ.
Прошу подсказать, что не так? Вот мой код:
Код:
function UpdateSubGrid() {
    var relatedGrid = document.getElementById("Activities");
    if (!relatedGrid) {
        setTimeout('UpdateSubGrid()', 2000);
        return;
    }

    var fetchXml = "<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>"
        + "<entity name='activitypointer'>"
        + "<attribute name='activitytypecode' />"
        + "<attribute name='subject' />"
        + "<attribute name='statecode' />"
        + "<attribute name='prioritycode' />"
        + "<attribute name='modifiedon' />"
        + "<attribute name='activityid' />"
        + "<attribute name='instancetypecode' />"
        + "<attribute name='community' />"
        + "<link-entity name='contact' from='contactid' to='regardingobjectid' alias='ad'>"
        + "<filter type='and'>"
        + "<condition attribute='parentcustomerid' operator='eq' uiname='(Rosprom)' uitype='account' value='{22589E3F-00F6-E311-80D0-8A5D23F70DBE}' />"
        + "</filter>"
        + "</link-entity>"
        + "</entity>"
        + "</fetch>";


    relatedGrid.control.SetParameter("fetchXml", fetchXml);
    relatedGrid.control.refresh();
}
ЗЫ: Для простоты эксперимента ГУИД аккаунта в данном примере взят фиксированный, на котором осуществляется тестирование.
Старый 27.11.2014, 11:58   #2  
Quodnon is offline
Quodnon
Участник
 
48 / 15 (1) ++
Регистрация: 13.02.2014
Адрес: Киев
Если фетч корректен я бы смотрел права на связанные действия. Набор колонок в гриде совпадает с набором параметров в фетче?
За это сообщение автора поблагодарили: magicandy (1).
Старый 27.11.2014, 12:45   #3  
spectr is offline
spectr
Участник
Аватар для spectr
MCBMSS
Лучший по профессии 2014
 
287 / 70 (3) ++++
Регистрация: 19.10.2011
Адрес: Киев
Код:
+ "<link-entity name='contact' from='contactid' to='regardingobjectid' alias='ad'>"
        + "<filter type='and'>"
        + "<condition attribute='parentcustomerid' operator='eq' uiname='(Rosprom)' uitype='account' value='{22589E3F-00F6-E311-80D0-8A5D23F70DBE}' />"
        + "</filter>"
        + "</link-entity>"
У вас линк идет на Contact а ищете вы по айди Account потому и не находит
Старый 27.11.2014, 12:53   #4  
Quodnon is offline
Quodnon
Участник
 
48 / 15 (1) ++
Регистрация: 13.02.2014
Адрес: Киев
Для тестирования фетчей есть опенсорсная тулза http://xrmtoolbox.codeplex.com/ подключаешь к организации и в ирл смотришь результаты запроса.
Старый 28.11.2014, 16:17   #5  
magicandy is offline
magicandy
Участник
 
111 / 12 (1) ++
Регистрация: 15.07.2014
Коллеги, всем спасибо за ответ.
Для чистоты эксперимента. Вот текущий код:
X++:
function UpdateSubGrid() {
    var relatedGrid = document.getElementById("Activities");

    if (!relatedGrid) {
        setTimeout('UpdateSubGrid()', 2000);
        return;
    }

    var fetchXml = "<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>"
                + "<entity name='activitypointer'>"
                + "<attribute name='subject' />"
                + "<attribute name='activitytypecode' />"
                + "<order attribute='subject' descending='false' />"
                + "<link-entity name='contact' from='contactid' to='regardingobjectid' alias='ae'>"
                + "<filter type='and'>"
                + "<condition attribute='parentcustomerid' operator='eq' uiname='(Rosprom)' uitype='account' value='{22589E3F-00F6-E311-80D0-8A5D23F70DBE}' />"
                + "</filter>"
                + "</link-entity>"
                + "</entity>"
                + "</fetch>";

    relatedGrid.control.SetParameter("fetchXml", fetchXml);
    relatedGrid.control.refresh();
}
Вот скрин текущего сабгрида.

Вот скрин фетч-запроса и ответа на него.

Для полной стерильности отключены ВСЕ остальные скрипты на форме.
Результат прежний: выводит все связанные с аккаунтом активности, рефрешит и в ответ пустота (напомню, что должны быть активности, связанных с данным аккаунтом контактов). Что не так?
Ещё раз спасибо.
Старый 28.11.2014, 16:28   #6  
magicandy is offline
magicandy
Участник
 
111 / 12 (1) ++
Регистрация: 15.07.2014
Цитата:
Сообщение от spectr Посмотреть сообщение
Код:
+ "<link-entity name='contact' from='contactid' to='regardingobjectid' alias='ad'>"
        + "<filter type='and'>"
        + "<condition attribute='parentcustomerid' operator='eq' uiname='(Rosprom)' uitype='account' value='{22589E3F-00F6-E311-80D0-8A5D23F70DBE}' />"
        + "</filter>"
        + "</link-entity>"
У вас линк идет на Contact а ищете вы по айди Account потому и не находит
А как же реальный ответ на данный фетч-запрос?
Запрос дословно: "Найти все активности, связанных с Аккаунтом_22589E3F-00F6-E311-80D0-8A5D23F70DBE контактов".

В поиске строится так:
http://prntscr.com/5azue8

Результат:
http://prntscr.com/5azunw
Старый 28.11.2014, 17:29   #7  
spectr is offline
spectr
Участник
Аватар для spectr
MCBMSS
Лучший по профессии 2014
 
287 / 70 (3) ++++
Регистрация: 19.10.2011
Адрес: Киев
а можно еще скрин настроек грида
я походу знаю в чем причина. Там стоит связанные и фильтр работает на них, вам надо поставить все.

Последний раз редактировалось spectr; 28.11.2014 в 17:34.
За это сообщение автора поблагодарили: magicandy (1).
Старый 28.11.2014, 19:20   #8  
magicandy is offline
magicandy
Участник
 
111 / 12 (1) ++
Регистрация: 15.07.2014
Цитата:
Сообщение от spectr Посмотреть сообщение
а можно еще скрин настроек грида
я походу знаю в чем причина. Там стоит связанные и фильтр работает на них, вам надо поставить все.
Именно так и было .
Поставил фильтр на все записи - заработало. Спасибо!

А теперь несколько усложню задачу. Собственно с чего я всё это и начинал.
Теперь на этом же гриде хочу вывести И активности самой организации, И активности её связанных контактов. Тут всё сложно. Такой вот фетч уже не даёт результатов (хотя каждый link-entity в отдельности результат дает):
X++:
<fetch version="1.0" output-format="xml-platform" mapping="logical" distinct="false">
  <entity name="activitypointer">
    <attribute name="activitytypecode" />
    <attribute name="subject" />
    <attribute name="statecode" />
    <attribute name="prioritycode" />
    <attribute name="modifiedon" />
    <attribute name="activityid" />
    <attribute name="instancetypecode" />
    <attribute name="community" />
    <order attribute="modifiedon" descending="false" />
    <link-entity name="account" from="accountid" to="regardingobjectid" alias="au">
      <filter type="and">
        <condition attribute="accountid" operator="eq" uitype="account" value="{22589E3F-00F6-E311-80D0-8A5D23F70DBE}" />
      </filter>
    </link-entity>
    <link-entity name="contact" from="contactid" to="regardingobjectid" alias="av">
      <filter type="and">
        <condition attribute="parentcustomerid" operator="eq" uitype="account" value="{22589E3F-00F6-E311-80D0-8A5D23F70DBE}" />
      </filter>
    </link-entity>
  </entity>
</fetch>
Подозреваю, это уже ограничения самой ЦРМ. Хотя казалось бы - все записи одной сущности. И прекрасно отображается на стандартных вьюхах.

По запросу в сиквеле выдаёт то, что надо:
X++:
select  a.Subject, Accountid from ActivityPointer a
 join Contact c on c.contactid = a.RegardingObjectId
 where RegardingObjectTypeCode = 2
 and c.Accountid ='22589E3F-00F6-E311-80D0-8A5D23F70DBE'
 union all
 select a.Subject, Accountid from ActivityPointer a
 join Accountbase ac on ac.accountid = a.RegardingObjectId
 where RegardingObjectTypeCode = 1
 and ac.Accountid ='22589E3F-00F6-E311-80D0-8A5D23F70DBE'
Пытался разными способами переконвертить этот запрос в рабочий фетч, но без большого успеха.
Может быть кто решал подобную задачу? Воркэраунд какой-нибудь?

В общем-то цель всех этих мытарств одна - по сути создать своеобразный Активити Фид (который как раз и отображает все активности всех связанных элементов), только в виде грида, с сортировкой и визуально понятный.

Последний раз редактировалось magicandy; 28.11.2014 в 19:23.
Старый 29.11.2014, 05:05   #9  
a33ik is offline
a33ik
Чайный пьяница
Аватар для a33ik
MCP
MCBMSS
Злыдни
Соотечественники
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,243 / 896 (36) +++++++
Регистрация: 02.07.2008
Адрес: Greenville, SC
Цитата:
Сообщение от magicandy Посмотреть сообщение
Может быть кто решал подобную задачу? Воркэраунд какой-нибудь?
Строите запрос на получение контактов указанной компании и потом через Or клеите айдишник Account и дочерних Contact.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством.

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit
Старый 29.11.2014, 11:40   #10  
magicandy is offline
magicandy
Участник
 
111 / 12 (1) ++
Регистрация: 15.07.2014
Цитата:
Сообщение от a33ik Посмотреть сообщение
Строите запрос на получение контактов указанной компании и потом через Or клеите айдишник Account и дочерних Contact.
UI не позволяет поставить OR на разные связанные сущности, в том то и проблема. Или это можно сделать как-то вручную? Тогда хотелось бы пример в студию. Спасибо.
Старый 29.11.2014, 19:08   #11  
a33ik is offline
a33ik
Чайный пьяница
Аватар для a33ik
MCP
MCBMSS
Злыдни
Соотечественники
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,243 / 896 (36) +++++++
Регистрация: 02.07.2008
Адрес: Greenville, SC
Цитата:
Сообщение от magicandy Посмотреть сообщение
UI не позволяет поставить OR на разные связанные сущности, в том то и проблема. Или это можно сделать как-то вручную? Тогда хотелось бы пример в студию. Спасибо.
Могу сформулировать по другому.
1. На основании AccountID строите запрос на получение идентификаторов дочерних контактов.
2. Строите Fetch и фильтруете через Or regardingobjectid. Вроде бы такое UI позволяет.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством.

Подписывайтесь на мой блог, twitter и YouTube канал.
Пользуйтесь моим Ultimate Workflow Toolkit
За это сообщение автора поблагодарили: magicandy (1).
Старый 01.12.2014, 16:46   #12  
magicandy is offline
magicandy
Участник
 
111 / 12 (1) ++
Регистрация: 15.07.2014
Talking
Цитата:
Сообщение от a33ik Посмотреть сообщение
Могу сформулировать по другому.
1. На основании AccountID строите запрос на получение идентификаторов дочерних контактов.
2. Строите Fetch и фильтруете через Or regardingobjectid. Вроде бы такое UI позволяет.

Получилось . Большое спасибо!
Старый 26.12.2014, 20:34   #13  
magicandy is offline
magicandy
Участник
 
111 / 12 (1) ++
Регистрация: 15.07.2014
А теперь попробовал тот же финт с подменой основного грида "crmGrid". Всё-то хорошо, только вот маленькая проблемка. Скрипт подмены прикручен на кнопку риббона (Риббон Воркбенч). А рефреш грида в конце скрипта вызывает повторный запуск самого себя. В результате имеем бесконечный рефреш грида . Уже всю голову поломал. Пока здоровых идей, как это обойти нет . Если только где-то в ДОМе ставить метку, что грид уже обновлялся, но мне это кажется не очень здоровой идеей. Коллеги, вновь прошу помощи. Может быть есть какая магия JS, как ограничить рефреш одним разом?

Последний раз редактировалось magicandy; 26.12.2014 в 20:39.
Старый 29.12.2014, 12:29   #14  
magicandy is offline
magicandy
Участник
 
111 / 12 (1) ++
Регистрация: 15.07.2014
Пока что реализовал так:
X++:
if (document.cookie.toLowerCase().indexOf("refresh=true") == -1)
        crmGrid.control.refresh();
var date = new Date( new Date().getTime() + 10*1000 ); 
document.cookie = "refresh=true; path=/; expires=" + date.toUTCString();
Если кто-то подскажет более грамотное решение, буду премного благодарен.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
crminthefield: Podcast and Overview: Microsoft Dynamics CRM 2011 Update Rollup 15 Blog bot Dynamics CRM: Blogs 1 10.02.2016 10:26
crminthefield: Podcast and Overview: Microsoft Dynamics CRM 2011 Update Rollup 17 Blog bot Dynamics CRM: Blogs 0 10.05.2014 06:30
crminthefield: Podcast and Overview: Microsoft Dynamics CRM 2013 Update Rollup 2 Blog bot Dynamics CRM: Blogs 0 15.04.2014 01:15
crminthefield: Podcast and Overview: Microsoft Dynamics CRM 2011 Update Rollup 16 Blog bot Dynamics CRM: Blogs 0 23.01.2014 03:15
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 19:14.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.