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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 31.07.2023, 13:23   #1  
SuperStar88 is offline
SuperStar88
Участник
 
81 / 10 (1) +
Регистрация: 11.08.2017
? Lookup задваиваются значения
Делаю Lookup на контроле формы (надо вывести все уникальные значения поля таблицы)
X++:
    SysTableLookup          sysTableLookup = SysTableLookup::newParameters(tablenum(VendTrans), this);
    Query                   query;
    QueryBuildDataSource    queryBuildDataSource;
    QueryBuildRange         queryBuildRange;
    ;

    query = new Query();
    queryBuildDataSource = query.addDataSource(tablenum(VendTrans));

    queryBuildDataSource.addSortField(fieldnum(VendTrans, FIELD));
    queryBuildDataSource.addGroupByField(fieldnum(VendTrans, FIELD));


    sysTableLookup.addLookupfield(fieldnum(VendTrans, FIELD));

    sysTableLookup.parmQuery(query);
    sysTableLookup.performFormLookup();
Когда значение в контроле пустое, то всё нормально, но когда там уже что-то выбрано, то появляется чуть ли не бесконечный скролинг со множеством повторяющимися значениями.
Как правильно это сделать?
Старый 31.07.2023, 13:38   #2  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,941 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Вроде был баг в какой-то из версий, когда в лукапах сбрасывался group by
Вроде бы можно было обойти если расположить метод лукапа не на поле датасорса а на контроле.
Но точно уже не помню.
Старый 31.07.2023, 13:52   #3  
TasmanianDevil is offline
TasmanianDevil
Мрачный тип
Аватар для TasmanianDevil
Злыдни
 
886 / 389 (14) ++++++
Регистрация: 24.01.2005
Адрес: Томск
Стандартный SysTableLookup крайне криво работает с переданным запросом - если есть хоть одно пересечение м-ду полями группировки в запросе и полями в лукапе, группировка сбрасывается.
Вся "радость" происходит в buildSelectionList() , можете сравнить свой queryBuildDataSource в своем lookup() и в buildSelectionList() в конце его исполнения - будете удивлены (group by исчезнет).
Решение - контролировать добавление полей ТАМ на каждой итерации цикла на отсутствие их в queryBuildDataSource fields()
__________________
Мы летаем, кружимся, нагоняем ужасы ...
Старый 31.07.2023, 14:09   #4  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,732 / 406 (17) +++++++
Регистрация: 23.03.2006
Если не вдаваться в подробности решения технической проблемы, а решать бизнес задачу, то лукап по проводкам лучше не делать, а сделать по справочнику, где значения уникальны, и если есть потребность проверить участвовало ли данное значение в проводках, то проверить на этапе сохранения значения
За это сообщение автора поблагодарили: Logger (3).
Старый 31.07.2023, 14:36   #5  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,941 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от TasmanianDevil Посмотреть сообщение
Стандартный SysTableLookup крайне криво работает с переданным запросом - если есть хоть одно пересечение м-ду полями группировки в запросе и полями в лукапе, группировка сбрасывается.
Вся "радость" происходит в buildSelectionList() , можете сравнить свой queryBuildDataSource в своем lookup() и в buildSelectionList() в конце его исполнения - будете удивлены (group by исчезнет).
Решение - контролировать добавление полей ТАМ на каждой итерации цикла на отсутствие их в queryBuildDataSource fields()
На x++ фикс можно сделать ?

Мне казалось бага где-то в ядре сидит.
Старый 31.07.2023, 15:15   #6  
bacardi is offline
bacardi
Участник
 
3 / 18 (1) ++
Регистрация: 10.07.2009
Попробуйте добавить
X++:
sysTableLookup.parmUseLookupValue(false);
За это сообщение автора поблагодарили: Logger (3).
Старый 01.08.2023, 11:24   #7  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Если поле Field - это ссылка на справочник, то можно сделать Query по этому справочнику и через Exists Join добавить ограничение на факт наличия проводки. Можно, кстати, параметризировать добавление Exists. Т.е. по дополнительному параметру или выдавать все записи справочника или только с ограничением

Если совсем уж ничего не поможет, то вместо Query, можно наполнить временную таблицу и через parmTmpBuffer() передать как источник данных LookUp

Хотя, все-таки соглашусь с ice. Если это действительно ссылка на справочник, то лучше не фильтровать выпадающий список, а проверять уже выбранное значение.
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 01.08.2023, 12:18   #8  
TasmanianDevil is offline
TasmanianDevil
Мрачный тип
Аватар для TasmanianDevil
Злыдни
 
886 / 389 (14) ++++++
Регистрация: 24.01.2005
Адрес: Томск
Цитата:
Сообщение от Logger Посмотреть сообщение
На x++ фикс можно сделать ?.
А почему нет ?
SysTableLookup - открытый класс.

X++:
protected void buildSelectionList(Query _query)
{
    QueryBuildDataSource            queryBuildDataSource = _query.dataSourceTable(tableId);
    QueryBuildFieldList             selectedFields;
    boolean                         returnItem;
    str                             method;
    int                             fieldId;
    int                             i;

    //+ ТумОВ 02.12.2022
    boolean  fieldSelected(FieldId _id)
    {
        int     j;
        FieldId selectedFieldId;

        for( j = 1 ; j <= selectedFields.fieldCount() ; j++ )
        {
            selectedFieldId = selectedFields.field(j);

            if(selectedFieldId == _id) return true;
        }

        return false;
    };
    //- ТумОВ 02.12.2022

    if (!queryBuildDataSource)
    {
        return;
    }

    selectedFields = queryBuildDataSource.fields();

    for (i = 1; i <= conlen(lookupItems); i++)
    {
        [fieldId, returnItem, method] = conpeek(lookupItems, i);
        //
        // FieldId could be 0 if current element represents a display method used
        // to return values for a lookup column.
        // If fieldId is 0 then there is no sense to add it to the selection list of the query.
        //
        //+ ТумОВ 02.12.2022
        //todo А если, <censored>, поле уже выбрано как агрегат в ранее переданном запросе - на<censored> агрегацию ?
        //if (fieldId)
        if (fieldId && !fieldSelected(fieldId))
        //- ТумОВ 02.12.2022
        {
            queryBuildDataSource.addSelectionField(fieldId);
        }
    }
}
Цитата:
Сообщение от Logger Посмотреть сообщение
Мне казалось бага где-то в ядре сидит.
Внутри закрытого QueryBuildDataSource.addSelectionField(<код поля>, [<тип агрегации>)] - повторная передача поля в список выбираемых с типом агрегации по умолчанию сносит режим группировки у источника данных. Обходится вышеуказанным контролем на наличие добавляемого поля в списке полей выбора источника данных lookup-овского запроса.
__________________
Мы летаем, кружимся, нагоняем ужасы ...
За это сообщение автора поблагодарили: Logger (10).
Старый 02.08.2023, 13:28   #9  
pitersky is offline
pitersky
северный Будда
Аватар для pitersky
Ex AND Project
Соотечественники
 
1,509 / 432 (18) +++++++
Регистрация: 26.09.2007
Адрес: Солнечная система
У меня была такая ситуация на одном из проектов
Решил банальной очисткой контрола перед запуском лукапа
Присоединяюсь к предыдущим ораторам, что лукап с группировкой решение очень плохое, надо его делать только по уникальному полю таблицы
__________________
С уважением,
Вячеслав
Старый 03.08.2023, 10:56   #10  
TasmanianDevil is offline
TasmanianDevil
Мрачный тип
Аватар для TasmanianDevil
Злыдни
 
886 / 389 (14) ++++++
Регистрация: 24.01.2005
Адрес: Томск
Цитата:
Сообщение от pitersky Посмотреть сообщение
лукап с группировкой решение очень плохое
Почему же ?
Задача ограничения списка выбора значений какого-либо классификатора по набору его "засветившихся" позиций из какой-то порции транзакционных данных - регулярно возникающая задача, решаемая при минимуме трудозатрат именно так
__________________
Мы летаем, кружимся, нагоняем ужасы ...
Старый 03.08.2023, 12:39   #11  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от TasmanianDevil Посмотреть сообщение
Почему же ?
Задача ограничения списка выбора значений какого-либо классификатора по набору его "засветившихся" позиций из какой-то порции транзакционных данных - регулярно возникающая задача, решаемая при минимуме трудозатрат именно так
Решение не масштабируемое. Например, если попросят дополнительно вывести в Lookup расшифровку отобранного кода (название из классификатора).

Т.е. как решение "по быстрому", чтобы "отвязаться" - пойдет. Но позже, сам же будешь это все исправлять
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
За это сообщение автора поблагодарили: S.Kuskov (5).
Старый 04.08.2023, 10:30   #12  
TasmanianDevil is offline
TasmanianDevil
Мрачный тип
Аватар для TasmanianDevil
Злыдни
 
886 / 389 (14) ++++++
Регистрация: 24.01.2005
Адрес: Томск
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
если попросят дополнительно вывести в Lookup расшифровку отобранного кода (название из классификатора).
addLookupMethod() - и баба с возу, и волки сыты
__________________
Мы летаем, кружимся, нагоняем ужасы ...
Старый 05.08.2023, 18:37   #13  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,164 / 1293 (48) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Для себя я как-то решил, что в таких программных лукапах, где есть группировка, использовать временные таблицы (конечно, в 2012 те, что TempDB) или вьюхи.

Конечно, можно программно заткнуть описанные в теме проблемы, но практически любое их таких решений выключает возможности хоть как-то влиять на скорострельность.
В общем, что-то сделано, вроде работает, но как оптимизировать скорость работы таких частичных "затычек" непонятно в принципе.
Старый 05.08.2023, 21:46   #14  
pitersky is offline
pitersky
северный Будда
Аватар для pitersky
Ex AND Project
Соотечественники
 
1,509 / 432 (18) +++++++
Регистрация: 26.09.2007
Адрес: Солнечная система
Цитата:
Сообщение от TasmanianDevil Посмотреть сообщение
Почему же ?
Задача ограничения списка выбора значений какого-либо классификатора по набору его "засветившихся" позиций из какой-то порции транзакционных данных - регулярно возникающая задача, решаемая при минимуме трудозатрат именно так
Ну вообще-то кмк решаться она должна через exists join классификатора и транзакций. Так и работать быстрее будет, и идеологически корректно
__________________
С уважением,
Вячеслав
Теги
lookup, законченный пример

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Передача значения из ComboBox одной формы в lookup форму P^ilk^A DAX: Программирование 4 03.03.2015 18:25
получение значения из Lookup Global::conView() DesertBrowser DAX: Программирование 3 23.11.2011 15:56
LookUp. На основе предыдущего значения. Михаил Петрович DAX: Программирование 4 24.10.2007 12:26
Выбор значения из lookup + ввод с клавиатуры Lucky13 DAX: Программирование 29 25.05.2007 10:54
Как получить значения поля из lookup метода в WEB Dronas DAX: Программирование 5 13.01.2005 10:17

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

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

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