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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 04.08.2005, 12:14   #1  
TOLK is offline
TOLK
Участник
 
11 / 10 (1) +
Регистрация: 29.07.2005
? Какой это объект
Как из кода определить что это
таблица, перечислимый тип, форма и т.д
Старый 04.08.2005, 12:19   #2  
LEX is offline
LEX
NavAx
Аватар для LEX
NavAx Club
 
33 / 12 (1) ++
Регистрация: 06.04.2004
а в чем заключается проблема?
Старый 04.08.2005, 12:22   #3  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Мне больше интересно, а в результате чего возникает такая потребность ?
Старый 04.08.2005, 13:52   #4  
Zan is offline
Zan
Участник
 
104 / 25 (1) +++
Регистрация: 22.07.2004
Адрес: I live in Moscow
Выбираете объект, который хотите анализировать.
Например метод класса.
Нажимаете на нем правой кнопкой.
далее add-ins -> Анализатор кода
Старый 04.08.2005, 14:08   #5  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Цитата:
Как из кода.....
Так что анализатор как я понимаю здесь не поможет.

Хороших способов я не знаю, поэтому могу предложить два извращенческих

1) перебирать ноды АОТ
2) покопаться в табличке, в которой хранится описание объектов AOT (название не помню, что-то типа Dict*)

Но вообще, задача идентификации объекта в run-time, как правило, свидетельствует о неправильном проектировании.
Старый 04.08.2005, 14:14   #6  
TOLK is offline
TOLK
Участник
 
11 / 10 (1) +
Регистрация: 29.07.2005
Например в коде есть определение переменной,
VarXXX tempVar;

Я не знаю что это за VarXXX, таблица, класс, или еще какой объект, приходится искать пойском. Может есть какой нить путь побыстрее.
Старый 04.08.2005, 14:47   #7  
Zan is offline
Zan
Участник
 
104 / 25 (1) +++
Регистрация: 22.07.2004
Адрес: I live in Moscow
:)
.....и опыт, сын ошибок трудных, и гений порадоксов друг .....

Да, согласен, определить из кода тип той или иной переменной довольно трудно, особенно для новичка.
Поработаете какое-то время с Аксаптой, а там уж многие объекты будете знать в лицо
Старый 04.08.2005, 15:12   #8  
dn is offline
dn
Участник
Самостоятельные клиенты AX
 
486 / 159 (6) ++++++
Регистрация: 26.03.2003
Адрес: Москва
Цитата:
Изначально опубликовано TOLK
Например в коде есть определение переменной,
VarXXX tempVar;

Я не знаю что это за VarXXX, таблица, класс, или еще какой объект, приходится искать пойском. Может есть какой нить путь побыстрее.
Выделяешь VarXXX, вызываешь правой клавишей мыши контекстное меню:
Scripts\AddIns\OpenNewWindowSelected
Старый 04.08.2005, 15:19   #9  
Dron AKA andy is offline
Dron AKA andy
Moderator
 
944 / 253 (10) ++++++
Регистрация: 27.03.2002
Адрес: Москва
Цитата:
Scripts\AddIns\OpenNewWindowSelected
Нету такого, видимо, ваша разработка. Полезная вещица
Поделитесь, если не сложно, вашим классом EditorScripts. Всем полезно будет.
__________________
Андрей.
Старый 04.08.2005, 15:29   #10  
TOLK is offline
TOLK
Участник
 
11 / 10 (1) +
Регистрация: 29.07.2005
Да я новичок, и попобывал, нашел только Scripts\AddIns\OpenNewWindows, который открывает только сам объект, код которого я просматриваю, в новом окне
Старый 04.08.2005, 15:29   #11  
dn is offline
dn
Участник
Самостоятельные клиенты AX
 
486 / 159 (6) ++++++
Регистрация: 26.03.2003
Адрес: Москва
void addIns_OpenNewWindowSelected(Editor e)
{
TreeNode treeNode;
str selectedText;
;

selectedText = strRTrim(strLTrim(substr(e.currentLine(), e.selectionStartCol(), e.selectionEndCol() - e.selectionStartCol())));
treeNode = TreeNode::findNode(strFmt('\\Data Dictionary\\Tables\\%1', selectedText));

if (! treeNode)
{
treeNode = TreeNode::findNode(strFmt('\\Data Dictionary\\Base Enums\\%1', selectedText));
}

if (! treeNode)
{
treeNode = TreeNode::findNode(strFmt('\\Classes\\%1', selectedText));
}

if (! treeNode)
{
treeNode = TreeNode::findNode(strFmt('\\Forms\\%1', selectedText));
}

if (! treeNode)
{
treeNode = TreeNode::findNode(strFmt('\\Data Dictionary\\Extended Data Types\\%1', selectedText));
}

if (treeNode)
treeNode.AOTnewWindow();
}
Старый 04.08.2005, 15:43   #12  
TOLK is offline
TOLK
Участник
 
11 / 10 (1) +
Регистрация: 29.07.2005
Супер, спасибо, работает
Заодно научился как добавлять новый пункт меню, в ниспадающее меню, например коментарии, типа //TOLK "Current Date, "Current Time
Старый 19.05.2009, 11:36   #13  
Jox is offline
Jox
Developer
Аватар для Jox
 
112 / 24 (1) +++
Регистрация: 26.07.2005
Адрес: Питер
Может быть Вам будет полезно это простое решение, хотя оно требует доработки (оптимизации):
Старый 19.05.2009, 12:29   #14  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
Вот же решение, уже обсуждалось. Автор вроде miklenew.
Работает при поддержке аксаптовского, движка. Ну невыносимо полезная штука!!!

Откывает объект АОТ в новом окне, при этом имя не обязательно должно совпадать. Идёт распознование по типу
X++:
void AA_NewWindow(Editor e)
{
    TreeNode            treeNode = TreeNode::findNode(e.path());
    xRefTmpReferences   tmpxRefReferences;
    Column              nCol = e.columnNo() + 1;
    Line                nLine = e.currentLineNo() + 1;
    ;
    treeNode.AOTmakeXref(1);
    tmpxRefReferences = xRefCreate::makeTmp(infolog.lastxRef());

    select firstonly tmpxRefReferences
        order by Column desc
        where tmpxRefReferences.line == nLine &&
              tmpxRefReferences.Column <= nCol;

    if (!tmpxRefReferences)
        return;

    treeNode = TreeNode::findNode(tmpxRefReferences.path());

    if (treeNode)
        treeNode.AOTnewWindow();
}
За это сообщение автора поблагодарили: mazzy (2), Владимир Максимов (3).
Старый 20.05.2009, 11:41   #15  
Timofey_k is offline
Timofey_k
Microsoft Dynamics
Аватар для Timofey_k
Соотечественники
Сотрудники Microsoft Dynamics
 
20 / 50 (2) ++++
Регистрация: 04.07.2006
Адрес: Sydney, Australia
Держите самый красивый вариант :-) Года два назад нарисовал бессонной ночью.

X++:
//Open the selected element in a new AOT window
#AOT
void addIns_OpenNewWindowSelected(Editor e)
{
    TreeNode            sourceCodeNode = TreeNode::findNode(e.path());
    TreeNode            newWindowNode;
    TreeNodePath        treeNodePath;

    xRefTmpReferences   refTable;

    int                 startLine = e.selectionStartLine();
    int                 startCol  = e.selectionStartCol();
    int                 endCol    = e.selectionEndCol();

    str                 selectedText;
    ;
    if (sourceCodeNode && e.selectionStartLine() == e.selectionEndLine() && startCol != endCol)
    {
        infolog.updatexRefSet(sourceCodeNode, true);

        sourceCodeNode.AOTmakeXref(1);
        refTable = xRefCreate::makeTmp(infolog.lastxRef());

        infolog.updatexRefSet(sourceCodeNode, false);

        select firstonly refTable
            where refTable.line   == startLine
               && refTable.Column == startCol;

        if (refTable)
        {
            treeNodePath = refTable.Path();

            if (treeNodePath)
            {
                newWindowNode = TreeNode::findNode(treeNodePath);

                if (newWindowNode)
                {
                    newWindowNode.AOTnewWindow();

                    if (!newWindowNode.AOTchildNodeCount()) //Workaround for the AX4 "open new window" bug. Remove for AX3/2009
                    {
                        infolog.getUserSetup().setUserSetup(xUserInfo::find());
                    }
                }
            }
        }
        else
        {
            e.firstSelectedLine();
            selectedText = strLRTrim(subStr(e.getLine(), e.selectionStartCol(), endCol-startCol));

            if (selectedText)
            {
                newWindowNode = TreeNode::findNode(#MacrosPath + #AOTDelimiter + selectedText);

                if (newWindowNode)
                {
                    newWindowNode.AOTedit();
                }
            }
        }
    }
}
За это сообщение автора поблагодарили: sukhanchik (8), aidsua (1), alex55 (3), DSPIC (5).
Старый 20.05.2009, 12:23   #16  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
2 Timofey_k

Вы напишите, в чём отличия.
Насколько я понял,
1. Добавлена возможность "прыжка" в макроопределение
2. Обход кривой отрисовки single-элементов для 4-ки (//Workaround for the AX4 "open new window" bug. Remove for AX3/2009)
Старый 20.05.2009, 12:49   #17  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
На всякий случай замечу, что в решении, приведенном DSPIC используется таблица

xRefTmpReferences

которая получила такое имя только в AX4. В младших версиях Axapta она называлась также, как и переменная в этом коде

TmpxRefReferences

Т.е. для версий AX2.5 и AX3.0 надо записать

X++:
// xRefTmpReferences   tmpxRefReferences; // for AX4 and later
TmpxRefReferences   tmpxRefReferences;  // for AX2.5 and AX3.0
Старый 20.05.2009, 17:12   #18  
Timofey_k is offline
Timofey_k
Microsoft Dynamics
Аватар для Timofey_k
Соотечественники
Сотрудники Microsoft Dynamics
 
20 / 50 (2) ++++
Регистрация: 04.07.2006
Адрес: Sydney, Australia
DSPIC
Для меня основное отличие в том, что там ничего не добавлено, а написано самостоятельно с нуля (по мотивам анализатора кода) :-) Ну и в целом код малость почище. А так - да, в большинстве случаем результат будет тот же.

Владимир Максимов
Да, я про название таблицы тоже забыл сказать. Давно уже в трешке не работал. Спасибо.
Старый 20.05.2009, 20:16   #19  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
Timofey_k
Хотелось, чтобы Вы написали в чем отличия - чтобы, не всматриваясь в X++ код, сразу увидеть функциональную разницу между приведенными примерами, чтобы тот, кто увидит эти варианты исполнений, сразу понял, какой именно тянуть себе в карман. Не все же умеют быстро X++ читать Я ни в коем случае не хотел этим сказать - какой из примеров первоисточник || лучше с т.з. написания кода и т.п. Эхх...
Старый 21.05.2009, 04:56   #20  
Timofey_k is offline
Timofey_k
Microsoft Dynamics
Аватар для Timofey_k
Соотечественники
Сотрудники Microsoft Dynamics
 
20 / 50 (2) ++++
Регистрация: 04.07.2006
Адрес: Sydney, Australia
DSPIC
Ну вообще-то первое функциональное отличие между двумя скриптами, что в моем надо интересующий объект выделить. :-) Вопрос не принципиальный, но лично мне так удобнее и нагляднее - дабл-клик на любом объекте, а затем вызов скрипта.

В остальном принцип один и тот же: пинок стандартному движку перекрестных ссылок (без сохранения в таблицу) и по результату определение типа объекта под курсором.

Кстати, в отличие от примитивного поиска текста по AOT, тут требуется, чтобы текущий метод компилировался от начала и до искомого объекта в тексте (включительно).

Вот еще до кучи скриптик: переход в анализатор кода прямо из текста метода.
X++:
//Open the current method in Code Explorer
void addIns_CodeExplorer(Editor e)
{
    TreeNode node = TreeNode::findNode(e.path());
    HelpGenerator helpGenerator;
    ;
    helpGenerator = infolog.helpGenerator();
    helpGenerator.showURL('SOURCE:\\\\'+node.treeNodePath());
}
Теги
editor script, tools, перекрестные ссылки, полезное, ax3.0

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Открыть в новом окне объект из кода miklenew DAX: База знаний и проекты 24 31.01.2023 17:31
танцы с бубном - COM Объект не имеет метода 'worksheets' Artem Mikhailov DAX: Программирование 4 05.02.2007 14:25
Как выбрать объект для создания шаблона импорта Excel? MagisterLudi DAX: Функционал 2 15.08.2003 16:42
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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