|
20.05.2008, 12:49 | #1 |
Участник
|
mapIterator.end()
help по методу mapIterator.end() :
Description Moves the iterator past the last element in the map. Syntax public void end() Remarks After executing this function more() will return FALSE. X++: static void PO_MapIterator(Args _args) { MapIterator mapIterator; Map map = new Map(Types::Integer, Types::String); ; map.insert(1, 'one'); map.insert(2, 'two'); map.insert(3, 'three'); mapIterator = new mapIterator(map); mapIterator.end(); if (mapIterator.more()) { info('mapIterator.more() return TRUE'); } } |
|
20.05.2008, 13:00 | #2 |
Участник
|
В Dynamics AX 2009 этого бага уже не будет. С какой версией работаете?
|
|
20.05.2008, 13:09 | #3 |
Участник
|
3.0 SP3
Просто нужно было всё осортировать в запросе... X++: while select sum(Qty), ItemId from iJTrans group by ItemId join inventTable where iJTrans.JournalId == iJTable.JournalId && iJTrans.ItemId == inventTable.ItemId && inventTable.ItemGroupId == inventItemRange.Name { map.insert(iJTrans.Qty * (-1), iJTrans.ItemId); } As opposed to SQL, X++ does not allow group by and order by in the same select statement RecordSortedList разве что...но там в пределах одной таблицы...я пока не уверен, что получится... А объявлять ещё одну темповую таблицу и ещё раз шуровать в цикле...как-то криво...Вот вычитал про автосортировку в map...поналобилось достать ПОСЛЕДНИЙ элемент...а оказывается mapIterator.end() переводит итератор на ПЕРВЫЙ... |
|
20.05.2008, 16:09 | #4 |
Участник
|
Можно применить вот этот класс.
X++: quickSort = QuickSort::construct(Types::String, Types::Real); while select sum(Qty), ItemId from iJTrans group by ItemId join inventTable where iJTrans.JournalId == iJTable.JournalId && iJTrans.ItemId == inventTable.ItemId && inventTable.ItemGroupId == inventItemRange.Name { quickSort.add(iJTrans.ItemId, -iJTrans.Qty); } itemEnumerator = quickSort.getEnumerator(); while (itemEnumerator.moveNext()) { [itemId, qty] = itemEnumerator.current(); print itemId, ' ', qty; } pause; Последний раз редактировалось Stitch_MS; 20.05.2008 в 16:48. Причина: Добавлен код |
|
20.05.2008, 18:02 | #5 |
Участник
|
А order by и не помог бы, Axapta не умеет order by по агрегатам.
1. Можно сделать view по ItemId и sum(Qty) и от него уже X++: select firstOnly ItemId, SumQty from iJTransView order by SumQty desc; X++: Qty maxQty; ItemId itemId; ... while select sum(Qty), ItemId from iJTrans group by ItemId ... { ... if( maxQty < iJTrans.Qty ) [itemId, maxQty] = [iJTrans.ItemId, iJTrans.Qty]; }
__________________
SY, AVA |
|
21.05.2008, 00:28 | #6 |
Участник
|
Как известно, Map по умолчанию сортирует элементы в порядке возрастания ключа (в ядре упоминается какой-то параметр ком.строки reversemap, возможно, меняющий такое поведение). Так вот, если требуется получить обратный порядок сортировки, можно, скажем, для числовых ключей просто при помещении очередного значения в Map задавать значение ключа с противоположным знаком, а при извлечении данных из Map снова менять знак, чтобы получить исходное значение. В приведенном примере отрицательные значения InventJournalTrans.Qty просто не надо умножать на -1 перед помещением в Map.
|
|
|
За это сообщение автора поблагодарили: PODOL (1). |