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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 28.10.2010, 18:10   #1  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Слой прикладного объекта в перекрестных ссылках
Иногда хочется иметь возможность найти по перекрестным ссылкам только свои модификации, исключив стандартный функционал. Особенно актуально это может быть при переходе на новый SP или версию системы. Во вложении - проект с соответствующими модификациями: новое поле в таблице, поле на гриде формы и класс, который заполняет новое поле. В принципе, можно было поступить проще и реализовать его заполнение на вставке записи в xRefPaths, что кажется логичным. Однако, для большинства объектов приложения путь определяется за счет создания объекта TreeNode, а как показала практика, при создании сотен тысяч таких объектов по ходу сбора перекрестных ссылок клиент Аксапты почему-то валится. В связи с этим заполнение поля было вынесено в отдельный класс, который запускается на одном из этапов построения перекрестных ссылок. Затем можно использовать эти данные на форме перекрестных ссылок, в т.ч. для фильтрации записей.

Проект приведен для AX 3.0, причем выгрузка сделана только для модификаций на usr-слое. При накатывании проекта на 4-ку или 2009-ю может потребоваться вручную добавить новое поле в таблицу и вынести его на форму.
Вложения
Тип файла: zip DEV_xRefNamesUtilLevel.zip (13.8 Кб, 109 просмотров)
За это сообщение автора поблагодарили: mazzy (5), Logger (7), MikeR (2), jonny (1), Antoncheg (1), someOne (1), kornix (1).
Старый 29.10.2010, 10:05   #2  
AraraT® is offline
AraraT®
Участник
1C
 
158 / 106 (4) +++++
Регистрация: 13.01.2006
Адрес: Республика Татарстан, г. Казань
Я правильно понимаю, что в поле хранится самый верхний слой, в котором были сделаны добавления или изменения?
Старый 29.10.2010, 15:57   #3  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Правильно.
Старый 29.10.2010, 16:04   #4  
Antoncheg is offline
Antoncheg
Участник
 
41 / 11 (1) +
Регистрация: 29.02.2008
Не компилируется main
Добрый день! Проект, безусловно, полезный. Есть небольшой вопрос, у меня не компилируется метод main класса DEV_xRefPathsLayerUpdate."is не является методом класса" . В перекрестных ссылках везде обозачен солой sys (думаю, связано с вышеуказанным). Заранее благодарен.AX 3.0
Миниатюры
Нажмите на изображение для увеличения
Название: xDev.JPG
Просмотров: 318
Размер:	38.2 Кб
ID:	6316  
Старый 29.10.2010, 16:49   #5  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Пардон, это я в 3-ный SysDictClass перенес пару методов из 2009-й:
X++:
public static boolean is(Object _class, classId _classId)
{
    SysDictClass    dictCls = new SysDictClass(classidget(_class));
    boolean         ret     = dictCls && dictCls.isImplementing(_classId);
    ;
    if (!ret)
    {
        ret = SysDictClass::isEqualOrSuperclass(classidget(_class), _classId);
    }
    return ret;
}

static public Object as(Object _class, classId _classId)
{
    if (SysDictClass::is(_class, _classId))
        return _class;
    return null;
}
За это сообщение автора поблагодарили: Logger (1).
Старый 29.10.2010, 16:52   #6  
Antoncheg is offline
Antoncheg
Участник
 
41 / 11 (1) +
Регистрация: 29.02.2008
to gl00mie, спасибо, с этим уже разобрался, забрал с 9-ки Остался вопрос, почему у меня везде sys слой, хотя объекты модифицированы на usr ?
Старый 29.10.2010, 16:55   #7  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Простановка слоя приделана в xRefUpdate на случай перестройки всех перекрестных ссылок ("Обновить все"). В принципе, можно запустить класс и отдельно - он тогда в уже созданных записях xRefPaths проставит "правильный" код слоя.
Старый 07.02.2011, 20:06   #8  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Обновил проект для работы на AX 2009, по-максимуму сократил использование TreeNode, из-за которых AOS отжирал фигову тучу памяти и дико тормозил. За счет кэширования информации по формам, отчетам и подобным "большим" объектам приложения, хранящимся на слое целиком, а также за счет оптимизации SysTreeNode::path2ApplObjectType() удалось добиться того, что теперь на все про все у меня уходит чуть больше 20 минут (AOS в виртуалке, проц - Xeon 5405 @ 2 GHz):
Код:
2 из 1004083 записей обновлено в таблице xRefPaths
Израсходованное время: 0:20:48
Закэшировано 7403, в кэше найдено/не найдено 499471/14555, создано объектов TreeNode 83615, записей UtilElements запрошено/найдено 393742/386102
Обновление завершено
В проекте - только изменения на usr-слое.
Вложения
Тип файла: rar DEV_xRefNamesTopmostUtilLevel_AX2009.rar (11.6 Кб, 110 просмотров)

Последний раз редактировалось gl00mie; 07.02.2011 в 20:45. Причина: вложил проект с исправленной опечаткой ("Fields Groups")
За это сообщение автора поблагодарили: mazzy (5), Logger (10).
Старый 25.12.2020, 18:19   #9  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,867 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Привет всем.
А кто-нибудь пробовал адаптировать этот проект для 2012-й аксапты ?
Или может быть знает как по Path узла получить sysModelElement ? (это нужно чтобы не использовать тормозной TreeNode. Если есть sysModelElement, то слой легко получается простым запросом к sysModelElementData и sysModelLayer)
Старый 27.12.2020, 18:55   #10  
trud is offline
trud
Участник
Лучший по профессии 2017
 
1,038 / 1629 (57) ++++++++
Регистрация: 07.06.2003
Записей в блоге: 1
я вот такие 2 дисплей метода юзаю на таблице xRefReferences в 2012. Возможно они и пришли из этого проекта Дениса
один показывает находится ли элемент на текущем слое, другой выдает строку кода в месте расположения перекрестных ссылок. Но это именно дисплей методы, чтобы фильтровать надо их скопировать в Excel
X++:
//BP Deviation documented
[SysClientCacheDataMethodAttribute]
display NoYesId SDSinCurrentLayer()
{
    NoYes       ret;
    TreeNode    node;
    ;
    node = TreeNode::findNode(this.path());
    if (node && node.treeNodeType().isLayerAware())
    {
        ret = SysTreeNode::isNodeInLayer(node, currentAOLayer());
    }
    return ret;
}

//BP Deviation documented
[SysClientCacheDataMethodAttribute]
display SourceLine SDSgetSourceLine()
{
    SourceLine  res;
    TreeNode    node;
    ;
    if (this.line)
    {
        node = TreeNode::findNode(this.path());
        if (node)
        {
            res = strLine(node.AOTgetSource(), this.line - 1);
            res = strLRTrim(res);
        }
    }
    return res;
}
За это сообщение автора поблагодарили: mazzy (5), Logger (5).
Старый 28.12.2020, 13:40   #11  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,867 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от trud Посмотреть сообщение
я вот такие 2 дисплей метода юзаю на таблице xRefReferences в 2012.
Спасибо, все работает.

А при интенсивной работе ошибок не бывает ?
Treenode-ы могут ошибки выдавать при интенсивном использовании.
Я еще у себя добавил вызов treeNodeRelease. Так точно не должно ничего утекать.
Старый 28.12.2020, 14:07   #12  
trud is offline
trud
Участник
Лучший по профессии 2017
 
1,038 / 1629 (57) ++++++++
Регистрация: 07.06.2003
Записей в блоге: 1
ошибок не замечал. но тут вроде не должно быть особо интенсивной работы.
Создайте пример для воспроизведения проблемы, его можно будет обсудить.
Старый 28.12.2020, 20:24   #13  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,867 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Да я не утверждаю, что они обязаны быть.
Просто как-то переносил проект по поиску узла в проектах из ax3 в 2009 и заметил что клиент стал падать. Оказалось не хватало вызова treenodeRelease. С тех всегда его ставлю.
В обсуждаемом случае возможно не достигаем предела, поэтому и никаких проблем нет. У меня сегодня не возникло.

Последний раз редактировалось Logger; 28.12.2020 в 20:28.
Старый 28.12.2020, 20:27   #14  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,867 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Доработал проект, чтобы взводил галку
\Data Dictionary\Tables\xRefPaths\Fields\IsCurLayer_MRC
для текущего слоя (а другие нам и не нужны)

Думает 2-3 минуты для всего usr слоя (129 тысяч узлов). Думаю, что достаточная скорость.
Соответственно, теперь можно фильтровать.

Для работы достаточно класса xRefPathsLayerUpdate (остальное паровозом прицепилось в проект, можно выкинуть)
Вложения
Тип файла: zip PKoz_xRefAxforum_dev.zip (11.1 Кб, 50 просмотров)
За это сообщение автора поблагодарили: mazzy (5).
Старый 29.12.2020, 11:11   #15  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,867 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от trud Посмотреть сообщение
я вот такие 2 дисплей метода юзаю на таблице xRefReferences в 2012.
Попробовал SDSgetSourceLine

Он просто прекрасен !
Ооочень удобно.

А у вас он где на форме выведен ?
Столбец в гриде или отдельный контрол под гридом?
Старый 29.12.2020, 11:18   #16  
trud is offline
trud
Участник
Лучший по профессии 2017
 
1,038 / 1629 (57) ++++++++
Регистрация: 07.06.2003
Записей в блоге: 1
Оба поля - дисплей методы в гриде
За это сообщение автора поблагодарили: Logger (10).
Старый 02.01.2021, 10:30   #17  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,867 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от Logger Посмотреть сообщение
Доработал проект, чтобы ...
Ха.
Оказывается ветка AOT \Reports
работает так же как в 2009-й версии - в SysModelElements только одна корневая запись, а все дочерние узлы лежат бинарном поле.

Поправил для такого случая, чтобы корректно заполнялся слой.
Также заметил что для дизайнов форм слой заполняется только для ветки
\Forms\*\Designs\DesignList\*

а для ветки с полными путями
\Forms\*\Designs\Design\*
пропускается.

Сперва хотел для нее тоже дописать, но потом решил не трогать, так как
1. Это сильно усложнит заполнение и удлинит время работы
2. Эти ветки дублируют друг друга и проставление слоя в них обеих ничего не упрощает при дальнейшем использовании перекрестных ссылок. Просто увеличивает в 2 раза число узлов, которые при фильтрации остаются. Так что даже кхорошо что слой не заполняется для ветки \Forms\*\Designs\Design\*

PKoz_xRefPathsLayerUpdate_dev.zip

Последний раз редактировалось Logger; 02.01.2021 в 10:34.
Старый 04.03.2021, 11:04   #18  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,867 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Поправил ряд багов.
Не обрабатывались поля и методы датасорса.
Вложения
Тип файла: zip PKoz_xRefPathsLayerUpdate_dev.zip (5.4 Кб, 44 просмотров)
За это сообщение автора поблагодарили: mazzy (10), raz (5).
Теги
xref, законченный пример, перекрестные ссылки, слой приложения

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как проверить существование метода у объекта Lucky13 DAX: Программирование 21 18.03.2022 09:34
ax2009: почему обновление перекрестных ссылок перестало быть пакетным заданием? mazzy DAX: Программирование 9 21.08.2010 22:08
перенос объекта со слоя на слой sparur DAX: Программирование 3 22.02.2007 11:33
Есть ли таблица соответствий ID -объекта - Имя объекта в Аксапта? coja DAX: Администрирование 5 26.04.2005 15:25
"Падающий" вниз слой ? renat DAX: Программирование 3 01.03.2004 08:10
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 17:50.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.