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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 20.04.2006, 14:31   #1  
Aslan is offline
Aslan
Участник
 
98 / 10 (1) +
Регистрация: 23.08.2005
Адрес: Астана
map+map
Каким образом можно сложить значения 2-ух карт...если известно что их ключи идентичны....?
Старый 20.04.2006, 14:35   #2  
Gad is offline
Gad
Участник
 
136 / 18 (1) ++
Регистрация: 21.05.2003
Адрес: Москва
сложить - это как? При совпадении ключа value + value? а value какого типа?
Старый 20.04.2006, 14:43   #3  
Aslan is offline
Aslan
Участник
 
98 / 10 (1) +
Регистрация: 23.08.2005
Адрес: Астана
key - str
value - integer
Старый 20.04.2006, 14:45   #4  
Aslan is offline
Aslan
Участник
 
98 / 10 (1) +
Регистрация: 23.08.2005
Адрес: Астана
то есть получить карту с такими же ключами и суммой value?
Старый 20.04.2006, 14:49   #5  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
А как насчет не Map, а класса KeySum?
Старый 20.04.2006, 14:54   #6  
Aslan is offline
Aslan
Участник
 
98 / 10 (1) +
Регистрация: 23.08.2005
Адрес: Астана
значит...не стоит свечь?
Старый 20.04.2006, 14:58   #7  
Roman777 is offline
Roman777
NavAx
Аватар для Roman777
NavAx Club
 
320 / 64 (3) ++++
Регистрация: 10.02.2005
Адрес: г. Москва
Вот так должно работать:

PHP код:
static void Job11(Args _args)
{
    
map         mapSource1  = new Map(Types::StringTypes::Integer);
    
map         mapSource2  = new Map(Types::StringTypes::Integer);
    
map         mapDest     = new Map(Types::StringTypes::Integer);
    
MapIterator mi;
    ;

    
// .. некая инициализация  mapSource1, mapSource2 -->
    // ..
    // .. некая инициализация  mapSource1, mapSource2 <--


    
mi = new mapIterator(mapSource1);
    
mi.begin();
    while (
mi.more())
    {
        if (
mapSource2.exists(mi.key()))
        {
            
mapDest.insert(mi.key(), mi.value() + mapSource2.lookup(mi.key()));
        }
        
mi.next();
    }

За это сообщение автора поблагодарили: Aslan (1).
Старый 20.04.2006, 14:58   #8  
Gad is offline
Gad
Участник
 
136 / 18 (1) ++
Регистрация: 21.05.2003
Адрес: Москва
Боюсь, что кроме перебора mapa никак.
Старый 20.04.2006, 15:19   #9  
Aslan is offline
Aslan
Участник
 
98 / 10 (1) +
Регистрация: 23.08.2005
Адрес: Астана
спасибо всем хоть так можно
Старый 23.10.2013, 16:53   #10  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Заранее прошу прощения за поднятие темы.
Нужен почти тот же результат, только вместо сложений значений map-ов, нужно добавить элементы вторго мепа к элементам первого.
То есть, например:
Есть map1 из 7 элементов;
Есть map2 из 5 элементов;

Хочу получить map3, который будет состоять из 12 элементов.
Это возможно ?
Заранее спасибо за ответы!!
Старый 23.10.2013, 17:46   #11  
plumbum is offline
plumbum
Участник
Соотечественники
 
182 / 86 (3) ++++
Регистрация: 07.12.2007
Адрес: Vienna, AT
А что делать, с теми элементами, где ключи пересекаются?

Посмотрите еще здесь:
Классы коллекции
__________________
http://www.axdevposts.blogspot.com
Пришел, уведел.... отойди, дай другому увидеть!
Старый 23.10.2013, 17:57   #12  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Цитата:
Сообщение от plumbum Посмотреть сообщение
А что делать, с теми элементами, где ключи пересекаются?

Посмотрите еще здесь:
Классы коллекции
А ключи не могут пересекаться ибо в ключе есть tableId, он может измениться только при изменении базы данных ведь. Над этой ситуацией не думал... Весь день сижу уже мудрю..
Можно ещё запаковать оба мепа в контейнер и тогда надо подумать, как сложить 2 контейнера.

Ссылку посмотрю сейчас, спасибо!
Старый 23.10.2013, 18:28   #13  
db is offline
db
Роман Долгополов (RDOL)
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
 
393 / 692 (24) +++++++
Регистрация: 01.04.2004
Адрес: Москва
Нечего тут голову ломать
1. Если ключи не пересекаются - так и сохраняйте сразу в одном. Например, передавайте ссылку на мап через параметр в метод, добавляющий в них элементы вместо складывания результирующих мапов. Вот час назад писал как раз такое
X++:
private Map calcJournalLines(mInventRejectJournalTable _journalTable,
                             InventTable               _inventTable,
                             mProgressBarNoTotals      _bar)
{
    Map     journalLines = new Map(Types::String, Types::Container);
    ;
    this.calcInventTrans(_journalTable, _inventTable, _bar, journalLines);
    this.calcInventSettlements(_journalTable, _inventTable, _bar, journalLines);

    return journalLines;
}
Или в двух - один как сейчас, второй общий - там где вставляем в частный мап дублируем вставку еще и в общий.

2. Очевидный и правильный путь - обойти один мап и вставить во второй
3. Трюк с перепаковкой и сложение контейнеров то-же возможен, но это именно трюк. Сложного, как мне помнится, там ничего нет - кроме самих данных там будет еще заголовок из, боюсь соврать, трех элементов. На форуме была тема со структурой упакованных мапов, сетов и т.д.
4. А может вам и не мап нужен?

У всех способов очевидные достоинства и недостатки, но если вы по любым причинам склоняетесь к п.3, то скорее всего с алгоритмом что то не то и стоит об этом серьезно подумать

Последний раз редактировалось db; 23.10.2013 в 18:39. Причина: Добавил пример
Старый 23.10.2013, 18:39   #14  
Player1 is offline
Player1
Участник
Самостоятельные клиенты AX
 
305 / 137 (5) +++++
Регистрация: 21.04.2008
У map-ов есть есть keyset() и valueset(), а они умеют так:
- set intersection (set1, set2) - возвращает пересечение двух указанных множеств, то есть множество, содержащее элементы, найденные в обоих множествах.
- set union (set1, set2) - возвращает объединение двух указанных множеств, то есть множество содержит значения из обоих множеств.
- set difference (set1, set2) - возвращает множество, содержащее значения множества set1, не найденные в множестве set2.
© Шашков Р., Еременко А.
Старый 23.10.2013, 18:41   #15  
db is offline
db
Роман Долгополов (RDOL)
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
 
393 / 692 (24) +++++++
Регистрация: 01.04.2004
Адрес: Москва
Цитата:
Сообщение от Player1 Посмотреть сообщение
У map-ов есть есть keyset() и valueset(), .
Только если надо сложить ключи и значения отдельно. Это не поможет получить общий мап
Старый 24.10.2013, 09:27   #16  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Цитата:
Сообщение от db Посмотреть сообщение
4. А может вам и не мап нужен?

У всех способов очевидные достоинства и недостатки, но если вы по любым причинам склоняетесь к п.3, то скорее всего с алгоритмом что то не то и стоит об этом серьезно подумать
Может и не нужен. Сейчас подумаю, как алгоритм поменять. Использовал мапы так как нужен уникальный идентификатор, вернее связка 2-х полей для идентификации данных в результирующем наборе данных. А если есть такой же ключ - производить сумму количеств из полей...другого, более изящного решения не придумал.

Последний раз редактировалось user_ax; 24.10.2013 в 09:47.
Старый 24.10.2013, 10:26   #17  
plumbum is offline
plumbum
Участник
Соотечественники
 
182 / 86 (3) ++++
Регистрация: 07.12.2007
Адрес: Vienna, AT
Два мапа нужно вам из-за того, что вы их в разных местах инициализируете, или для какого-то логического разделения элементов.
Ведь если вопрос только в инициализации, то можно выкрутиться и создать один мап. Передавайте общий мап как параметр в ваши методы и возвращайте его, как результат. Тогда сможете добавить нужные элементы в один мап в нескольких местах еще и от дубликатов избавитесь.
Ну а если честно, сколько элементов в сумме в двух мапах получается? Может стоит уже их просто перебрать
__________________
http://www.axdevposts.blogspot.com
Пришел, уведел.... отойди, дай другому увидеть!
Старый 24.10.2013, 10:32   #18  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Цитата:
Сообщение от plumbum Посмотреть сообщение
Два мапа нужно вам из-за того, что вы их в разных местах инициализируете, или для какого-то логического разделения элементов.
Ведь если вопрос только в инициализации, то можно выкрутиться и создать один мап. Передавайте общий мап как параметр в ваши методы и возвращайте его, как результат. Тогда сможете добавить нужные элементы в один мап в нескольких местах еще и от дубликатов избавитесь.
Ну а если честно, сколько элементов в сумме в двух мапах получается? Может стоит уже их просто перебрать
Разделяю скорее всего. У меня есть результирующий набор данных из Query(4 таблицы). 2 таблицы я пихаю в 1 мап по уникальному ключу(номенклатура+номер спецификации), вторые 2 таблицы я пихаю в другой мап по этому же ключу. Если ключ в мапе есть - я делаю суммирование кол-ва, иначе произвожу вставку в меп.
А по поводу метода с мапом в кач-ве параметра не совсем понял, если честно.

Данным методом я создаю своих 2 мапа

X++:
void FindSpecForClose()
{
    //view variable ->
    JourListTrans       jour,list;
    InvoiceInvent       invoice,invent;
    //<-
    str                     listKey,
                            invoiceKey;
    container               listCon,
                            invoiceCon;
    ;
    ListMap = new Map(Types::String, Types::Container);
    InvoiceMap = new Map(Types::String, Types::Container);

    //->add range in query by date
    if(bydate)
        queryRun.query().dataSourceNo(1).addRange(fieldnum(JourListTrans,SpDate)).value(strFmt('(SpDate <= %1)', date2strXpp(bydate)));
    
    //<-
    //info(queryRun.query().dataSourceNo(1).toString());
    
    while(queryRun.next())
    {
        jour = queryRun.get(tablenum(JourListTrans));
        list = queryRun.get(tablenum(JourListTrans));
        invoice = queryRun.get(tablenum(InvoiceInvent));
        invent = queryRun.get(tablenum(InvoiceInvent));


        listKey = list.InternalSp + "#" + list.ItemId+"#"+tablenum(VendSpListTrans);

        invoiceKey = invoice.InternalSp + "#" + invoice.ItemId+"#"+tablenum(VendInvoiceTrans);

        //check in vendSpListTrans
        if(ListMap.exists(listKey))
        {
            listCon = ListMap.lookup(listKey);
            listCon = conpoke(listCon,7,conpeek(listCon,7)+list.SumOfSpQty);
            listMap.insert(listKey,listCon);
        }
        else
        {
            listMap.insert(listKey,[jour.IDSp, jour.SpDate, jour.RContractAccount,list.InternalSp, list.ItemId, list.SpUnit, list.SumOfSpQty]);
        }
        //check in VendInvoiceTrans
        if(InvoiceMap.exists(invoiceKey))
        {
            invoiceCon = invoiceMap.lookup(invoiceKey);
            invoiceCon = conpoke(invoiceCon,3,conpeek(invoiceCon,3)+invoice.SumOfQty);
            InvoiceMap.insert(invoiceKey,invoiceCon);

        }
        else
        {
            invoiceMap.insert(invoiceKey,[invoice.ItemId, invoice.PurchUnit, invoice.SumOfQty, invoice.InternalSp, invent.UnitId]);
        }

    }
}
Если есть какой-либо другой путь решения - я с удовольствием узнаю о нём. Сейчас пока что пришла идея лишь заменить мепы на общий контейнер
Старый 24.10.2013, 10:39   #19  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,427 / 1771 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от user_ax Посмотреть сообщение
Разделяю скорее всего.
А для чего вы их разделяете? Вы их перед объединением ещё как-то по разному обрабатываете?
Старый 24.10.2013, 10:41   #20  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
А для чего вы их разделяете? Вы их перед объединением ещё как-то по разному обрабатываете?
Так данные-то разные, для того и разделяю.
Объединение ещё как такового нет, но перед объединением, да, обрабатываю, а именно: провожу сверку единиц измерения и проверяю равенство сумм.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Помещение временной таблицы в 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
Открытие контейнера из Map tolstjak DAX: Программирование 12 12.11.2006 18:01
Пропадение связи в Map 6apcyk DAX: Программирование 1 08.06.2006 08:05
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 02:32.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.