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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 24.10.2013, 10:32   #1  
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   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,443 / 1781 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от user_ax Посмотреть сообщение
Разделяю скорее всего.
А для чего вы их разделяете? Вы их перед объединением ещё как-то по разному обрабатываете?
Старый 24.10.2013, 10:41   #3  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
А для чего вы их разделяете? Вы их перед объединением ещё как-то по разному обрабатываете?
Так данные-то разные, для того и разделяю.
Объединение ещё как такового нет, но перед объединением, да, обрабатываю, а именно: провожу сверку единиц измерения и проверяю равенство сумм.
Старый 24.10.2013, 10:49   #4  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,443 / 1781 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от user_ax Посмотреть сообщение
Так данные-то разные, для того и разделяю.
Ок, допустим структура данных в мапах разная. Какую структуру должны иметь данные в объединённом мапе?

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

Последний раз редактировалось S.Kuskov; 24.10.2013 в 10:52.
Старый 24.10.2013, 11:10   #5  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Ок, допустим структура данных в мапах разная. Какую структуру должны иметь данные в объединённом мапе?

Вообще говоря в разных элементах одного и тогоже мапа запросто можно хранить контейнеры разной структуры. Вопрос только в том как их обрабатывать. Как вариант можно на первое место в контейнере записывать определяющий структуру признак.
Я вот сижу и думаю, как записывать в мап 2 контейнера, как вы советуете...И как их обрабатывать после этого.
Данные должны иметь похожую структуру. Если ключи одинаковые - нужно до внесения в общий мап просуммировать и внести уже готовое значение, если же нет - внести опять-таки в мап...

Вот вопрос в обработке и стал, поэтому и обратился к вам за подсказкой.

Вы с уважаемым plumbum посоветовали разделять по ключу. То есть, я могу заносить данные в один мап, но с разным ключом или как ??
Что-то вроде такого??
X++:
key1 = "#List"+list.itemid+list.intsp;
key2 = "#Invoice"+list.itemid+list.intsp;
if (map1.lookup(key1))
   map1.insert(key1, [someFields]);
else
   map1.insert(key2,[someOtherFields]);
Старый 24.10.2013, 11:35   #6  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,443 / 1781 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от user_ax Посмотреть сообщение
Данные должны иметь похожую структуру. Если ключи одинаковые - нужно до внесения в общий мап просуммировать и внести уже готовое значение, если же нет - внести опять-таки в мап...
Похожую, но не одинаковую? "Просуммировать и внести уже готовое" ... эмм это "готовое" должно быть в виде какой структуры? как у первого мапа? как у второго? или вообще в виде новой объединённой структуры?

Зачем вам вообще объединённый мап? может быть вам достаточно по разным мапам собрать объединённое множества ключей? а сами данные оставить в разных мапах?
Старый 24.10.2013, 11:40   #7  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Похожую, но не одинаковую? "Просуммировать и внести уже готовое" ... эмм это "готовое" должно быть в виде какой структуры? как у первого мапа? как у второго? или вообще в виде новой объединённой структуры?

Зачем вам вообще объединённый мап? может быть вам достаточно по разным мапам собрать объединённое множества ключей? а сами данные оставить в разных мапах?
Нет, не одинаковую, вы правы.
В виде новой объединённой структуры, но с полями из первого мапа и второго.


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

X++:
 while (listEnumerator.moveNext())
    {
        while(invoiceEnumerator.moveNext())
Но этот проход был неккоректен, так как вначале цикл шёл по всему внутреннему мапу и по первому элементу внешнего, а мне нужно чтобы одновременно шёл цикл...
Может и достаточно, только что потом с этими ключами мне делать? Искать соотв.им значения в разных мапах ?
Старый 24.10.2013, 14:46   #8  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,443 / 1781 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Я бы не стал заморачиваться...
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Зачем вам вообще объединённый мап? может быть вам достаточно по разным мапам собрать объединённое множества ключей? а сами данные оставить в разных мапах?
Сделайте один цикл по общему множеству ключей. Внутри цикла выбирайте данные из двух мапов и сравнивайте, обрабатывайте, выводите... что вам там с ними нужно делать...

Цитата:
Сообщение от Player1 Посмотреть сообщение
У map-ов есть есть keyset() и valueset(), а они умеют так:
- set union (set1, set2) - возвращает объединение двух указанных множеств, то есть множество содержит значения из обоих множеств.
Старый 24.10.2013, 14:47   #9  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение

Зачем вам вообще объединённый мап? может быть вам достаточно по разным мапам собрать объединённое множества ключей? а сами данные оставить в разных мапах?

Хорошо, тогда подскажите, кк сделать тогда объединённое моженство ключей, а данные оставить ?
По ключу ходить в цикле итератором я так понял, а внутри как данные из мапов выбирать?
Старый 24.10.2013, 12:04   #10  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,443 / 1781 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от user_ax Посмотреть сообщение
Может и достаточно, только что потом с этими ключами мне делать? Искать соотв.им значения в разных мапах ?
Типа того. Не очень оптимально с точки зрения количества необходимых операций поиска. Оптимальнее конечно изначально всё в один мап складывать, меняя структуру контейнера элементов так сказать на лету.
Цитата:
Сообщение от user_ax Посмотреть сообщение
Вы с уважаемым plumbum посоветовали разделять по ключу. То есть, я могу заносить данные в один мап, но с разным ключом или как ??
Нет я имел в виду вставку разделителя в значение мапа а не в ключ. Тогда смысловая уникальность ключа будет соблюдена, и в тоже время в элементе будет сохранена информация о его структуре.
Старый 24.10.2013, 12:18   #11  
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, время: 06:06.