Страница 1 из 3

Подцепка или фильтр

Добавлено: 16 фев 2011, 16:10
n0where
Такой вопрос
Что быстрее и что для чего нужно:

Код: Выделить всё

_loop SKLORDER where ( SKLORDER.CSOPR = KATSOPR.nrec ) {
или

Код: Выделить всё

_loop SKLORDER where (( KATSOPR.nrec == SKLORDER.CSOPR )) {
В чем отличие? Что быстрее отработает? что для чего нужно?

Re: Подцепка или фильтр

Добавлено: 16 фев 2011, 16:13
BlazeBio
Первое медленнее, так как идёт выполнение без индекса на внешнюю выгрузку.
Второе быстрее. Так работает по индексу.

А вообще почитайте доку вначале. :)

Re: Подцепка или фильтр

Добавлено: 16 фев 2011, 16:19
n0where
А если мне надо сделать так:

Код: Выделить всё

      if ((getfirst SPSOPR where (
        SPSOPR.CSOPR    = KATSOPR.nRec    and
        SPSOPR.PRMC     = 1               and
        SPSOPR.CMCUSL   = SPORDER.cMC     and
        SPSOPR.cParty   = SPORDER.cParty  and
        SPSOPR.kol      = SPORDER.kol     and
        SPSOPR.price    = SPORDER.srprice
      ))<>tsok) {
индексов таких нет, в этом случае что быстрее?

И по факту почему то у меня получается, что фильтр работает быстрее...

Re: Подцепка или фильтр

Добавлено: 16 фев 2011, 16:26
BlazeBio
n0where писал(а):А если мне надо сделать так:

Код: Выделить всё

      if ((getfirst SPSOPR where (
        SPSOPR.CSOPR    = KATSOPR.nRec    and
        SPSOPR.PRMC     = 1               and
        SPSOPR.CMCUSL   = SPORDER.cMC     and
        SPSOPR.cParty   = SPORDER.cParty  and
        SPSOPR.kol      = SPORDER.kol     and
        SPSOPR.price    = SPORDER.srprice
      ))<>tsok) {
индексов таких нет, в этом случае что быстрее?

И по факту почему то у меня получается, что фильтр работает быстрее...
Так вы проходите таблицу по циклу(_loop), а здесь берёте целую запись. Вообще используйте по возможности индексы, а то без них тормозить будет. :)

Re: Подцепка или фильтр

Добавлено: 16 фев 2011, 18:54
Vik
n0where писал(а):А если мне надо сделать так:

Код: Выделить всё

      if ((getfirst SPSOPR where (
        SPSOPR.CSOPR    = KATSOPR.nRec    and
        SPSOPR.PRMC     = 1               and
        SPSOPR.CMCUSL   = SPORDER.cMC     and
        SPSOPR.cParty   = SPORDER.cParty  and
        SPSOPR.kol      = SPORDER.kol     and
        SPSOPR.price    = SPORDER.srprice
      ))<>tsok) {
индексов таких нет, в этом случае что быстрее?

И по факту почему то у меня получается, что фильтр работает быстрее...
Все переносите во view, индекс есть cSopr + prMc + cmcUsl + cParty. Если по какому-то полю индекса нет, указываете noindex.
В коде просто if getFirst SpSopr = tsOk..

Re: Подцепка или фильтр

Добавлено: 16 фев 2011, 18:59
BlazeBio
n0where, вы тут допрос проводите? Или какую-то конкретно задачу решить хотите? ;-)

Re: Подцепка или фильтр

Добавлено: 16 фев 2011, 20:03
edward_K
просто кому то влом открыть viprogr.chm и прочитать.
вообще getfirst where да и вообще getfirst плохой тон - если есть возможность нужно избегать, но там тоже есть индексные и не индексные условия.

Re: Подцепка или фильтр

Добавлено: 17 фев 2011, 00:01
n0where
BlazeBio
Охото понять что быстрее и правильнее.

edward_K, Vik
getfirst where - плохой тон. Лично я вообще не вижу аналога данной связке
Я не могу все внести в create view по крайней мере я не понимаю логику. пока что я просто кидаю туда таблицы которые хочу использовать.

Я делаю поиск ошибок которые сделать пользователи:
В моей практике вылезло несколько типов:
- Отрицательные остатки - как не печатьно, но такое получилось,
- В документах не указан МОЛ - тоже такое бывает давольно часто
- Пустые документы (Нет проводок, нет ордеров, нет счет фактур, нет ДО и тп)
- ...

Все ограничения в create view внести я вообще не представляю как. Допустим для какихто документов мне нужно проверять проводки, для какихто ордера и тп... Все связать в один запрос мне лично не под силу. И я не хочу использовать кучу интерфейсов, для отображения каждого типа ошибок.

Я организовал так - все ошибки имеют отдельную таблицу в памяти, и функцию заполняющую данную таблицу. В этой функции идет поиск грубо говоря так

Код: Выделить всё

_loop katsopr {
if getfirst spsopr where (karsopt.nrec = spsopr.csopr) { message('Ошибка - нет спецификации у документа') }
}
Как тут без where? и без getfirst?

Re: Подцепка или фильтр

Добавлено: 17 фев 2011, 03:10
Ged

Код: Выделить всё

Create view 
As Select
 *
From 
   Katsopr
,  SpSopr
Where
((
   KarSopt.Nrec == SpSopr.cSopr
))
;
....
// Раз не указали Where, то используется подцепка из Create View. что кстати намного быстрее
_loop katsopr 
   if(GetFirst SpSopr<>tsOk) 
     { message('Ошибка - нет спецификации у документа') }

// Еще ускорение. FastFirstRow - считывается по одной записи. Дает ускорение, когда явно известно что позиционирования на след запись не будет. Т.е. работаем без кэширования. 
_loop katsopr 
   if(GetFirst FastFirstRow SpSopr<>tsOk) 
     { message('Ошибка - нет спецификации у документа') }

// А это еще быстрее будет работать, т.к. только проверяется наличие в БД
// записи. при этом запись сама не считывается в буфер. 
_loop katsopr 
  if (RecordExists SpSopr<>tsOk) 
     { message('Ошибка - нет спецификации у документа')  }

Re: Подцепка или фильтр

Добавлено: 17 фев 2011, 08:23
n0where
Ged,
Спасибо именно то что я хотел.
Почему я не юзал RecordExists - на форуме были сообщения что данная функция не работает. Так ли это?

Re: Подцепка или фильтр

Добавлено: 17 фев 2011, 10:46
galover
RecordExists не всегда правильно работает, лучше отказаться от него в пользу IsValid (если view без имени) и IsValidAll (если вьюха именованная)

Re: Подцепка или фильтр

Добавлено: 17 фев 2011, 10:49
edward_K
использование табл в create view без условий - увеличение трафика и времени загрузки фейса. Ну так же как и использование неиндексных условий где либо в том же getfirst. Для того чтобы не использовать кучу фейсов есть переменные и bounds. Есть еще синонимы - если вам в цикле скажем по организации нужно подтягивать обороты по кредиту и отдельно по дебету логичней заюзать для oborot синоним. Лет 5 назад была тробла, что использование getfirst ломал цикл _loop при определенных условиях - и хотя ее уже починили все равно если уж совсем не обойтись, то делайте на такие таблы отдельный view.

Re: Подцепка или фильтр

Добавлено: 17 фев 2011, 12:33
Vik
edward_K писал(а):ообще getfirst where да и вообще getfirst плохой тон
Ладно, getFirst where, но getFirst -то с каких пор стал нежелательным?) Что тогда вместо него использовать для позиционирования?
galover писал(а):RecordExists не всегда правильно работает, лучше отказаться от него в пользу IsValid (если view без имени) и IsValidAll (если вьюха именованная)
Эти функции работают, если запись была предварительно считана в буфер. А если она считана не была, isValid не поможет, если необходимо узнать, существует ли в таблице запись. А RecordExists всегда посылает запрос к серверу.

Re: Подцепка или фильтр

Добавлено: 17 фев 2011, 12:35
galover
Эти функции работают, если запись была предварительно считана в буфер. А если она считана не была, isValid не поможет, если необходимо узнать, существует ли в таблице запись. А RecordExists всегда посылает запрос к серверу.
По собственному опыту пишу. RecordExists возвращал неправильное значение, заменил на IsValid все заработало, так что нафиг-нафиг. По поводу getFirst тоже не врубился в чем криминал, всегда использую, пока не подводил

Re: Подцепка или фильтр

Добавлено: 17 фев 2011, 13:22
Vik
Да я и сам пару раз натыкался на косяки при работе с RecordExists. Я лишь обратил внимание, в каких ситуациях isValid бесполезна.