Показать сообщение отдельно
Старый 01.09.2008, 12:11   #11  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от koraman Посмотреть сообщение
Это какая-то мистика!
Барабашки нет.

Цитата:
Сообщение от 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
Очень странное условие в запросе.

Цитата:
Сообщение от koraman Посмотреть сообщение
Добавили ещё один джоин, стали отображать ещё один столбец - и появилась первая проблема! Почему-то у нескольких записей перестало отображаться название группы клиентов CustGroup.Name!
Читайте про outer join на этом форуме.
Аксапта плохо переваривает несколько 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 только в первый раз за пользовательскую сессию. как правило, результаты будет браться из кэша КЛИЕНТА.

Вывод - не усложняйте запросы. В Аксапте не всегда вложенные запросы плохо.
Детально разберитесь с кэшированием записей.
__________________
полезное на axForum, github, vk, coub.
За это сообщение автора поблагодарили: koraman (1).