Поля, которые не участвуют в индексе нужно пометить ключевым словом noindex. Простой способ, но время формирования запроса может быть большим, так как не используется индекс.
Прмерно вот так:
select katmc.name, katmc.barkod, katmc.OKDP, katmc.TNVED, maskmc.name, TypeMC.Name
from katmc, maskmc, typeMC
where
((
'ТОВАРЫ' /== typeMC.Name and
typeMC.Nrec /== katmc.cType and
'0' == katmc.isarch and
0 <<= KatMC.cType and
katmc.cmaskmc == maskmc.nrec
))
to dbf;
почти так .
1. (noindex) нужно сразу после поля, а не через and
2. указывать 1 нужно по возможности только у второстепенных полей - в данном случае у признака архива(по cType видимо индекс есть)
3. условий <<= >>= может быть несколько на один узел(последние в условиях по индексу), на другие опять же (noindex)
4. Возможны и более сложные фильтрации в () внутри (()) или за )). Для VIP разница есть поскольку в первом случае условие применяется к конкретной таблице( после поля которой задаете) , а во втором ко всему запросу
С этим разобрались. Работает. Спасибо за помощь.
А вот теперь как проапдейтить поле, нужно подвязать известный NREC шаблона, для выборки матценностей одного типа.
Update katmc
where
((
'СЫРЬЕ И МАТЕРИАЛЫ' /== typeMC.Name and
typeMC.Nrec /== katmc.cType
))
Set katmc.cmaskmc:=4611794353132940000;
В ответ на вышеприведенный код ругается так:
Предупреждение: неявное добавление таблицы TYPEMC в логическую таблицу РАБОЧАЯ ТАБЛИЦА...
Кроме того, затирает нулем уже имеющееся значение поля katmc.cmaskmc
При update честь сложности. Таблица для update должна быть главной, то есть не должно быть условий где поля из нее справа а слева поля другой таблицы( константы допускаются). Если нужно , то можно переписать запрос чтобы typemc была дочерней и использовать no index + жесткие подцепки по typemc. Ну либо генерите выражения в текстовый файл, а потом его запускаете
Явное указание NREC помогло, апдейт проходит, спасибо.
Еще подскажите - каким образом обработать NREC в десятичном виде (в какие-то хитрые скобки заключить), чтобы апдейт его понял?
Сейчас проходит только если указать в шестнадцатиричном виде.