|
02.02.2017, 07:39 | #1 |
Участник
|
Да, я вчера пришел к подобной же мысли, только реализовать решил по-другому:
(чтобы не разбивать запрос на две части - подсчет количество и саму вставку) делаю заморозку выделения RecID выполняю запрос резервирую разницу между следующим RecId и фактическим RecId после вставки в таблицу снимаю заморозку но реализация что-то не работает: --start ----макс. recid в таблице 5642940489, systemsequences.nextval 5642940490 --suspend --before query ----макс. recid в таблице 5642940540, systemsequences.nextval 5642940740 ----systemsequence.reserve(1) = 5642940543 --execute insert query --after query ----макс. recid в таблице 5642945298, systemsequences.nextval 5642940740 ----systemsequence.reserve(1) = 5642940544 ----systemsequence.reserve(4754 {5642945245 - 5642940491 - разница между след. рекид и фактическим рекид}) = 5642940740 --removesuspend --а теперь проверим, какой RecId будет следующий --suspend ----systemsequence.reserve(1) = 5642940545 //будто бы не было reserve(4754) --removesuspend По идее, я зарезервировал 4754 RecId начиная с 5642940740 - то есть следующий номер должен быть 5642940740 + 4754 Или у меня неверные представления о работе резерва, и система не только резервирует, но ещё и по факту отслеживает вставку записей с этими RecId ? Впрочем, с выделением ДО запроса ситуация такая же: выделил скопом 10000 (больше реально вставляемых 4754), получил recid 5642990876, значение в systemSequence.nextVal = 5643000876 вставил запросом в таблицу выделил ещё 1 для проверки - получил 5642980716, значение меньше стартового RecId от первого выделения Последний раз редактировалось Pandasama; 02.02.2017 в 08:40. |
|
02.02.2017, 10:18 | #2 |
Участник
|
ну и вообще, вот такой джоб
X++: static void Job342(Args _args) { SystemSequence sysSeq = new SystemSequence(); int64 recId; ; sysSeq.suspendRecIds(tablenum(VendTable)); recId = sysSeq.reserveValues(1, tablenum(VendTable)); info(strfmt("after reserve 1 = %1", recId)); //5637264076 recId = sysSeq.reserveValues(10000, tablenum(VendTable)); info(strfmt("after reserve 10000 = %1", recId)); //5637264327 recId = sysSeq.reserveValues(1, tablenum(VendTable)); info(strfmt("after reserve 1 = %1", recId)); //5637264077 sysSeq.removeRecIdSuspension(tablenum(VendTable)); } 5637264076 5637264327 5637264077 то есть третий резерв возвращает значение меньше чем второй |
|
02.02.2017, 13:29 | #3 |
Участник
|
Цитата:
5637274077 Обратите вниманием на окончание: 74077, а не 64077, как у Вас. Возможно, Вы просто невнимательно посмотрели на число в этом разряде? Цитата:
Сообщение от Pandasama
(чтобы не разбивать запрос на две части - подсчет количество и саму вставку)
Разбивать по любому придется. Дело в том, что Axapta резервирует часть значение RecId. Т.е. определение значения по полю таблицы systemsequences.nextval ни о чем не говорит. Далеко не факт, что именно это значение и будет использовано в среде Axapta для генерации следующего значения. Как следствие, Вы рискуете присвоить не корректные значения RecId. Те, с которыми позже произойдет пересечение при обычной работе Axapta Другими словами недопустимо на основании systemsequences.nextval сфоромировать RecId, а потом попросить Axapta зарезервировать NN значений. Не получится, поскольку Axapta может начать резервирование вовсе не с того значения, которое указано в systemsequences.nextval Кроме того, с предварительным запросом во временную таблицу проще организовать нумерацию, при этом задержка по времени незначительная. У меня получается примерно так X++: // Этап 1 выборка во временную таблицу if object_id('tempDB..#NewData') is not null drop table #NewData; select (...) , identity(int,1,1) as RowNum into #NewData from (...) // Подсчет записей. Это значение считываем в Axapta select count(*) from #NewData // Этап 2 // Резервирование RecId в Axapta // И передача начального номера RecId в SQL // Этап 3 - Вставка в итоговую таблицу // beginRecId - переданное начальное значение insert into MyTable (... ,RecId ) select ... , #NewData.RowNum - 1 + beginRecId from #NewData
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... Последний раз редактировалось Владимир Максимов; 02.02.2017 в 13:41. |
|
Теги |
ax2009, recid, sql, systemsequences |
|
|