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.
Проверьте.
Уж потом, если захочется, ваяйте ваш код по созданию запроса и по закату солнца вручную.