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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 25.05.2017, 15:50   #1  
Oz is offline
Oz
Участник
Аватар для Oz
 
293 / 51 (2) ++++
Регистрация: 22.08.2002
Адрес: Москва
Ошибка запроса типа Union в лукапе
DAX 2012 R3
версия приложения 6.3.5000.133
версия ядра 6.3.5000.138

Ошибка проявилась в стандартном функционале: при создании нового ресурса (Управление и учет по проектам/Обычный/Ресурсы проекта/Ресурсы). Если в форме создания в поле Рабочий ввести предварительный фильтр с использованием символа *, то при срабатывании лукапа возникает ошибка "Несоответствие числа полей в запросе типа UNION. Номер поля HcmWorkerCubeDimension_1 отличается от номера поля HcmWorkerCubeDimension_2". При этом вызов того же лукапа из поля, не содержащего *, проходит штатно. При попытке отфильтровать появившийся список, используя этот же текст с *, ничего предосудительного не происходит.
Как выяснилось в ходе экспериментов, чтобы воспроизвести такое поведение, достаточно на пустую форму добавить StringEdit, перекрыть у него lookup примерно таким образом:
X++:
public void lookup()
{
    Query query = new Query();
    QueryBuildDataSource qbds_1;
    QueryBuildDataSource qbds_2;

    SysTableLookup sysTableLookup = SysTableLookup::newParameters(tableNum(ProjTable), this);

    query.queryType(QueryType::Union);

    qbds_1 = query.addDataSource(tableNum(ProjTable));
    
    qbds_2 = query.addDataSource(tableNum(ProjTable));
    qbds_2.unionType(UnionType::Union);
    
    sysTableLookup.parmQuery(query);

    sysTableLookup.addLookupField(fieldNum(ProjTable, ProjId), true);
    sysTableLookup.addLookupField(fieldNum(ProjTable, Name));

    sysTableLookup.performFormLookup();
}
Таблица ProjTable взята для примера, на её месте по всей видимости может быть использована любая.
В таком примере ошибочное поведение лукапа воспроизводится чуть более, чем полностью.
Ещё нюанс, трассировка запросов показывает, что в ошибочной ситуации запрос на SQL не отправляется. Ядро само видимо решает, что что то не так и генерирует ошибку.

Хочу спросить у уважаемого сообщества, сталкивался ли кто нибудь с подобным?
Есть ли сборки DAX 2012, на которых описанная ситуация не происходит? И есть ли у кого нибудь мысли, что же тут может происходить, и как с этим жить бороться?
__________________
Здесь могла быть Ваша реклама!
Старый 26.05.2017, 15:23   #2  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
375 / 562 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
Баг в классе SysTableLookupBase, можно поправить например вот так метод formRun
X++:
    queryBuildDataSource = formDataSource.queryBuildDataSource();
    if (queryBuildDataSource)
    {
        // Update the Query's select list.
        this.buildSelectionList(queryBuildDataSource);

        uniqueId = queryBuildDataSource.uniqueId();
    }

    queryBuildDataSource = formDataSource.queryRunQueryBuildDataSource();
    if (queryBuildDataSource)
    {
        // Update the QueryRun's select list.
        this.buildSelectionList(queryBuildDataSource);

        uniqueId = queryBuildDataSource.uniqueId();
    }

    if(query != null && query.queryType() == QueryType::Union)
    {
        for(i = 1; i <= query.dataSourceCount(); i++)
        {
            queryBuildDataSource = query.dataSourceNo(i);

            if(queryBuildDataSource.uniqueId() != uniqueId)
            {
                this.buildSelectionList(queryBuildDataSource);
                //simple fix srf
                if (formDataSource.queryRun() && formDataSource.queryRun().query().dataSourceUniqueId(queryBuildDataSource.uniqueId()))
                {
                    queryBuildDataSource = formDataSource.queryRun().query().dataSourceUniqueId(queryBuildDataSource.uniqueId());
                    if (queryBuildDataSource)
                    {
                        // Update the QueryRun's select list.
                        this.buildSelectionList(queryBuildDataSource);
                    }                
                }
                //simple fix srf
            }
        }
    }
Смысл в том, что поля, которые отображаются в лукапе, добавляются в запрос 2 раза(комменты // Update the Query's select list. и // Update the QueryRun's select list.), а для оставшихся DS в query типа union только 1 раз, поэтому и ошибка про несоответствие числа полей в источниках данных

Но логичнее посмотреть метод this.buildSelectionList и поправить его так, чтобы поля которые уже есть в запросе дополнительно в него не добавлялись, тогда метод formRun править не надо будет.
__________________
Sergey Nefedov
За это сообщение автора поблагодарили: Oz (2), gl00mie (3), Logger (1).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
AX 2009 Ошибка запроса с условием по полю Dimension[x] ziva DAX: Программирование 4 20.01.2013 20:33
Ошибка расширенного диапазона запроса: Ожидается правая круглая скобка рядом с 0. uskutus DAX: Программирование 5 11.04.2012 13:48
Ошибка при увеличении количества символов в поле типа Extended Data Types DAX13 DAX: Администрирование 1 10.09.2010 11:06
Ошибка при определении запроса в RLS mass DAX: Программирование 3 03.03.2009 12:51
Ошибка в формате числа. 36AC DAX: Программирование 7 19.10.2006 10:04

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

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

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