28.10.2010, 18:10 | #1 |
Участник
|
Слой прикладного объекта в перекрестных ссылках
Иногда хочется иметь возможность найти по перекрестным ссылкам только свои модификации, исключив стандартный функционал. Особенно актуально это может быть при переходе на новый SP или версию системы. Во вложении - проект с соответствующими модификациями: новое поле в таблице, поле на гриде формы и класс, который заполняет новое поле. В принципе, можно было поступить проще и реализовать его заполнение на вставке записи в xRefPaths, что кажется логичным. Однако, для большинства объектов приложения путь определяется за счет создания объекта TreeNode, а как показала практика, при создании сотен тысяч таких объектов по ходу сбора перекрестных ссылок клиент Аксапты почему-то валится. В связи с этим заполнение поля было вынесено в отдельный класс, который запускается на одном из этапов построения перекрестных ссылок. Затем можно использовать эти данные на форме перекрестных ссылок, в т.ч. для фильтрации записей.
Проект приведен для AX 3.0, причем выгрузка сделана только для модификаций на usr-слое. При накатывании проекта на 4-ку или 2009-ю может потребоваться вручную добавить новое поле в таблицу и вынести его на форму. |
|
|
За это сообщение автора поблагодарили: mazzy (5), Logger (7), MikeR (2), jonny (1), Antoncheg (1), someOne (1), kornix (1). |
29.10.2010, 10:05 | #2 |
Участник
|
Я правильно понимаю, что в поле хранится самый верхний слой, в котором были сделаны добавления или изменения?
|
|
29.10.2010, 15:57 | #3 |
Участник
|
Правильно.
|
|
29.10.2010, 16:04 | #4 |
Участник
|
Не компилируется main
Добрый день! Проект, безусловно, полезный. Есть небольшой вопрос, у меня не компилируется метод main класса DEV_xRefPathsLayerUpdate."is не является методом класса" . В перекрестных ссылках везде обозачен солой sys (думаю, связано с вышеуказанным). Заранее благодарен.AX 3.0
|
|
29.10.2010, 16:49 | #5 |
Участник
|
Пардон, это я в 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 |
Участник
|
to gl00mie, спасибо, с этим уже разобрался, забрал с 9-ки Остался вопрос, почему у меня везде sys слой, хотя объекты модифицированы на usr ?
|
|
29.10.2010, 16:55 | #7 |
Участник
|
Простановка слоя приделана в xRefUpdate на случай перестройки всех перекрестных ссылок ("Обновить все"). В принципе, можно запустить класс и отдельно - он тогда в уже созданных записях xRefPaths проставит "правильный" код слоя.
|
|
07.02.2011, 20:06 | #8 |
Участник
|
Обновил проект для работы на 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 Обновление завершено Последний раз редактировалось gl00mie; 07.02.2011 в 20:45. Причина: вложил проект с исправленной опечаткой ("Fields Groups") |
|
|
За это сообщение автора поблагодарили: mazzy (5), Logger (10). |
25.12.2020, 18:19 | #9 |
Участник
|
Привет всем.
А кто-нибудь пробовал адаптировать этот проект для 2012-й аксапты ? Или может быть знает как по Path узла получить sysModelElement ? (это нужно чтобы не использовать тормозной TreeNode. Если есть sysModelElement, то слой легко получается простым запросом к sysModelElementData и sysModelLayer) |
|
27.12.2020, 18:55 | #10 |
Участник
|
я вот такие 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 |
Участник
|
Спасибо, все работает.
А при интенсивной работе ошибок не бывает ? Treenode-ы могут ошибки выдавать при интенсивном использовании. Я еще у себя добавил вызов treeNodeRelease. Так точно не должно ничего утекать. |
|
28.12.2020, 14:07 | #12 |
Участник
|
ошибок не замечал. но тут вроде не должно быть особо интенсивной работы.
Создайте пример для воспроизведения проблемы, его можно будет обсудить. |
|
28.12.2020, 20:24 | #13 |
Участник
|
Да я не утверждаю, что они обязаны быть.
Просто как-то переносил проект по поиску узла в проектах из ax3 в 2009 и заметил что клиент стал падать. Оказалось не хватало вызова treenodeRelease. С тех всегда его ставлю. В обсуждаемом случае возможно не достигаем предела, поэтому и никаких проблем нет. У меня сегодня не возникло. Последний раз редактировалось Logger; 28.12.2020 в 20:28. |
|
28.12.2020, 20:27 | #14 |
Участник
|
Доработал проект, чтобы взводил галку
\Data Dictionary\Tables\xRefPaths\Fields\IsCurLayer_MRC для текущего слоя (а другие нам и не нужны) Думает 2-3 минуты для всего usr слоя (129 тысяч узлов). Думаю, что достаточная скорость. Соответственно, теперь можно фильтровать. Для работы достаточно класса xRefPathsLayerUpdate (остальное паровозом прицепилось в проект, можно выкинуть) |
|
|
За это сообщение автора поблагодарили: mazzy (5). |
29.12.2020, 11:11 | #15 |
Участник
|
|
|
29.12.2020, 11:18 | #16 |
Участник
|
Оба поля - дисплей методы в гриде
|
|
|
За это сообщение автора поблагодарили: Logger (10). |
02.01.2021, 10:30 | #17 |
Участник
|
Ха.
Оказывается ветка 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 |
Участник
|
Поправил ряд багов.
Не обрабатывались поля и методы датасорса. |
|
|
За это сообщение автора поблагодарили: mazzy (10), raz (5). |
Теги |
xref, законченный пример, перекрестные ссылки, слой приложения |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|