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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 08.12.2006, 11:05   #1  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,333 / 3558 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Когда-то писал подобное... Так что голосую за kashperuk
Что хочется отметить:
1. Не хвататет для полного счастья макросов и методов класса Global:
X++:
    if (selectedLine)
    {
        //The main elementTypes - can be extended
        add2Set(#ExtendedDataTypesPath);
        add2Set(#BaseEnumsPath);
        add2Set(#TablesPath);
        add2Set(#ClassesPath);
        add2Set(#FormsPath);
        add2Set(#ReportsPath);
        add2Set(#MacrosPath); // Macros

        //if nothing was found in the AOT, we'll try searching in systemDocumentation
        if (selectedNodesSet.elements() == 0)
        {
            add2Set(#SystemFunctionsPath);
            add2Set(#SystemTablesPath);
            add2Set(#SystemTypesPath);
            add2Set(#SystemEnumsPath);
            add2Set(#SystemClassesPath);
            add2Set(#ClassesPath + #AOTRootPath + classstr(Global)); // Global
        }
2. Формы и отчеты - не нужны - только сбивают с толку. Если этим скриптом пользоваться из кода, то нельзя объявить переменную типа названия формы. В то же время может существовать таблица/класс/едт который совпадает с названием формы. А значит скрипт откроет лишние окна. В случае макросов - по идее тоже можно провести анализ на наличие перед названием - символа # или фразы GlobalMacro - но для простоты так делать не хочется

3. Открываются сразу 2 окна (в случае системной доки) - одно окно узла и другое - окно редактора. Окно узла - лишнее - его вполне можно убрать - сделав в коде анализ типа узла. Также вылезает окно свойств - что как мне кажется только мешает. Хотя как говорится на вкус и цвет товарищей нет.

В общем - это пока только те вещи, которые можно убрать из кода (если конечно доберусь - то исправлю - а если нет (что скорее всего) - то пусть останутся просто моим мнением)

4. Что еще можно сделать (автор идеи - db) - это построить по узлу, который открыт в редакторе перекрестные ссылки (табл TmpxRefReferences и класс xRefCreate) и делать тоже самое - только выделяя переменные, а не сами названия узлов АОТ

5. Ну и в заключение - можно еще искать контролы на форме/отчете с AutoDeclaration=Yes. Для этого нужно убедиться, что редактор открыт у формы/отчета и путем перебора дерева контролов можно найти сей контрол.
Код у меня он оформлен как 2 вспомогательных метода, что с ходу не впишется в представленный скрипт. Однако идею можно переработать.
X++:
// _sourceNode = '\\Forms\\Address' (к примеру), получается через TreeNode::findNode(e.path()).AOTParent().TreeNodePath()
// _declaration - тоже самое что и selectedLine
public TreeNode findControlNode(TreeNode _sourceNode, str _declaration)
{
    TreeNode       declTreeNode;
    TreeNode       ret;
    int            i;
    str            s;
    #AOT
    ;
    i = strfind(_sourceNode.treeNodePath(), '\\', strlen(#AOTRootPath) + 1, strlen(_sourceNode.treeNodePath()));
    if (i < 1)
    {
        return ret;
    }
    s = substr(_sourceNode.treeNodePath(), 1, i - 1);
    i = strfind(_sourceNode.treeNodePath(), '\\', strlen(s) + 2, strlen(_sourceNode.treeNodePath()));
    switch (s)
    {
        case #FormsPath, #ReportsPath:
            s = substr(_sourceNode.treeNodePath() + '\\Designs', 1, i - 1);
            ret = this.findSubNode(TreeNode::findNode(s), _declaration);
            break;
        default:
    }
    return ret;
}
Код функции findSubNode
X++:
private TreeNode findSubNode(TreeNode _startNode, TreeNodeName _nodeName, TreeNode _parentNode = null)
{
    int              i;
    TreeNode         curNode, subNode;
    TreeNodeIterator it;
    TreeNodePath     subNodePath;
    ;
    curNode = _parentNode ? _parentNode : _startNode;
    it = curNode.AOTiterator();
    subNode = it.next();
    while (subNode)
    {
        subNodePath = subNode.treeNodePath();
        if (this.isNodeOk(subNode, _nodeName))
        {
            break;
        }
        if (subNode.AOTchildNodeCount() > 0)
        {
            subNode = this.findSubNode(_startNode, _nodeName, subNode);
            subNodePath = '';
            if (subNode)
            {
                subNodePath = subNode.treeNodePath();
            }
        }
        if (this.isNodeOk(subNode, _nodeName))
        {
            break;
        }
        else
        {
            subNode = it.next();
            subNodePath = '';
        }
    }
    return subNode;
}
__________________
Возможно сделать все. Вопрос времени

Последний раз редактировалось sukhanchik; 08.12.2006 в 11:08.
За это сообщение автора поблагодарили: kashperuk (3).
Теги
открыть переменную

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Шаблон комментария blitzkrieg DAX: Программирование 6 06.11.2010 06:54
Kashperuk Ivan: EditorScripts.addIns_OpenInAOT - version 2 Blog bot DAX Blogs 0 29.05.2008 17:05
Kashperuk Ivan: EditorScripts.addIns_OpenInAOT() script updateHO... Blog bot DAX Blogs 0 08.02.2007 22:31
Dynamics AX Geek: Productivity tip: classes EditorScripts & xppSource Blog bot DAX Blogs 0 28.10.2006 16:40
Как создать свой сценарий Diman DAX: Программирование 1 15.08.2003 10:55

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

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

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