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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 25.12.2002, 11:22   #1  
Surok is offline
Surok
Участник
 
17 / 10 (1) +
Регистрация: 11.09.2002
Адрес: Moscow
Массовый Insert / инициализация таблицы
Привет !

Есть таблица , в ней 3 поля, ее нужно заполнить (проинициализировать) значениями ключа от 1 до "Х". Остальные поля - знаечния фиксированы. Как это сделать оптимально ?

следующий код в static методе таблицы, выполняющемся на сервере (при Х = 100000)

Gamenumber = 50;

for (i=1; i<= Х ; i++)
{
t.VariantNumber = i;
t.GameNumber = Gamenumber;
t.Possible = True;
t.doInsert();
}

работает 27 секунд. Это много.

Нет - ли какого - нибудь "массового" inserta , что - то типа как в СИ инициализируется область памяти. Чтобы загнать значения в какой - нить буфер, а потом одним оператором из этого буфера вставить все это дело в таблицу ???
Старый 25.12.2002, 14:27   #2  
Garic is offline
Garic
NavAx
Аватар для Garic
NavAx Club
 
393 / 63 (3) ++++
Регистрация: 23.07.2002
Адрес: Москва
Никакого массового insert-a нет, он и не нужен.
Интересно, зачем понадобилось инициализировать все 100 000 полей таблицы?
Неужели нельзя инициализировать запись по мере надобности?
__________________
С уважением, Игорь Ласийчук.
Старый 25.12.2002, 19:45   #3  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Массовый insert есть в версии 3.0, он активно используется для обновления данных:
PHP код:
    RecordInsertList  arrayInsert = new RecordInsertList(tableNum(CustPackingSlipSalesLink));
arrayInsert.add(newCustPackingSlipSalesLink);
arrayInsert.insertDatabase(); 
Старый 26.12.2002, 18:55   #4  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Рискну добавить.

Если подумать, то массовый инсерт противоречит ООП подходу )
С точки зрения ООП, каждая запись является объектом.

Поэтому массовый инсерт может не всегда сработать корректно.
Особенно в навороченных стандартных таблицах.
Старый 26.12.2002, 19:27   #5  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Мне пока такая философская высота не подвластна.
Код бывает правильным или неправильным, arrayInsert или запишет правильные данные, или запишет неправильные. Условие лишь в том, чтобы записи не зависели друг от друга, а на такой анализ хватит любого программиста.
Старый 26.12.2002, 20:10   #6  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Не думаю, что хватит в общем случае.

Если попробовать сделать массовый инсерт в InventTrans, то никакого программитса не хватит. Там столько оговорок и возможных побочных эффектов при МАССОВОЙ вставке.

Хотя согласен с тем, что в большинстве случаев, массовая вставка полезная весчь.
Старый 30.12.2002, 15:11   #7  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
В этом форуме очень важно оставить за собой последнее слово

Думаю как раз, что на анализ InventTrans.insert() программиста хватит. Поняв, что метод подозрительно сложный, он спокойно использует while select. А если программист более хитроумный, то решит задачу в два приема: сначала вставит InventTrans, а затем - массово - обновит InventSum/
Старый 03.01.2003, 00:32   #8  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10


А inventTransPosting?
А резервы?
А связь с основными средствами?
Не думаю, что все так просто

Старый 26.09.2007, 14:09   #9  
Arahnid is offline
Arahnid
Участник
 
880 / 60 (4) ++++
Регистрация: 09.08.2005
Адрес: Moscow
Использую примерно так, ничего не получается. Что сделано не так?

X++:
TableMy t;
RecordInsertList  arrayInsert = new RecordInsertList(tableNum(TableMy ),true,true); 

for (i=1; i<=  ; i++)
{
t.VariantNumber = i;
t.GameNumber = Gamenumber;
arrayInsert.add(t); 
}
arrayInsert.insertDatabase();
recordInsertList.insertDatabase(); - он физически добавляет запись в мою таблицу TableMy ? или в переменую t?

Причина не работы выяснилась метод не может работать с временными таблицами, только не пойму почему?

Последний раз редактировалось Arahnid; 26.09.2007 в 14:40.
Старый 27.09.2007, 11:44   #10  
MironovI is offline
MironovI
Участник
 
724 / 77 (4) ++++
Регистрация: 30.05.2005
Цитата:
Сообщение от EVGL Посмотреть сообщение
В этом форуме очень важно оставить за собой последнее слово

Думаю как раз, что на анализ InventTrans.insert() программиста хватит. Поняв, что метод подозрительно сложный, он спокойно использует while select. А если программист более хитроумный, то решит задачу в два приема: сначала вставит InventTrans, а затем - массово - обновит InventSum/
По рукам бы таким хитроумным А ты подумал что после тебя еще люди дописывать будут и знать не знают что где-то там есть doUpdate и ломают потом голову почему де не отлавливается и ищут по всей системе doUpdate перекрестными?

Помню делаю ревью кода - грю челу - у тебя одна и та же перменная используется в разных контекстах пять раз, неужели дополнительную лень объявить? Ответ меня поразил - "Моя переменная, что хочу то и делаю".

Последний раз редактировалось MironovI; 27.09.2007 в 11:48.
Старый 27.09.2007, 11:55   #11  
Zuzaz is offline
Zuzaz
Участник
 
119 / 18 (1) ++
Регистрация: 22.09.2006
Цитата:
Сообщение от MironovI Посмотреть сообщение
"Моя переменная, что хочу то и делаю".
Жесть! Одна из лучших историй на форуме!
Старый 27.09.2007, 12:04   #12  
MironovI is offline
MironovI
Участник
 
724 / 77 (4) ++++
Регистрация: 30.05.2005
Цитата:
Сообщение от Zuzaz Посмотреть сообщение
Жесть! Одна из лучших историй на форуме!
у нее еще и окончание есть - чел уже не работает
Старый 27.09.2007, 13:37   #13  
Arahnid is offline
Arahnid
Участник
 
880 / 60 (4) ++++
Регистрация: 09.08.2005
Адрес: Moscow
Товарищи, ну давайте без разборок, я же вопрос задала и надеялась оответ услышать на вопрос, а не ответ, как уничтожить врага на работе.
Старый 27.09.2007, 14:09   #14  
MironovI is offline
MironovI
Участник
 
724 / 77 (4) ++++
Регистрация: 30.05.2005
Попробовал. На таблице из трех полей ваш джоб запускать для темповой doInsert и для настоящей arrayInsert.insertDatabase() - результат приблизительно одинаковый 20 и 25 секунд - в пользу настоящей. Смысл в том, что темповые таблицы в принципе не расчитаны на такие объемы (100 000). Если бы рассказали подробнее постановку задачи - было б легче.
Старый 27.09.2007, 14:10   #15  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Цитата:
Сообщение от Arahnid Посмотреть сообщение
Товарищи, ну давайте без разборок, я же вопрос задала и надеялась оответ услышать на вопрос, а не ответ, как уничтожить врага на работе.
Ответ - потому что она временная.
Там ссылка на файл этой таблицы нужно чтобы сохранялась при добавлении записей.

А с использованием этого класса это не происходит. Потому что он на это не рассчитан.
Но он вполне справедливо на это не рассчитан.

Вставка записей во временную таблицу в любом случае идет последовательно, запись за записью, потому что это файл на диске.
Поэтому выигыша от использования пакетной вставки не было бы.
Старый 27.09.2007, 15:39   #16  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,325 / 3548 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Тут я говорил про этот класс (RecordInsertList). Фактом могу подтвердить увеличение скорости минимум в 6 раз по сравнением с doInsert.
Он действительно рассчитан на постоянные таблицы
__________________
Возможно сделать все. Вопрос времени
Старый 27.09.2007, 17:42   #17  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Пробовал вставлять без ttsbegin и ttscommit большое количество строк.
С ними система зависала. Т.к. кэш похоже перегружался. Ведь надо же где то эту транзакцию хранить.
Без них в кэш ничего не идёт. Или очень мало.
И всё сработало.
Правда есть вероятность. Что в каком то месте оборвётся вставка. И выйдет половина вставилась, а половина нет. Но job можно дописать таким макаром, чтоб то что не доставилось довставлялось пока всё не вставиться.
Старый 27.09.2007, 17:46   #18  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Вообще-то достаточно флага обычного, что все удачно вставилось.

И только если флаг установлен, продолжается обработка этой временной таблицы.
А так как она временная, нет нужны беспокоиться о ее очисте перед повторным использованием.
Старый 27.09.2007, 22:34   #19  
MironovI is offline
MironovI
Участник
 
724 / 77 (4) ++++
Регистрация: 30.05.2005
Цитата:
Сообщение от Arahnid Посмотреть сообщение
Товарищи, ну давайте без разборок, я же вопрос задала и надеялась оответ услышать на вопрос, а не ответ, как уничтожить врага на работе.
почему-то когда просишь уточнить постановку задачи все вопросы отпадают
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Пересоздание таблицы при синхронизации Serg16 DAX: Администрирование 1 26.08.2009 13:55
Вставка строк в таблицы Аксапты сторонними средствами Андре DAX: База знаний и проекты 1 07.05.2009 16:49
method insert() when insert table from outside susenyudha DAX in English 1 29.08.2008 18:51
Про Insert, DoInsert и IAxaptaRecord::Insert murad DAX: Программирование 5 23.05.2006 12:26
Получение из поля Map кода поля реальной таблицы, к ней привязанной (Mappings) vey DAX: Функционал 5 16.03.2005 11:16
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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