|
![]() |
#1 |
Участник
|
Мы в итоге (спасибо wolfstein) пошли по еще более простому пути - заменили вызов mappingExists_RU на сравнение tableid с перечнем конкретных таблиц. Утечка памяти ликвидирована полностью, скорость разноски тоже немного увеличилась (хотя и не так сильно, как я ожидал).
|
|
|
За это сообщение автора поблагодарили: someOne (3). |
![]() |
#2 |
Боец
|
Мы сделали так. Скорость разноски увеличилась на порядок.
1. Обявляем в классе \Classes\Application.classDeclaration переменную X++: Map mappingsInfo_RU; // Оптимизация разноски накладной, EVO 26.04.2011 X++: // Оптимизация разноски накладной, EVO 26.04.2011 Map mappingsInfo_RU() { ; if (!mappingsInfo_RU) { mappingsInfo_RU = new Map(Types::Container, Types::Class); // [TableId, MapId], MappingsInfo_RU object } return mappingsInfo_RU; } X++: static public Map createMapWithFieldId(tableId _tableId, tableId _mapID) { MappingsInfo_RU mappingsInfo; ; // Оптимизация разноски накладной, EVO 26.04.2011 --> //orig mappingsInfo = new MappingsInfo_RU(_tableId, _mapID); //orig return mappingsInfo.find(); if (!appl.mappingsInfo_RU().exists([_tableId, _mapID])) { mappingsInfo = new MappingsInfo_RU(_tableId, _mapID); appl.mappingsInfo_RU().insert([_tableId, _mapID], mappingsInfo.find()); } return appl.mappingsInfo_RU().lookup([_tableId, _mapID]); // Оптимизация разноски накладной, EVO 26.04.2011 <-- } Последний раз редактировалось DSPIC; 09.06.2011 в 23:23. |
|
|
За это сообщение автора поблагодарили: UNRW (1), wolfstein (1). |
![]() |
#3 |
Administrator
|
Идиотский вопрос: А зачем новый метод в классе Application? Почему не использовать appl.globalcache() ? Там такой же Map.
__________________
Возможно сделать все. Вопрос времени |
|
|
За это сообщение автора поблагодарили: DSPIC (5). |
![]() |
#4 |
Axapta Retail User
|
С использованием appl.globalcache() - модифицируем метод \Classes\MappingsInfo_RU\createMapWithFieldId следующим образом:
X++: static public Map createMapWithFieldId(tableId _tableId, tableId _mapID) { MappingsInfo_RU mappingsInfo; ; //mappingsInfo = new MappingsInfo_RU(_tableId, _mapID); //return mappingsInfo.find(); if (!appl.globalCache().isSet(classstr(MappingsInfo_RU), [_tableId, _mapID])) { mappingsInfo = new MappingsInfo_RU(_tableId, _mapID); appl.globalCache().set(classstr(MappingsInfo_RU), [_tableId, _mapID], mappingsInfo.find()); } return appl.globalCache().get(classstr(MappingsInfo_RU), [_tableId, _mapID]); } |
|
|
За это сообщение автора поблагодарили: DSPIC (5). |
![]() |
#5 |
Участник
|
Цитата:
Собрал статистику вариантов входных параметров, которые передаются ей на вход. Для нашего приложения (Ax2009 RU6) их оказалось всего лишь 13 комбинаций. Но самое интересное в том что из всех этих вариантов она никогда не возвращает "false". Результат всегда один и тот же: "true" ! Возникает вопрос - зачем эта функция вообще нужна ? к примеру в методе класса SalesPurchReport_Invoice4Paym_RU она используется так X++: if (mappingExists_RU(tablenum(CustVendInvoiceJour), invoiceJour.TableId, fieldnum(CustVendInvoiceJour, rContractCode))) так как invoiceJour в этом методе всегда VALUE: map = CustInvoice4PaymJour_RU и никак иначе. Или я не прав ? Короче, заменил эту функцию на X++: return true; |
|
Теги |
bug, map, treenode, баг, локализация, накладная, налоги, ошибка, счет-фактура |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|