Добро пожаловать в мой блог! Изначально он не задумывался как блог CRM разработчика, но жизнь сама внесла нужные коррективы. Тут я публикою все свои наблюдения относительно обозначенных в заголовке систем. Если Вы найдете в нем что-то интересное для Вас, как для заказчика, то буду рад сотрудничать с Вами! В моей компетенции 100% задач по MS CRM 3.0/4.0/2011:
MVP 2010, 2011
- Консалтинг
- Проектирование
- Разработка
- Обучение
MVP 2010, 2011
Агрегированные Fetch запросы могут не вернуть данных
Запись от Артем Enot Грунин размещена 21.08.2013 в 10:29
Обновил(-а) Артем Enot Грунин 07.10.2013 в 10:25
Обновил(-а) Артем Enot Грунин 07.10.2013 в 10:25
Теги development, fetch, xml
Недавно я посмотрел статистику выполнения по своим плагинам и обнаружил что один из них иногда валится с ошибкой:
Порыскав в логах системных заданий я выяснил что в некоторых случаях плагин валится с ошибкой "given key was not present in the dictionary", что казалось странным, так как казалось что все необходимые проверки я выполнил. Беда крылась в получении значения агрегата в Fetch запросе. Рассмотрим пример из SDK:
В данном случае не принципиально для чего к коде цикл - запрос все равно вернет только 1 запись Entity. У возвращенного объекта будет единственный атрибут estimatedvalue_avg, который за каким-то хреном завернут в объект AliasedValue. Так вот момент заключается в том, что атрибуты-агригаты, равно как и все прочие столбцы, возвращаются системой только в том случае, если они содержат данные! В противном случае, такого столбца в возвращенном объекте не будет. Если запустить этот пример на пустой базе, вы получите ошибку.
X++:
SELECT
[plugintypeidname],
[averageexecutetimeinmilliseconds],
[executecount],
[failurecount],
[failurepercent]
FROM FilteredPluginTypeStatistic
X++:
string estimatedvalue_avg = @" <fetch distinct='false' mapping='logical' aggregate='true'> <entity name='opportunity'> <attribute name='estimatedvalue' alias='estimatedvalue_avg' aggregate='avg' /> </entity> </fetch>"; EntityCollection estimatedvalue_avg_result = _serviceProxy.RetrieveMultiple(new FetchExpression(estimatedvalue_avg)); foreach (var c in estimatedvalue_avg_result.Entities) { decimal aggregate1 = ((Money)((AliasedValue)c["estimatedvalue_avg"]).Value).Value; System.Console.WriteLine("Average estimated value: " + aggregate1); }
Всего комментариев 0