Страница 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 бесполезна.