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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 18.09.2025, 13:24   #1  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,995 / 3293 (117) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Некорректная работа Extended query в 2012-й с Array полями
Привет.
Пишем модификацию под 12-ку R3
задействовали array поля (аналог Dimension)
И вдруг выясняется что для измерений начиная с 2-ки extended query в 12-ке не работает. Хотя это было вылечено еще в 2009-й.
Обычный Query работает.

Пример - джобик отрабатывает в 2009-й
для SysDimension::Center в бд уходит запрос с фильтром такого вида
X++:
(DIMENSION2_=N'1929')
а в 2012-й аналогичный джоб приводит к
X++:
(DIMENSION=N'1929')
(имена полей в 12-ке у нас конечно другие - свои значения - здесь стоит Dimension чисто для иллюстрации)
Но если поставить обычный Query то в 12-ке тоже работает.

Может можно как-то это исправить ?
В синтаксисе extendedQuery что-то поменять.

X++:
static void Job503_TestDim(Args _args)
{
    Query       query;
    QueryBuildDataSource    qbds;
    SysQueryRun    queryRun;
    SalesTable    salesTable;
    void test(SysDimension _finSysDimension, SysDim _num)
    {
        ;
        
        setPrefix(strFmt("%1 - %2", _finSysDimension, _num));
        query = new query();
        query.literals(1);
        qbds = query.addDataSource(tableNum(SalesTable));
        qbds.addSelectionField(fieldNum(SalesTable, SalesId));
        
        // extended query для измерений начиная с 2 не работает в 12-ке
        qbds.addRange(fieldNum(SalesTable, RecId)).value(
            strFmt('((%1.%2=="%3"))',
            qbds.name(),
            fieldid2name(tablenum(SalesTable), fieldid2ext(fieldnum(SalesTable, Dimension), Dimensions::code2ArrayIdx(_finSysDimension))),
            SysQuery::value(_num)
            )
            );
        /*
        // а обычный query - работает
        qbds.addRange(fieldid2ext(fieldnum(SalesTable, Dimension), Dimensions::code2ArrayIdx(_finSysDimension))).value(
            SysQuery::value(_num)
            );
        */
        queryRun = new SysQueryRun(query);
        // info(queryRun.toString());
        info(queryRun.query().dataSourceNo(1).toString()); // поправил для 2009-й
        if (queryRun.next())
        {
            salesTable = queryRun.get(tableNum(SalesTable));
            info(strFmt("%1", salesTable.SalesId));
        }
        else
        {
            warning(strFmt("Нет записей"));
        }
    }
    ;
    
    setPrefix(strFmt("Test"));
    
    // test(SysDimension::Department, '001'); // для SysDimension::Department - все работает в Extended Query
    // test(SysDimension::Department, '002');
    test(SysDimension::Center,     '1929');  // а для SysDimension::Center - уже нет
    // test(SysDimension::Center,     '222');
}

Последний раз редактировалось Logger; 18.09.2025 в 14:13. Причина: Исправил строку info(queryRun.toString());
Старый 18.09.2025, 13:39   #2  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,995 / 3293 (117) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Дополню в несколько другой формулировке (а то уточняют - видимо не совсем понятно описал)

в общем в 12-ке есть array поле самописное и для столбцов
Filed[2]
Filed[3]
и.т.п. extendedQuery не отрабатывает. Считает что это Filed[1]

Я помню что-то подобное было в 2009-й, но начиная с какого-то сервис пака (кажется SP5) это было исправлено. - Проверил в 2009-й все хорошо на последних билдах
Старый 18.09.2025, 13:47   #3  
Pandasama is offline
Pandasama
Участник
 
469 / 140 (5) +++++
Регистрация: 11.08.2014
Адрес: Барнаул
То есть в Ax если текст запроса посмотреть - он нормальный, а в SQL уходит другой?
Это очень странно.

Или он уже в Ax кривой? если да - то где именно ломается внутри этого?
X++:
strFmt('((%1.%2=="%3"))',
            qbds.name(),
            fieldid2name(tablenum(SalesTable), fieldid2ext(fieldnum(SalesTable, Dimension), Dimensions::code2ArrayIdx(_finSysDimension))),
            SysQuery::value(_num)
Старый 18.09.2025, 13:50   #4  
Pandasama is offline
Pandasama
Участник
 
469 / 140 (5) +++++
Регистрация: 11.08.2014
Адрес: Барнаул
X++:
Dimensions::code2ArrayIdx()
вот это что? это не стандарт

ну и в SalesTable нет Dimension, там DefaultDimension в 12ке - джоб не компилится
Старый 18.09.2025, 14:05   #5  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,995 / 3293 (117) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от Pandasama Посмотреть сообщение
То есть в Ax если текст запроса посмотреть - он нормальный, а в SQL уходит другой?
именно так !
Скрины не могу выкладывать - превысил лимит по картинкам.
Выглядит так
X++:
info(queryRun.query().dataSourceNo(1).toString());
выдает строку
Цитата:
SELECT WITH FORCE_LITERALS OrderId FROM TreasPayReqTable(TreasPayReqTable_1) WHERE ((((TreasPayReqTable_1.FinDimension[2]=="1929"))))
а на SQL уходит так :
Цитата:
SELECT T1.ORDERID,T1.RECID FROM TREASPAYREQTABLE T1 WHERE (((PARTITION=5637144576) AND (DATAAREAID=N'mrc')) AND (FINDIMENSION=N'1929')) ORDER BY T1.ORDERID

Последний раз редактировалось Logger; 18.09.2025 в 14:25.
Старый 18.09.2025, 14:08   #6  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,995 / 3293 (117) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от Pandasama Посмотреть сообщение
X++:
Dimensions::code2ArrayIdx()
вот это что? это не стандарт

ну и в SalesTable нет Dimension, там DefaultDimension в 12ке - джоб не компилится
Джобик написан в 2009-й.
В 12-ку наверно легко портировать - просто константы поставить например.

У нас свои самописные таблички, я мог бы выложить джобик для них, но но у вас их нет. Не сможете повторить.
Попробуйте на SalesTable.DEL_Dimension

вместо
FinDimensions::code2ArrayIdx(_finSysDimension)
можно просто поставить (_finSysDimension+ 1)
это же джоб
Старый 18.09.2025, 14:18   #7  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,995 / 3293 (117) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Кажется придумал как обойти.
Делаем вьюху по табличке.
В ней делаем поля
View.Dimension1 - мапируется на Table.Dimension[1]
View.Dimension2 - мапируется на Table.Dimension[2]
View.Dimension3 - мапируется на Table.Dimension[3]

в запросе джоиним эту вьюху по первичному ключу (или по RecId) к таблице и накладываем фильтры уже на поля вьюхи. Все работает.
Немного геморно, но рабочий вариант.

Но может можно без вьюхи ?
Теги
bug, extended query, extended query syntax

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
AXAPTA 2012. Работа с выпадающим списком feuerfub DAX: Функционал 1 21.11.2019 15:06
emeadaxsupport: Dynamics AX 2012 Reporting: How to add company logo into query based report Blog bot DAX Blogs 0 06.12.2012 21:11
X++: X++ Arrays Behave Differently in .NET CIL, in Dynamics AX 2012 Blog bot DAX Blogs 0 17.09.2012 23:11
dynamicsaxtraining: Purchase Blog bot DAX Blogs 0 11.03.2012 05:25

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

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

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