![]() |
#1 |
Участник
|
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(); } |
|
![]() |
#2 |
Участник
|
Если фетч корректен я бы смотрел права на связанные действия. Набор колонок в гриде совпадает с набором параметров в фетче?
|
|
|
За это сообщение автора поблагодарили: magicandy (1). |
![]() |
#3 |
Участник
|
Код: + "<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>" |
|
![]() |
#4 |
Участник
|
Для тестирования фетчей есть опенсорсная тулза http://xrmtoolbox.codeplex.com/ подключаешь к организации и в ирл смотришь результаты запроса.
|
|
![]() |
#5 |
Участник
|
Коллеги, всем спасибо за ответ.
Для чистоты эксперимента. Вот текущий код: 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(); } Вот скрин фетч-запроса и ответа на него. Для полной стерильности отключены ВСЕ остальные скрипты на форме. Результат прежний: выводит все связанные с аккаунтом активности, рефрешит и в ответ пустота (напомню, что должны быть активности, связанных с данным аккаунтом контактов). Что не так? Ещё раз спасибо. |
|
![]() |
#6 |
Участник
|
Цитата:
Сообщение от 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>" Запрос дословно: "Найти все активности, связанных с Аккаунтом_22589E3F-00F6-E311-80D0-8A5D23F70DBE контактов". В поиске строится так: http://prntscr.com/5azue8 Результат: http://prntscr.com/5azunw |
|
![]() |
#7 |
Участник
|
а можно еще скрин настроек грида
я походу знаю в чем причина. Там стоит связанные и фильтр работает на них, вам надо поставить все. Последний раз редактировалось spectr; 28.11.2014 в 17:34. |
|
|
За это сообщение автора поблагодарили: magicandy (1). |
![]() |
#8 |
Участник
|
Цитата:
![]() Поставил фильтр на все записи - заработало. Спасибо! А теперь несколько усложню задачу. Собственно с чего я всё это и начинал. Теперь на этом же гриде хочу вывести И активности самой организации, И активности её связанных контактов. Тут всё сложно. Такой вот фетч уже не даёт результатов ![]() 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. |
|
![]() |
#9 |
Чайный пьяница
|
Строите запрос на получение контактов указанной компании и потом через Or клеите айдишник Account и дочерних Contact.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
![]() |
#10 |
Участник
|
UI не позволяет поставить OR на разные связанные сущности, в том то и проблема. Или это можно сделать как-то вручную? Тогда хотелось бы пример в студию. Спасибо.
|
|
![]() |
#11 |
Чайный пьяница
|
Цитата:
1. На основании AccountID строите запрос на получение идентификаторов дочерних контактов. 2. Строите Fetch и фильтруете через Or regardingobjectid. Вроде бы такое UI позволяет.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
|
За это сообщение автора поблагодарили: magicandy (1). |
![]() |
#12 |
Участник
|
![]() |
|
![]() |
#13 |
Участник
|
А теперь попробовал тот же финт с подменой основного грида "crmGrid". Всё-то хорошо, только вот маленькая проблемка. Скрипт подмены прикручен на кнопку риббона (Риббон Воркбенч). А рефреш грида в конце скрипта вызывает повторный запуск самого себя. В результате имеем бесконечный рефреш грида
![]() ![]() Последний раз редактировалось magicandy; 26.12.2014 в 20:39. |
|
![]() |
#14 |
Участник
|
Пока что реализовал так:
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(); |
|
|
|