Показать сообщение отдельно
Старый 20.03.2012, 16:41   #7  
Alexanderis.ua is offline
Alexanderis.ua
Участник
 
53 / 40 (2) +++
Регистрация: 25.12.2008
Адрес: Киев, Украина
Ну раз все молчат, вверну свой быдлокод.
Собственно в решении ничего неожиданного нет.
Заменил использование 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 <--
}
Далее, в классе FactureEditLinesEngineCustVend_RU в метод dsExecuteMarkup добавляем
X++:
mrkDS.clearRanges(); // в потомках мы накладываем range, логично его сначала почистить
return false;
И, наконец, в наследниках (тут пример FactureEditLinesEngineCust_RU, в Vend - аналогично)
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 (с)