![]() |
#9 |
Участник
|
Цитата:
Сообщение от 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; Что здесь можно бы ло бы оптимизировать? Не исключаю, что можно код перестроить, в результате чего заработает быстрее. Что за переменная SalesInvoiceLine? Может можно найти строки без поиска заголовков? Т.к. вы используете Native базу, то порядок наложения фильтров важен - он должен быть таким же, как и в ключе. FINDSET работает только в SQL-версии быстрее. Попробуйте не накладывать фильтр SalesInvoiceHeader.SETFILTER("No.",'..%1',"Sales Invoice Header"."No."); а измените цикл на (SalesInvoiceHeader."No." = "Sales Invoice Header"."No.") OR (SalesInvoiceHeader.NEXT = 0); |
|