20.12.2011, 06:46 | #1 |
Участник
|
Получить Transact-SQL из QueryRun
Собственно, сабж:
Если можно, то как? Если нельзя, то почему? |
|
20.12.2011, 07:41 | #2 |
Участник
|
X++: info(queryRun.query().dataSourceNo(1).toString()); все условия where перенести в конец строки, group by и order by в самый-самый конец. join заменить на inner join и т.д. В общем, требуется редактирование, чтобы преобразовать полученную строку в T\SQL. |
|
|
За это сообщение автора поблагодарили: S.Kuskov (2). |
20.12.2011, 07:59 | #3 |
Участник
|
Цитата:
Также exists join меняется на exists() и всё в таком духе. Единственным исключением наверное является Advanced query range value expressions. В общем, согласен |
|
|
За это сообщение автора поблагодарили: Ace of Database (2). |
20.12.2011, 09:13 | #4 |
Участник
|
RLS так не отловишь
По-моему, надо включать трассировку запросов и искать нужный запрос там
__________________
Axapta v.3.0 sp5 kr2 |
|
20.12.2011, 13:42 | #5 |
Участник
|
Цитата:
Все мясо пока еще в АХ30, вот там приходится чуть ли не ежедневно такие строки получать. |
|
20.12.2011, 13:59 | #6 |
Участник
|
Нет, все-таки и в АХ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 код:
Последний раз редактировалось Ace of Database; 20.12.2011 в 14:02. |
|
20.12.2011, 14:10 | #7 |
Участник
|
Вобщем делает, но не до конца, алиасы не назначены..
http://axforum.info/forums/attachmen...1&d=1324375547 |
|
20.12.2011, 14:16 | #8 |
Участник
|
Попробовал тоже самое на другой АХ2009 - на которой стоит KR5, там без FirstFast такая же строка получается.
Но на обоих Аксаптах данные выбираются правильно, проверил джобом. У меня просто на разных проектах разные АХ2009, и я только недавно их получил. Пока еще путаюсь между ними |
|
20.12.2011, 14:21 | #9 |
Участник
|
Кстати, у кого различаются версии клиента и АОСа, то вставка FirstFast может породить глюк, когда во всех гридах отображается только одна запись, если версия клиента и АОСа не совпадает.
Глюк. "Выбрать компанию" в гриде только одна строка Так что лучше ставить KR5, или придется следить за соответствием версий на клиенте и АОСе |
|
21.12.2011, 10:36 | #10 |
Axapta Retail User
|
Можно включать трассировку запросов с сохранением в таблицу на время выполнения запроса, т.е. перед выполнением запроса включить, а после выполнения отключить. А потом попытаться найти в 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 |
Участник
|
Для анализа конечно применимо, для реальной работы.. выполнить запрос, чтобы потом его еще раз выполнить. Странно, я на каком-то форуме видел запись про 2012-ю, что мол - наконец, появилась такая возможность, потом перерыл все и не смог найти это сообщение, походу вброс был Вообще странно все это - неужели такой простой возможности будем ждать еще пару версий..
|
|
21.12.2011, 15:58 | #12 |
Axapta Retail User
|
|
|
21.12.2011, 16:45 | #13 |
Участник
|
Применений может быть масса - основное - это получить результат не в виде queryRun.next() а в виде, допустим NET Dataset-а.
Во первых - перебор queryRun.next() в цикле - ужасно долго работает. Во вторых - NET Dataset или сам текст запроса можно передать дальше любой другой системе, допустим в Reporting Services или любую другую. Т.е. Ax query - используем как гибкий конструктор запроса, к которому применяться все "фишки" типа RLS, сложных расширенных фильтров, Datareaid по виртуальным компаниям. А потреблять этот запрос будут уже другие. |
|
|
За это сообщение автора поблагодарили: S.Kuskov (1). |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|