05.12.2016, 11:36 | #1 |
Участник
|
Как лучше сделать обход дерева AOT? Рекурсивный TreeNode? цикл по UtilElement? Еще как-то? Хочу найти все объекты с заданным Property
ax2012, ax7. Да и для других версий тоже актуально, по-моему.
Хочу найти все объекты с заданным Property Предположим, хочу найти объекты, у которых CountryRegionCode содержит RU. Внимание, может быть "RU", может быть "CZ,PL,RU,HU" и так далее. Есть и другие условия, которые я хочу наложить на выборку. Но пока пусть будет только "Property содержит подстроку". Как лучше сделать обход дерева AOT? Рекурсивный TreeNode? Цикл по UtilElement? Еще как-то? Ближайшая аналогичная ветка была вывод дерева из АОТа |
|
05.12.2016, 11:41 | #2 |
Участник
|
|
|
|
За это сообщение автора поблагодарили: mazzy (5). |
05.12.2016, 11:58 | #3 |
Участник
|
|
|
05.12.2016, 12:33 | #4 |
Участник
|
Цитата:
Цитата:
а для акс2012?
X++: Exportfile for AOT version 1.0 or later Formatversion: 1 ***Element: JOB ; Microsoft Dynamics AX Job: DEV_OurRuMenuItems unloaded ; -------------------------------------------------------------------------------- JOBVERSION 1 SOURCE #DEV_OurRuMenuItems #static void DEV_OurRuMenuItems(Args _args) #{ # CommaIo io = new CommaIo(@'D:\0\menuitems.csv', 'w'); # TreeNodeTraverser traverser = new TreeNodeTraverser(TreeNode::findNode('\Menu Items')); # TreeNode node; # container badcountries = ['BR', 'CN', 'IN', 'JP', 'TH', 'US', 'MX']; # Label label = new Label('en-US'); # label rulabel = new label('ru-RU'); # str codes; # # boolean isGoodCountry(str _country) # { # return strLRTrim(_country) && !conFind(badcountries, strLRTrim(_country)); # } # io.write('Path', 'Country', 'ViewUserLicense', 'MaintainUserLicense', 'Label', 'HelpText', 'Label.en', 'Help.en', 'Label.ru', 'Help.ru'); # node = traverser.next(); # while (node) # { # # if (node.AOTgetPropertiesExt()) # { # codes = node.AOTgetProperty("CountryRegionCodes"); # //if (strScan(codes, 'RU', 1, strLen(codes))) # if (isGoodCountry(codes)) # { # print node.treeNodePath(); # infolog.yield(); # io.write(node.treeNodePath(), codes, # node.AOTgetProperty('ViewUserLicense'), # node.AOTgetProperty('MaintainUserLicense'), # node.AOTgetProperty('Label'), # node.AOTgetProperty('HelpText'), # label.extractString(node.AOTgetProperty('Label')), # label.extractString(node.AOTgetProperty('HelpText')), # rulabel.extractString(node.AOTgetProperty('Label')), # rulabel.extractString(node.AOTgetProperty('HelpText'))); # } # } # node = traverser.next(); # } # io = null; # info('done'); #} ENDSOURCE PROPERTIES Origin #{A555D6A7-3E58-453C-9E8C-95B1E333F1C3} ENDPROPERTIES ***Element: END |
|
05.12.2016, 13:01 | #5 |
Участник
|
Для семерки скорее всего такое можно было бы найти непосредственно из Visual Studio через Metadata search
https://ax.help.dynamics.com/en/wiki...visual-studio/ |
|
05.12.2016, 13:03 | #6 |
Участник
|
Цитата:
мне кажется, что он не оптимально написан. В принципе понятно что делают - рекурсивный спуск вытягивают в одну итерацию. Но за счет какого-то левого встроенного класса TreeNodeIterator (все еще итератор!) и за счет кучи левого кода на X++. Но с одной стороны, рекурсивный спуск по AOT вряд ли будет иметь большую глубину (разве что в дизайнах форм/отчетов), поэтому вряд ли стоит бояться переполнения при обходе AOT. поэтому скорее всего своя рекурсивная функия как здесь вывод дерева из АОТа будет пооптимальнее А с другой стороны, есть просто псевдотаблица UtelElements, обход которой дает обычный одноуровневый цикл. Отсюда собственно и вопрос на обсуждение и для потрындеть: За перпендикулярный взгляд "работать с XML" отдельное спасибо. Последний раз редактировалось mazzy; 05.12.2016 в 13:08. |
|
05.12.2016, 13:05 | #7 |
Участник
|
Цитата:
Сообщение от kashperuk
Для семерки скорее всего такое можно было бы найти непосредственно из Visual Studio через Metadata search
https://ax.help.dynamics.com/en/wiki...visual-studio/ но обрати внимание metaData search ищет проперти только по равенству )))) я же специально обратил внимание, что условие "Property содержит подстроку" |
|
05.12.2016, 13:07 | #8 |
Участник
|
|
|
05.12.2016, 13:26 | #9 |
Боец
|
Для AX[0..2012]: Поиск в АОT на предмет использования метода с непустым аргументом
|
|
|
За это сообщение автора поблагодарили: mazzy (10). |
05.12.2016, 13:30 | #10 |
Участник
|
|
|
|
За это сообщение автора поблагодарили: mazzy (2). |