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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 17.04.2012, 15:29   #1  
db is offline
db
Роман Долгополов (RDOL)
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
 
393 / 692 (24) +++++++
Регистрация: 01.04.2004
Адрес: Москва
Преобразование query в строку sql
знает ли кто нибудь способ получить по квери его представление в виде sql строки пригодной для непосредственного выполнения сервером БД или какое нибудь готовое решение для корректного преобразования значений range в условия на Т-SQL/PL-SQL?

требуется дать пользователю возможность задать произвольные ренжи на квери, а потом получив запрос использовать его в качестве основы для выполнения другого гораздо более сложного запроса с синтаксисом который невозможно получить стандартными средствами dax

просьба не сводить обсуждения к вопросам зачем/это неправильно/сделайте стандартно и т.д., а обсуждать конкретно эту техническую задачу

нужно это для существенного ускорения некой операции. возможность отрубания стандартной функциональности расширенного фильтра для упрощения формирования условия where так же здесь не обсуждается - с таким упрощением проблема перестает быть проблемой. использовать трассировку для выковыривания текста запроса то же не вариант. qbds.toString() вариант, но его надо допиливать - СУБД такое не съест

DAX 2009 SP1 EE RU8
Старый 17.04.2012, 16:40   #2  
wolfstein is offline
wolfstein
Axapta Retail User
Axapta Retail User
 
51 / 91 (4) ++++
Регистрация: 05.07.2006
Получить Transact-SQL из QueryRun
За это сообщение автора поблагодарили: mazzy (2), db (2).
Старый 18.04.2012, 08:17   #3  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
В общем случае Query может содержать несколько последовательных запросов. Не связанных друг с другом и не подчинённых друг к другу. Т.е. просто независимые друг от друга запросы разной структуры, которые queryRun обрабатывает последовательно.

Даже если брать за основу не весь Query, а QueryBuildDataSource, то и тут есть нюансы. Например, я себе не представляю, как можно реализовать одним SQL запросом QueryBuildDataSource, содержащий QueryFetchMode::One2Many.

Понятно что все эти "экзотические" возможности недоступны для пользователя через функциональность расширенного фильтра. Но ведь для системы нет никакой разницы - Query полученный от пользователя и Query созданный программно это одна и таже сущность. Поэтому я сомневаюсь в том что в системе есть какой-то стандартный инструмент, который сможет превратить в чесный SQL-текст любой Query/QueryBuildDataSource. Всё-таки наличие у аксаптовского Query таких "экзотических" возможностей, делает его гораздо более сложным объектом, нежели просто SQL-запрос.

Если говорить даже просто о преобразовании значения range, в некоторое логическое условие, то и тут не вижу никакаих надежд на наличие стандартных инструментов . Стандартный метод Global::inRange() реализуется через запрос к временной таблице. Если бы существовал транслятор, доступный из X++, стали бы они так делать?

Хотя... всё может быть Также не исключаю возможность существования самописных трансляторов. Но они ли вам нужны?
За это сообщение автора поблагодарили: db (2).
Старый 18.04.2012, 13:30   #4  
db is offline
db
Роман Долгополов (RDOL)
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
 
393 / 692 (24) +++++++
Регистрация: 01.04.2004
Адрес: Москва
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
В общем случае Query может содержать несколько последовательных запросов
.....
Понятно что все эти "экзотические" возможности недоступны для пользователя через функциональность расширенного фильтра
.....
Хотя... всё может быть Также не исключаю возможность существования самописных трансляторов. Но они ли вам нужны?
Сферический конь в вакууме (и даже в более реальных средах) не нужен и то что невозможно сделать в расширенном фильтре не интересует

Ну про стандартные я даже и не мечтаю - так что если кто поможет ссылкой на самодельное подобное извращение то буду вполне доволен

Пока склоняюсь к разбору и переформатированию результатов qbds.toString(). Ну и тут своя бяка нашлась - на некоторых (вполне нормально исполняющихся, но достаточно сложных по структуре) запросах выполнение этого кода валит аксапту ...
Старый 18.04.2012, 15:48   #5  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Решения нет, но есть вот такая мысль.
1. Создать компанию "ttt" без данных
2. Нужный запрос выполнить в рамках этой компании. Обязательно без параметризации.
3. Со стороны SQL отловить такой запрос (к компании ttt) и сохранить в какую-нибудь табличку
4. Использовать полученный запрос из таблички.

п.3 кажется реализуемым, вот только не знаю как
Старый 25.04.2012, 18:37   #6  
db is offline
db
Роман Долгополов (RDOL)
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
 
393 / 692 (24) +++++++
Регистрация: 01.04.2004
Адрес: Москва
всем спасибо за идеи.
сделал всё таки через отлов трассировки в таблицу по мотивам Получить Transact-SQL из QueryRun естественно с forceLiterals=true

с левыми компаниями связываться не стал. перед трассируемым исполнением на первый датасорс запроса накладываю условие RecId==0, которое потом легко найти и вырезать в готовом sql-тексте
За это сообщение автора поблагодарили: mazzy (2), S.Kuskov (1).
Старый 25.04.2012, 22:11   #7  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Если решили завязаться на трассировку, то я бы предложил дописать свой код в Application.SysTrace(), где и перехватывать созданные запросы.
Для передачи результата в прикладной код можно воспользоваться GlobalCache() на Application.
Можно так же не допускать записи в лог, введя флаг перехвата через тот же GlobalCache().
__________________
Axapta v.3.0 sp5 kr2
Старый 25.04.2012, 22:52   #8  
Удвой Покуров is offline
Удвой Покуров
Участник
 
461 / 228 (8) ++++++
Регистрация: 03.04.2011
Андрей, а так rls ловится? То, что не ловятся подсказки оптимизатора самого скуля, понятно...
Старый 26.04.2012, 00:12   #9  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Не понял вопрос

В лог пишется запрос в том виде, как он уходит на сиквел, в том числе с ограничениями rls и всеми хинтами, которые были добалены
__________________
Axapta v.3.0 sp5 kr2
Старый 12.05.2012, 13:22   #10  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,438 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
В AX2012 появился метод getSQLStatement и директива generateonly

dax-lessons: Get underlying SQL query using getSQLStatement [Dynamics AX 2012]
За это сообщение автора поблагодарили: iCloud (4).
Теги
query, t-sql, преобразование, расширенный фильтр

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
fed: Two stories about inventory closing and SQL Locks Blog bot DAX Blogs 3 14.01.2014 11:53
Преобразование datasource и query в табличный курсор Geo DAX: Программирование 29 21.04.2011 21:52
axperf: Important SQL Server Change! - Parameter Sniffing and Query Plan Caching Blog bot DAX Blogs 3 24.05.2010 02:53
jinx: Dynamics AX – Query-Ranges und Filtereinstellungen des Benutzers Blog bot DAX auf Deutsch 0 04.02.2010 00:05
Как реализовать Query или View на примере такого T-SQL запроса для OLAP? sao DAX: Программирование 9 07.10.2005 18:57

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

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

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