![]() |
#2 |
Участник
|
1.
Понимает. Отлично понимает "два join". Неправильно делаете. Уж сколько раз твердилось: перестаньте программировать запросы с нуля. накидайте в 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(...); ... } здесь неоднократно говорилось о влиянии порядка условий в запросе на производительность. некоторые считают это мифом. некоторые, как я, считают порядок условий - важной вещью. я бы поредомендовал все-таки во всем коде придерживаться единого порядка в условиях. условие сначала по CustTable, потом по SalesID, потом по InventQtyReserv... это что-то уникальное, наверняка, нигде не закэшированное. мало того, этот уникальный запрос может выкинуть из кэша что-нибудь нужное и достаточно часто используемое. пишите единообразно. 5. (возможная причина ошибки) Кроме того, условие ">0" в критериях записывается по другому "0..". =============== В общем, сначала набросайте запрос мышкой в AOT. Проверьте. Уж потом, если захочется, ваяйте ваш код по созданию запроса и по закату солнца вручную. |
|
Теги |
join, query, как правильно |
|
|