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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 17.01.2011, 17:30   #28  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Кое-что удалось проверить.

Действительно, insert_recordset генерит значения RecId в количестве, равном количеству записей вставки, начиная со значения nextVal, хранящегося в таблице SystemSequences на момент вызова оператора insert_recordset. После выполнения этого оператора новое значение nextVal = предыдущее значение nextVal + кол-во вставленных записей.

Всё это происходит только в том случае, если у таблицы, в которую вставляются записи, не перекрыт метод insert. Если же перекрыт, то insert_recordset превращается в серию обычных одиночных insert-ов. И это известный факт из курса программирования в Аксапте.

Как показала проверка, стоит нам создать на таблице простейшую версию метода, например, просто используя ту, которая прописывается автоматически:
X++:
public void insert()
{
    super();
}
и ничего больше не делать, как Аксапта начинает при выполнении того же insert_recordset генерить RecId обычными пачками по 25 штук.

Поэтому если есть готовность пожертвовать скоростью вставки, приобретя возможность эффективного использования дыр, то можно просто аналогично перекрыть метод insert() на соответствующей таблице.

У меня во всем приложении Аксапты нашлось всего 12 мест в коде с оператором insert_recordset.

Но это, конечно, выглядит как полумера (хотя лично мне вполне симпатичная) и я продолжаю подумывать о более универсальном подходе. Пока в голову пришло следующее. Использовать для вставок посредством insert_recordset большую непрерывную область за пределами диапазонов, охватываемых таблицей дыр RecId. Тогда каждому вызову insert_recordset будет предшествовать вызов некоего метода, передвигающего nextVal в непрерывную область, а после insert_recordset другой метод будет восстанавливать предыдущее значение nextVal (опять из области дыр). Парными вызовами этих методов (условно назовем их "BEFORE_insert_recordset" и "AFTER_insert_recordset") необходимо будет "окутать" все операторы insert_recordset.
Теги
ax3.0, recid, дефрагментирование recid, законченный пример, полезное

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
if (record) vs if (record.RecId) kashperuk DAX: Программирование 18 27.11.2008 18:53
поля, содержащие RecId somebody DAX: Программирование 15 16.05.2008 17:50
Что лучше select RecId или select TableId Logger DAX: Программирование 9 02.06.2007 15:13
aEremenko: Дефрагментация RecID Blog bot DAX Blogs 2 06.03.2007 22:25
Два RecId у одной записи таблицы sparur DAX: Программирование 33 18.12.2006 15:56

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

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

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