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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 20.05.2008, 12:49   #1  
PODOL is offline
PODOL
Участник
 
44 / 16 (1) ++
Регистрация: 20.07.2006
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  
Stitch_MS is offline
Stitch_MS
Участник
Аватар для Stitch_MS
Соотечественники
 
397 / 478 (16) +++++++
Регистрация: 27.02.2006
Адрес: Дания
В Dynamics AX 2009 этого бага уже не будет. С какой версией работаете?
Старый 20.05.2008, 13:09   #3  
PODOL is offline
PODOL
Участник
 
44 / 16 (1) ++
Регистрация: 20.07.2006
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);
    }
Нужна сорнтировка по количеству...Как известно group by и order by одновременно не пляшут...
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  
Stitch_MS is offline
Stitch_MS
Участник
Аватар для Stitch_MS
Соотечественники
 
397 / 478 (16) +++++++
Регистрация: 27.02.2006
Адрес: Дания
Можно применить вот этот класс.
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  
ShowPoint is offline
ShowPoint
Участник
 
16 / 10 (1) +
Регистрация: 28.07.2005
Адрес: Moscow, Russia
А order by и не помог бы, Axapta не умеет order by по агрегатам.

1. Можно сделать view по ItemId и sum(Qty) и от него уже
X++:
select firstOnly ItemId, SumQty from iJTransView 
    order by SumQty desc;
2. Если нужно только максимальное значение, то в Вашем же цикле проверять
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  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от PODOL Посмотреть сообщение
Нужна сорнтировка по количеству... Вот вычитал про автосортировку в map... поналобилось достать ПОСЛЕДНИЙ элемент... а оказывается mapIterator.end() переводит итератор на ПЕРВЫЙ...
Как известно, Map по умолчанию сортирует элементы в порядке возрастания ключа (в ядре упоминается какой-то параметр ком.строки reversemap, возможно, меняющий такое поведение). Так вот, если требуется получить обратный порядок сортировки, можно, скажем, для числовых ключей просто при помещении очередного значения в Map задавать значение ключа с противоположным знаком, а при извлечении данных из Map снова менять знак, чтобы получить исходное значение. В приведенном примере отрицательные значения InventJournalTrans.Qty просто не надо умножать на -1 перед помещением в Map.
За это сообщение автора поблагодарили: PODOL (1).
Теги
ax2009, ax3.0

 


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

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

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