Показать сообщение отдельно
Старый 28.01.2011, 20:44   #4  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,343 / 3563 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Небольшое замечание. Если вдруг в лукапе потом захочется вывести поля, к которым нужно применить агрегатную функцию (Sum, Count и т.д.), то можно столкнуться с неприятным моментом, когда пропадает группировка.
Связано это с тем, что в рамках оптимизации исполнения запроса выбираются не все поля, а только те, что определены в лукапе (для которых был вызван метод addLookupField).
Соответственно, выполняется следующий код (\Classes\SysTableLookup\buildSelectionList):
X++:
        for (i = 1; i <= conlen(lookupItems); i++)
        {
            [fieldId, returnItem, method] = conpeek(lookupItems, i);
            queryBuildDataSource.addSelectionField(fieldId);
        }
И тут, как несложно заметить - метод addSelectionField вызывается без агрегатных функций. Соответственно, все наши Sum-ы пропадают и по этим полям начинает работать группировка (т.е. фактически, она слетает).

Лечится это простым условием:
X++:
    if (queryBuildDataSource.orderMode() == OrderMode::OrderBy) // Ограничение числа полей актуально только для выборки без группировок    
    {
        for (i = 1; i <= conlen(lookupItems); i++)
        {
            [fieldId, returnItem, method] = conpeek(lookupItems, i);
            queryBuildDataSource.addSelectionField(fieldId);
        }
    }
после чего суммирование начинает работать нормально.

Справедливо для всех версий (3.0 - 2009 RU5)
__________________
Возможно сделать все. Вопрос времени

Последний раз редактировалось sukhanchik; 29.01.2011 в 12:37.
За это сообщение автора поблагодарили: konopello (1), jonny (3), IKA (1), player (1).