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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 01.11.2007, 09:00   #1  
exodus is offline
exodus
Участник
 
23 / 10 (1) +
Регистрация: 22.10.2007
Оптимизация кода
Подскажите пожалуйста,как мне быть

while select * from TOR_Eo_Table
where tor_eo_table.RassetId == rassetTable.AccountNum
{
while select * from Tor_OrdersObj
where Tor_OrdersObj.EoID == Tor_Eo_Table.EO_Id
{
while select * from prodTable
where prodtable.prodId == Tor_OrdersObj.ProdId
join tor_WorkCode
where tor_WorkCode.Code == prodTable.tor_WorkCode
&& tor_WorkCode.WorkGroup == TOR_WorkGroup::TR

while select PlanSumCustMaterialTZP from ProdSum
where ProdSum.ProdId == Tor_OrdersObj.ProdId
У меня есть главная таблица rassetTable (основные средства),из нее беру нужный параметр и с этим параметром обращаюсь к другой таблице,потом из этой беру и к другой и вот так собираю все данные в кучу.Так то все работает, но у меня
получилось очень много циклов,должно добавиться еще три,как оптимизировать свой код.
Если несложно приведите наглядный пример, я только начинаю разбираться с аксаптой.Надеюсь мне удалось донести свою проблему понятно
Старый 01.11.2007, 09:09   #2  
Михаил Андреев is offline
Михаил Андреев
Участник
Компания АМАНД
Лучший по профессии 2009
 
1,296 / 239 (10) ++++++
Регистрация: 09.11.2001
Адрес: Химки, Московская область
А что в цикле-то делается?
__________________
Михаил Андреев
https://www.amand.ru
Старый 01.11.2007, 09:27   #3  
exodus is offline
exodus
Участник
 
23 / 10 (1) +
Регистрация: 22.10.2007
У нас на производстве внедрен модуль ТОРО (техническое обслуживание и ремонтное обслуживание).В этом модуле есть таблица с единицами оборудованиями,которые используются для ремонта основных средств.Мне нужно выбрав основное средство в модуле ОСНОВНЫЕ СРЕДСТВА и щелкнув на кнопку получить сумму затрат на ремонт на определенный период.Очень плохо что все необходимые данные разбросаны по разным таблицам. Получается мне для каждой табицы надо писать цикл.Или как-то можно поубавить циклы,подскажите?
Старый 01.11.2007, 09:41   #4  
exodus is offline
exodus
Участник
 
23 / 10 (1) +
Регистрация: 22.10.2007
Распишу детальней
В этом цикле
while select * from TOR_Eo_Table
where tor_eo_table.RassetId == rassetTable.AccountNum
я нахожу единицы оборудования,которые имеют связь с основным средством

В этом цикле
while select * from Tor_OrdersObj
where Tor_OrdersObj.EoID == Tor_Eo_Table.EO_Id
я нахожу заказы,в которых присутствуют ранее найденные единицы оборудования

В этом цикле
while select * from prodTable
where prodtable.prodId == Tor_OrdersObj.ProdId
join tor_WorkCode
where tor_WorkCode.Code == prodTable.tor_WorkCode
&& tor_WorkCode.WorkGroup == TOR_WorkGroup::TR
я нахожу вид ремонта всего их четыре(текущий,капитальный,средний и техническое перевооружение)сумма будет складываться по видам ремонтов.

В этом цикле
while select PlanSumCustMaterialTZP from ProdSum
where ProdSum.ProdId == Tor_OrdersObj.ProdId
Я нахожу суммы затрат прикрепленные к заказам

И вот этот приведеный кусок только для оного вида ремонта,таких блоков будет еще три,для каждого вида ремонта.
И всего где - то получится 16 циклов.
При маленьком количестве заказов у меня обработка проходит за две секунду,а если их будет 60тыс. даже считать неохота как это будет долго
Старый 01.11.2007, 10:01   #5  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от exodus Посмотреть сообщение
Распишу детальней
В этом цикле
...
Нет, у вас не это спрашивают.
внутри внешних циклов находится только вызов вложенного while select или есть какие-нибудь вычисления на x++?

если нет вычислений, то стоит подумать над тем, чтобы объединить вложенные запросы в один с join.

Содной стороны это резко уменьшит количество запросов на скл-сервер.
Но с другой стороны, объединенные запросы не позволят выполнить действия на Х++ по завершению вложенного цикла.
__________________
полезное на axForum, github, vk, coub.
Старый 01.11.2007, 10:06   #6  
Михаил Андреев is offline
Михаил Андреев
Участник
Компания АМАНД
Лучший по профессии 2009
 
1,296 / 239 (10) ++++++
Регистрация: 09.11.2001
Адрес: Химки, Московская область
Цитата:
Сообщение от exodus Посмотреть сообщение
Мне нужно выбрав основное средство в модуле ОСНОВНЫЕ СРЕДСТВА и щелкнув на кнопку получить сумму затрат на ремонт на определенный период.Очень плохо что все необходимые данные разбросаны по разным таблицам. Получается мне для каждой табицы надо писать цикл.Или как-то можно поубавить циклы,подскажите?
Не видя связей таблиц, нереально ответить правильно. Если предположить, что никаких вычислений или запросов внутри циклов (внешних) нет, а связи типа 1:N или N:1 и всегда есть, тогда могу предположить, что это можно сделать одним запросом типа
X++:
select sum(  ) from   
join ,
.
Запрос, насколько я понял, будет включать порядка 4 таблиц. Другими словами, начинаем запрос с таблицы затрат, фильтруя её по периоду, и далее накладываем фильтры по связям до конкретного ОС.
Но, повторюсь, не зная точно, каким образом связаны таблицы, однозначно ответить на вопрос невозможно. Если где-то связь необязательна или есть вычисления или запросы внутри циклов, данный метод не подойдёт.
__________________
Михаил Андреев
https://www.amand.ru
Старый 06.11.2007, 07:38   #7  
exodus is offline
exodus
Участник
 
23 / 10 (1) +
Регистрация: 22.10.2007
Я сделал как вы рекомендовали

X++:
 select sum(TOR_QuantityOperation) from prodjournalroute
              //  group by transdate
                  where prodjournalroute.TransDate >= FromDate 
                    && prodjournalroute.TransDate <= ToDat
                     join  tor_Worktable
                       where tor_Worktable.Code == prodTable.tor_WorkCode
                         &&  tor_Worktable.WorkGroup == TOR_WorkGroup::TR
                          join prodtable
                             where prodtable.ProdId == prodjournalroute.ProdId
                          join tor_ordersobj
                             where tor_ordersobj.ProdId == prodtable.ProdId
                          join tor_eo_table
                            where tor_eo_table.EO_Id == tor_ordersobj.EOId
                               && tor_eo_table.RAssetId == rassettable.AccountNum;
но у меня при выполнении кода выдает следующую ошибку
Нажмите на изображение для увеличения
Название: 9.JPG
Просмотров: 330
Размер:	27.5 Кб
ID:	3020
подскажите что надо исправить в коде
Старый 06.11.2007, 10:46   #8  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Попробуйте везде, где написано join что-то (без полей выбора) добавить одну из двух конструкций:

- join TableId from <table>
- join maxOf(RecId) from <table>
Старый 06.11.2007, 16:24   #9  
СоникSV is offline
СоникSV
Участник
 
1 / 10 (1) +
Регистрация: 25.06.2007
Адрес: Питер
Может быть join с tor_Worktable должен стоять после join c prodtable?
Старый 07.11.2007, 11:46   #10  
_scorp_ is offline
_scorp_
Участник
Аватар для _scorp_
MCBMSS
 
488 / 369 (13) ++++++
Регистрация: 25.07.2007
Адрес: Москва
По моему без group by не получиться.
Старый 07.11.2007, 12:20   #11  
exodus is offline
exodus
Участник
 
23 / 10 (1) +
Регистрация: 22.10.2007
спасибо заработало, только подскажите,какова функция:
join maxOf(RecId) from <table>
Старый 07.11.2007, 13:16   #12  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
нужно выбирать какое-то поле, и применять к нему агрегатную функцию, иначе по строковым полям произойдет ошибка при группировке
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Оптимизация класса Tax Lihgt DAX: Программирование 43 27.05.2022 11:05
Оптимизация кода с LedgerTrans Poleax DAX: Программирование 18 07.11.2008 12:32
проблема с настройкой штрихового кода Nic DAX: Функционал 4 27.12.2004 09:04
Оптимизация кода X++ Владимир Максимов DAX: Программирование 8 19.01.2004 15:24
Использование штрихового кода (barcode) в Аксапта Pavlo AKA Panok DAX: Функционал 9 17.10.2003 15:13
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 09:58.