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

Ошибка при компиляции

Добавлено: 16 апр 2008, 14:08
ENB83
//вот так всё работает

.create view vSpStep
from
SpStep (ReadOnly),
KatParty (ReadOnly)
where
((
PosNRec == SpStep.nRec
and SpStep.cParty == KatParty.nRec
));



//после добавленя строки and word(2)==SpStep.PRMC
//компилятор ругается "нужен ключ NREC+PRMC для SPSTEP"
//Как правельно вставить это условие "word(2)==SpStep.PRMC"
//во вьюху?

.create view vSpStep
from
SpStep (ReadOnly),
KatParty (ReadOnly)
where
((
PosNRec == SpStep.nRec
and SpStep.cParty == KatParty.nRec
and word(2)==SpStep.PRMC
));

Добавлено: 16 апр 2008, 14:25
Den
А у Вас по одному SpStep.nRec могут быть два разных SpStep.PRMC ?

Добавлено: 16 апр 2008, 14:41
ENB83
Да, по одному SpStep.nRec могут быть два разных SpStep.PRMC.

Добавлено: 16 апр 2008, 14:44
Den
Хм...поле PRMC одно единственное на запись с определенным нрек.
У Вас одновременно в этом поле хранится и 1 и 2 ?

Добавлено: 16 апр 2008, 14:57
ENB83
Нет. я так не думаю. Мне бы понять что значит "нужен ключ NREC+PRMC для SPSTEP" ?

Я просто хочу выводить только те записи которые удовлетворяют условию SpStep.PRMC=word(2)

Добавлено: 16 апр 2008, 15:06
Den
ну мессаг грит что нет нужного индеса по полям таким. Вот и все.
Как вариант можно сделать :

.create view vSpStep
from
SpStep (ReadOnly),
KatParty (ReadOnly)
where
((
PosNRec == SpStep.nRec
and (word(2)=SpStep.PRMC)
and SpStep.cParty == KatParty.nRec
));

Добавлено: 16 апр 2008, 15:10
ENB83
Да, Вы правы. Этот вариант самый подходящий. Спасибо!

Добавлено: 17 апр 2008, 10:22
edward_K
лучше писать
word(2)==SpStep.PRMC (noindex)
такая конструкция пашет надежней, а "=" в "(())" иногда глючит , тогда лучше это за скобки выносить, кроме того = задает условие жесткой подцепки на всю вьюху.

Добавлено: 17 апр 2008, 10:53
Алексей
не согласен. как раз сегодня писал

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

and arciznos.ckatos ==  katosARC.nrec
and (arcdate < katosARC.datv OR katosARC.datv=0 )
жесткой подцепки не получилось, пришлось ставить её самому

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

and arciznos.ckatos  /==  katosARC.nrec
and (arcdate < katosARC.datv OR katosARC.datv=0 )  

Добавлено: 17 апр 2008, 11:28
Den
edward_K писал(а):лучше писать
word(2)==SpStep.PRMC (noindex)
такая конструкция пашет надежней, а "=" в "(())" иногда глючит , тогда лучше это за скобки выносить, кроме того = задает условие жесткой подцепки на всю вьюху.
А мне кажется не так.. конструкция () внутри (()) - это узловой фильтр. Нужно его просто правильно применять. И не вполне понятна Ваша аналогия с жесткой подцепкой - такой фильтр просто фильтрует на n-м узле лог. таб. записи.
Возьмем простой пример :

select * from persons,lschet
where ((
persons.nrec==lschet.tperson
and (lschet.tabn<100)
and lschet.nrec == sumvidop.clsch
));

При отработке такой конструкции валидация узла lschet.nrec == sumvidop.clsch даже не будет проверяться, если таб № <100

Смысл же жесткой подцепки немного в другом.

Что касается того,что выносить за (()) :
1. Слышал от прикладников что лучше не применять подобную кострукцию.
2. Теоретически такая конструкция медленнее узлового фильтра, поскольку вначале проверяются вся связки тип == а только потом накладывается фильтр на проверку. При узловом же фильтре отсекается на нужном узле и длее проверка не производится. Разница будет тем больше, чем больше узлов задействовано в ЛТ