31.03.2015, 18:21 | #21 |
Участник
|
Судя по результату, эта утилита тоже ошибается.
Для слоя берет все, а ОЛД без нижних слоев |
|
31.03.2015, 19:24 | #22 |
Сенбернар
|
Гм.. позвольте усомниться.. "- она всех удовлетворяет.. - а его никто не удовлетворяет" (с) анекдот, извините..
Поясните, плз, в следующем разрезе : - что, по-вашему, делает эта утилита? - что, по-вашему (или - для вашей задачи) она должна делать?
__________________
Best Regards, Roman Последний раз редактировалось RVS; 31.03.2015 в 19:30. |
|
01.04.2015, 10:11 | #23 |
Участник
|
Цитата:
Значит на слое VAR и в OLD_VAR она должна быть одинаковая. Задаю утилите сравнение var и old var. Утилита добавила таблицу в проект. Я ожидал, что ее не будет. |
|
01.04.2015, 10:30 | #24 |
Сенбернар
|
Цитата:
Теперь, чтобы удостовериться, что таблица действительно не менялась - делаем так : - наступаем на эту таблицу в дереве - правой кнопой мыши - Сравнение, задаем var и old var - жмем Сравнить Если получаем "Расхождений не обнаружено" - тогда да, таблица действительно не менялась и утилита ведет себя как-то не так. У вас именно так получается?
__________________
Best Regards, Roman |
|
01.04.2015, 11:44 | #25 |
Участник
|
И приходим к исходной проблеме.
Если так сравнивать, то в разницу попадают например поля с нижних слоев. Слой var берется с нижними слоями |
|
01.04.2015, 12:03 | #26 |
Британский учённый
|
Не совсем понимаю вашу задачу, но попробуйте сделать вот что: скопируйте в папку old все новые слои ниже var. Тогда при сравнении у вас нижние слои будут одинаковы и вы сможете увидеть разницу только в самих var слоях.
__________________
Людям физического труда для восстановления своих сил нужен 7-8 часовой ночной сон. Людям умственного труда нужно спать часов 9-10. Ну а программистов будить нельзя вообще. |
|
|
За это сообщение автора поблагодарили: MazZzDaI (1). |
01.04.2015, 12:16 | #27 |
Сенбернар
|
Цитата:
- При сравнении Акса "смотрит" на VAR-слой именно так, как она работает.Вот так :Про слои в Аксе - и это, ИМХО, правильно. Представьте следующее : - вы сделалли некую доработку на USR. Затем перенесли ее на CUS. Сравнение USR с OLD_USR честно покажет вам, что доработка "опущена" на слой CUS (если бы было "по-вашему", сравнение показало бы что - о, ужас-ужас!! - доработка удалена) Это к вопросу о том, почему так работает сравнение. - не понимаю проблему. Вы дали описание только части задачи, имхо : Цитата:
Сообщение от kia
Нужно программно вывести список объектов, реально измененных в обновлении (в VAR слое).
Хочется сравнить только VAR слой с его OLD версией. Слой VAR чужой, пароля на него нет.
__________________
Best Regards, Roman |
|
01.04.2015, 13:32 | #28 |
Участник
|
Про задачу я писал выше. Уточню еще конкретней.
Нам приходит обновление на VAR слое и есть наши модификации на CUS. После обновления нужно свести наши изменения с изменениями в обновлении. Можно перелопатить ВСЕ объекты, которые мы меняли. Но появилась идея сводить только измененные в обновлении объекты. Ведь остальные уже сведены. Вот и нужно найти эти самые измененные объекты. Интересная идея подсунуть в OLD нижние слои. Попробуем |
|
|
За это сообщение автора поблагодарили: MazZzDaI (1). |
01.04.2015, 13:42 | #29 |
Участник
|
Цитата:
1.1. Перед обновлением АХ подрядчиком, я сохраняю VAR слой в VAR_OLD; 1.2. Для обновления АХ, подрядчик подменяет VAR слой своим; 1.3. Мои объекты, и модификации объектов VAR слоя, находятся на CUS. 2. Задача: 2.1. Выбрать все объекты CUS; 2.2. Выбрать все объекты VAR, которые также существуют на CUS; 2.3. Выбрать все объекты VAR_OLD, соответствующие выборке п.2.2; 2.4. Сравнить п.2.3 и п.2.4. В случае нахождения различий— сообщить. 3. Возможные решения п.2.4: 3.1. Используя SysCompare; 3.2. Используя экспорт объекта в XPO с последующим сравнением. 4. Проблема использования возможных решений состоит в том, как писал KIA: Цитата:
Для слоя берет все, а ОЛД без нижних слоев
|
|
01.04.2015, 15:58 | #30 |
Сенбернар
|
Понятно.
Не знаю. Я всегда делал так : - создаю проект "различий" при помощи Сравнения слоев с именем, например, zzz - создаю еще один проект zzz_ready. Пустой. - иду по проекту zzz, начиная с EDT, таблиц, и т.д. - сравниваю каждый объект (в вашем случае - CUS и VAR слои) - если Акса говорит "Расхождений не обнаружено" - тупо удаляю объект из zzz - если Акса находит расхождения - мержу эти расхождения и переношу объект в zzz_ready По окончании работы - проект zzz пуст, в zzz_ready - реально изменившиеся объекты. Тоталь : 1. Все, что вы экономите своей доработкой со сравнением слоев - это суммарное время на (сравнение + удаление) "одинаковых" объектов из проекта zzz. Вопрос : а оно правда того стоит? 2. Ситуация, когда "объекты различаются на более низком слое" может быть вызвана, в том числе, и тем, что один из партнеров накатил у себя обновление (от Микрософта которое), а другой партнер этого не сделал. Другого объяснения мне как-то не видится. Понятно, что это.. нехорошо и делать так не стОит. Но это уже вам решать с вашим подрядчиком.
__________________
Best Regards, Roman |
|
|
За это сообщение автора поблагодарили: MazZzDaI (1). |
01.04.2015, 18:01 | #31 |
Британский учённый
|
Цитата:
Сообщение от MazZzDaI
1. Ситуация следующая:
1.1. Перед обновлением АХ подрядчиком, я сохраняю VAR слой в VAR_OLD; 1.2. Для обновления АХ, подрядчик подменяет VAR слой своим; 1.3. Мои объекты, и модификации объектов VAR слоя, находятся на CUS. 2. Задача: 2.1. Выбрать все объекты CUS; 2.2. Выбрать все объекты VAR, которые также существуют на CUS; 2.3. Выбрать все объекты VAR_OLD, соответствующие выборке п.2.2; 2.4. Сравнить п.2.3 и п.2.4. В случае нахождения различий— сообщить. 3. Возможные решения п.2.4: 3.1. Используя SysCompare; 3.2. Используя экспорт объекта в XPO с последующим сравнением. 4. Проблема использования возможных решений состоит в том, как писал KIA: 1. Утилитой сравнения слоев получить проект между var и old var. 2. Удалить из проекта, например джобом, все объекты отсутствующие на cus слое. То можно написать своё сравнение с шахматами и куртизанками, метод отсутствующий в 2009 и пример его работы: X++: /// <summary> /// Checks whether an item exists in the given layer /// </summary> /// <param name="_node">The tree node instance.</param> /// <param name="_layer">The layer.</param> /// <returns>true if an item exists in the given layer; otherwise, false.</returns> public static boolean existsInLayer(TreeNode _node, UtilEntryLevel _layer) { return SysTreeNode::isNodeInLayer(_node, _layer) || (_node.applObjectLayerMask() & (1 << _layer)); // check if sub-elements' layer is in layer mask } X++: treeNode = TreeNode::findNode(_treeNodePath); if (treeNode && SysTreeNode::existsInLayer(treeNode, _layer)) { for (layerCnt = UtilEntryLevel::usp; layerCnt >= _layer; layerCnt--) { if (SysTreeNode::existsInLayer(treeNode, layerCnt)) i++; } }
__________________
Людям физического труда для восстановления своих сил нужен 7-8 часовой ночной сон. Людям умственного труда нужно спать часов 9-10. Ну а программистов будить нельзя вообще. |
|
03.04.2015, 13:55 | #32 |
Участник
|
Скопировал нижележащие слои в OLD, и всё получилось.
Прилагаю решение: X++: static void ADM_Compare_layers(Args _args) { #AOT boolean fnCompare(UtilElements _utilElements) { TreeNode curLevelTreeNode, oldLevelTreeNode; SysComparable comparable1, comparable2; ; curLevelTreeNode = SysTreeNode::findNodeInLayer(_utilElements.recordType, _utilElements.name, _utilElements.parentId, UtilEntryLevel::var, true, false); oldLevelTreeNode = SysTreeNode::findNodeInLayer(_utilElements.recordType, _utilElements.name, _utilElements.parentId, UtilEntryLevel::var, true, true); comparable1 = SysTreeNode::newTreeNode(curLevelTreeNode); comparable2 = SysTreeNode::newTreeNode(oldLevelTreeNode); return SysCompare::silentCompare(comparable1, comparable2); } void fnLoopObj(UtilElementType _recordtype) { UtilElements utilElementsCUS, utilElementsVAR; SysOperationProgress p = new SysOperationProgress(); ProjectListNode projectsNode; ProjectNode projNode; Treenode rootNode, itemNode; str treePath; ; projectsNode = SysTreenode::getPrivateProject(); projNode = projectsNode.AOTfindChild('testProj'); switch (_recordType) { case UtilElementType::Table: treePath = #TablesPath; break; case UtilElementType::Class: treePath = #ClassesPath; break; case UtilElementType::Form: treePath = #FormsPath; break; case UtilElementType::Menu: treePath = #MenusPath; break; } rootNode = Treenode::findNode(treePath); select count(RecId) from utilElementsCUS where 1 == 1 && utilelementsCUS.recordType == _recordType && utilElementsCUS.utilLevel == UtilEntryLevel::cus; p.setTotal(utilElementsCUS.RecId); while select utilElementsCUS where 1 == 1 && utilelementsCUS.recordType == _recordType && utilElementsCUS.utilLevel == UtilEntryLevel::cus // && utilElementsCUS.name != 'CustVendTable' { p.incCount(); select utilElementsVAR where utilelementsVAR.recordType == utilelementsCUS.recordType && utilElementsVAR.utilLevel == UtilEntryLevel::var && utilelementsVAR.name == utilElementsCUS.name; if (utilElementsVAR.RecId) { if (!fnCompare(utilElementsCUS)) { info(strfmt('%1\t%2', utilelementsCUS.recordType, utilElementsCUS.name)); itemNode = rootNode.AOTfindChild(utilElementsCUS.name); projNode.addNode(itemNode); } } } projNode.AOTsave(); } ; // fnLoopObj(UtilElementType::Table); fnLoopObj(UtilElementType::Class); // fnLoopObj(UtilElementType::Form); // fnLoopObj(UtilElementType::Menu); } |
|