Показать сообщение отдельно
Старый 13.10.2011, 22:50   #16  
.Quattro. is offline
.Quattro.
Участник
Лучший по профессии 2009
 
194 / 22 (1) +++
Регистрация: 22.05.2006
Цитата:
Сообщение от Kadawrik Посмотреть сообщение
Вот франиент кода, на котором наблюдаются основные "тормоза":
Код:
SalesInvoiceHeader.SETCURRENTKEY("Order No.");
SalesInvoiceHeader.SETRANGE("Order No.","Sales Invoice Header"."Order No.");
SalesInvoiceHeader.SETFILTER("No.",'..%1',"Sales Invoice Header"."No.");
IF SalesInvoiceHeader.FIND('-') THEN
  REPEAT
    SalesInvoiceLine2.SETRANGE("Document No.",SalesInvoiceHeader."No.");
    SalesInvoiceLine2.SETRANGE("Line No.",SalesInvoiceLine."Line No.");
    SalesInvoiceLine2.SETRANGE(Type,SalesInvoiceLine.Type);
    SalesInvoiceLine2.SETRANGE("No.",SalesInvoiceLine."No.");
    SalesInvoiceLine2.SETRANGE("Unit of Measure Code",SalesInvoiceLine."Unit of Measure Code");
    IF SalesInvoiceLine2.FIND('-') THEN
      REPEAT
        TotalQuantity := TotalQuantity + SalesInvoiceLine2.Quantity;
      UNTIL SalesInvoiceLine2.NEXT = 0;
  UNTIL SalesInvoiceHeader.NEXT = 0;
Тормозит на первой части (от "IF SalesInvoiceHeader.FIND('-') THEN" до UNTIL SalesInvoiceHeader.NEXT = 0").
Что здесь можно бы ло бы оптимизировать?
Посоветовал бы вам перед наложением фильтров ставить RESET - неизвестно, какие до этого фильтры накладывались на записи.
Не исключаю, что можно код перестроить, в результате чего заработает быстрее. Что за переменная SalesInvoiceLine? Может можно найти строки без поиска заголовков?

Т.к. вы используете Native базу, то порядок наложения фильтров важен - он должен быть таким же, как и в ключе.
FINDSET работает только в SQL-версии быстрее.
Попробуйте не накладывать фильтр SalesInvoiceHeader.SETFILTER("No.",'..%1',"Sales Invoice Header"."No.");
а измените цикл на
(SalesInvoiceHeader."No." = "Sales Invoice Header"."No.") OR (SalesInvoiceHeader.NEXT = 0);