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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 29.10.2007, 19:02   #1  
greench is offline
greench
Участник
Oracle
 
425 / 74 (3) ++++
Регистрация: 12.07.2007
Адрес: Киев
Не создается экземпляр MapIterator
День добрый всем. Есть inqMap = new map(Types::Integer,Types::Container);

есть такая строка: MapIterator it = new MapIterator(inqMap);
После чего it = null, т.е. ничего не проинициализировалось. В мапе есть 2-е записи.
В чем проблема не пойму.

P.S. AX 4.0. SP 2
Старый 29.10.2007, 19:10   #2  
Alex_KD is offline
Alex_KD
Участник
AxAssist
MCBMSS
Соотечественники
 
522 / 362 (14) ++++++
Регистрация: 06.07.2006
Адрес: Melbourne, Down Under
X++:
MapEnumerator me;
;
me = inqMap.getEnumerator();
А так?

И вот еще полезно:
А почему, кстати Enumerator лучше Iterator?
__________________
AxAssist 2012 - Productivity Tool for Dynamics AX 2012/2009/4.0/3.0

Последний раз редактировалось Alex_KD; 29.10.2007 в 19:16.
Старый 29.10.2007, 19:16   #3  
greench is offline
greench
Участник
Oracle
 
425 / 74 (3) ++++
Регистрация: 12.07.2007
Адрес: Киев
[quote=Alex_KD;151900]
X++:
MapEnumerator me;
;
me = inqMap.getEnumerator();
А так?

me = Unknown
Старый 29.10.2007, 19:18   #4  
Alex_KD is offline
Alex_KD
Участник
AxAssist
MCBMSS
Соотечественники
 
522 / 362 (14) ++++++
Регистрация: 06.07.2006
Адрес: Melbourne, Down Under
[quote=greench;151901]
Цитата:
Сообщение от Alex_KD Посмотреть сообщение
X++:
MapEnumerator me;
;
me = inqMap.getEnumerator();
А так?

me = Unknown
А полный код посмотреть можно?
__________________
AxAssist 2012 - Productivity Tool for Dynamics AX 2012/2009/4.0/3.0
Старый 29.10.2007, 19:25   #5  
greench is offline
greench
Участник
Oracle
 
425 / 74 (3) ++++
Регистрация: 12.07.2007
Адрес: Киев
Полный код чего? заполнения мапы ? так это много и надолго. Приводить здесь код 2-х классов какой смысл. А если просто кусок кода где вставляются значения в мап, то я думаю вряд ли это поможет.
Старый 29.10.2007, 19:34   #6  
Alex_KD is offline
Alex_KD
Участник
AxAssist
MCBMSS
Соотечественники
 
522 / 362 (14) ++++++
Регистрация: 06.07.2006
Адрес: Melbourne, Down Under
Код:
X++:
    Map m = new Map(Types::Integer, Types::Container);
    MapEnumerator me;
    container c;
    ;
    m.insert(1, ["First",1,1]);
    m.insert(2, ["Second",2,2]);
    m.insert(3, ["Third",3,3]);
    me =  m.getEnumerator();
    while(me.moveNext())
    {
      c = me.currentValue();
      info(conpeek(c, 1));
    }
Результат:

Код:
Info Message (19:33:51) First
Info Message (19:33:51) Second
Info Message (19:33:51) Third
__________________
AxAssist 2012 - Productivity Tool for Dynamics AX 2012/2009/4.0/3.0
Старый 29.10.2007, 23:21   #7  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
До того, как итератор (или энумератор) не перейдут на первое значение (next или moveNext), значение текущего элемента (именно это показывает метод toString() этих классов) не известно.
Старый 30.10.2007, 10:17   #8  
konopello is offline
konopello
SAP
SAP
 
628 / 76 (4) ++++
Регистрация: 08.11.2005
Адрес: Минск
Цитата:
После чего it = null, т.е. ничего не проинициализировалось. В мапе есть 2-е записи.
В чем проблема не пойму.
у меня такое предчувствие что вы не правильно передаете MAP с клиента на сервер. Поэтому то он и пустой (это так догадки, самая распространенная ошибка).
Старый 30.10.2007, 10:24   #9  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Цитата:
у меня такое предчувствие что вы не правильно передаете MAP с клиента на сервер. Поэтому то он и пустой (это так догадки, самая распространенная ошибка).
Поддерживаю, его надо в контейнер преобразовывать. Там, кажется, даже метод специальный есть - pack().
Старый 30.10.2007, 11:18   #10  
MikeR is offline
MikeR
MCT
Аватар для MikeR
MCBMSS
Лучший по профессии 2015
Лучший по профессии 2014
 
1,628 / 627 (24) +++++++
Регистрация: 28.11.2005
Адрес: просто землянин
Читал о следующем

Цитата:
Вы можете пересчитывать ваши коллекции с помощью либо enumerator либо iterator. Когда классы коллекции были впервые представлены в Dynamics AX, iterator это была единственная опция. Но по причине hard-to-find ошибок, был добавлен enumerators, а iterators сохранился для дальнейшей совместимости. Для выявления этих различий, приведен следующий код для пересчета обоими способами.
X++:
List list = new List(Types::Integer);
ListIterator iterator;
ListEnumerator enumerator;
;
//Populate list.
...

//Traverse using an iterator.
iterator = new ListIterator(list);
while (iterator.more())
{
    print iterator.value();
    iterator.next();
}

//Traverse using an enumerator.
enumerator = list.getEnumerator();
while (enumerator.moveNext())
{
    print enumerator.current();
}
Первое отличие это путь, которым создаются сущности iterator и enumerator. Для iterator, вы вызываете new, а для enumerator, вы уже получаете сущности из класса коллекции вызовом метода getEnumerator. В большинстве случаев, обе реализации работают одинаково хорошо. Однако, когда класс коллекция передается на другой уровень (tier) с уровня на котором он пересчитывается, ситуация совершенно отличная. Например, если пересчет коллекции происходит на клиенте, а затем передается на сервер, iterator терпит крах, так как iterator не поддерживает cross-tier вызовов. Еnumerator не поддерживает cross-tier вызовов так же, но он и не должен, так как он инициируется на том же самом уровне (tier) что и класс коллекция. Пересчет на уровне сервера, используя уровень клиента, enumerator будет достаточно нагружать сеть, но результат будет логически корректным. Так как некоторый код отмечается как Called From, означающий, что он может выполняться на том уровне из которого вызван, вы можете испортить логику при использовании iterators, даже если вы тестируете по одному плану. В большинстве случаев, hard-to-track баги такие, как this surface происходят, когда операция выполняется в пакетной обработке.
Примечание

В предыдущих версиях Dynamics AX, эта проблема была более явной так как разработка и тестирование могло происходить в двух уровневой архитектуре, а эта проблема появляется только в трех уровневой архитектуре.

Второе отличие между iterators и enumerators это путь, по которому происходит сам пересчет. При использовании iterator, вы должны явно использовать вызов more и next; при использовании enumerator, метод moveNext обрабатывает это сам. Большинство разработчиков получали бесконечный цикл, просто потому что забывали дописать move a pointer. Это не существенная проблема, но иногда это раздражает во время разработки.
При постоянном использовании enumerator, вы не столкнетесь ни с одной из этих проблем. Единственная ситуация, в которой следует использовать iterator это удаление элементов из List collection. Следующий код показывает, как это реализовать.
X++:
List list = new List(Types::Integer);
ListIterator iterator;
;
list.addEnd(100);
list.addEnd(200);
list.addEnd(300);

iterator = new ListIterator(list);
while (iterator.more())
{
    if (iterator.value() == 200)
        iterator.delete();
    iterator.next();
}
print list.toString(); //{100, 300}
pause;
За это сообщение автора поблагодарили: Dudnik Anton (1).
Старый 30.10.2007, 14:55   #11  
greench is offline
greench
Участник
Oracle
 
425 / 74 (3) ++++
Регистрация: 12.07.2007
Адрес: Киев
В общем сделал сделал через MapEnumerator все работает. Спасибо за помощь.
Старый 30.10.2007, 15:25   #12  
konopello is offline
konopello
SAP
SAP
 
628 / 76 (4) ++++
Регистрация: 08.11.2005
Адрес: Минск
Цитата:
В общем сделал сделал через MapEnumerator все работает. Спасибо за помощь.
а причина то в чем была.....?
Старый 30.10.2007, 16:50   #13  
greench is offline
greench
Участник
Oracle
 
425 / 74 (3) ++++
Регистрация: 12.07.2007
Адрес: Киев
В чем была причина с MapIterator'ом так и не понял и разбираться если честно некогда, а MapEnumerator поначалу сбил толку тем что смотрел значение до moveNext. Насколько я понял для большинства случаев лучше пользоваться именно MapEnumerator' ом, вот значит им и буду.
Старый 30.10.2007, 17:05   #14  
MikeR is offline
MikeR
MCT
Аватар для MikeR
MCBMSS
Лучший по профессии 2015
Лучший по профессии 2014
 
1,628 / 627 (24) +++++++
Регистрация: 28.11.2005
Адрес: просто землянин
Цитата:
Сообщение от greench Посмотреть сообщение
Насколько я понял для большинства случаев лучше пользоваться именно MapEnumerator' ом, вот значит им и буду.
belugin в свое время писал, что он must die
и поддерживается только для совместимости с предыдущими версиями
Теги
ax4.0

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Не создается экземпляр SysMailer в RunBaseBatch pvito DAX: Программирование 3 21.10.2011 15:30
Производственный заказ из заказа на продажу (не создается) Sadj DAX: Функционал 3 23.01.2009 09:39
mapIterator.end() PODOL DAX: Программирование 5 21.05.2008 00:28
MapIterator не инициализируется V777 DAX: Программирование 13 19.05.2008 11:49
"Серверный" экземпляр класса SysExcelApplication Bug DAX: Программирование 4 13.01.2006 13:32

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

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

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