18.04.2018, 10:32 | #1 |
Участник
|
Скрипт для конвертации select в queryRun
Топик про SQL PARSER SPLITTER напомнил.
Давным давно я сделал скрипт который конвертирует из axapta'овских select'ов в axapta'овскую же череду queryBuildDataSource и QueryBuildRange (писать select'ы легче и были задачи делать запросы где пользователь может использовать запятые и звездочки, что select'овский like не поддерживает) Он на питоне, так как парсить текст на х++ это то ещё удовольствие. Консольная версия : http://codepad.org/QeUzFAWw (построенный queryRun в конце после "Output") Могу скинуть версию с gui если интересно. |
|
|
За это сообщение автора поблагодарили: Stitch_MS (3), Pokersky09 (2), trud (3). |
18.04.2018, 13:06 | #2 |
Участник
|
Думаю будет полезно, если дополнить мануалом "как воспользоваться" всем этим
|
|
18.04.2018, 15:42 | #3 |
Участник
|
Цитата:
Если нет питона - codepad.org или ideone позволяют запускать код с интернета. Скрипт выдаст queryRun. В select правда ДАЛЕКО не всё поддерживается - скобок нет, join только inner и || тоже нет в явном виде (что не страшно, так как два && по одному полю создадут два queryRange'а, что по сути и является условием ИЛИ).Я тогда решил допиливать результат его работы руками легче чем доделывать полный парсер axapta'овских запросов, так как его основная цель - убрать рутину, нежели полностью всё конвертировать В аттаче версия с гуем. В левом окошке вводится select, внизу волшебная кнопка. Если на неё нажать, в правой части будет текст queryRun'ов или ошибка. Работает на python 3.5.1. Кстати, интересный факт про синтаксис аксапты. В ней нельзя делать array[x ? y : z], но можно array[(x ? y : z)] |
|
|
За это сообщение автора поблагодарили: belugin (5). |
19.04.2018, 04:12 | #4 |
Участник
|
Ну кстати X++ то парсить довольно просто, вот код который вернет вам выделенный фрагмент текста в виде объектов во временной табличке(с типами и прочим).
если нужен просто лексический анализ, то можно использовать класс XppScanner X++: _treeMethodNode.AOTmakeXref(1); tmpxRefReferences = xRefCreate::makeTmp(appl.lastxRef()); xppScanner::populateXRefTmpReferenceWithSymbols(tmpxRefReferences,origSource); while select tmpxRefReferences order by Line, Column { |
|
|
За это сообщение автора поблагодарили: Logger (3), mayk (2). |