27.05.2016, 09:48 | #1 |
Участник
|
Dynamics AX4.0 ошибка REGID по LedgerTrans.
В Axapta 4.0 произошла ошибка по REGID. При разноске любого документа выходит сообщение
Невозможно создать запись в Операции ГК (LedgerTrans). Операция: КНКЛN02873348, 27.05.2016. Запись уже существует. Провел проверку по ошибке , такой операций нету. Следовательно дошел до того что аксапта не может увеличить(не могу понять из-за чего) номер следующего REGID. Подскажите пожалуйста какие существуют варианты решения данной проблемы. |
|
27.05.2016, 10:19 | #2 |
Участник
|
Я пользуюсь таким скриптом для AX 2012. Попробуйте применить его для AX 4 на тестовом приложении.
После исправлений, выполненных скриптом, перегрузите АОС. X++: protected void checkNextVal(boolean _fixNextVal = false) { SystemSequences systemSequences; Common record; while select forUpdate systemSequences where systemSequences.TabId != 0 { if (!(new SysDictTable(systemSequences.TabId))) continue; record = new SysDictTable(systemSequences.TabId).makeRecord(); new SkipAOSValidationPermission().assert(); record.skipAosValidation(true); select firstOnly crossCompany RecId from record where record.RecId >= systemSequences.NextVal; if (record.RecId) { warning(tableId2Name(systemSequences.TabId)); new SystemSequence().suspendRecIds(systemSequences.TabId); new SystemSequence().flushValues(systemSequences.TabId); if (_fixNextVal) { this.fixNextVal(systemSequences.TabId); } } CodeAccessPermission::revertAssert(); } } X++: protected void fixNextVal(TableId _tableId) { Connection dbConnection = new Connection(); str sqlStatement; Common record = new SysDictTable(_tableId).makeRecord(); select crossCompany maxOf(RecId) from record; sqlStatement = strFmt('update %1 set NextVal = %2 where TabId = %3', new SysDictTable(tableNum(SystemSequences)).name(DbBackend::Sql), int642str(record.RecId + 1), int2str(_tableId)); new SqlStatementExecutePermission(sqlStatement).assert(); dbConnection.createStatement().executeUpdate(sqlStatement); CodeAccessPermission::revertAssert(); } Последний раз редактировалось Morpheus; 27.05.2016 в 10:24. |
|
|
За это сообщение автора поблагодарили: AlGol (2). |
27.05.2016, 10:27 | #3 |
Moderator
|
Посмотрите на результаты следующих запросов:
X++: SELECT nextval FROM SystemSequences where SystemSequences.tabid == 225 X++: SELECT maxof(recid) FROM LedgerTrans
__________________
Андрей. |
|
27.05.2016, 10:48 | #4 |
Участник
|
Спасибо сейчас проверю,TabLId это ledgerTrans я правильно понимаю?
|
|
27.05.2016, 10:51 | #5 |
Moderator
|
Да, tableNum(LedgerTrans)
__________________
Андрей. |
|
27.05.2016, 11:03 | #6 |
Участник
|
Подскажите пожалуйста из-за чего может возникать данная ошибка?(Пока не проверил скрипт поднимаю тестовую базу)
|
|
27.05.2016, 12:35 | #7 |
Мрачный тип
|
Staxs_Huck, для 64-битного идентификатора записи естественным путем достичь предела за прошедший с момента появления 4-ки срок - нереально (вставляйте по миллиону записей в секунду - он кончится через пол-миллиона лет). Нет ли каких сторонних программных продуктов, обитающих в вашей IT-епархии и вставляющих записи в БД DAX и пользующих/обновляющих таблицу SystemSequences ?
__________________
Мы летаем, кружимся, нагоняем ужасы ... |
|
27.05.2016, 12:53 | #8 |
Участник
|
Нет такого нету,весь импорт производится через ADO после чего все созданные документы разносятся непосредственно в системе.
|
|
27.05.2016, 13:27 | #9 |
Участник
|
Цитата:
Я бы советовал запустить профайлер SQL. Поймать команду INSERT ... INTO LEDGERTRANS, скопировать эту команду в Management Studio и попытаться выполнить вручную. Тут дело в том, что сообщение об ошибке, выдаваемое Axapta очень часть не соответствует действительности. Подозреваю, Axapta большую часть ошибок SQL отображает как "Запись уже существует" вне зависимости от реальной ошибки. Например, такое сообщение может выдать если в таблице нет какого-то поля Цитата:
1. Вы вручную, из вне Axapta вставляете записи в таблицу LedgerTrans, но не корректируете значение счетчика в SystemSequences 2. Вот из-за этого еще может быть, раз Вы пользуетесь закачкой через ADO. Проблема с настройкой SET NOCOUNT в хранимых процедурах AX2009: Ошибка оптимистической модели обновления Правда, в этом случае подобная ошибка будет выскакивать произвольно в любой момент на любой таблице.
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
27.05.2016, 14:57 | #10 |
Участник
|
Извените а что означает данная переменная crossCompany -?
|
|
27.05.2016, 15:58 | #11 |
Участник
|
Это не переменная, а элемент языка запросов, появившийся в DAX2009.
В DAX4 придется пробежаться по всем компаниям и найти максимальное значение учитывая все компании. Ну для такого простого действия проще будет в Management studio (или в любом другом средстве, позволяющем создавать запросы к MS SQL Server) запрос сделать что по таблице проводок, что по SystemSequences. |
|
27.05.2016, 16:14 | #12 |
Участник
|
Копания одна, получается мне нужно взять максимальное значение по РЕГайди(я ток начал разбираться в языке х++,до этого все решал спокойно с помощью SQL).и подставить его в значение LedgerTrans. Или я не уловил смысл запороса.
|
|
28.05.2016, 10:25 | #13 |
Участник
|
Всем большое спасибо,проблема исправлена
|
|
|
|