17.06.2015, 17:54 | #1 |
Участник
|
Помощь с QUERY
Добрый день!
Делаю Query: X++: static void _201_HTC_Query_fromCustJour(Args _args) { Query query; QueryRun qr; QueryBuildDataSource qbds, qbdsinvent; QueryBuildRange qbr; CustInvoiceJour custInvoiceJour; CustInvoiceTrans custInvoiceTrans; CustTable custTable; InventBatchid inventBatchId = "141110-PO014116"; ; query = new Query(); qbds = query.addDataSource(tableNum(CustInvoiceJour)); qbds.addSortField(fieldNum(CustInvoiceJour, SalesId)); qbds = query.dataSourceTable(tableNum(CustInvoiceJour)).addDataSource(tableNum(CustTable)); qbds.relations(true); qbds.fetchMode(QueryFetchMode::One2One); qbds = query.dataSourceTable(tableNum(CustInvoiceJour)).addDataSource(tableNum(CustInvoiceTrans)); qbds.addRange(fieldNum(CustInvoiceTrans,ItemId)).value("P35080"); qbds.relations(true); qbds.fetchMode(QueryFetchMode::One2One); qbds = query.dataSourceTable(tableNum(CustInvoiceTrans)).addDataSource(tableNum(InventTrans)); qbds.addRange(fieldNum(InventTrans,InventTransId)).value("001720288"); qbds.relations(true); qbds.fetchMode(QueryFetchMode::One2One; qr = new QueryRun(query); info(query.dataSourceTable(tableNum(CustInvoiceJour)).toString()); while (qr.next()) { custInvoiceJour = qr.get(tablenum(CustInvoiceJour)); custInvoiceTrans = qr.get(tablenum(CustInvoiceTrans)); custTable = qr.get(tablenum(CustTable)); info(strfmt("%1 | %2 | %3 | %4", custInvoiceJour.SalesId, custTable.Name, custInvoiceTrans.ItemId, custInvoiceTrans.Qty)); } } |
|
17.06.2015, 18:12 | #2 |
Участник
|
Разобрался. Однако проблема - вот такая ошибка.
Суммарный внутренний размер записей в вашем объединенном операторе SELECT равен 25016 байтам, но система Microsoft Dynamics по умолчанию настроена так, что он не должен превосходить 24576 байтов. Приходится исключать одну из таблиц в данном случае CustTable. Что разумеется не очень круто. Подскажите можно ли это исправить?? |
|
17.06.2015, 18:16 | #3 |
Administrator
|
У Вас группировка только по первому датасорсу.Плюс явно не весь запрос приведен, ибо видны "следы" от CustTable, который не участвует в приведенном примере кода.
Ну т.е. сделайте так: 1. Сделайте группировку и Query только с одним датасорсом. 2. Как только получите результат - то подсоединяйте второй датасорс и т.д. Те датасорсы, которые в выборке не нужны - присоединяйте по (Not) Exists Join В Вашем случае скорее всего группировка наложилась неверно и поля из других датасорсов также участвуют в группировке, в то время, как отображается только то поле, по которому Вы наложили группировку.
__________________
Возможно сделать все. Вопрос времени |
|
17.06.2015, 18:21 | #4 |
Administrator
|
Поставьте Maximum buffer size, большее, чем 24 (в Вашем случае можно 25-26, т.е. 25016 / 1024) в конфигурационной утилите аоса и рестартаните его
__________________
Возможно сделать все. Вопрос времени |
|
|
За это сообщение автора поблагодарили: Art_Tanis (1). |
17.06.2015, 18:31 | #5 |
Участник
|
Или ограничивайте количество выбираемых полей в запросе qbds.selectedField(). Оставьте только те, которые вы реально будете использовать.
|
|
17.06.2015, 18:45 | #6 |
Участник
|
Цитата:
Предположительно в Ax2009 при анализе размера буфера суммирует размер всех полей записи вне зависимости от настроек qbds.selectedField(). По крайней мере мне в аналогичной ситуации пришлось делать вложенные циклы...
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
|
За это сообщение автора поблагодарили: A_BAS (1). |
17.06.2015, 18:54 | #7 |
Участник
|
Бааальшущее спасибо за ответы! Все получилось.
|
|