|
![]() |
#1 |
Участник
|
Оптимизация кода
Подскажите пожалуйста,как мне быть
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 (основные средства),из нее беру нужный параметр и с этим параметром обращаюсь к другой таблице,потом из этой беру и к другой и вот так собираю все данные в кучу.Так то все работает, но у меня получилось очень много циклов,должно добавиться еще три,как оптимизировать свой код. Если несложно приведите наглядный пример, я только начинаю разбираться с аксаптой.Надеюсь мне удалось донести свою проблему понятно |
|
![]() |
#2 |
Участник
|
А что в цикле-то делается?
|
|
![]() |
#3 |
Участник
|
У нас на производстве внедрен модуль ТОРО (техническое обслуживание и ремонтное обслуживание).В этом модуле есть таблица с единицами оборудованиями,которые используются для ремонта основных средств.Мне нужно выбрав основное средство в модуле ОСНОВНЫЕ СРЕДСТВА и щелкнув на кнопку получить сумму затрат на ремонт на определенный период.Очень плохо что все необходимые данные разбросаны по разным таблицам. Получается мне для каждой табицы надо писать цикл.Или как-то можно поубавить циклы,подскажите?
|
|
![]() |
#4 |
Участник
|
Цитата:
Сообщение от exodus
![]() Мне нужно выбрав основное средство в модуле ОСНОВНЫЕ СРЕДСТВА и щелкнув на кнопку получить сумму затрат на ремонт на определенный период.Очень плохо что все необходимые данные разбросаны по разным таблицам. Получается мне для каждой табицы надо писать цикл.Или как-то можно поубавить циклы,подскажите?
X++: select sum( ) from join , Запрос, насколько я понял, будет включать порядка 4 таблиц. Другими словами, начинаем запрос с таблицы затрат, фильтруя её по периоду, и далее накладываем фильтры по связям до конкретного ОС. Но, повторюсь, не зная точно, каким образом связаны таблицы, однозначно ответить на вопрос невозможно. Если где-то связь необязательна или есть вычисления или запросы внутри циклов, данный метод не подойдёт. |
|
![]() |
#5 |
Участник
|
Я сделал как вы рекомендовали
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; подскажите что надо исправить в коде |
|
![]() |
#6 |
Участник
|
Распишу детальней
В этом цикле 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тыс. даже считать неохота как это будет долго |
|
![]() |
#7 |
Участник
|
Нет, у вас не это спрашивают.
внутри внешних циклов находится только вызов вложенного while select или есть какие-нибудь вычисления на x++? если нет вычислений, то стоит подумать над тем, чтобы объединить вложенные запросы в один с join. Содной стороны это резко уменьшит количество запросов на скл-сервер. Но с другой стороны, объединенные запросы не позволят выполнить действия на Х++ по завершению вложенного цикла. |
|
![]() |
#8 |
Участник
|
Попробуйте везде, где написано join что-то (без полей выбора) добавить одну из двух конструкций:
- join TableId from <table> - join maxOf(RecId) from <table> |
|
![]() |
#9 |
Участник
|
Может быть join с tor_Worktable должен стоять после join c prodtable?
|
|
![]() |
#10 |
Участник
|
По моему без group by не получиться.
|
|
![]() |
#11 |
Участник
|
спасибо заработало, только подскажите,какова функция:
join maxOf(RecId) from <table> |
|
![]() |
#12 |
Участник
|
нужно выбирать какое-то поле, и применять к нему агрегатную функцию, иначе по строковым полям произойдет ошибка при группировке
|
|
|
![]() |
||||
Тема | Ответов | |||
Оптимизация класса Tax | 43 | |||
Оптимизация кода с LedgerTrans | 18 | |||
проблема с настройкой штрихового кода | 4 | |||
Оптимизация кода X++ | 8 | |||
Использование штрихового кода (barcode) в Аксапта | 9 |
|