05.05.2009, 18:40 | #1 |
Участник
|
Пропуск номеров RecId
У таблицы в АХ 4.0 получилось так, что последовательность гененрируемых RecId наложилась на уже сужествующие в таблице.
Каковы есть варианты решения проблемы? В форуме нашел описание использование класса SystemSequence, но для 4.0 это не подходит. В 4.0, например, нет метода nextVal() |
|
05.05.2009, 19:34 | #2 |
Роман Долгополов (RDOL)
|
остновить аос(ы)
исправить поле NEXTVAL таблицы SystemSequence в записи для нужной таблицы (TabId - Id таблицы, ID=-1) любым доступым или любимым инструментом (SQLServer Management Studio, например) |
|
05.05.2009, 20:38 | #3 |
NavAx
|
ИМХО, если эта таблица не имеет связок по RecId, то можно через SQL проапдейтить у нее RecId на меньшие (меньше тех что генерятся). Тем более это DAX4. Если конечно в минуса не уйдет.
Типа: update myTable set recid = recid - 10000; Последний раз редактировалось raz; 05.05.2009 в 20:42. |
|
06.05.2009, 09:53 | #4 |
Модератор
|
Кстати, а случайно нет хранимой процедуры типа "CheckRecId" или "FixRecId"?
С Уважением, Георгий |
|
06.05.2009, 11:41 | #5 |
Участник
|
Хочется обойтись средствами самой АХ. Будем считать что нет доступа к БД.
А как теперь в AX4 сбросить кеш номеров? Половину функций поубирали из SystemSequence |
|
07.05.2009, 15:28 | #6 |
MCITP
|
Цитата:
(на уровне идеи - реализовать не сложно, как мне кажеться)
__________________
Zhirenkov Vitaly |
|
07.05.2009, 15:31 | #7 |
Участник
|
Цитата:
И, наверняка, расхлебывает кашу совсем не тот, кто был автором этого "гениально простого" решения, из-за которых дублируются recid. извините. |
|
07.05.2009, 15:41 | #8 |
MCITP
|
Цитата:
Оффтоп: Когда-то очень давно моей первой процедурой (пакетом) на PL/SQL для работы с Аксаптой извне была именно процедура правильной генерации RecID... Для тройки. Работает до сих пор иногда, уже много лет, ни одного бага. Если кому интересно могу выложить... А если по сути, то не обязательно такое может случиться из-за кривой работы с RecID извне. Альтернативный например - делали дамп БД с какой-то базы, с которой в данный момент шла работа, импортнули в другое место, (иссественно CONSISTENT не использовали ) - получили аналогичный результат.
__________________
Zhirenkov Vitaly Последний раз редактировалось ZVV; 07.05.2009 в 16:01. |
|
07.05.2009, 15:59 | #9 |
Участник
|
Да, было бы здорово.
особенно если дополнить уже существующие темы Вставка строк в таблицы Аксапты сторонними средствами См. также: SystemSequences - Выделение RecId Как сформировать RecId а также для ax3.0: Как выполнять дефрагментирование RecID |
|
07.05.2009, 16:52 | #10 |
MCITP
|
Цитата:
Сообщение от mazzy
Да, было бы здорово.
особенно если дополнить уже существующие темы Вставка строк в таблицы Аксапты сторонними средствами
__________________
Zhirenkov Vitaly |
|
07.05.2009, 20:19 | #11 |
Участник
|
Цитата:
А ситуация была следующая. У Заказчика обновление модуля ставиться установкой слоя. У Заказчика была создана таблица (с каким-то TableId), которая наполнялась данными. Чтобы после обновления она не пропала, то она была включена в новый слой (c другим TableId) и слой был установлен (слой usr удален). После синхронизации у таблицы изменился TableId и значенеи Next в таблице SystemSequences. |
|
12.05.2009, 11:02 | #12 |
Участник
|
Для АХ 4.0 :
1. Заходим в АХ монопольно. 2. Создаем класс, запускаемый на сервере. 3. Создаем в нем метод main и вносим в него имя нужной таблицы : X++: #define.TableName("MyTable") public static void main(Args _args) { Connection con; Statement stmt; SqlStatementExecutePermission ssep; SqlDictionary sqlDictionary; str sqlStr; int result; ; con = new Connection(); stmt = con.createStatement(); select firstonly sqlDictionary where sqlDictionary.TabId == tablenum(#TableName) && !sqlDictionary.fieldId; if (sqlDictionary) { ttsbegin; sqlStr = "UPDATE SystemSequences \n"; sqlStr += "SET NextVal = (SELECT MAX(RecID) FROM " + sqlDictionary.sqlName + " WITH (TABLOCK)) + 1 \n"; sqlStr += "WHERE DataAreaId = 'dat' AND Id = -1 AND TabId = " + int642str(tablenum(#TableName)) + " \n"; ssep = new SqlStatementExecutePermission(sqlStr); ssep.assert(); result = stmt.executeUpdate(sqlStr); CodeAccessPermission::revertAssert(); ttscommit; } } 5. Перезапускаем АОС. 6. Проверяем на всякий случай присвоение нового RecId с помощью вставки строки. PS. Если нет уверенности, то сначала "тренируемся на кошках" |
|
|
За это сообщение автора поблагодарили: Logger (2), Poleax (2), AvrDen (1). |