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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 05.12.2016, 11:36   #1  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Как лучше сделать обход дерева AOT? Рекурсивный TreeNode? цикл по UtilElement? Еще как-то? Хочу найти все объекты с заданным Property
ax2012, ax7. Да и для других версий тоже актуально, по-моему.

Хочу найти все объекты с заданным Property
Предположим, хочу найти объекты, у которых CountryRegionCode содержит RU.
Внимание, может быть "RU", может быть "CZ,PL,RU,HU" и так далее.

Есть и другие условия, которые я хочу наложить на выборку.
Но пока пусть будет только "Property содержит подстроку".

Как лучше сделать обход дерева AOT?
Рекурсивный TreeNode?
Цикл по UtilElement?
Еще как-то?

Ближайшая аналогичная ветка была вывод дерева из АОТа
Старый 05.12.2016, 11:41   #2  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от mazzy Посмотреть сообщение
ax7
PHP код:
ls -filter *.xml -recourse | ?{  select-xml "какой-то-xpath" $_ 
За это сообщение автора поблагодарили: mazzy (5).
Старый 05.12.2016, 11:58   #3  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от belugin Посмотреть сообщение
PHP код:
ls -filter *.xml -recourse | ?{  select-xml "какой-то-xpath" $_ 
интересная мысль!
там, конечно, regexp заколебешься писать.
но мысль "свести к поиску по xml" интересная. надо подумать. спасибо.

а для акс2012?
Старый 05.12.2016, 12:33   #4  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от mazzy Посмотреть сообщение
интересная мысль!
там, конечно, regexp заколебешься писать.
но мысль "свести к поиску по xml" интересная. надо подумать. спасибо.
Не надо никаких регэкспов - в Posh поддержка xml есть
Цитата:
а для акс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:03   #5  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от belugin Посмотреть сообщение
[XPP]
TreeNodeTraverser traverser = new TreeNodeTraverser(TreeNode::findNode('\Menu Items'));
собственно вопрос у меня и родился после того, как заглянул в TreeNodeTraverser.
мне кажется, что он не оптимально написан.

В принципе понятно что делают - рекурсивный спуск вытягивают в одну итерацию.
Но за счет какого-то левого встроенного класса TreeNodeIterator (все еще итератор!)
и за счет кучи левого кода на X++.

Но с одной стороны, рекурсивный спуск по AOT вряд ли будет иметь большую глубину (разве что в дизайнах форм/отчетов), поэтому вряд ли стоит бояться переполнения при обходе AOT. поэтому скорее всего своя рекурсивная функия как здесь вывод дерева из АОТа будет пооптимальнее
А с другой стороны, есть просто псевдотаблица UtelElements, обход которой дает обычный одноуровневый цикл.

Отсюда собственно и вопрос на обсуждение и для потрындеть:
Цитата:
Сообщение от mazzy Посмотреть сообщение
Как лучше сделать обход дерева AOT?
Рекурсивный TreeNode?
Цикл по UtilElement?
Еще как-то?
За перпендикулярный взгляд "работать с XML" отдельное спасибо.

Последний раз редактировалось mazzy; 05.12.2016 в 13:08.
Старый 05.12.2016, 13:30   #6  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от mazzy Посмотреть сообщение
собственно вопрос у меня и родился после того, как заглянул в TreeNodeTraverser.
мне кажется, что он не оптимально написан.
В моей практике такие задачи решаются для одноразовых потребностей, поэтому эффективность выполнения кода не нужна
За это сообщение автора поблагодарили: mazzy (2).
Старый 05.12.2016, 13:01   #7  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Для семерки скорее всего такое можно было бы найти непосредственно из Visual Studio через Metadata search

https://ax.help.dynamics.com/en/wiki...visual-studio/
Старый 05.12.2016, 13:05   #8  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Для семерки скорее всего такое можно было бы найти непосредственно из Visual Studio через Metadata search

https://ax.help.dynamics.com/en/wiki...visual-studio/
это первое, что сделал
но обрати внимание metaData search ищет проперти только по равенству ))))
я же специально обратил внимание, что условие "Property содержит подстроку"
Старый 05.12.2016, 13:07   #9  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Visual Studio Metadata search
ну и Metadata search выдает результаты только в интерфейс
и позволяет только открыть окошко.

а я хочу как-то дополнительно обработать результаты выборки.
кроме того, у меня в результате несколько сотен объектов получается.
Старый 05.12.2016, 13:26   #10  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
Для AX[0..2012]: Поиск в АОT на предмет использования метода с непустым аргументом
За это сообщение автора поблагодарили: mazzy (10).
Теги
aot, ax2012, ax7, treenode, utilelements

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Экпортировать объекты AOT по security key Art_Tanis DAX: Программирование 2 06.04.2015 14:42
не возможно переместить объекты из AOT АртемМелихов DAX: Администрирование 13 05.03.2014 11:13
Перечень пунктов меню и их свойств Sequel DAX: Программирование 5 09.08.2012 13:39
Подсвеченые и не подсвеченые объекты в AOT miklenew DAX: Программирование 14 15.05.2008 17:14
В каких таблицах хранятся объекты AOT и проекты? Кирилл DAX: Программирование 2 11.06.2004 14:49

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

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

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