07.08.2008, 13:12 | #1 |
Участник
|
В очередной раз о ошибках синхронизации
Доброго времени суток. При попытке синхронизации чере Администрирование\Периодические операции выдает ошибку:
Невозможно выполнить команду языка определения данных в (). База данных SQL обнаружила ошибку. Таких строк много. В итоге выдает строку: Невозможно выполнить команду языка определения данных в (). База данных SQL обнаружила ошибку. Каким образом получить более информативные сообщения: в каких таблицах, почему? И вообще как с этим бороться? переиндексирование не помогло. P.S. AX 4.0. SP 2 |
|
07.08.2008, 13:16 | #2 |
Участник
|
А в EventLog что?
|
|
|
За это сообщение автора поблагодарили: greench (1). |
07.08.2008, 13:34 | #3 |
Участник
|
|
|
07.08.2008, 13:42 | #4 |
Боец
|
Вот простенький джобец, который позволяет локализовать проблемную таблицу.
X++: //DSPIC static void synchronizationCheck(Args _args) { Dictionary dictionary = new Dictionary(); TableId tableId; RunbaseProgress runbaseProgress = new RunbaseProgress(); ; tableId = dictionary.tableNext(tableId); runbaseProgress.setTotal(dictionary.tableCnt()); runbaseProgress.setCaption("SynchronizationCheck"); while (tableId) { appl.dbSynchronize(tableId, false, true, false); runbaseProgress.setText(tableId2Name(tableId)); info (strfmt("Table '%1' - OK", tableId2Name(tableId))); runbaseProgress.incCount(); tableId = dictionary.tableNext(tableId); } } |
|
07.08.2008, 14:34 | #5 |
Administrator
|
Поставьте в настройках АОСа на закладке Tracing галку Allow client tracing on Application Object Server instance. И будет Аксапта все вам писать в инфолог сразу. Только после установки галки нужен будет рестарт АОСа и как следствие - повторный запуск синхронизации
__________________
Возможно сделать все. Вопрос времени |
|
08.08.2008, 11:12 | #6 |
Участник
|
Цитата:
Вчера как раз тоже написал подобный джоб, может кому пригодится: X++: // Синхронизация с выводом наименований "неправильных" таблиц static void DbSynchronize(Args _args) { #AviFiles Dictionary dictionary; DictTable dictTable; int i; SysOperationProgress progress; ; dictionary = new Dictionary(); progress = SysOperationProgress::newGeneral(#AviUpdate, "Синхронизация", dictionary.tableCnt()); for (i = 1; i <= dictionary.tableCnt(); i++) { dictTable = new DictTable(dictionary.tableCnt2Id(i)); if (dictTable.isSql() && ( !dictTable.configurationKeyId() || isConfigurationkeyEnabled(dictTable.configurationKeyId()) ) ) { try { progress.setText(dictTable.name()); progress.setCount(i); if (!appl.dbSynchronize(dictTable.id(), false, true, false)) { warning(strfmt("Проблемы с таблицей %1 (Id = %2)!", dictTable.name(), dictTable.id())); } } catch (Exception::Error) { warning(strfmt("Проблемы с таблицей %1 (Id = %2)!", dictTable.name(), dictTable.id())); } } } info("Синхронизация завершена"); } - некорректные данные в таблице SqlDictionary (чаще всего - их отсутствие), - нарушение уникального индекса (самая "попса" - табличка InventDim при отключении складской аналитики) |
|
|
За это сообщение автора поблагодарили: DarLord (0). |
08.08.2008, 11:42 | #7 |
Боец
|
Цитата:
По-моему, некорректный джобец. Во-первых, он работает до первой ошибки, во-вторых, имя таблицы с ошибкой как раз не выводится, а в инфологе только куча строк "Table xxx - ОК".
Цитата:
Вчера как раз тоже написал подобный джоб...
|
|
08.08.2008, 12:07 | #8 |
Участник
|
Цитата:
Отрабатывает , но возможно что не во всех случаях. Вчера была проблема с отсутствием данных в SqlDictionary - там выкидывается Exception::Error (соответственно, ловится). |
|
08.08.2008, 12:23 | #9 |
Боец
|
Цитата:
Интересно - как это? Синхронизация не в алфавитном порядке же идет...
В общем пример будем считать лабораторным - как найти проблему синхронизации програмно - понятно. Спасибо за бдительность и уточнение. |
|