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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 06.09.2007, 10:59   #1  
Sequel is offline
Sequel
Участник
 
53 / 13 (1) ++
Регистрация: 17.06.2005
Адрес: Новокузнецк
Перечень пунктов меню и их свойств
Доброго времени суток
Можно ли получить программно доступ к таким вещам как пункты меню Menu Item? Нужен перечень всех пунктов меню со всеми их свойствами, в частности свойство SecurityKey для каждого пункта меню. Для объектов, хранящихся в ветке Dictionary такое сделать можно через классы Dict*. Есть ли такая же возможность для остальных объектов?
Старый 06.09.2007, 11:09   #2  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Перебирать можно с помощью TreeNodeIterator
Получать свойства - с помощью MenuFunction
Старый 06.09.2007, 11:44   #3  
TasmanianDevil is offline
TasmanianDevil
Мрачный тип
Аватар для TasmanianDevil
Злыдни
 
886 / 389 (14) ++++++
Регистрация: 24.01.2005
Адрес: Томск
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Получать свойства - с помощью MenuFunction
А AOTGetProperties у объекта TreeNode и разборка полученного Global::findProperty() чем плоха ?
Старый 06.09.2007, 11:47   #4  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Цитата:
Сообщение от TasmanianDevil Посмотреть сообщение
А AOTGetProperties у объекта TreeNode и разборка полученного Global::findProperty() чем плоха ?
Да, наверное, ничем.
Просто это смахивает на низкоуровневое выковыривание.
А через menuFunction все так цивильненько, опрятненько
Старый 06.09.2007, 12:17   #5  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,494 / 1065 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
X++:
// собрать список объектов АОТ без ключей доступа, у которых они должны быть, в проект
static void Edd_ListAOTObjectsWithoutSecurity(Args _args)
{
    ProjectNode                 ProjectNode;
    SysProjectFilterRunBase     Project       = new SysProjectFilterRunBase();

    boolean existCustomization(UtilElementType _UtilElementType, identifiername _name)
    {
        UtilElements        UtilElements;
        ;
        select UtilElements
            where UtilElements.recordType == _UtilElementType
               && UtilElements.utilLevel  >= UtilEntryLevel::bus
               && UtilElements.name       == _name;

        return (UtilElements.RecId != 0);
    }

    UtilElements findTreeNode(TreeNode _treeNode)
    {
        UtilElements utilElements;
        TreeNode     utilNode = _treeNode;

        identifiername  name;
        int             parentId;
        UtilElementType recordType;
        UtilEntryLevel  utilLevel;

        MemberFunction memberFunctionNodeType;
        classId memberFunctionClassId = classIdGet(memberFunctionNodeType);  // as a constant

        while (utilNode && !sysTreeNode::isApplObject(utilNode))
        {
            utilNode = utilNode.aotParent();
        }

        if (utilNode && sysTreeNode::isApplObject(utilNode))
        {
            name         = utilNode.treeNodeName();
            recordType   = utilNode.applObjectType();
            utilLevel    = utilNode.applObjectLayer();

            if (utilNode.AOTparent())
            {
                if ((recordType == UtilElementType::TableInstanceMethod) ||
                    (recordType == UtilElementType::TableStaticMethod) ||
                    (recordType == UtilElementType::TableRelation) ||
                    (recordType == UtilElementType::TableField) ||
                    (recordType == UtilElementType::TableFieldGroup) ||
                    (recordType == UtilElementType::TableIndex))
                {
                    parentId = utilNode.aotParent().aotParent().applObjectId();
                }
                else
                {
                    if ((recordType == UtilElementType::ClassStaticMethod) ||
                        (recordType == UtilElementType::ClassInstanceMethod))
                    {
                        parentId = utilNode.aotParent().applObjectId();
                    }
                }
            }

            select firstonly utilElements
                where utilElements.name         == name         &&
                      utilElements.recordType   == recordType   &&
                      utilElements.parentId     == parentId     &&
                     (utilElements.utilLevel    == utilLevel    ||
                      utilElements.utilLevel    == utilLevel - 1);

            return utilElements;
        }

        return null;
    }


    void TableList()
    {
        DictTable           DictTable;
        treeNode            treeNode;
        xInfo               xInfo = new xInfo();
        securityKeyId       securityKeyId;
        ;
        treeNode = xInfo.rootNode();
        treeNode = treeNode.AOTfindChild("Data Dictionary");
        treeNode = treeNode.AOTfindChild("Tables");
        treeNode = treeNode.AOTfirstChild();

        while (treeNode)
        {
            DictTable = new DictTable(tablename2id(treeNode.AOTname()));

            if (!DictTable.securityKeyId() && !DictTable.isTmp() && existCustomization(UtilElementType::Table, treeNode.AOTname()))
            {
                securityKeyId = DictTable.securityKeyId();
                info(strfmt("%1            %2", treeNode.AOTname(), DictTable.label()));
                Project.doUtilElements(findTreeNode(treeNode));
            }
            treeNode   = treeNode.AOTnextSibling();
        }
    }

    void MenuItemOutputList()
    {
        treeNode            treeNode;
        xInfo               xInfo = new xInfo();
        str                 Properties;
        int                 pos1, pos2;
        ;
        treeNode = xInfo.rootNode();
        treeNode = treeNode.AOTfindChild("Menu Items");
        treeNode = treeNode.AOTfindChild("Output");
        treeNode = treeNode.AOTfirstChild();

        while (treeNode)
        {
            Properties  = treeNode.AOTgetProperties();
            pos1        = findPropertyPos(Properties, "SecurityKey") + 21;
            pos2        = strscan(Properties,"\n",pos1,100);

            if ((pos2 - pos1) == 0 && existCustomization(UtilElementType::OutputTool, treeNode.AOTname()))
            {
                pos1 = findPropertyPos(Properties, "Label") + 21;
                pos2 = strscan(Properties,"\n",pos1,100);

                info(strfmt("%1            %2", treeNode.AOTname(), substr(Properties, pos1, pos2 - pos1)));
                Project.doUtilElements(findTreeNode(treeNode));
            }

            treeNode   = treeNode.AOTnextSibling();
        }
    }

    void MenuItemActionList()
    {
        treeNode            treeNode;
        xInfo               xInfo = new xInfo();
        str                 Properties;
        int                 pos1, pos2;
        ;
        treeNode = xInfo.rootNode();
        treeNode = treeNode.AOTfindChild("Menu Items");
        treeNode = treeNode.AOTfindChild("Action");
        treeNode = treeNode.AOTfirstChild();

        while (treeNode)
        {
            Properties  = treeNode.AOTgetProperties();
            pos1        = findPropertyPos(Properties, "SecurityKey") + 21;
            pos2        = strscan(Properties,"\n",pos1,100);

            if ((pos2 - pos1) == 0 && existCustomization(UtilElementType::ActionTool, treeNode.AOTname()))
            {
                pos1 = findPropertyPos(Properties, "Label") + 21;
                pos2 = strscan(Properties,"\n",pos1,100);

                info(strfmt("%1            %2", treeNode.AOTname(), substr(Properties, pos1, pos2 - pos1)));
                Project.doUtilElements(findTreeNode(treeNode));
            }

            treeNode   = treeNode.AOTnextSibling();
        }
    }

    void MenuItemDisplayList()
    {
        treeNode            treeNode;
        xInfo               xInfo = new xInfo();
        str                 Properties;
        int                 pos1, pos2;
        ;
        treeNode = xInfo.rootNode();
        treeNode = treeNode.AOTfindChild("Menu Items");
        treeNode = treeNode.AOTfindChild("Display");
        treeNode = treeNode.AOTfirstChild();

        while (treeNode)
        {
            Properties  = treeNode.AOTgetProperties();
            pos1        = findPropertyPos(Properties, "SecurityKey") + 21;
            pos2        = strscan(Properties,"\n",pos1,100);

            if ((pos2 - pos1) == 0 && existCustomization(UtilElementType::DisplayTool, treeNode.AOTname()))
            {
                pos1 = findPropertyPos(Properties, "Label") + 21;
                pos2 = strscan(Properties,"\n",pos1,100);

                info(strfmt("%1            %2", treeNode.AOTname(), substr(Properties, pos1, pos2 - pos1)));
                Project.doUtilElements(findTreeNode(treeNode));
            }

            treeNode   = treeNode.AOTnextSibling();
        }
    }
    ;
    ProjectNode = SysTreeNode::createProject("ndn_SecurityKeyNeeded");

    Project.parmProjectNode(ProjectNode);
    Project.grouping(SysProjectGrouping::AOT);

    setprefix("Таблицы");
    TableList();

    setprefix("Отчеты");
    MenuItemOutputList();

    setprefix("Формы");
    MenuItemDisplayList();

    setprefix("Действия");
    MenuItemActionList();

    Project.write();
}
За это сообщение автора поблагодарили: Wamr (4), aidsua (1), gl00mie (5), Андрей К. (1), Kabardian (4), Hammer (1).
Теги
безопасность, законченный пример, программно

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Evgeny Arlionak: Ссылки на главное меню: как получить? Blog bot DAX Blogs 2 02.02.2009 18:14
Доступ пунктов меню в Заказе - Обработка Arahnid DAX: Функционал 11 23.10.2007 17:51
Аксапта 4.0: при выборе пунктов по меню кнопок система вылетает superb DAX: Прочие вопросы 6 26.07.2007 22:18
"Классическое" главное меню в 4.0... glibs DAX: База знаний и проекты 3 11.04.2007 09:58
Работа с главным меню в Axapta Alexey DAX: Программирование 0 04.01.2002 23:31
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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