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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 20.12.2011, 06:46   #1  
imir is offline
imir
Участник
 
159 / 161 (6) ++++++
Регистрация: 28.05.2010
Получить Transact-SQL из QueryRun
Собственно, сабж:
Если можно, то как?
Если нельзя, то почему?
Старый 20.12.2011, 07:41   #2  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
877 / 649 (23) +++++++
Регистрация: 14.10.2004
X++:
info(queryRun.query().dataSourceNo(1).toString());
в полученной строке символы '==' заменить на '=', '||' заменить на 'or', '&&' заменить на 'and'
все условия where перенести в конец строки, group by и order by в самый-самый конец. join заменить на inner join и т.д.
В общем, требуется редактирование, чтобы преобразовать полученную строку в T\SQL.
За это сообщение автора поблагодарили: S.Kuskov (2).
Старый 20.12.2011, 07:59   #3  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от Ace of Database Посмотреть сообщение
в полученной строке символы '==' заменить на '=', '||' заменить на 'or', '&&' заменить на 'and'
У меня на AX2009 эти замены уже содержаться в результате QBDS.toString().
Также exists join меняется на exists() и всё в таком духе. Единственным исключением наверное является Advanced query range value expressions.
Цитата:
Сообщение от Ace of Database Посмотреть сообщение
В общем, требуется редактирование, чтобы преобразовать полученную строку в T\SQL.
В общем, согласен
За это сообщение автора поблагодарили: Ace of Database (2).
Старый 20.12.2011, 09:13   #4  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
RLS так не отловишь

По-моему, надо включать трассировку запросов и искать нужный запрос там
__________________
Axapta v.3.0 sp5 kr2
Старый 20.12.2011, 13:42   #5  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
877 / 649 (23) +++++++
Регистрация: 14.10.2004
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
У меня на AX2009 эти замены уже содержаться в результате QBDS.toString().
Также exists join меняется на exists() и всё в таком духе. Единственным исключением наверное является Advanced query range value expressions.
Точно У меня на АХ2009 простенькие проекты, и я не успел заметить новшества.
Все мясо пока еще в АХ30, вот там приходится чуть ли не ежедневно такие строки получать.
Старый 20.12.2011, 13:59   #6  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
877 / 649 (23) +++++++
Регистрация: 14.10.2004
Нет, все-таки и в АХ30 вместо '==' toString выдает '=' и вместо '||' выдает 'or'.
Видимо, я спутал случаи, когда надо кусок кода из Аксапты вырезать и анализировать через SQL Management Studio

Указанный ниже джоб выдает практически одинаковые результаты в АХ30 и в АХ2009

В АХ30 результат такой:
SELECT * FROM InventTable WHERE ((ItemId = 123 OR ItemId = 124)) EXISTS JOIN * FROM InventTableModule WHERE InventTable.ItemId = InventTableModule.ItemId AND ((ModuleType = Склад))

В АХ2009 результат такой:
SELECT FIRSTFAST * FROM InventTable WHERE ((ItemId = N'123' OR ItemId = N'124')) EXISTS JOIN FIRSTFAST * FROM InventTableModule WHERE InventTable.ItemId = InventTableModule.ItemId AND ((ModuleType = 0))

Кстати, очень умно Аксапта2009 добавляет FirstFast, видимо, чувствует, что идет фильтрация по уникальному индексу. И еще удобно, что вместо "Склад" пишет значение 0.

PHP код:
static void Job471(Args _args)
{
    
Query                   Query;
    
QueryRun                QueryRun;
    
QueryBuildDatasource    qbds;
    ;
    
Query = new Query();
    
qbds Query.addDataSource(tableNum(InventTable));
    
qbds.addRange(fieldNum(InventTableItemId)).value("123, 124");

    
qbds qbds.addDataSource(tableNum(InventTableModule));
    
qbds.addRange(fieldNum(InventTableModuleModuleType)).value(queryValue(ModuleInventPurchSales::Invent));
    
qbds.addLink(fieldNum(InventTableItemId), fieldNum(InventTableModuleItemId));
    
qbds.joinMode(JoinMode::ExistsJoin);

    
QueryRun = new QueryRun(Query);
    
info(QueryRun.query().dataSourceNo(1).toString());


Последний раз редактировалось Ace of Database; 20.12.2011 в 14:02.
Старый 20.12.2011, 14:10   #7  
imir is offline
imir
Участник
 
159 / 161 (6) ++++++
Регистрация: 28.05.2010
Вобщем делает, но не до конца, алиасы не назначены..

http://axforum.info/forums/attachmen...1&d=1324375547
Миниатюры
Нажмите на изображение для увеличения
Название: Снимок.JPG
Просмотров: 740
Размер:	72.1 Кб
ID:	7392  
Старый 20.12.2011, 14:16   #8  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
877 / 649 (23) +++++++
Регистрация: 14.10.2004
Попробовал тоже самое на другой АХ2009 - на которой стоит KR5, там без FirstFast такая же строка получается.
Но на обоих Аксаптах данные выбираются правильно, проверил джобом.
У меня просто на разных проектах разные АХ2009, и я только недавно их получил. Пока еще путаюсь между ними
Старый 20.12.2011, 14:21   #9  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
877 / 649 (23) +++++++
Регистрация: 14.10.2004
Кстати, у кого различаются версии клиента и АОСа, то вставка FirstFast может породить глюк, когда во всех гридах отображается только одна запись, если версия клиента и АОСа не совпадает.
Глюк. "Выбрать компанию" в гриде только одна строка

Так что лучше ставить KR5, или придется следить за соответствием версий на клиенте и АОСе
Старый 21.12.2011, 10:36   #10  
wolfstein is offline
wolfstein
Axapta Retail User
Axapta Retail User
 
51 / 91 (4) ++++
Регистрация: 05.07.2006
Цитата:
Сообщение от imir Посмотреть сообщение
Если можно, то как?
Можно включать трассировку запросов с сохранением в таблицу на время выполнения запроса, т.е. перед выполнением запроса включить, а после выполнения отключить. А потом попытаться найти в SysTraceTableSQL соответствующую запись с текстом запроса на T-SQL.

Однако для этого случая нужно хотя бы один раз выполнить запрос. И не всегда точно удастся идентифицировать твою запись в таблице SysTraceTableSQL.

X++:
static void Job60(Args _args)
{

    UserInfo                    userInfo;
    Query                       Query;
    QueryRun                    QueryRun;
    QueryBuildDatasource        qbds;
    SysTraceTableSQL            sysTraceTableSQL;
    SysTraceTableSQLTabRef      sysTraceTableSQLTabRef;

    void setTrace(boolean _set)
    {
        ;

        ttsbegin;

        userInfo.selectForUpdate(true);
        userInfo.reread();

        if (userInfo)
        {
            if (_set)
            {
                if (!((UserInfo.DebugInfo & (1 << 8)) >> 8))
                {
                    userInfo.debugInfo = userInfo.DebugInfo | (1 << 8);
                }
                if (!((UserInfo.TraceInfo & (1 << 3)) >> 3))
                {
                    userInfo.TraceInfo = userInfo.TraceInfo | (1 << 3);
                }
            }
            else
            {
                if ((UserInfo.TraceInfo & (1 << 3)) >> 3)
                {
                    userInfo.TraceInfo = userInfo.TraceInfo ^ (1 << 3);
                }
                if ((UserInfo.DebugInfo & (1 << 8)) >> 8)
                {
                    userInfo.debugInfo = userInfo.DebugInfo ^ (1 << 8);
                }
            }

            userInfo.update();
        }
        ttscommit;

        infolog.getUserSetup().setUserSetup(userinfo);
    }
    ;

    Query = new Query();
    qbds = Query.addDataSource(tableNum(InventTable));
    qbds.addRange(fieldNum(InventTable, ItemId)).value("123, 124");

    qbds = qbds.addDataSource(tableNum(InventTableModule));
    qbds.addRange(fieldNum(InventTableModule, ModuleType)).value(queryValue(ModuleInventPurchSales::Invent));
    qbds.addLink(fieldNum(InventTable, ItemId), fieldNum(InventTableModule, ItemId));
    qbds.joinMode(JoinMode::ExistsJoin);

    QueryRun = new QueryRun(Query);

    select firstonly userInfo where userInfo.Id == curuserid();

    setTrace(true);
    
    QueryRun.next(); // выполнение запроса
    
    setTrace(false);

    select firstonly systracetablesql
        order by CreatedDateTime desc
        where systracetablesql.createdBy == curuserid()
            &&systracetablesql.createdDateTime >= DateTimeUtil::newDateTime(systemdateget(),0)
            &&systracetablesql.createdDateTime <= DateTimeUtil::newDateTime(systemdateget(),str2time('23:59:59'))
        exists join sysTraceTableSQLTabRef
            where sysTraceTableSQLTabRef.TraceRecId == systracetablesql.RecId
                &&(sysTraceTableSQLTabRef.TraceTabId == tablenum(InventTable)
                    || sysTraceTableSQLTabRef.TraceTabId == tablenum(InventTableModule));
                
    info(systracetablesql.Statement);
}

Может быть будет еще вот эта тема полезна Как убрать знаки вопроса в мониторе запросов SQL?.
Старый 21.12.2011, 15:53   #11  
imir is offline
imir
Участник
 
159 / 161 (6) ++++++
Регистрация: 28.05.2010
Для анализа конечно применимо, для реальной работы.. выполнить запрос, чтобы потом его еще раз выполнить. Странно, я на каком-то форуме видел запись про 2012-ю, что мол - наконец, появилась такая возможность, потом перерыл все и не смог найти это сообщение, походу вброс был Вообще странно все это - неужели такой простой возможности будем ждать еще пару версий..
Старый 21.12.2011, 15:58   #12  
wolfstein is offline
wolfstein
Axapta Retail User
Axapta Retail User
 
51 / 91 (4) ++++
Регистрация: 05.07.2006
Цитата:
Сообщение от imir Посмотреть сообщение
Для анализа конечно применимо, для реальной работы.. выполнить запрос, чтобы потом его еще раз выполнить.
Если не секрет, а для чего вам нужен текст запроса в T-SQL? Я думал, что именно для анализа или для проверки работы запроса.
Старый 21.12.2011, 16:45   #13  
imir is offline
imir
Участник
 
159 / 161 (6) ++++++
Регистрация: 28.05.2010
Применений может быть масса - основное - это получить результат не в виде queryRun.next() а в виде, допустим NET Dataset-а.
Во первых - перебор queryRun.next() в цикле - ужасно долго работает. Во вторых - NET Dataset или сам текст запроса можно передать дальше любой другой системе, допустим в Reporting Services или любую другую. Т.е. Ax query - используем как гибкий конструктор запроса, к которому применяться все "фишки" типа RLS, сложных расширенных фильтров, Datareaid по виртуальным компаниям. А потреблять этот запрос будут уже другие.
За это сообщение автора поблагодарили: S.Kuskov (1).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
emeadaxsupport: Reporting Extensions Installation Fails to install on SQL 2008 Reporting services after applying 959494 and 957312 Blog bot DAX Blogs 1 23.06.2011 14:27
axinthefield: SQL Server Trace Flags for Dynamics AX Blog bot DAX Blogs 0 23.11.2010 21:11
Connection к другому SQL Server Poleax DAX: Программирование 5 19.10.2010 10:49
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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