05.07.2002, 20:32 | #1 |
Участник
|
Кажется, набрел на очередную фичу
Для таблиц, к которых режим кэширования (CacheLookup) установлен в EntireTable, система некорректно
работает с полями CreatedDate/ModifiedDate/Time... (которые включаются установкой соотв. свойств на таблице). Как правило, во всех записях они будут соответствовать дате и времени начала текущей сессии АКСАПТы. Таблиц с этим режимом кэша в AOT очень много - те же пресловутые LedgerTable, CustGroup, ... Неужели у меня одного такие проблемы????? |
|
05.07.2002, 21:42 | #2 |
Участник
|
Как программировать в sys-слое
Казалось бы, для того, чтобы записать свою модификацию в sys-слой, надо быть членом команды
Navision-hq или хакером. Но на практике выяснилось следующее: В рамках решения задачи тотального аудита системы возникла необходимость включить свойства CreatedDate/ModifiedDate во многих таблицах, в т.ч. созданных в sys-слое. Нелегкая работа - проставить руками свойства сразу в нескольких сотнях таблиц. Поэтому был написан небольшой джоб, вроде этого: static void AOT_ModifyAllTables_tst(Args _args) { treeNode treeNode; xInfo xInfo = new xInfo(); DictTable dictTable; int i; ; treeNode = xInfo.rootNode(); treeNode = treeNode.AOTfindChild("Data Dictionary"); treeNode = treeNode.AOTfindChild("Tables"); treeNode = treeNode.AOTfirstChild(); while (treeNode) { dictTable = new DictTable(treeNode.applObjectId()); if (dictTable.dataPrCompany() && ! dictTable.isMap() && ! dictTable.isTmp()) { treeNode.AOTsetProperties("PROPERTIES"+"\n"+"ModifiedDate #Yes"+"\n"+"CreatedDate #Yes"+"\n"+"ENDPROPERTIES"); treeNode.aotsave(); info(strfmt("Table %1 changed", treeNode.treeNodeName())); i++; } treeNode = treeNode.nextSibling(); } info(strfmt("Total %1 tables changed", i)); } Если изменяемая таблица находилась в каком-нибудь из "низших" слоев, свойства изменялись, но объект оставался в том же слое, в котором и был, а не переходил в usr |
|
|
За это сообщение автора поблагодарили: aidsua (1), jeky (1). |
08.04.2009, 16:05 | #3 |
Участник
|
Может не в тему чуток. но из Вашего примера.
Есть код в 4 акс: X++: treeNode = xInfo.rootNode(); treeNode = treeNode.AOTfindChild("Forms"); treeNode = treeNode.AOTfindChild("FormName"); treeNode = treeNode.AOTfindChild("Designs"); treeNode = treeNode.AOTfindChild("Design"); treeNode = treeNode.AOTfindChild("Group1"); treeNode = treeNode.AOTfindChild("WindowControl1"); treeNode = treeNode.AOTfindChild("Group1"); здесь ничего не находит и на treeNode = treeNode.AOTfindChild("WindowControl1"); уже выдает ошибку о том что treeNode не инициализирован. Вроде бы все делаю так как нужно, после дизайна сразу идет группа. но почему то AOTfindChild() ее не находит. Если кто нибудь знает подскажите плиз |
|
08.04.2009, 16:32 | #4 |
Боец
|
Заставьте код выполняться на клиенте, возможно это поможет.
Да, ещё можно слегка укоротить ваш код, используя сразу полный путь, напр: X++: static void Job1(Args _args) { TreeNode treeNode; ; treeNode = TreeNode::findNode("\\Forms\\Address\\Designs\\Design\\[Tab:Tab]\\[TabPage:TabOverview]\\[Grid:Grid]"); treeNode.AOTshowProperties(); } Последний раз редактировалось DSPIC; 08.04.2009 в 16:37. |
|
|
За это сообщение автора поблагодарили: propeller (1). |
08.04.2009, 16:57 | #5 |
Боец
|
А, тут в другом дело. Неправильно названы элементы дерева АОТ.
Напр., имя группы должно быть не "Group1", а "[Group:Group1]". Но и выполнение кода на клиенте тож не лишним будет. |
|
08.04.2009, 17:00 | #6 |
Участник
|
да именно в этом был косяк , спасибо всем
|
|
08.04.2009, 19:05 | #7 |
AX*****
|
В DAX 4.0 меняет на текущем слое.. т.е. ошибку подправили.
__________________
О, как беден, как груб наш русский язык! [c] А.С.Пушкин |
|