26.11.2014, 19:10 | #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(); } |
|
27.11.2014, 11:58 | #2 |
Участник
|
Если фетч корректен я бы смотрел права на связанные действия. Набор колонок в гриде совпадает с набором параметров в фетче?
|
|
|
За это сообщение автора поблагодарили: magicandy (1). |
27.11.2014, 12:45 | #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>" |
|
27.11.2014, 12:53 | #4 |
Участник
|
Для тестирования фетчей есть опенсорсная тулза http://xrmtoolbox.codeplex.com/ подключаешь к организации и в ирл смотришь результаты запроса.
|
|
28.11.2014, 16:17 | #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(); } Вот скрин фетч-запроса и ответа на него. Для полной стерильности отключены ВСЕ остальные скрипты на форме. Результат прежний: выводит все связанные с аккаунтом активности, рефрешит и в ответ пустота (напомню, что должны быть активности, связанных с данным аккаунтом контактов). Что не так? Ещё раз спасибо. |
|
28.11.2014, 16:28 | #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 |
|
28.11.2014, 17:29 | #7 |
Участник
|
а можно еще скрин настроек грида
я походу знаю в чем причина. Там стоит связанные и фильтр работает на них, вам надо поставить все. Последний раз редактировалось spectr; 28.11.2014 в 17:34. |
|
|
За это сообщение автора поблагодарили: magicandy (1). |
28.11.2014, 19:20 | #8 |
Участник
|
Цитата:
Поставил фильтр на все записи - заработало. Спасибо! А теперь несколько усложню задачу. Собственно с чего я всё это и начинал. Теперь на этом же гриде хочу вывести И активности самой организации, И активности её связанных контактов. Тут всё сложно. Такой вот фетч уже не даёт результатов (хотя каждый 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 |
Чайный пьяница
|
Строите запрос на получение контактов указанной компании и потом через Or клеите айдишник Account и дочерних Contact.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
29.11.2014, 11:40 | #10 |
Участник
|
UI не позволяет поставить OR на разные связанные сущности, в том то и проблема. Или это можно сделать как-то вручную? Тогда хотелось бы пример в студию. Спасибо.
|
|
29.11.2014, 19:08 | #11 |
Чайный пьяница
|
Цитата:
1. На основании AccountID строите запрос на получение идентификаторов дочерних контактов. 2. Строите Fetch и фильтруете через Or regardingobjectid. Вроде бы такое UI позволяет.
__________________
Эмо разработчик, сначала пишу код, потом плачу над его несовершенством. Подписывайтесь на мой блог, twitter и YouTube канал. Пользуйтесь моим Ultimate Workflow Toolkit |
|
|
За это сообщение автора поблагодарили: magicandy (1). |
01.12.2014, 16:46 | #12 |
Участник
|
|
|
26.12.2014, 20:34 | #13 |
Участник
|
А теперь попробовал тот же финт с подменой основного грида "crmGrid". Всё-то хорошо, только вот маленькая проблемка. Скрипт подмены прикручен на кнопку риббона (Риббон Воркбенч). А рефреш грида в конце скрипта вызывает повторный запуск самого себя. В результате имеем бесконечный рефреш грида . Уже всю голову поломал. Пока здоровых идей, как это обойти нет . Если только где-то в ДОМе ставить метку, что грид уже обновлялся, но мне это кажется не очень здоровой идеей. Коллеги, вновь прошу помощи. Может быть есть какая магия JS, как ограничить рефреш одним разом?
Последний раз редактировалось magicandy; 26.12.2014 в 20:39. |
|
29.12.2014, 12:29 | #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(); |
|
|
|