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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 12.10.2004, 18:53   #1  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,941 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
? Что хранит map ? ссылки на Record или сам рекорд в упакованном виде ?
Подскажите как реально работает map
при исполнении примерно такого кода :
MapIterator mi;
InventTrans inventTransCopy;
InventTrans inventTransCopy2;

map mapInventTrans;
mapInventTrans = new map(types::INTEGER,types::RECORD);
...

mapInventTrans.insert(inventTransCopy.RecId,inventTransCopy);
...

mi = new mapIterator(mapInventTrans);
mi.begin();
while (mi.more())
{
inventTrans = mapInventTrans.lookup(mi.key());
/*

Что реально происходит при вызове методов insert и
lookup ? Упаковка переменной типа RECORD в некую бинарную структуру и копирование, либо просто копирование ссылки на экземпляр RECORD ?


Кстати, а если мы перебирали эти рекорд в цикле типа
while select forupdate
то что будет с элементами mapa которые мы заполнили в процессе цикла
после того как цикл завершится ?

*/
...
}
Старый 12.10.2004, 21:27   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
посмотрите сюда
http://www.axforum.info/forums/showt...&threadid=3209

Цитата:
Часто некоторые на форумах повторяют миф:
Миф: Объекты передаются по ссылке, а примитивы по значению.
...
Истина же...:
Истина 1: Всё в Java передается по значению. Объекты, же, вообще никогда не передаются
Истина 2: Значениями переменных могут быть только примитивы или ссылки, но не объекты.
RTFM
Старый 12.10.2004, 21:48   #3  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,941 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
2 Muzzy
Спасибо за ответ.


Хотелось бы узнать еще вот что. Получается что если я перебираю в цикле (while select) записи таблицы и нужные мне кладу в map, то получается что по выходе из цикла все элементы map-a будут ссылаться на одну запись которая была в цикле последней...

А хотелось бы иметь набор отобранных экземпляров записей ...

Т.е. неясно как ведет себя цикл при итерациях. -
1. Создает заново новый экземпляр табличной переменной, а старая освобождается (если, естественно, на неё больше нет ссылок)

2. либо просто грузит новые значения в один и тот же экземпляр.

Подозреваю, что скорее всего второе.

Но в таком случае - есть ли способ гарантированно создать копию, чтобы положить её в map ?
(Это нужно для создания некоего подобия кеша из записей, с возможностью быстрого доступа и обработки)

Я смотрел код в аксапте (3.0 SP 2 ) и, например, в классе
InventCostItemDim
нашел такой пример, но там для каждой строки создается отдельный экземпляр путем нового (!!!) запроса к базе данных :

/*для каждой выбранной строки вызывается этот метод */
protected void loadTrans(InventTrans _inventTrans)
{
InventTrans inventTransCopy;
;
InventTransCopy = inventTrans::findRecId(_inventTrans.RecId,true);

if (inventTransCopy.RecId)
{
mapInventTrans.insert(inventTransCopy.RecId,inventTransCopy);
...

}

но мне кажется это неоптимально - для каждой записи делать отдельный запрос к базе. Гораздо быстрее (что как раз от меня и требуется !) было бы отбирать группу записей и потом обрабатывать, а не дергать их по одной заводя кучу табличных переменных.

Хотя возможно движок аксапты использует кеширование, так что вызов приведенного метода уже не приводит к новому обращению к базе. Но это надо уточнять.
Старый 12.10.2004, 22:56   #4  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Изначально опубликовано Logger
Хотелось бы узнать еще вот что. Получается что если я перебираю в цикле (while select) записи таблицы и нужные мне кладу в map, то получается что по выходе из цикла все элементы map-a будут ссылаться на одну запись которая была в цикле последней...
Почему? Нет, конечно.

элементы будут ссылаться на объекты в памяти.
Этих объектов будет столько, сколько было обработано записей в цикле.

Аксапта, как и java сама управляет памятью.
Не мучайтесь этим вопросом. Или разберитесь досконально.
Читайте в документации по java.

Про хранение записей. Не понимаю, зачем вы используете map, а не RecordSortedList.
Это так задумано или вы про RecordSortedList еще не прочитали?...

Обратите внимание, что есть еще и recordLinkList. Но RecordSortedList ищет быстрее...
Старый 12.10.2004, 23:00   #5  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Изначально опубликовано Logger
но мне кажется это неоптимально - для каждой записи делать отдельный запрос к базе. Гораздо быстрее (что как раз от меня и требуется !) было бы отбирать группу записей и потом обрабатывать, а не дергать их по одной заводя кучу табличных переменных.
Именно. Просто этот код был написан давным-давно.
С тех пор... "работает - не трожь"

Цитата:
Изначально опубликовано Logger
Хотя возможно движок аксапты использует кеширование, так что вызов приведенного метода уже не приводит к новому обращению к базе. Но это надо уточнять.
Для таблицы InventTrans кэширование по-умолчанию выключено.
Старый 13.10.2004, 09:11   #6  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,941 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
2 Muzzy

Цитата:
--------------------------------------------------------------------------------
Изначально опубликовано Logger
Хотелось бы узнать еще вот что. Получается что если я перебираю в цикле (while select) записи таблицы и нужные мне кладу в map, то получается что по выходе из цикла все элементы map-a будут ссылаться на одну запись которая была в цикле последней...

Изначально опубликовано Muzzy
Почему? Нет, конечно.

элементы будут ссылаться на объекты в памяти.
Этих объектов будет столько, сколько было обработано записей в цикле.
---------------------------------------------------------------------------------
Так ведь в том то и дело, что если на каждом шаге цикла не создается отдельного экземпляра записи, то в map мы фактически будем класть ссылку на один и тот же экземпляр класса, только ключи в map-е на эту ссылку будут отличаться.

А про RecordSortedList и recordLinkList я не знал. Буду разбираться.

В любом случае, огромное спасибо за ответы.
Старый 13.10.2004, 09:38   #7  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,941 / 3229 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Интересно.

Проверка показала, что все-таки на каждом шаге создается новый экземпляр, так что все в порядке. в map-е будут ссылки на разные экземпляры.
Старый 13.10.2004, 11:42   #8  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Записи (Types::Record) не являются объектами Axapta в общем смысле. Скорее они похожи на статические структуры.
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 15.10.2004, 10:22   #9  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
Цитата:
Изначально опубликовано Maxim Gorbunov
Записи (Types::Record) не являются объектами Axapta в общем смысле. Скорее они похожи на статические структуры.
Но код:

PHP код:
static void Job7(Args _args)
{
    
Unit Unit;
    
void infoNextUnitUnit u )
    {
        
next u;
        
info">" u.UnitId );
        
u.UnitId "CHANGED";
    }
    ;
    while 
select Unit
    
{
        
info"*" Unit.UnitId );
        
infoNextUnitUnit );
        
info"?" Unit.UnitId );
    }

говорит об обратном.
В обычную ф-ю таблицы передаются по ссылке.
Тут скорее всё таки приколы в методе Map.insert, который как то по особенному обрабатывает таблицы.
Старый 15.10.2004, 10:45   #10  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
Цитата:
Изначально опубликовано Maxim Gorbunov
Записи (Types::Record) не являются объектами Axapta в общем смысле. Скорее они похожи на статические структуры.
Сорри - немного неправильно понял вашу фразу. На самом деле она верна.

В общем ответ на вопрос именно "хранит в упакованном виде".
Несмотря на то что таблицы в аксапте ведут себя как обычные объекты, но в методе Map::insert для типа types::record происходит неявное создание некоего промежуточного хранилища полей таблицы и копирование их значений туда, хранится в map-е именно эта переменная. В методе lookup видимо происходит "обратная расшифровка" таблицы (видимо по TableId) - создаётся новая (!) табличная переменная такого типа, в неё распаковываются значения полей и она возвращается пользователю. Замечу что:

Unit unit1, unit2;
Map map = new Map( types::integer, types::Record );
;
select unit1;
map.insert( unit1.RecId, unit1 );
unit2 = map.lookup( unit1.RecId );
next unit2; // Выдаст ошибку, т.к. unit2 - совершенно новый экземпляр таблицы unit, с неоткрытым еще запросом (select-ом)
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Помещение временной таблицы в Map Lemming DAX: Программирование 20 19.10.2017 14:16
Dynamics AX: Map Object Sorting - a real issue Blog bot DAX Blogs 7 15.10.2008 12:02
MAP vs Class. В чем идейная необходимость в MAP-ах? А что если использовать Class вместо MAP? Hub DAX: Программирование 16 11.08.2008 16:58
casperkamal: Using record templates in code for Dynamics Ax 4.0. Blog bot DAX Blogs 0 10.05.2008 19:14
Types::Record в качестве ключа для класса Map Gad DAX: Программирование 12 11.07.2007 10:54

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

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

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