AXForum  
Вернуться   AXForum > Блоги > CRM, SharePoint и Черная Магия
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

Добро пожаловать в мой блог! Изначально он не задумывался как блог CRM разработчика, но жизнь сама внесла нужные коррективы. Тут я публикою все свои наблюдения относительно обозначенных в заголовке систем. Если Вы найдете в нем что-то интересное для Вас, как для заказчика, то буду рад сотрудничать с Вами! В моей компетенции 100% задач по MS CRM 3.0/4.0/2011:
  • Консалтинг
  • Проектирование
  • Разработка
  • Обучение


MVP 2010, 2011
Оценить эту запись

Агрегированные Fetch запросы могут не вернуть данных

Запись от Артем Enot Грунин размещена 21.08.2013 в 10:29
Обновил(-а) Артем Enot Грунин 07.10.2013 в 10:25
Теги development, fetch, xml

Недавно я посмотрел статистику выполнения по своим плагинам и обнаружил что один из них иногда валится с ошибкой:
X++:
SELECT
    [plugintypeidname],
    [averageexecutetimeinmilliseconds],
    [executecount],
    [failurecount],
    [failurepercent]
FROM FilteredPluginTypeStatistic
Порыскав в логах системных заданий я выяснил что в некоторых случаях плагин валится с ошибкой "given key was not present in the dictionary", что казалось странным, так как казалось что все необходимые проверки я выполнил. Беда крылась в получении значения агрегата в Fetch запросе. Рассмотрим пример из SDK:
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);

                    }
В данном случае не принципиально для чего к коде цикл - запрос все равно вернет только 1 запись Entity. У возвращенного объекта будет единственный атрибут estimatedvalue_avg, который за каким-то хреном завернут в объект AliasedValue. Так вот момент заключается в том, что атрибуты-агригаты, равно как и все прочие столбцы, возвращаются системой только в том случае, если они содержат данные! В противном случае, такого столбца в возвращенном объекте не будет. Если запустить этот пример на пустой базе, вы получите ошибку.
Размещено в CRM
Просмотров 23315 Комментарии 0
Всего комментариев 0

Комментарии

 


Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 01:50.