08.08.2008, 11:33 | #1 |
Участник
|
2 CustTable_ds на форме
На форме 3 датасурса - CustInvoiceJour и 2 CustTable - присоединенные по InvoiceAccount и OrderAccount (по InnerJoin). Накладываются фильтры и по кнопке вызываем ExecuteQuery(). Вот такой запрос строится:
SELECT * FROM CustInvoiceJour WHERE ((InvoiceDate>={ts '2008-05-01 00:00:00.000'} AND InvoiceDate<={ts '2008-05-31 00:00:00.000'})) JOIN * FROM CustTable WHERE CustInvoiceJour.OrderAccount = CustTable.AccountNum JOIN * FROM CustTable WHERE CustInvoiceJour.InvoiceAccount = CustTable.AccountNum В итоге вылетает ошибка : Суммарный внутренний размер записей в вашем объединенном операторе SELECT равен 26684 байтам, но система Microsoft Dynamics по умолчанию настроена так, что он не должен превосходить 24576 байтов. С одним CustTable работает нормально. Можно ли как-то решить проблему не изменняя настроек AOS? |
|
|
За это сообщение автора поблагодарили: mazzy (1). |
08.08.2008, 11:38 | #2 |
MCTS
|
Попробуйте поставить OnlyFetchActive на датасорсе
Еще один вариант (на init обоих датасорсов выбираем только нужные поля): X++: public void init() { QueryBuildDataSource qbds; ; super(); qbds = CustTable_DS.query().dataSourceTable(tablenum(CustTable)); qbds.addSelectionField(fieldnum(CustTable, RecId)); qbds.addSelectionField(fieldnum(CustTable, AccountNum)); qbds.addSelectionField(fieldnum(CustTable, CellularPhone)); qbds.addSelectionField(fieldnum(CustTable, Phone)); } Последний раз редактировалось Eldar9x; 08.08.2008 в 12:11. |
|
08.08.2008, 12:30 | #3 |
Участник
|
Поставила OnlyFetchActive - в запросе появился перечень полей. НО летит та же ошибка...В грид выбрались какието строки, но в каждом поле проставились значения RecId из СustTable.
SELECT SalesId, InvoiceId, InvoiceDate, OrderAccount, InvoiceAccount, inventLocationId, Qty, SalesBalanceMST, SumTaxMST, DocReestrInvoice_UAI, DocReestrAttorney_UAI, InvoiceAmountMST, RContractCode, DlvMode, CashCheck_UAI, AttorneyId_RU, AttorneyDate_RU, AttorneyIssuedName_RU, Description_UAI, SalesAdministrator, DeliveryAddress FROM CustInvoiceJour WHERE ((InvoiceDate>={ts '2008-05-01 00:00:00.000'} AND InvoiceDate<={ts '2008-05-31 00:00:00.000'})) JOIN Name FROM CustTable WHERE CustInvoiceJour.OrderAccount = CustTable.AccountNum JOIN Name, CodeOKPO_RU FROM CustTable WHERE CustInvoiceJour.InvoiceAccount = CustTable.AccountNum |
|
08.08.2008, 12:46 | #4 |
MCTS
|
Мне первый вариант тоже не помог, поэтому лучше четко указывать, какие поля нужно получить. Судя по запросу, придется еще и CustInvoiceJour_DS.init() также переписать.
X++: public void init() { QueryBuildDataSource qbds; ; super(); qbds = CustInvoiceJour_DS.query().dataSourceTable(tablenum(CustInvoiceJour)); qbds.addSelectionField(fieldnum(CustInvoiceJour, RecId)); .... } |
|
08.08.2008, 12:47 | #5 |
Участник
|
с addSelectionField - то же самое что из с FetchActive - ошибка и некорректные данные в строках..
Перекрывала иниты на всех трех датасурсах. Последний раз редактировалось Ameli; 08.08.2008 в 12:49. |
|
08.08.2008, 13:42 | #6 |
Участник
|
размер данных после указания перечня полей остался все тот же - 26684
|
|
08.08.2008, 13:43 | #7 |
MCTS
|
Форму можно?
|
|
08.08.2008, 14:08 | #8 |
Участник
|
Выкладываю форму
|
|
08.08.2008, 15:41 | #9 |
MCTS
|
Забыли в inite() CustInvoiceJour_DS выбрать SalesId
X++: qbds = this.query().dataSourceName('CustInvoiceJour'); qbds.addSelectionField(fieldnum(CustInvoiceJour, RecId)); qbds.addSelectionField(fieldnum(CustInvoiceJour, SalesId)); Для CustInvoiceJour X++: // !!! qbds.addSelectionField(fieldnum(CustInvoiceJour, DocReestrInvoice_UAI)); // !!! qbds.addSelectionField(fieldnum(CustInvoiceJour, DocReestrAttorney_UAI)); // !!! qbds.addSelectionField(fieldnum(CustInvoiceJour, RContractCode)); // !!! qbds.addSelectionField(fieldnum(CustInvoiceJour, CashCheck_UAI)); // !!! qbds.addSelectionField(fieldnum(CustInvoiceJour, AttorneyId_RU)); // !!! qbds.addSelectionField(fieldnum(CustInvoiceJour, AttorneyIssuedName_RU)); // !!! qbds.addSelectionField(fieldnum(CustInvoiceJour, Description_UAI)); X++: // !!! qb.addSelectionField(fieldNum(CustTable,CodeOKPO_RU)); CustInvoiceJour_ds.executeQuery(); вместо CustInvoiceJour_ds.research(); Последовательно отключайте поля, пока не добъетесь результата. Начать лучше с полей типа: CustInvoiceJour.Description_UAI CustInvoiceJour.DeliveryAddress Последний раз редактировалось Eldar9x; 08.08.2008 в 16:29. |
|
|
За это сообщение автора поблагодарили: Ameli (1). |
08.08.2008, 16:38 | #10 |
Участник
|
Eldar9x, спасибо за участие! Но к сожалению, не помогло. Втянула вашу хро-шку - та же картина... Теперь наверняка можно сказать что дело в настройках системы.
До недавнего времени эта форма работала. Потом стала эта ошибка валиться. А увеличивать Maximum Buffer size не разрешили... (хотя пробовали - помогает). Я подумала что надо оптимизировать както запрос - но похоже не запросе дело. Выходить, что надо увеличивать - других вариантов нет? |
|
08.08.2008, 16:49 | #11 |
MCTS
|
Почему же не в запросе. Точно такую же проблему решил именно так, отключая не нужные поля, причем свойство OnlyFetchActive так и не помогло - только программно. Попробуйте выбирать вначале только несколько полей из CustInvoiceJour. То есть RecId и поля связки. Пусть на форме данные и неправильно отображаются, но добейтесь вначале, что бы это сообщение исчезло. А потом уже будете выбирать, что целесообразней - обойтись без какого либо дополнительного поля или увеличить буфер.
Кстати, оказывается, свойство OnlyFetchActive выставленное в Yes перекрывает программную настройку выбираемых полей. Последний раз редактировалось Eldar9x; 08.08.2008 в 17:25. |
|
08.08.2008, 17:21 | #12 |
Участник
|
Цитата:
Сообщение от Ameli
До недавнего времени эта форма работала. Потом стала эта ошибка валиться. А увеличивать Maximum Buffer size не разрешили... (хотя пробовали - помогает). Я подумала что надо оптимизировать както запрос - но похоже не запросе дело. Выходить, что надо увеличивать - других вариантов нет?
__________________
aLL woRk aNd nO JoY MAKes jAck a dULL Boy Последний раз редактировалось ivas; 08.08.2008 в 17:38. Причина: орфография)) |
|
08.08.2008, 17:34 | #13 |
MCTS
|
Не уверен, что это верно, но вроде можно обойтись одним датасорсом CustTable, в init которого
X++: public void init() { QueryBuildDataSource qb; super(); qb = CustTable_ds.query().dataSourceName('CustTable'); qb.clearLinks(); qb.fetchMode(QueryFetchMode::One2One); qb.addLink(fieldNum(CustInvoiceJour,InvoiceAccount),fieldNum(CustTable,AccountNum)); qb.addLink(fieldNum(CustInvoiceJour,OrderAccount ),fieldNum(CustTable,AccountNum)); qb.addSelectionField(fieldNum(CustTable,RecId)); qb.addSelectionField(fieldNum(CustTable,Name)); } Цитата:
Информация:
SELECT RecId, SalesId FROM CustInvoiceJour WHERE ((InvoiceDate>={ts '2008-08-08 00:00:00.000'} AND InvoiceDate<={ts '2008-08-08 00:00:00.000'})) JOIN RecId FROM CustTable WHERE CustInvoiceJour.InvoiceAccount = CustTable.AccountNum AND CustInvoiceJour.OrderAccount = CustTable.AccountNum Цитата:
SELECT * FROM CustInvoiceJour WHERE ((InvoiceDate>={ts '2008-05-01 00:00:00.000'} AND InvoiceDate<={ts '2008-05-31 00:00:00.000'}))
JOIN * FROM CustTable WHERE CustInvoiceJour.OrderAccount = CustTable.AccountNum JOIN * FROM CustTable WHERE CustInvoiceJour.InvoiceAccount = CustTable.AccountNum судя по данным - равносильно и можно обойтись без addSelectionField, выбирая сразу все поля. Последний раз редактировалось Eldar9x; 08.08.2008 в 17:57. |
|
10.08.2008, 01:47 | #14 |
Участник
|
Попробуйте это:
Цитата:
1. Open the Microsoft Dynamics AX Server Configuration Utility.
2. Select a configuration that can be modified from the menu or create a new configuration (Manage > Create Configuration). 3. Click the Database Tuning tab. 4. In the Maximum Buffer Size field, enter a value higher than 24 (kilobytes). 5. Save the configuration. 6. Restart the AOS. |
|
10.08.2008, 11:43 | #15 |
Боец
|
2kashperuk:
Цитата:
А увеличивать Maximum Buffer size не разрешили... (хотя пробовали - помогает)
IMHO ничего криминального в увеличении Maximum Buffer нет, хотя нужно учесть Параметр Maximum buffer size в настройках AOS |
|
11.08.2008, 09:40 | #16 |
MCTS
|
Цитата:
IMHO ничего криминального в увеличении Maximum Buffer нет
|
|
11.08.2008, 11:34 | #17 |
Участник
|
Попробовала заново создать форму, выбрала через AddSelectionField из каждого датасурса только RecId - ошибка не исчезла.
а запрос SELECT RecId, SalesId FROM CustInvoiceJour WHERE ((InvoiceDate>={ts '2008-08-08 00:00:00.000'} AND InvoiceDate<={ts '2008-08-08 00:00:00.000'})) JOIN RecId FROM CustTable WHERE CustInvoiceJour.InvoiceAccount = CustTable.AccountNum AND CustInvoiceJour.OrderAccount = CustTable.AccountNum - задвоит накладные. Попробуем все-таки пока что увеличить Maximum Buffer, надеюсь, AOS не свалится. И все-таки не понятно, почему возникла такая проблема с этой формой, есть же куча подобных - и с двумя EmplTable, InventDim и т.д. и т.п. |
|
11.08.2008, 11:41 | #18 |
MCTS
|
Цитата:
а запрос
- задвоит накладные. |
|
11.08.2008, 12:15 | #19 |
Участник
|
Ну, думаю, до 40-60 КБ значение этого параметра можно увеличить довольно безболезненно. Чтобы были и волки сыты, и овцы целы.
|
|
|
|