|
![]() |
#1 |
Участник
|
Цитата:
Сообщение от plumbum
![]() Два мапа нужно вам из-за того, что вы их в разных местах инициализируете, или для какого-то логического разделения элементов.
Ведь если вопрос только в инициализации, то можно выкрутиться и создать один мап. Передавайте общий мап как параметр в ваши методы и возвращайте его, как результат. Тогда сможете добавить нужные элементы в один мап в нескольких местах еще и от дубликатов избавитесь. Ну а если честно, сколько элементов в сумме в двух мапах получается? Может стоит уже их просто перебрать ![]() А по поводу метода с мапом в кач-ве параметра не совсем понял, если честно. Данным методом я создаю своих 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]); } } } ![]() |
|
![]() |
#2 |
Участник
|
|
|
![]() |
#3 |
Участник
|
Цитата:
Объединение ещё как такового нет, но перед объединением, да, обрабатываю, а именно: провожу сверку единиц измерения и проверяю равенство сумм. |
|
![]() |
#4 |
Участник
|
Ок, допустим структура данных в мапах разная. Какую структуру должны иметь данные в объединённом мапе?
Вообще говоря в разных элементах одного и тогоже мапа запросто можно хранить контейнеры разной структуры. Вопрос только в том как их обрабатывать. Как вариант можно на первое место в контейнере записывать определяющий структуру признак. Последний раз редактировалось S.Kuskov; 24.10.2013 в 10:52. |
|
![]() |
#5 |
Участник
|
Цитата:
Сообщение от S.Kuskov
![]() Ок, допустим структура данных в мапах разная. Какую структуру должны иметь данные в объединённом мапе?
Вообще говоря в разных элементах одного и тогоже мапа запросто можно хранить контейнеры разной структуры. Вопрос только в том как их обрабатывать. Как вариант можно на первое место в контейнере записывать определяющий структуру признак. Данные должны иметь похожую структуру. Если ключи одинаковые - нужно до внесения в общий мап просуммировать и внести уже готовое значение, если же нет - внести опять-таки в мап... Вот вопрос в обработке и стал, поэтому и обратился к вам за подсказкой. Вы с уважаемым 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]); |
|
![]() |
#6 |
Участник
|
Цитата:
Зачем вам вообще объединённый мап? может быть вам достаточно по разным мапам собрать объединённое множества ключей? а сами данные оставить в разных мапах? |
|
![]() |
#7 |
Участник
|
Цитата:
Сообщение от S.Kuskov
![]() Похожую, но не одинаковую? "Просуммировать и внести уже готовое" ... эмм это "готовое" должно быть в виде какой структуры? как у первого мапа? как у второго? или вообще в виде новой объединённой структуры?
Зачем вам вообще объединённый мап? может быть вам достаточно по разным мапам собрать объединённое множества ключей? а сами данные оставить в разных мапах? В виде новой объединённой структуры, но с полями из первого мапа и второго. Чтобы сделать по нему один проход. У меня изначально был проход по двум мапам такого вида: X++: while (listEnumerator.moveNext()) { while(invoiceEnumerator.moveNext()) Может и достаточно, только что потом с этими ключами мне делать? Искать соотв.им значения в разных мапах ? |
|
![]() |
#8 |
Участник
|
Я бы не стал заморачиваться...
Цитата:
|
|
![]() |
#9 |
Участник
|
Цитата:
Хорошо, тогда подскажите, кк сделать тогда объединённое моженство ключей, а данные оставить ? По ключу ходить в цикле итератором я так понял, а внутри как данные из мапов выбирать? |
|
![]() |
#10 |
Участник
|
Цитата:
Нет я имел в виду вставку разделителя в значение мапа а не в ключ. Тогда смысловая уникальность ключа будет соблюдена, и в тоже время в элементе будет сохранена информация о его структуре. |
|
![]() |
#11 |
Участник
|
Цитата:
Сообщение от S.Kuskov
![]() Типа того. Не очень оптимально с точки зрения количества необходимых операций поиска. Оптимальнее конечно изначально всё в один мап складывать, меняя структуру контейнера элементов так сказать на лету.
Нет я имел в виду вставку разделителя в значение мапа а не в ключ. Тогда смысловая уникальность ключа будет соблюдена, и в тоже время в элементе будет сохранена информация о его структуре. То есть, ключ будет один для двух мепов, а в значение вствалять разные значения через разделитель? Хм..а если ключ сделать общий, а в значение вставлять контейнер, в котором будут все поля, разделены через разделитель какой-нибудь, тогда мап будет один...и останется придумать, как выдернуть нужное значение из этого мапа. Неплохая идея! Подумаю! |
|
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|