Показать сообщение отдельно
Старый 16.07.2010, 11:17   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
1.
Понимает. Отлично понимает "два join".
Цитата:
Сообщение от Roman N. Krivov Посмотреть сообщение
Вот что я делаю:
....
Как это можно вылечить?
Неправильно делаете.
Уж сколько раз твердилось: перестаньте программировать запросы с нуля.
накидайте в AOT, а в коде используйте
myQuery = new Query(querystr(myAOTQuery));

если честно, то по-моему, в коде полная фигня написана.
но разбираться ни сил, ни желания.

Поэтому совет: прежде чем жаловаться "не понимает", сначала проверьте по AOT.

2.
не понимает "два exists join".
об этом писалось на форуме. неоднократно. и способы решения приводились. ищите.

вкратце: не используйте exists join без необходимости. не надо с его помощью эмулировать left join.

3.
в аксапте есть режим кэширования. разберитесь с ним. ОБЯЗАТЕЛЬНО!
из-за кэширования зачастую лучше писать не один суперзапрос, а простой запрос и несколько вложенных.

Кроме того, помните о том, что Аксапта очень активно использует кэширование планов запросов на SQL.
Поэтому лучше писать простые и единообразные запросы.

В частности у вас, скорее всего, возможно лучше написать код, работающий по следующей схеме:

X++:
while select salesTable
    join salesLine
    where salesLine.SalesId == salesTable.SalesId
{
    ...
    CustTable = CustTable::find(...);
    ...
}
4. (опционально)
здесь неоднократно говорилось о влиянии порядка условий в запросе на производительность.
некоторые считают это мифом.
некоторые, как я, считают порядок условий - важной вещью.

я бы поредомендовал все-таки во всем коде придерживаться единого порядка в условиях.
условие сначала по CustTable, потом по SalesID, потом по InventQtyReserv... это что-то уникальное, наверняка, нигде не закэшированное. мало того, этот уникальный запрос может выкинуть из кэша что-нибудь нужное и достаточно часто используемое.

пишите единообразно.

5. (возможная причина ошибки)
Кроме того, условие ">0" в критериях записывается по другому "0..".

===============
В общем, сначала набросайте запрос мышкой в AOT.
Проверьте.
Уж потом, если захочется, ваяйте ваш код по созданию запроса и по закату солнца вручную.
__________________
полезное на axForum, github, vk, coub.