Показать сообщение отдельно
Старый 03.07.2023, 17:42   #1  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,448 / 1792 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Select sum по временной таблице может удваивать значение
AX2009
Поймал очередной баг при работе с временными таблицами. Понятно что движок временных таблиц - это не настоящий SQL, и поэтому не все что работает для реальных таблиц также работает и для временных.

Если в одном select попытаться суммировать одно и тоже поле несколько раз, то значение будет получатся кратно больше
X++:
static void Job_TEST_DOUBLE_SUM(Args _args)
{
    TmpABC TmpABC;
    ;
    TmpABC.clear();
    TmpABC.Amount = 123;
    TmpABC.insert();

    select sum(Amount) from TmpABC;
    info(strfmt("%1", TmpABC.Amount)); //123,00

    select sum(Amount), sum(Amount) from TmpABC;
    info(strfmt("%1", TmpABC.Amount)); //246,00

    select sum(Amount), sum(Amount), sum(Amount) from TmpABC;
    info(strfmt("%1", TmpABC.Amount)); //369,00
}
Интересно, что с count() такой ошибки нет.

Зачем вообще такое делать: включать в список полей одно и тоже значение несколько раз? Не знаю. Поймал это в коде, где второе вхождение того же поля было опечаткой.
Но вообще говоря в стандарте SQL такое не запрещено. Возможно где-нибудь в групповых операциях вставки/обновления может понадобится одно и тоже значение записать в разные поля.
В общем, будьте осторожны. Компилятор и рантайм такой код молча выполняют, но на выходе получается совсем не то что хотелось

Если у кого будет возможность и желание, проверьте данное поведение на более поздних версиях.
За это сообщение автора поблагодарили: Raven Melancholic (5), Logger (3), Pustik (5), A_BAS (2), Player1 (1), Manner (1).