12.10.2009, 20:23 | #1 |
Участник
|
Group by и временная таблица
AX 4.0 SP2
Тестируя отчёт, случайно поймал глюк: X++: static void job(Args _args) { tmpTable tmpTable; counter cnt; ; tmpTable.clear(); tmpTable.Field1 = '1'; tmpTable.insert(); tmpTable.clear(); tmpTable.Field1 = '1'; tmpTable.insert(); // вставляем две одинаковые строки cnt = 0; while select tmpTable group by Field1 // where tmpTable.Field1 == '1' { cnt++; } info(int2str(cnt)); } P.S.: Обязательные условия: таблица - временная; поле - текстовое |
|
|
За это сообщение автора поблагодарили: miklenew (3). |
12.10.2009, 20:36 | #2 |
Участник
|
а это не потому что,
select TmpTable = select * from TmpTable, т.е со всей тучей полей типа RecId itd? Группировка соответсвенно тут не помогает. Т.е нужно явно написать X++: select Field1 from tmpTable group by Field1
__________________
The Variable men power. Последний раз редактировалось Varmen; 12.10.2009 в 20:44. |
|
12.10.2009, 20:47 | #3 |
Участник
|
Не помогает . И к тому же без where - работает корректно!
|
|
12.10.2009, 21:21 | #4 |
MCITP
|
Цитата:
Аксапта сама этот момент "распознаёт", так что явно писать вовсе не обязательно.
__________________
Zhirenkov Vitaly |
|
12.10.2009, 21:57 | #5 |
Участник
|
ага, особенно когда join , не раз палился. при поиске ошибки, лучше явно поставить, дабы исключить разную трактовку ситуации.
__________________
The Variable men power. Последний раз редактировалось Varmen; 12.10.2009 в 22:02. |
|
12.10.2009, 22:06 | #6 |
Участник
|
Цитата:
+1 |
|
12.10.2009, 22:28 | #7 |
Участник
|
не, не смогу такое привести.
Но ведь Вы мною предложенный вариант попробовали правда? Знаете почему, потому что jobik не работает так как изначально задумали, а причина неизвестна.
__________________
The Variable men power. |
|
12.10.2009, 22:55 | #8 |
Участник
|
не работает "как задумали" - мягко сказано
Если фильтровать текстовое поле, участвующее в группировке, то group by попросту игнорируется! (причём, например, для целочисленного поля тот же код отрабатывает корректно ) Что я делаю не так? Кто-нибудь может прокомментрировать такое поведение group by? Это следствие каких-то известных (документированных) ограничений? И какие ещё сюрпризы от использования временных таблиц можно ожидать? |
|
12.10.2009, 23:21 | #9 |
Участник
|
могу подвердить, зашел на нашу систему, также исполняется два раза.
Ах4.0сп2
__________________
The Variable men power. |
|
12.10.2009, 23:24 | #10 |
Участник
|
баг можно побороть, если вставить не явно поле, как я предпологал выше, а функцию агрегации над ним. Тогда аксапта "распознает" что таки надо группировать!
X++: while select maxof(Field1) from t group by Field1 where t.Field1 == '1' { info(strfmt("fisrt query %1",t.Field1)); }
__________________
The Variable men power. Последний раз редактировалось Varmen; 12.10.2009 в 23:34. |
|
|
За это сообщение автора поблагодарили: S.Kuskov (1). |
12.10.2009, 23:29 | #11 |
Участник
|
X++: static void Job10(Args _args) { TempDummyTable t; ; ttsbegin; t.Field1="1"; t.insert(); ttscommit; ttsbegin; t.Field1="1"; t.insert(); ttscommit; while select maxof(Field1) from t group by Field1 where t.Field1 == '1' { info(strfmt("fisrt query %1",t.Field1)); } while select t group by Field1 where t.Field1 == '1' { info(strfmt("second query %1",t.Field1)); } } fisrt query 1 second query 1 second query 1
__________________
The Variable men power. |
|
12.10.2009, 23:39 | #12 |
Участник
|
Ну что смеемся дальше?
добавим поле Фиелд2 X++: static void Job10(Args _args) { TempDummyTable t; ; ttsbegin; t.Field1="1"; t.Field2="2"; t.insert(); ttscommit; ttsbegin; t.Field1="1"; t.Field2="4"; t.insert(); ttscommit; while select maxof(Field1) from t group by Field1 where t.Field1 == '1' { info(strfmt("fisrt query %1--%2",t.Field1,t.Field2)); } while select t group by Field1 where t.Field1 == '1' { info(strfmt("second query %1--%2",t.Field1,t.Field2)); } } fisrt query 1-- second query 1--2 second query 1--4 Ну куда группировка делась, во втором случае?
__________________
The Variable men power. |
|
12.10.2009, 23:45 | #13 |
Участник
|
ну и под занавес, мой любимый RecId itd
X++: static void Job10(Args _args) { TempDummyTable t; ; ttsbegin; t.Field1="1"; t.Field2="2"; t.insert(); ttscommit; ttsbegin; t.Field1="1"; t.Field2="4"; t.insert(); ttscommit; while select maxof(Field1) from t group by Field1 where t.Field1 == '1' { info(strfmt("fisrt query %1--%2",t.Field1,t.Field2)); } while select t group by Field1 where t.Field1 == '1' { info(strfmt("second query %1--%2--%3",t.Field1,t.Field2,t.RecId)); } } (21:44:51) fisrt query 1-- second query 1--2--1328 second query 1--4--1376
__________________
The Variable men power. |
|
13.10.2009, 00:13 | #14 |
MCITP
|
Вы имеете ввиду, что результаты никак не сгруппировались вобще и в остальных колонках тоже есть данные? Ну мне кажется это сразу было очевидно, что Аксапта "забыла" сделать груп_бай вообще. Например можно было попробовать вставить не 2, а 3 или 4 строки.
По сути... Проверил на DAX2009 SP1 - результат абсолютно тот же. Реальный баг. Видимо разработчики такой вырожденный случай тупо забыли/не подумали закодить. )) Почему "вырожденный"? Ну потому что вы по сути хотите выяснить есть ли у вас хоть одна строка со значением "1". С точки зрения производительности и логики я думаю лучше было бы написать этот запрос примерно так: X++: while select firstFast firstOnly Field1 from tmpTable where tmpTable.Field1 == '1' Так работает...
__________________
Zhirenkov Vitaly |
|
13.10.2009, 00:56 | #15 |
Боец
|
Цитата:
Сообщение от ZVV
Вы имеете ввиду, что результаты никак не сгруппировались вобще и в остальных колонках тоже есть данные? Ну мне кажется это сразу было очевидно, что Аксапта "забыла" сделать груп_бай вообще. Например можно было попробовать вставить не 2, а 3 или 4 строки.
По сути... Проверил на DAX2009 SP1 - результат абсолютно тот же. Реальный баг. Видимо разработчики такой вырожденный случай тупо забыли/не подумали закодить. )) Почему "вырожденный"? Ну потому что вы по сути хотите выяснить есть ли у вас хоть одна строка со значением "1". С точки зрения производительности и логики я думаю лучше было бы написать этот запрос примерно так: X++: while select firstFast firstOnly Field1 from tmpTable where tmpTable.Field1 == '1' Так работает... X++: while select sum (amount) from tmpTable group by department where tmpTable.department like 'OUT*' { info(strFmt("%1 - %2", tmpTable.department, tmpTable.amount)); } |
|
13.10.2009, 01:09 | #16 |
Участник
|
или скажем узнать кол-во уволенных сотрудников в связи с кризисом по отделам, имеющим признак ="CLOSED"
__________________
The Variable men power. Последний раз редактировалось Varmen; 13.10.2009 в 01:17. |
|
13.10.2009, 08:41 | #17 |
Участник
|
Цитата:
Цитата:
X++: while select maxof(Field1), count(RecId) from t group by Field1 where t.Field1 == '1' { info(strfmt("fisrt query %1 %2",t.Field1, t.RecId)); } Последний раз редактировалось S.Kuskov; 13.10.2009 в 08:59. Причина: поспешил с выводами |
|
13.10.2009, 09:03 | #18 |
Участник
|
Цитата:
А по поводу вырожденности случая - не всегда удобно обробатывать его отдельно. Например, я часто использую в условии запроса такую конструкцию X++: ((prmValue == "") || (Table.Field1 == prmValue)) X++: ((prmValue == "") || (Table.Field1 like prmValue)) P.S.: Вот сижу сейчас и думаю, как же я раньше на такие грабли не наступал? Может действительно пример искуственен, а в жизни есть какая-то комбинация дополнительных условий, которая всегда спасала? Последний раз редактировалось S.Kuskov; 13.10.2009 в 09:10. |
|
13.10.2009, 10:44 | #19 |
MCITP
|
Цитата:
Сообщение от DSPIC
Не совсем согласен с вырожденностью. Я, например, хочу получить итоговые суммы по отделам, наименования которых начинаются на "OUT*"
X++: while select sum (amount) from tmpTable group by department where tmpTable.department like 'OUT*' { info(strFmt("%1 - %2", tmpTable.department, tmpTable.amount)); } X++: while select tmpTable group by Field1 where tmpTable.Field1 == '1' К чему придираемся?
__________________
Zhirenkov Vitaly |
|
|
За это сообщение автора поблагодарили: DSPIC (0). |
13.10.2009, 13:40 | #20 |
Участник
|
Предлагаю вынести сообщения #19, 20, 22-31 в отдельную тему "Временным таблицам фиолетово на транзакции"
--- Модератор: оффтопик перенесен в Временные таблицы и транзакции --- Последний раз редактировалось Dron AKA andy; 13.10.2009 в 14:26. |
|
Теги |
bug, баг, временная таблица, запрос (query), ошибка |
|
Похожие темы | ||||
Тема | Ответов | |||
Временная таблица | 21 | |||
производительность: map или временная таблица | 5 | |||
Временная таблица + RLS | 6 | |||
select sum(amount) from временная таблица | 6 | |||
next и временная таблица | 3 |
|