AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 02.02.2017, 07:39   #1  
Pandasama is offline
Pandasama
Участник
 
457 / 134 (5) +++++
Регистрация: 11.08.2014
Адрес: Барнаул
Да, я вчера пришел к подобной же мысли, только реализовать решил по-другому:
(чтобы не разбивать запрос на две части - подсчет количество и саму вставку)
делаю заморозку выделения 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  
Pandasama is offline
Pandasama
Участник
 
457 / 134 (5) +++++
Регистрация: 11.08.2014
Адрес: Барнаул
ну и вообще, вот такой джоб

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  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от Pandasama Посмотреть сообщение
выдает результаты:
5637264076
5637264327
5637264077

то есть третий резерв возвращает значение меньше чем второй
У меня возвращает корректно. Применительно к Вашему примеру последнее число было бы

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
Я использую динамическое формирование запроса в среде Axapta, поэтому временные таблицы. Если использовать хранимые процедуры SQL, то придется делать постоянные таблицы
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...

Последний раз редактировалось Владимир Максимов; 02.02.2017 в 13:41.
Теги
ax2009, recid, sql, systemsequences

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
SystemSequences - Выделение RecId kashperuk DAX: Программирование 11 27.08.2013 15:02
ax2009. зачем нужно создавать индекс по recID, если включены CreatedDateTime или ModifiedDateTime? mazzy DAX: Программирование 1 17.07.2011 23:01
Формирование RecId при вставке в таблицу AX из SQL Server Hyper DAX: Программирование 20 28.06.2011 17:30
axforum blogs: Переделываем RecId в таблицах Blog bot DAX Blogs 0 06.05.2011 19:11
aEremenko: Дефрагментация RecID Blog bot DAX Blogs 2 06.03.2007 22:25

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 05:13.