|
![]() |
#1 |
Участник
|
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. Проверьте. Уж потом, если захочется, ваяйте ваш код по созданию запроса и по закату солнца вручную. |
|
![]() |
#2 |
Участник
|
Цитата:
если честно, то по-моему, в коде полная фигня написана.
но разбираться ни сил, ни желания. ![]() Задание: Нужно выбрать все открытые заказы у которых существует хотя бы одна строка с зарезервированным количеством != 0 И чтобы не делать каждый раз CustTable::Find() нужно при'join'ить CustTable Цитата:
не понимает "два exists join".
Цитата:
вкратце: не используйте exists join без необходимости. не надо с его помощью эмулировать left join.
![]() Цитата:
здесь неоднократно говорилось о влиянии порядка условий в запросе на производительность.
Код: Но вам скорее всего нужно писать "!0" Цитата:
В общем, сначала набросайте запрос мышкой в AOT.
Проверьте. Уж потом, если захочется, ваяйте ваш код по созданию запроса и по закату солнца вручную. Код: SELECT * FROM SalesTable WHERE ((SalesStatus = Открыто)) |
|
![]() |
#3 |
Ищущий знания...
|
Цитата:
т.е.: X++: qbdsSalesTable = SysQuery::findOrCreateDatasource(query, tablenum(SalesTable)); qbdsSalesTable.fetchMode(QueryFetchMode::One2One); qbdsCustTable = SysQuery::findOrCreateDatasource(query, tablenum(CustTable), tablenum(SalesTable), false); qbdsCustTable.fetchMode(QueryFetchMode::One2One); qbdsSalesLine = SysQuery::findOrCreateDatasource(query, tablenum(SalesLine), tablenum(SalesTable), false); qbdsSalesLine.fetchMode(QueryFetchMode::One2One);
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
![]() |
#4 |
Участник
|
|
|
![]() |
#5 |
Участник
|
угу. не бывает плохих вопросов, бывают плохие ответы
![]() Цитата:
но если уж так хочется при'join'ить, то (см. ниже) Цитата:
|
|
Теги |
join, query, как правильно |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|