![]() |
#7 |
Участник
|
Ну раз все молчат, вверну свой быдлокод.
Собственно в решении ничего неожиданного нет. Заменил использование markupDS.findRecord на банальное накладываение range по заранее собранным RecId (индекс в таблице такой есть, так что это не проблема). А сбор RecId уже спокойно можно разбить на 2 запроса. Ниже уже конкретная реализация, если кому интересно. Метод dsExecuteMarkup по всему семейству сделал типа boolean, чтобы в форме FactureEditLines_RU у датасорса метод executeQuery имел вид X++: public void executeQuery() { // SOI --> /* factureEngine.dsExecuteMarkup(); // super(); // PS 1791 */ if (factureEngine.dsExecuteMarkup()) { super(); } // SOI <-- } X++: mrkDS.clearRanges(); // в потомках мы накладываем range, логично его сначала почистить return false; X++: public boolean dsExecuteMarkup() { MarkupTrans markupCursor; CustInvoiceJour tJour = custInvoiceJourDS.cursor(); CustInvoiceTrans tTrans; // SOI --> QueryBuildDataSource qbds; QueryBuildRange qbr; Set set = new Set(Types::Int64); SetEnumerator sE; counter counter; str range; // SOI <-- ; super(); // SOI --> qbds = markupDs.query().dataSourceTable(tablenum(MarkupTrans)); // собственно собираем все, что связано и со строками и с заголовком while select recid from markupCursor where markupCursor.CustVendPosted_RU && !markupCursor.ItemPosted_RU exists join tTrans where tTrans.SalesId == tJour.SalesId && tTrans.InvoiceId == tJour.InvoiceId && tTrans.InvoiceDate == tJour.InvoiceDate && tTrans.NumberSequenceGroup == tJour.NumberSequenceGroup && tTrans.TableId == markupCursor.TransTableId && tTrans.RecId == markupCursor.TransRecId { set.add(markupCursor.RecId); } while select recid from markupCursor where markupCursor.CustVendPosted_RU && !markupCursor.ItemPosted_RU && markupCursor.TransTableId == tJour.TableId && markupCursor.TransRecId == tJour.RecId { set.add(markupCursor.RecId); } // и лепим это все в range sE = set.getEnumerator(); while (sE.moveNext()) { counter++; if (counter > 15) // не по-научному, знаю, но зато работает :) { qbr = qbds.addRange(fieldnum(MarkupTrans, RecId)); qbr.value(range); range = strmin(); counter = 0; } range = queryRangeConcat(range, sE.current()); } if (!set.elements()) { range = sysQuery::value(0); // ничего не нашли - ничего и не покажем } if (range) { qbr = qbds.addRange(fieldnum(MarkupTrans, RecId)); qbr.value(range); } return true; // SOI <-- } Если у кого есть какие другие варианты или критика/дополнения - буду рад увидеть.
__________________
If it ain't broke, take it apart and find out why (с) |
|
|
![]() |
||||
Тема | Ответов | |||
оптимизация запроса статистики по клиенту | 2 | |||
Просмотрщик запросов QueryBrowser DAX 3.0 SP4 | 30 | |||
Оптимизация запросов к БД в коде | 57 | |||
Оптимизация запросов | 6 | |||
Оптимизация запросов | 3 |
|