![]() |
#9 |
Участник
|
Барабашки нет.
Цитата:
Сообщение от koraman
![]() Шаг 2:
X++: while select custTable order by AccountNum outer join contactPerson where custTable.ContactPersonId == contactPerson.ContactPersonId outer join custGroup where (custGroup.dataAreaId == contactPerson.dataAreaId || custGroup.dataAreaId != contactPerson.dataAreaId) && custTable.CustGroup == custGroup.CustGroup { this.CustInfo = custTable.AccountNum + ", " + contactPerson.Name; this.CustGroupName = custGroup.Name; this.insert(); } // end while Цитата:
Аксапта плохо переваривает несколько outer join'ов. Почему? Потому что разыменование в Аксапте делается совершенно другим способом. Вы привыкли к LEFT JOIN'ам и считаете, что это быстро. Нет, в Аксапте очень много зявязано на кэширование записей (читайте про кэширование в транзакции, вне транзакции, а также кэширование таблиц). Суть Аксапта-подхода: 1. Естественные коды (коды должны быть такими, что легко читаются и понимаются человеком). В результате потребность в разыменовании резко снижается. См. стандартные формы и отчеты. См. неоднократные обсуждения на этом форуме и здесь http://axapta.mazzy.ru/lib/autonumber/ 2. Использовать простые запросы с вложенными простыми и КЭШИРУЕМЫМИ запросами. Если вам всетаки нужно разыменование, то лучше написать сложенный запрос к CustGroup и при этом убедится что CustGroup кэшируемая таблица X++: while select custTable order by AccountNum outer join contactPerson where custTable.ContactPersonId == contactPerson.ContactPersonId { custGroup == custGroup::find(custTable.CustGroup); } А вот внутренний запрос будет выполняться на SQL только в первый раз за пользовательскую сессию. как правило, результаты будет браться из кэша КЛИЕНТА. Вывод - не усложняйте запросы. В Аксапте не всегда вложенные запросы плохо. Детально разберитесь с кэшированием записей. |
|
|
За это сообщение автора поблагодарили: koraman (1). |