|
25.10.2013, 09:07 | #1 |
Участник
|
После инсталяции Map вдруг cтал Table?!
Доброго времени суток,
используем AX2012R2. После инсталяции VAR Model наблюдаем следующий феномен: объект SalesPurchTableToLineParameters раньше был Map а теперь стал вдруг Table. Его ID не изменилось, но он почему-то перекочевал из мэпов в таблицы. Модификаций в нем нету (SYS Layer). Как его "отправить" обратно в мэпы? Спасибо за помощь! |
|
25.10.2013, 15:40 | #2 |
Участник
|
Это действительно странно, но в AX2012R2 Map SalesPurchTableToLineParameters в таблице UtilIdElements "числиться" как Table а не TableMap.
А вот в SQLDictionary ее как раз нету Попробуйте исправить запись в UtilIdElements и пезапустить AOS. Тоже самое наблюдается в AX2012, похоже что проблема вылезла как раз после заливки VAR, посмотрите, может где-то пересекаются ID?
__________________
http://www.axdevposts.blogspot.com Пришел, уведел.... отойди, дай другому увидеть! Последний раз редактировалось plumbum; 25.10.2013 в 15:44. Причина: проверил в AX2012 |
|
06.12.2013, 14:16 | #3 |
Участник
|
Удалось решить проблему? Столкнулся с тем же но с Map SalesPurchBookVATProcessLogTransOper_RU. В UtilIdElement записано как Table и реально стала таблицей. На других приложениях в UtilIdElement запись 1 в 1 такая же а отображается в АОТ как Map.
|
|
07.02.2014, 14:22 | #4 |
Программатор
|
Коллеги, как лечится этот глюк?
|
|
09.02.2014, 21:37 | #5 |
Талантливый разгвоздяй
|
А вы уверены что это баг? У меня чистая AX 2012 R2 CU7 и наугад выбранные маппы все в UtilElements и UtilIdElements числятся именно таблицами, а не маппами. Проверял вот эти маппы: SalesPurchTableToLineParameters, SalesDeliveryDateControlMap, SalesPurchLine, CustVendPaymModeFeeIntervalMap, InventPriceMap
Может тут какая-то фича скрывается, а? |
|
10.02.2014, 10:24 | #6 |
Программатор
|
Уверен, что это не баг, а фича. Но отображаются то они у вас в мапах? Если хоть одна отображается в таблицах - акса не синхронизируется.
|
|
11.02.2014, 00:47 | #7 |
Талантливый разгвоздяй
|
|
|
11.02.2014, 10:33 | #8 |
Программатор
|
|
|
11.02.2014, 12:22 | #9 |
Талантливый разгвоздяй
|
|
|
10.02.2014, 14:17 | #10 |
Участник
|
В MS знают про проблему, мой запрос был не первым. Но т.к. последовательность действий не повторить, я так понимаю, готового решения пока нет. На одном из проектов руками правили в SQL бд.
__________________
Ivanhoe as is.. |
|
|
За это сообщение автора поблагодарили: Kabardian (3). |
10.02.2014, 14:54 | #11 |
Программатор
|
удалить в базе на СКЛ и синхронизировать в аксе?
|
|
10.02.2014, 14:55 | #12 |
Участник
|
Нет, что-то другое.. именно в БД приложения поменять. Уточню у разработчиков.
__________________
Ivanhoe as is.. |
|
|
За это сообщение автора поблагодарили: Sada (4). |
11.02.2014, 10:59 | #13 |
Участник
|
Уточнил у своих - собирали сбоку новое приложение т.е. совсем не быстрый способ.
Пока сильно панику не подымаем, т.к. только на DEV случалось, а тестирование в отдельной системе делаем. Первая линия поддержки MS начала искать похожие кейсы, следующий апдейт - 17-го февраля. Попробую их ускорить.
__________________
Ivanhoe as is.. |
|
11.02.2014, 11:15 | #14 |
Талантливый разгвоздяй
|
|
|
11.02.2014, 11:22 | #15 |
Боец
|
Было такое. Не помню в какой таблице (UtilElements?) есть бинарное поле(массив байтов вроде). "Сигнатура" в этом поле оказалась битой. Короче поменяли несколько байт этого поля на верные, такие как должны быть в мапе. Подробности к сожалению не могу сейчас дать.
|
|
11.02.2014, 11:07 | #16 |
Программатор
|
Да. мы тоже собирали новое приложение, думал как то проще можно...
|
|
11.02.2014, 11:23 | #17 |
Программатор
|
Мы люди терпеливые
|
|
11.02.2014, 22:47 | #18 |
Программатор
|
Сорри, значит был не прав
|
|
12.02.2014, 13:36 | #19 |
Участник
|
Решение
Коллеги, нам удалось исправить данную проблему копированием поля Properties таблицы ModelElementsData базы модели и одной базы в другую, пример скрипта:
X++: USE AX60_DEV_model UPDATE [dbo].[ModelElementData] SET [dbo].[ModelElementData].Properties = GOOD_BASE.Properties FROM [dbo].[ModelElementData] AS BAD_BASE LEFT JOIN [AX60_TST_model].[dbo].[ModelElementData] AS GOOD_BASE ON BAD_BASE.ElementHandle = GOOD_BASE.ElementHandle WHERE GOOD_BASE.ElementHandle = 185644 Ссылка на тему с аналогичной проблемой: http://community.dynamics.com/ax/f/3...71/249240.aspx PS. Удобный сайт для форматирования SQL-операторов: http://poorsql.com/ Последний раз редактировалось Stainless; 12.02.2014 в 13:40. Причина: Очепятка |
|
|
За это сообщение автора поблагодарили: mazzy (2), AlGol (2), Oz (2), db (10), sukhanchik (20), Logger (8), b_nosoff (2), Raven Melancholic (5), Sada (4), leva (1), Ivanhoe (5), oip (2), gl00mie (15), Stitch_MS (6), Kabardian (6), Dreadlock (1), pedrozzz (1). |
28.08.2020, 19:43 | #20 |
Участник
|
Цитата:
В скрипте есть ошибка. Не учитывается что табличка может жить на нескольких слоях. Поправил, чтобы учитывался слой. Дописал в SysDictTable такой метод (он автоматически генерирует исправляющий скрипт) X++: public static server str sqlQueryRestoreTablePropsByTempl_MRC( TableId _tableId, str _modelDBNameTemplate, boolean _elementHandleEquel = false ) { SysModelElement sysModelElement; SqlStatementExecutePermission permission; Statement statement; ResultSet resultSet; TableName tableName = tableId2name(_tableId); str dbo = "[" + xSession::getDbSchema() + "]"; str modelDBName = "[" + SqlSystem::modelDatabaseBackendName() + "]"; str modelDBNameTemplate; str elementHandleGood; str elementHandleBad; str queryText; str queryTextForElementHandleGood; ; if (_modelDBNameTemplate) { modelDBNameTemplate = "[" + _modelDBNameTemplate + "]"; } else { throw error("Нужно указать имя базы образца!"); } select sysModelElement where sysModelElement.AxId == _tableId && sysModelElement.Name == tableName && sysModelElement.ElementType == UtilElementType::Table; if (!sysModelElement.RootModelElement) { throw error("Не смогли определить RootModelElement"); } elementHandleBad = int642str(sysModelElement.RootModelElement); if (_elementHandleEquel) { elementHandleGood = elementHandleBad; } else { queryTextForElementHandleGood = strFmt( @"SELECT RECID FROM %3.%1.[SYSMODELELEMENT] AS GOOD_BASE WHERE GOOD_BASE.ElementType = 44 /* Table */ AND GOOD_BASE.Name = N'%2' AND GOOD_BASE.PARENTMODELELEMENT = 0" ,dbo // 1 ,tableName // 2 ,modelDBNameTemplate // 3 ); permission = new SqlStatementExecutePermission(queryTextForElementHandleGood); permission.assert(); try { //BP Deviation documented statement = new Connection().createStatement(); resultSet = statement.executeQuery(queryTextForElementHandleGood); if (resultSet.next()) { elementHandleGood = int642str(resultSet.getInt64(1)); } } catch { info(strfmt("Error %1. Error text: %2", statement.getLastError(), statement.getLastErrorText())); } } if (!elementHandleGood) { throw error(strFmt("Не удалось определить ElementHandle для таблички в базе образце.")); } queryText = strFmt(@" UPDATE %2.%1.[ModelElementData] SET %2.%1.[ModelElementData].Properties = GOOD_BASE.Properties FROM %2.%1.[ModelElementData] AS BAD_BASE LEFT JOIN %3.%1.[ModelElementData] AS GOOD_BASE ON BAD_BASE.ElementHandle = %5 AND GOOD_BASE.ElementHandle = %4 WHERE GOOD_BASE.ElementHandle = %4 AND GOOD_BASE.LayerId = (SELECT MAX(LayerId) from %3.%1.[ModelElementData] AS GOOD_BASE2 where GOOD_BASE2.ElementHandle = %4) AND BAD_BASE.LayerId = (SELECT MAX(LayerId) from %2.%1.[ModelElementData] AS BAD_BASE2 where BAD_BASE2.ElementHandle = %5) ", dbo, // 1 modelDBName, // 2 modelDBNameTemplate, // 3 elementHandleGood, // 4 elementHandleBad // 5 ); return queryText; } База образец называется AXJW12_TEST_model X++: static void fixTableDefinition(Args _args) { info(SysDictTable::sqlQueryRestoreTablePropsByTempl_MRC(tableNum(SalesTable), "AXJW12_TEST_model")); // AifChangeTracking::executeDirectSqlUpdate(SysDictTable::sqlQueryRestoreTablePropsByTempl_MRC(tableNum(SalesTable), "AXJW12_TEST_model")); // для тех кто не боится info("Не забыть рестартовать аос."); } |
|
|
За это сообщение автора поблагодарили: mazzy (5), pedrozzz (2). |
Теги |
ax2012, ax2012r2, map, table |
|
|