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

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

n0where
Местный житель
Сообщения: 499
Зарегистрирован: 30 дек 2010, 08:16

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

Сообщение n0where »

Такой вопрос
Что быстрее и что для чего нужно:

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

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

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

_loop SKLORDER where (( KATSOPR.nrec == SKLORDER.CSOPR )) {
В чем отличие? Что быстрее отработает? что для чего нужно?
хороший программист — это человек, который переходя улицу с односторонним движением смотрит в обе стороны
BlazeBio
Местный житель
Сообщения: 386
Зарегистрирован: 27 апр 2010, 14:31
Контактная информация:

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

Сообщение BlazeBio »

Первое медленнее, так как идёт выполнение без индекса на внешнюю выгрузку.
Второе быстрее. Так работает по индексу.

А вообще почитайте доку вначале. :)
n0where
Местный житель
Сообщения: 499
Зарегистрирован: 30 дек 2010, 08:16

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

Сообщение 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) {
индексов таких нет, в этом случае что быстрее?

И по факту почему то у меня получается, что фильтр работает быстрее...
хороший программист — это человек, который переходя улицу с односторонним движением смотрит в обе стороны
BlazeBio
Местный житель
Сообщения: 386
Зарегистрирован: 27 апр 2010, 14:31
Контактная информация:

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

Сообщение 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), а здесь берёте целую запись. Вообще используйте по возможности индексы, а то без них тормозить будет. :)
Vik
Местный житель
Сообщения: 370
Зарегистрирован: 28 сен 2006, 15:43
Откуда: Санкт-Петербург
Контактная информация:

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

Сообщение 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..
BlazeBio
Местный житель
Сообщения: 386
Зарегистрирован: 27 апр 2010, 14:31
Контактная информация:

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

Сообщение BlazeBio »

n0where, вы тут допрос проводите? Или какую-то конкретно задачу решить хотите? ;-)
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

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

Сообщение edward_K »

просто кому то влом открыть viprogr.chm и прочитать.
вообще getfirst where да и вообще getfirst плохой тон - если есть возможность нужно избегать, но там тоже есть индексные и не индексные условия.
n0where
Местный житель
Сообщения: 499
Зарегистрирован: 30 дек 2010, 08:16

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

Сообщение n0where »

BlazeBio
Охото понять что быстрее и правильнее.

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

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

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

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

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

_loop katsopr {
if getfirst spsopr where (karsopt.nrec = spsopr.csopr) { message('Ошибка - нет спецификации у документа') }
}
Как тут без where? и без getfirst?
хороший программист — это человек, который переходя улицу с односторонним движением смотрит в обе стороны
Ged
Местный житель
Сообщения: 645
Зарегистрирован: 29 мар 2005, 17:49
Контактная информация:

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

Сообщение 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('Ошибка - нет спецификации у документа')  }
n0where
Местный житель
Сообщения: 499
Зарегистрирован: 30 дек 2010, 08:16

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

Сообщение n0where »

Ged,
Спасибо именно то что я хотел.
Почему я не юзал RecordExists - на форуме были сообщения что данная функция не работает. Так ли это?
хороший программист — это человек, который переходя улицу с односторонним движением смотрит в обе стороны
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

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

Сообщение galover »

RecordExists не всегда правильно работает, лучше отказаться от него в пользу IsValid (если view без имени) и IsValidAll (если вьюха именованная)
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

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

Сообщение edward_K »

использование табл в create view без условий - увеличение трафика и времени загрузки фейса. Ну так же как и использование неиндексных условий где либо в том же getfirst. Для того чтобы не использовать кучу фейсов есть переменные и bounds. Есть еще синонимы - если вам в цикле скажем по организации нужно подтягивать обороты по кредиту и отдельно по дебету логичней заюзать для oborot синоним. Лет 5 назад была тробла, что использование getfirst ломал цикл _loop при определенных условиях - и хотя ее уже починили все равно если уж совсем не обойтись, то делайте на такие таблы отдельный view.
Vik
Местный житель
Сообщения: 370
Зарегистрирован: 28 сен 2006, 15:43
Откуда: Санкт-Петербург
Контактная информация:

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

Сообщение Vik »

edward_K писал(а):ообще getfirst where да и вообще getfirst плохой тон
Ладно, getFirst where, но getFirst -то с каких пор стал нежелательным?) Что тогда вместо него использовать для позиционирования?
galover писал(а):RecordExists не всегда правильно работает, лучше отказаться от него в пользу IsValid (если view без имени) и IsValidAll (если вьюха именованная)
Эти функции работают, если запись была предварительно считана в буфер. А если она считана не была, isValid не поможет, если необходимо узнать, существует ли в таблице запись. А RecordExists всегда посылает запрос к серверу.
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

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

Сообщение galover »

Эти функции работают, если запись была предварительно считана в буфер. А если она считана не была, isValid не поможет, если необходимо узнать, существует ли в таблице запись. А RecordExists всегда посылает запрос к серверу.
По собственному опыту пишу. RecordExists возвращал неправильное значение, заменил на IsValid все заработало, так что нафиг-нафиг. По поводу getFirst тоже не врубился в чем криминал, всегда использую, пока не подводил
Vik
Местный житель
Сообщения: 370
Зарегистрирован: 28 сен 2006, 15:43
Откуда: Санкт-Петербург
Контактная информация:

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

Сообщение Vik »

Да я и сам пару раз натыкался на косяки при работе с RecordExists. Я лишь обратил внимание, в каких ситуациях isValid бесполезна.
Ответить