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

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

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

Ответить
ENB83
Новичок
Сообщения: 23
Зарегистрирован: 19 мар 2008, 11:57
Откуда: Новосибирск

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

Сообщение 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
));
Den
Местный житель
Сообщения: 1842
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Сообщение Den »

А у Вас по одному SpStep.nRec могут быть два разных SpStep.PRMC ?
ENB83
Новичок
Сообщения: 23
Зарегистрирован: 19 мар 2008, 11:57
Откуда: Новосибирск

Сообщение ENB83 »

Да, по одному SpStep.nRec могут быть два разных SpStep.PRMC.
Den
Местный житель
Сообщения: 1842
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Сообщение Den »

Хм...поле PRMC одно единственное на запись с определенным нрек.
У Вас одновременно в этом поле хранится и 1 и 2 ?
ENB83
Новичок
Сообщения: 23
Зарегистрирован: 19 мар 2008, 11:57
Откуда: Новосибирск

Сообщение ENB83 »

Нет. я так не думаю. Мне бы понять что значит "нужен ключ NREC+PRMC для SPSTEP" ?

Я просто хочу выводить только те записи которые удовлетворяют условию SpStep.PRMC=word(2)
Den
Местный житель
Сообщения: 1842
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Сообщение Den »

ну мессаг грит что нет нужного индеса по полям таким. Вот и все.
Как вариант можно сделать :

.create view vSpStep
from
SpStep (ReadOnly),
KatParty (ReadOnly)
where
((
PosNRec == SpStep.nRec
and (word(2)=SpStep.PRMC)
and SpStep.cParty == KatParty.nRec
));
ENB83
Новичок
Сообщения: 23
Зарегистрирован: 19 мар 2008, 11:57
Откуда: Новосибирск

Сообщение ENB83 »

Да, Вы правы. Этот вариант самый подходящий. Спасибо!
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

лучше писать
word(2)==SpStep.PRMC (noindex)
такая конструкция пашет надежней, а "=" в "(())" иногда глючит , тогда лучше это за скобки выносить, кроме того = задает условие жесткой подцепки на всю вьюху.
Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

Сообщение Алексей »

не согласен. как раз сегодня писал

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

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 )  
Den
Местный житель
Сообщения: 1842
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Сообщение 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. Теоретически такая конструкция медленнее узлового фильтра, поскольку вначале проверяются вся связки тип == а только потом накладывается фильтр на проверку. При узловом же фильтре отсекается на нужном узле и длее проверка не производится. Разница будет тем больше, чем больше узлов задействовано в ЛТ
Ответить