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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 08.02.2022, 23:53   #1  
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.
Старый 09.02.2022, 11:51   #2  
Masel is offline
Masel
Участник
 
39 / 537 (18) +++++++
Регистрация: 19.09.2007
Цитата:
Сообщение от mazzy Посмотреть сообщение
tmpTable.setTmpData(fromTmpTable);
Это не дублирование, вы просто получите вторую ссылку на тот же экземпляр таблицы.

Цитата:
Сообщение от mazzy Посмотреть сообщение
Подумайте - а что если бы метод merge существовал прямо в классе с идиотским назвнием LedgerPostingOneToManyCollection
Я если честно не понимаю просто эту идею, что это даст.
За это сообщение автора поблагодарили: S.Kuskov (5).
Старый 09.02.2022, 12:11   #3  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Masel Посмотреть сообщение
Это не дублирование, вы просто получите вторую ссылку на тот же экземпляр таблицы.
вы ошибаетесь


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

В общем, я понял.
Спасибо, что предложили решение, которое реально увеличивает производительность.
__________________
полезное на axForum, github, vk, coub.
Старый 09.02.2022, 18:16   #4  
Masel is offline
Masel
Участник
 
39 / 537 (18) +++++++
Регистрация: 19.09.2007
Цитата:
Сообщение от mazzy Посмотреть сообщение
вы ошибаетесь
Да нет, вроде не ошибаюсь. Такой джоб у меня выдает 2 записи и в 2012 и в d365. Два курсора по одной таблице. Вставляете в любой, получаете записи в обоих курсорах.

X++:
    TmpFrmVirtual tmp1, tmp2;
    
    tmp1.clear();
    tmp1.ItemId = 'item1';
    tmp1.insert();
    
    tmp2.setTmpData(tmp1);
    
    tmp2.clear();
    tmp2.ItemId = 'item2';
    tmp2.insert();    
   
    select count(RecId) from tmp1;
    info(strFmt("%1", tmp1.recId));
За это сообщение автора поблагодарили: mazzy (10).
Теги
faq, tax, налоги, оптимизация, производительность

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Вызов метода базового класса Eldar9x DAX: Программирование 15 22.03.2008 19:10
jerry-dynamics: tax codes Blog bot DAX Blogs 0 16.06.2007 11:20
Вызов класса из другого класса Protey DAX: Программирование 9 26.02.2007 11:01
передача курсора в два класса kitty DAX: Программирование 3 09.08.2006 13:21
Запустить метод класса loka DAX: Программирование 2 13.03.2006 15:40

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

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

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