Показать сообщение отдельно
Старый 08.02.2022, 23:53   #39  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Masel Посмотреть сообщение
На R2 в енуме 4 значения. У вас их больше либо потому, что R3, либо потому, что добавлено на USR слое.
R3

Цитата:
Сообщение от Masel Посмотреть сообщение
Вы в принципе не совсем понимаете в чем затыки по производительности в этом месте


Цитата:
Сообщение от Masel Посмотреть сообщение
У нас есть большое количество кусочков проводок ГК по налогам, образованные каждой строкой заказа на продажу.
угу. "кусочки" в английской аксапте называются movements.
по-русски, их можно называть "движения".

Цитата:
Сообщение от Masel Посмотреть сообщение
То есть она создает абсолютно новую структуру данных и переваливает потом все элементы в цикле по одному. В пером параметре _first куча элементов, во втором немного.
Угу.

Цитата:
Сообщение от Masel Посмотреть сообщение
Здесь идеально бы работало просто

X++:
this.addCollections(_first, _second);
return _first;
Но тогда вы измените taxTransactionRelationshipCollection на которую ссылаются из других мест.
Угу-угу.

Цитата:
Сообщение от Masel Посмотреть сообщение
В целом по коду кажется что после суммирования старый экземпляр LedgerBondMergeablesGeneralJour_RU уже использоваться не будет, но я так делать не решился.
угу-угу-угу.
авторы россикского класса вот тоже побоялись.

Цитата:
Сообщение от Masel Посмотреть сообщение
Далее встает вопрос, как переделать так, чтобы оставить такой подход - два элемента скопировать в первый, но сделать это быстро.

Нужно что-то типа _first.Clone(). Но такого метода ни у Map, ни у Set нету. pack/unpack не решают задачу.
tmpTable.setTmpData(fromTmpTable);



по поводу pack/unpack создал отдельную тему
List/Set/Map/Array: deep clone через pack/create в классических Аксаптах


Цитата:
Сообщение от Masel Посмотреть сообщение
В качестве решения предлагается изменить структуру хранения так, чтобы дублирование выполнялось командой container1 = container2, это работает быстро. А для того, чтобы изменить интерфейс работы с классом модифицировать taxTransactionRelationshipCollection метод, чтобы он выдавал данные в привичном виде, собирая из контейнеров результат.
да, это я понял.
и огромное вам спаибо за предложенное решение.

но решить можно еще лучше.

прежде всего, потому что у вас нет организационных ограничений. В Майкрософте каждый объект АОТ приписан к определенной команде. И разработчик другой команды не имеет права менять чужой объект без согласования. Поэтому разработчики Московской команды часто вынуждены делать странные решения сбоку, вместо того, чтобы просто расширить функционал другого объекта АОТ.

У вас таких ограничений нет - вы можете менять любой класс, любую таблицу, любой объект АОТ.
Очень многие странности в Аксапте можно решить просто перенеся функционал в другой класс.
Вот такая вот организация труда у них там в Майкрософте.

Подумайте - а что если бы метод merge существовал прямо в классе с идиотским назвнием LedgerPostingOneToManyCollection?

Цитата:
Сообщение от Masel Посмотреть сообщение
По поводу идеи с таблицей. Будет тормозить еще больше я думаю, хотя не пробовал. В CIL точно больше.
Подумайте
Подумайте не только об этом месте.

Ведь по сути, данное место просто окрашивает движения разными enum-признаками. Рано или поздно эти признаки надо будет как-то связать с исходными движениями.

Поскольку сейчас признаки хранятся в коллекции, то надо будет снова делать цикл по одному и искать исходные движения по одному.
А можно было бы сделать select-join со временной таблицей

Похоже, что беда в том, что данный код класса с идиотским названием делал человек, который не знает ни аксапту, ни СУБД. Причем, этот код прошел ревью. Т.е. либо это был team lead, который может впендюрить код без ревью, либо вся команда была уровня "не знаю ни аксапту, ни СУБД". И я даже не знаю какой вариант хуже...

Цитата:
Сообщение от Masel Посмотреть сообщение
Вместо 4 контейнеров можно было сделать один, который бы хранил и RecId и enum.
а можно map как в исходном классе с идиотским названием LedgerPostingOneToManyCollection

Цитата:
Сообщение от Masel Посмотреть сообщение
Можно еще как-то по другому делать, например я думал использовать структуры .Net.
это только для CIL.
между p-code и .net слишком дорогой маршаллинг.

Цитата:
Сообщение от Masel Посмотреть сообщение
Или, возможно если оставить эти пробеги в циклах по Map, но просто убрать Set, то этого будет достаточно (заменить Map recId -> Set, на более простую структуру данных).
угу. таблицу, например

Цитата:
Сообщение от Masel Посмотреть сообщение
Но меня просто устраивает этот вариант, я его замерил, если знаете как лучше, то сделайте, только проверьте результат по времени работы.
Если устраивает, то нет вопросов, конечно.

Огромное спасибо за предложенное решение.
__________________
полезное на axForum, github, vk, coub.

Последний раз редактировалось mazzy; 09.02.2022 в 00:10.