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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 21.12.2010, 00:12   #1  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,323 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Группировка по полю GUID
Столкнулся тут с интересным поведением группировки по полю типа GUID в 4.0 и 2009 RU5.

Имеем тестовый джоб
X++:
static void Job1(Args _args)
{
    Table1 t;
    ;
    t.StringField = 'aa';
    t.GuidField   = newguid();
    t.RealField   = 2;
    t.insert();
    t.StringField = 'aa';
    t.GuidField   = newguid();
    t.RealField   = 2;
    t.insert();
    t.StringField = 'bb';
    t.GuidField   = newguid();
    t.RealField   = 2;
    t.insert();
    while select sum(RealField) from t
        group by StringField, GuidField
    {
        info(strfmt("%1 %2 %3", t.StringField, t.GuidField, t.RealField));
    }
}
В DAX 2009 RU5 все отрабатывает достаточно ожидаемо:
Название: DAX2009RU5.PNG
Просмотров: 1301

Размер: 32.8 Кб

А вот в DAX 4.0 SP2 нас поджидает сюрприз:
Название: DAX40SP2.PNG
Просмотров: 1315

Размер: 15.4 Кб

Результат одинаковый - независимо от того - временная таблица или постоянная (т.е. есть она в БД или нет).

В обоих случаях в качестве СУБД использовался как SQL Server 2005, так и SQL Server 2008 R2.
Собственно - вывод - будьте аккуратнее
__________________
Возможно сделать все. Вопрос времени

Последний раз редактировалось sukhanchik; 21.12.2010 в 09:31.
За это сообщение автора поблагодарили: Logger (2).
Старый 21.12.2010, 01:47   #2  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
А запрос-то в 4-ке какой уходит на СУБД? А то и в 2009-й надо быть аккуратнее: на RTM-версии, как оказалось, при использовании update_recordset .. setting .. select sum(field) на СУБД уходил запрос без агрегирования Потом это, к счастью, исправили...
Старый 21.12.2010, 09:30   #3  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,323 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от gl00mie Посмотреть сообщение
А запрос-то в 4-ке какой уходит на СУБД?
Вполне ожидаемый исходя из получаемых результатов. Поле GUID тупо игнорируется.
PHP код:
SELECT SUM(A.REALFIELD),A.STRINGFIELD FROM TABLE1 A 
WHERE 
(DATAAREAID='dat'GROUP BY A.STRINGFIELD ORDER BY A.STRINGFIELD 
Цитата:
Сообщение от sukhanchik Посмотреть сообщение
Результат одинаковый - независимо от того - временная таблица или постоянная (т.е. есть она в БД или нет).
Если нет поля sum() в выборке то также нули выводятся - это у меня глюк был. Поправил исходное сообщение.
__________________
Возможно сделать все. Вопрос времени

Последний раз редактировалось sukhanchik; 21.12.2010 в 09:33.
Старый 21.12.2010, 10:42   #4  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Какой типа данных у поля GuidField? Допустимо ли в принципе использовать подобный тип данных в качестве поля группировки? Например, группировка по контейнерному полю запрещена.

Если явно указать поле GuidField в списке полей в опции select, что-то изменится?
Старый 21.12.2010, 11:12   #5  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,323 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Какой типа данных у поля GuidField?
GUID. Собственно - из-за этого и возник данный пост.

Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Допустимо ли в принципе использовать подобный тип данных в качестве поля группировки? Например, группировка по контейнерному полю запрещена.?
Ну я ж джоб выполнил => компиляция прошла. Более того, в АХ2009 этот джоб работает.
По контейнерному полю группировка запрещена в первую очередь самой СУБД - т.к. не имеет смысла сравнивать байтики в поле Image (отсюда и запрет на уровне компилятора). А тип GUID - есть в самой СУБД и не ограничен в группировке.

Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Если явно указать поле GuidField в списке полей в опции select, что-то изменится?
Нет. Запрос такой же уйдет.
__________________
Возможно сделать все. Вопрос времени
Старый 21.12.2010, 14:36   #6  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Я не про это. В MS SQL это поле имеет тип [uniqueidentifier]. Физически - это Binary(16). То, что оно так красиво выглядит - это уже результат специфического преобразования. Ну, как с полями DateTime.

Как следствие, возникает вопрос, была ли предусмотрена корректная обработка (сортировка и группировка) подобных полей в Ax4.0?

Судя по тому, что подобное поле просто исключается из списка полей группировки (по аналогии, скажем, с TableId), в Ax4.0 на работу с подобным типом были наложены какие-то дополнительные ограничения, которые были сняты в Ax2009. Хотя и не все. Например, в теме Lookup по полю типа Guid описаны другие проблемы GUID

Надо бы посмотреть в справке по Ax4.0 Нет ли каких упоминаний об ограничениях по работе с полями типа GUID.
Старый 21.12.2010, 14:43   #7  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,323 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Как следствие, возникает вопрос, была ли предусмотрена корректная обработка (сортировка и группировка) подобных полей в Ax4.0?
...
Надо бы посмотреть в справке по Ax4.0 Нет ли каких упоминаний об ограничениях по работе с полями типа GUID.
Я понял. Подозреваю, что если где-то это и описано - то "мелким шрифтом" на какой-нибудь странице к которой фиг докопаешься, да еще и может быть размещенной в закрытой части (на партнерсорсе).
Большими буквами чтобы это где-то было написано в явном виде - не видел. Может просто не там смотрел.
В любом случае - подозреваю, что я такой могу быть не один который обо этом не знает.
Т.е. в данном случае - это не размышление на тему - бага это или фича - а размышления на тему - если захочется группировать в 4-ке по guid-у - то нужно учесть данные особенности.
__________________
Возможно сделать все. Вопрос времени
За это сообщение автора поблагодарили: Poleax (1), gl00mie (3), johny77 (1).
Теги
ax4.0, guid, баг, группировка, ядро

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
sumitax: Creating new GUID in AX2009 Blog bot DAX Blogs 0 17.11.2010 18:11
Lookup по полю типа Guid Poleax DAX: Программирование 21 01.10.2010 13:06
Группировка сводной таблицы Excel AlexeyVS DAX: Программирование 4 29.07.2010 12:13
Группировка в Lookup maze DAX: Программирование 6 18.11.2009 17:08
Прочитать сформированный GUID Владимир Максимов DAX: Программирование 2 24.09.2007 11:55

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

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

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