![]() |
#1 |
Участник
|
Использование Like оператора в X++ SQL и кнопка перекомпилировать
Хотел сделать функцию которая подгружает лог компиляции и перекомпилирует его.
Но выяснил, что кнопка "Перекомпилировать всё" не перекомпилирует все объекты, а только некоторые. В классе SysCompilerOutput.reCompileElement: X++: likePath = SysCompilerOutput::buildLikePath('\\'); Дальше вызывается запрос: X++: while select forupdate tmpCompilerOutput group by UtilElementType, SysUtilElementName where tmpCompilerOutput.TreeNodePath like likePath { compileSetInsert(tmpCompilerOutput.TreeNodePath); } Вопрос: Какие элементы должны быть выбраны этим запросом в чём вообще его смысл - как отработает Like? Мне кажется что можно было бы заменить его на просто *. Ещё не совсем понятно если TreeNodePath не указан в group by, почему он использован внутри запроса и что в нём будет? |
|
![]() |
#2 |
Участник
|
Если мне не изменяет память, то
X++: like likePath Похоже ради этого все и делалось. Попробуйте заменить на *. На первый взгляд там нечего сломать. |
|
![]() |
#3 |
Участник
|
Немного разобрался, судя по всему "\\\\*" выбирает все элементы, но это не точно.
Но лог компиляции получающийся в результате многопоточной компиляции содержит не все поля TmpCompilerOutput, то есть поля UtilElementType вообще нет, оно пустое, а SysUtilElementName равно чему то вроде "\Data Dictionary\Tables" или "\Forms", а именно по ним идёт группировка, В результате получается, что оно компилирует по одной форме, одному классу, одной таблице и так далее. AX2012 R2. Лог обычной компиляции содержит все поля. |
|
![]() |
#4 |
Участник
|
Привет. Подниму старую тему.
Если в таблице Table1 указаны значения, допустим: '\\SERVER\Folder1' '\\SERVER\Folder2' '\\SERVER\Folder3' И если стоит задача выбрать все значения по фильтру '\\SERVER\*' то оператор like в AX требует что бы синтаксис был такой: select table1 where like @'\\\\SERVER\\*' или без @: select table1 where like '\\\\\\\\SERVER\\\\*' Т.е. почему нужно экранировать символ '\' четыре раза? Последний раз редактировалось oleggy; 27.05.2025 в 05:41. |
|
![]() |
#5 |
Участник
|
Потому что в like например * - означает "любые символы"
Если ты хочешь искать конкретно * - надо её экранировать \* Соответственно, символ \ является служебным, и чтобы использовать его не как служебный, а как просто косую черту - надо его экранировать \\ |
|
![]() |
#6 |
Участник
|
|
|
![]() |
#7 |
Участник
|
В данном случае экранируется именно backslash, а не asterisk.
__________________
// no comments |
|
![]() |
#8 |
Участник
|
Да, я описал почему он экранируется, например
|
|