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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 20.05.2008, 14:50   #1  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Будьте осторожны с RecordInsertList
1) Создаю таблицу новую (Table1)
2) Создаю текстовое поле (field1) (string 10 по умолчанию)
3) В insert таблицы пишу.
X++:
public void insert()
{
    super();
    info("ttttttttttttttttttttttttttttttttttttttttttt");
}
4) Запускаю джобик
X++:
static void Job14(Args _args)
{
    RecordInsertList    recordInsertList    = new RecordInsertList(tablenum(Table1));
    Table1 table1;
    int i;
;
    for(i=0;i<4000;i++)
    {
        table1.Field1 = int2str(i);
        info(table1.Field1);
        recordInsertList.add(table1);
    }
    recordInsertList.insertDatabase();
}
И вижу что в add на цифрах 1067, 2135, 3203 идёт сброс данных в таблицу не в insertDatabase(), а в add.
Провожу экспиримент сначала.
Только коментирую insertDatabase(). Те которые уже сбросились так и остались в таблице до 3203, а которые не успели в таблицу не попали.
Расширяю поле в таблице до 20 знаков.
Снова провожу экспиримент, цифры сброса уже другие 743, 1487, 2231, 2975, 3719.
Если взять например класс xRefCreate метод updateDBReferences, то
X++:
                                if (!xRefReferences::find(phantomCallReference.xRefNameRecId, phantomCallReference.xRefPathRecId))
                                {
                                    recordInsertList.add(phantomCallReference);
                                }
Перед тем как закинуть в буфер новую строку идёт проверка есть ли уже такая, и только тогда сбрасывается.
А ведь может выйти такая ситуация.
Сбрасываем десять записей, на восьмой буфер переполнился и произошёл сброс.
В той строке которую я написал находиться 9 строка, в базе её ещё нет. А в буфере она есть так как не было сброса. Добавляем в буфер 9 строку повторно и на insert database они обе идут в таблицу.
Просто у меня стоит локально Ax 3.0 sp1 и мало того что перекрёстные ссылки считаются 8 часов, так они ещё и задваиваются кое-где. На Ax 3.0 sp4 (не локально трёх звенка) задвоений нет, и считается быстро. Хотя классы xRefCreate и xRefUpdate одинаковые.
И думаю возможно причина здесь. Пока не знаю, до конца ещё не докопал.
Но впечатление, что человек писаший обновление перекрёстных ссылок не знал о подобном эффекте (преждевременного сброса буфера).
Но ведь такие места наверное есть и вдругих местах.
Вообщем будь те осторожны с recordInsertList, на верное его из-за этого и убрали из Ax 2009.
aEremenko: DAX 2009, работа с несколькими компаниями
За это сообщение автора поблагодарили: mazzy (2), Wamr (3).
Старый 20.05.2008, 15:04   #2  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,325 / 3548 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Тут нет ничего необычного. Просто метод insertDatabase не делает вставку в БД (как кажется из названия), а сбрасывает буфер (flush). На это надо рассчитывать. С перекрестными ссылками - да, подстава небольшая есть... но опять-таки зная как оно работает..... можно вполне сделать все правильно.
Зато этот класс (RecordInsertList) был очень удобным для массовой вставки записей, особенно если надо было сделать какой-то джобик по историческим данным. Ускорение (у меня) было раз в 6 по сравнению с обычным insert. Да и тут (Есть ли выигрыш от RecordInsertList) тоже говорилось о приросте производительности. Кстати в той же ветке есть и цитата из документации, в которой сказано, что записи вставляются не одноразово, а как ядро аксапты сочтет более нужным...
__________________
Возможно сделать все. Вопрос времени

Последний раз редактировалось sukhanchik; 20.05.2008 в 15:06.
Старый 20.05.2008, 15:17   #3  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Цитата:
Сообщение от sukhanchik Посмотреть сообщение
но опять-таки зная как оно работает..... можно вполне сделать все правильно.
Поэтому и написал чтоб понятнее было.
Старый 20.05.2008, 15:10   #4  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Цитата:
Сообщение от miklenew Посмотреть сообщение
Вообщем будь те осторожны с recordInsertList, на верное его из-за этого и убрали из Ax 2009.
aEremenko: DAX 2009, работа с несколькими компаниями
Его никто не убирал.
Просто crossCompany функциональность не поддерживается этим классом - об этом и пишет Алексей.
Старый 20.05.2008, 15:19   #5  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Его никто не убирал.
Просто crossCompany функциональность не поддерживается этим классом - об этом и пишет Алексей.
Сложно сказать что он имел ввиду под фразой
Цитата:
Правда не поддерживаются базовые структуры типа RecordInsertList и RecordSortedList.
Мне показалось что он писал здесь не про crossCompany.
Старый 20.05.2008, 15:35   #6  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Ну, во-первых, я перед тем, как писать, конечно же открыл АХ 2009 и проверил, что класс этот есть и работает.
А во-вторых, его не могли убрать хотя бы потому, что он используется на слишком большом кол-ве внедрений. А мы ж пытаемся не ломать код существующий
За это сообщение автора поблагодарили: miklenew (1).
Старый 20.05.2008, 15:39   #7  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Ну, во-первых, я перед тем, как писать, конечно же открыл АХ 2009 и проверил, что класс этот есть и работает.
А во-вторых, его не могли убрать хотя бы потому, что он используется на слишком большом кол-ве внедрений. А мы ж пытаемся не ломать код существующий
Значиться заблуждался.
Спасибо что поправили.
Теги
ax2009, ax3.0

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Есть ли выигрыш от RecordInsertList Wamr DAX: Программирование 30 18.09.2013 10:31
RecordInsertList для Excel Arahnid DAX: Программирование 7 02.10.2007 19:51
Получение данных из RecordInsertList. lemchey_white DAX: Программирование 1 10.09.2007 11:05
баг в 2.5. Будьте осторожнее с символом "_" подчеркивание levsha DAX: Программирование 5 07.12.2004 12:26
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

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

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

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