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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 03.05.2011, 12:12   #1  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Lightbulb Проверки Best Practices только для объектов на текущем слое
В приложении есть масса полезных проверок Best Practices, которые помогают выявлять различные косяки в своем и чужом коде. Стоит, однако, отметить, что выполнение этих проверок
  1. в разы замедляет компиляцию;
  2. практически бессмысленно для объектов на "чужих" слоях.
В связи с этим захотелось сделать так, чтобы эти проверки срабатывали лишь для объектов на текущем слое разработки. Для этого оказалось достаточно добавить новое поле, скажем, в SysBPParameters и чуток подрихтовать класс SysBPCheck:
X++:
private void doTreeNode(TreeNode _treeNode)
{
    TreeNodeTraverser   treeNodeTraverser;
    SysBPCheckBase      sysBPCheckBase;
    TreeNode            treeNodeToRelease;
    boolean             checkChildren = true;
    TreeNodePath        parentPath;
    int                 infologLines;

    Map map = new Map(Types::Integer, Types::Integer);
    MapEnumerator enum;
    int length;
    ;
    treeNodeToRelease = null;
//  if (_treeNode)                              //-gl00m, 14.02.2011
    if (this.mustCheckTreeNode(_treeNode))      //+gl00m, 14.02.2011
    {
        treeNodeTraverser = new TreeNodeTraverser(_treeNode);

        while (treeNodeTraverser.next()) // Check Best Practices
        {
            if (!sysCompilerOutput)
            {
                setprefix(treeNodeTraverser.infologPrefix());
            }

            treeNode = treeNodeTraverser.currentNode();
            if(treeNode)
            {
                length=strlen(treeNode.treeNodePath());
            }
            else
            {
                length=0;
            }
            //If we are doing a BP check on a Query node within a View node then don't release the view node
            if (treeNodeToRelease && SysTreeNode::isApplObject(treeNode) &&
                (treeNodeToRelease.sysNodeType()!= #NT_DBVIEW || (treeNode && treeNode.sysNodeType()!= #NT_QE) ||
                length < strlen(treeNodeToRelease.treeNodePath()) ||
                substr(treeNode.treeNodePath(),1,strlen(treeNodeToRelease.treeNodePath())) != treeNodeToRelease.treeNodePath()))
            {
                treeNodeToRelease.treeNodeRelease();
                treeNodeToRelease = null;
            }
//          if (checkChildren ||                        //-gl00m, 14.02.2011
            if ((checkChildren ||                       //+gl00m, 14.02.2011
                substr(treeNode.treeNodePath(),1,strlen(parentPath)) != parentPath) //No longer a child to the parent
                &&  this.mustCheckTreeNode( treeNode )) //+gl00m, 14.02.2011
            {
                sysBPCheckBase = this.getSysBpCheckBase(treeNode);
                sysBPCheckBase.parmSysBPCheck(this);
                // ...
А это новый метод, который решает, надо ли проверять переданный объект приложения:
X++:
// gl00m, 14.02.2011
protected boolean mustCheckTreeNode(TreeNode _treeNode)
{
    UtilEntryLevel  applObjectLayer;
    UtilEntryLevel  currentAOLayer;
    boolean         ret;
    ;
    if (_treeNode)
    {
        ret = true;
        currentAOLayer = currentAOLayer();
        // если разработка ведется на sys-слое, то эта модификация, очевидно, бессмысленна
        if (currentAOLayer > UtilEntryLevel::sys)
        {
            applObjectLayer = _treeNode.applObjectLayer();
            if (    applObjectLayer < currentAOLayer
                &&  enum2str(_treeNode.applObjectType()) != ''
               )
            {
                // в зависимости от настроек можем не проверять объекты, которые расположены ниже текущего слоя
                // NB! это поле надо будет добавить в таблицу и на форму самостоятельно
                ret = !SysBPParameters::find().CheckBPForCurrentAOLayerOnly;
            }
        }
    }
    return  ret;
}
PS. Модификация сделана для AX 2009, но, думаю, на другие версии перенести ее не составит труда.
За это сообщение автора поблагодарили: AlGol (2), Logger (8), AvrDen (1), MikeR (3), S.Kuskov (3), pitersky (2), JeS (1).
Старый 02.05.2014, 11:34   #2  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Оказывается, в AX 2012 приделали штатную возможность выполнять проверки Best Practices только для объектов на текущем слое: для этого в Сервис / Параметры / Разработка / Рекомендации / Настройка слоя надо выбрать "Пропускать узлы с нижестоящих уровней".
За это сообщение автора поблагодарили: Мартынов Дмитрий (1), virtuoso (1), Dreadlock (2).
Теги
best practice, законченный пример, полезное, слой приложения

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
kamalblogs: Towards Dynamics Ax Product Certification – Best Practices (Part II) Blog bot DAX Blogs 0 15.04.2010 22:05
Как сильно модифицировано ваше приложение Аксапты? (% обновленных партнерских объектов) mazzy DAX: Прочие вопросы 1 12.03.2009 17:41
Как сильно модифицировано ваше приложение Аксапты? (% новых партнерских объектов) mazzy DAX: Прочие вопросы 1 12.03.2009 17:41
Как сильно модифицировано ваше приложение Аксапты? (% обновленных объектов) mazzy DAX: Прочие вопросы 1 12.03.2009 17:41
Как сильно модифицировано ваше приложение Аксапты? (% новых объектов) mazzy DAX: Прочие вопросы 1 12.03.2009 17:40

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

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

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