|
![]() |
#1 |
Участник
|
Цитата:
Сообщение от Kadawrik
![]() Допустим сервер "разгоняется. Но тогда почему то же самое порисходит и на ЛОКАЛЬНОЙ базе? ... даже после того, как окно НАВа закрываю (т.е. я исходу из предположения, что в этот момент всё, что касается Навижн из памяти компа удаляется) все равно наблюдается этот эффект "ускорения"
Порядок фильтрации не важен. Посмотрите, что стоит в настойках Кэш объектов (KB) в филиале. Мож там 0? |
|
![]() |
#2 |
Участник
|
Цитата:
Код: 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; SalesShipmentLine.SETCURRENTKEY("Order No.","Order Line No."); SalesShipmentLine.SETRANGE("Order No.","Sales Invoice Header"."Order No."); SalesShipmentLine.SETRANGE("Order Line No.",SalesInvoiceLine."Line No."); SalesShipmentLine.SETRANGE("Line No.",SalesInvoiceLine."Line No."); SalesShipmentLine.SETRANGE(Type,SalesInvoiceLine.Type); SalesShipmentLine.SETRANGE("No.",SalesInvoiceLine."No."); SalesShipmentLine.SETRANGE("Unit of Measure Code",SalesInvoiceLine."Unit of Measure Code"); SalesShipmentLine.SETFILTER(Quantity,'<>%1',0); IF SalesShipmentLine.FIND('-') THEN REPEAT и т.д. Что здесь можно бы ло бы оптимизировать? |
|
![]() |
#3 |
Участник
|
Цитата:
Сообщение от 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; SalesShipmentLine.SETCURRENTKEY("Order No.","Order Line No."); SalesShipmentLine.SETRANGE("Order No.","Sales Invoice Header"."Order No."); SalesShipmentLine.SETRANGE("Order Line No.",SalesInvoiceLine."Line No."); SalesShipmentLine.SETRANGE("Line No.",SalesInvoiceLine."Line No."); SalesShipmentLine.SETRANGE(Type,SalesInvoiceLine.Type); SalesShipmentLine.SETRANGE("No.",SalesInvoiceLine."No."); SalesShipmentLine.SETRANGE("Unit of Measure Code",SalesInvoiceLine."Unit of Measure Code"); SalesShipmentLine.SETFILTER(Quantity,'<>%1',0); IF SalesShipmentLine.FIND('-') THEN REPEAT и т.д. Что здесь можно бы ло бы оптимизировать? |
|
![]() |
#4 |
Участник
|
Цитата:
Сообщение от 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; SalesShipmentLine.SETCURRENTKEY("Order No.","Order Line No."); SalesShipmentLine.SETRANGE("Order No.","Sales Invoice Header"."Order No."); SalesShipmentLine.SETRANGE("Order Line No.",SalesInvoiceLine."Line No."); SalesShipmentLine.SETRANGE("Line No.",SalesInvoiceLine."Line No."); SalesShipmentLine.SETRANGE(Type,SalesInvoiceLine.Type); SalesShipmentLine.SETRANGE("No.",SalesInvoiceLine."No."); SalesShipmentLine.SETRANGE("Unit of Measure Code",SalesInvoiceLine."Unit of Measure Code"); SalesShipmentLine.SETFILTER(Quantity,'<>%1',0); IF SalesShipmentLine.FIND('-') THEN REPEAT и т.д. Что здесь можно бы ло бы оптимизировать? Т.е. просматриваете все счета начиная с царя-гороха. Вообще с помощью создания ключей можно это дело ускорить все ж. Первичный ключ для строк инвойса, это <Document No.,Line No.>, если я не ошибаюсь. Остальные фильтруемые поля остаются за бортом. Лучше добавить ключ, где все фильтруемые поля входят в него. От цикла лучше избавиться, прописав в этом ключе SumIndexField = Quantity и потом его просто CalsSum-ить. Со строками отгрузки аналогично.. |
|
![]() |
#5 |
Участник
|
Цитата:
Сообщение от VProk
![]() Первичный ключ для строк инвойса, это <Document No.,Line No.>, если я не ошибаюсь. Остальные фильтруемые поля остаются за бортом.
Лучше добавить ключ, где все фильтруемые поля входят в него. От цикла лучше избавиться, прописав в этом ключе SumIndexField = Quantity и потом его просто CalsSum-ить. Со строками отгрузки аналогично.. |
|
![]() |
#6 |
Участник
|
Цитата:
Сообщение от 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); |
|
![]() |
#7 |
Administrator
|
|
|