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

Запрос не архивных МЦ

Добавлено: 01 авг 2014, 18:18
sim
Помогите составить запрос на выгрузку не архивных матценностей из каталога МЦ

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

select katmc.name, katmc.barkod, katmc.OKDP, katmc.TNVED, maskmc.name, TypeMC.Name 
from katmc, maskmc, typeMC 
where
((
'0' == katmc.isarch and 
'ТОВАРЫ' /== typeMC.Name and 
typeMC.Nrec /== katmc.cType and 
katmc.cmaskmc == maskmc.nrec
)) 
to dbf;
Ругается так: Нужен ключ ISARCH+CTYPE для katmc

Re: Запрос не архивных МЦ

Добавлено: 01 авг 2014, 19:13
Zver
Поля, которые не участвуют в индексе нужно пометить ключевым словом 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 (noindex)
katmc.cmaskmc == maskmc.nrec 
))
to dbf;
Если индекс использовать всё-таки хочется, то можно обойти используя условие больше или меньше (не более оlного на таблицу):

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

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;

Re: Запрос не архивных МЦ

Добавлено: 01 авг 2014, 20:02
edward_K
почти так 8) .
1. (noindex) нужно сразу после поля, а не через and
2. указывать 1 нужно по возможности только у второстепенных полей - в данном случае у признака архива(по cType видимо индекс есть)
3. условий <<= >>= может быть несколько на один узел(последние в условиях по индексу), на другие опять же (noindex)
4. Возможны и более сложные фильтрации в () внутри (()) или за )). Для VIP разница есть поскольку в первом случае условие применяется к конкретной таблице( после поля которой задаете) , а во втором ко всему запросу

Простой апдейт поля

Добавлено: 03 авг 2014, 20:10
sim
С этим разобрались. Работает. Спасибо за помощь.
А вот теперь как проапдейтить поле, нужно подвязать известный NREC шаблона, для выборки матценностей одного типа.

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

Update katmc
where
((
'СЫРЬЕ И МАТЕРИАЛЫ' /== typeMC.Name and
typeMC.Nrec /== katmc.cType
))
Set katmc.cmaskmc:=4611794353132940000;

В ответ на вышеприведенный код ругается так:
Предупреждение: неявное добавление таблицы TYPEMC в логическую таблицу РАБОЧАЯ ТАБЛИЦА...
Кроме того, затирает нулем уже имеющееся значение поля katmc.cmaskmc

Re: Запрос не архивных МЦ

Добавлено: 03 авг 2014, 20:31
RAJAH
sim
Можно же узнать NREC записи в таблице TYPEMC, соответствующей "СЫРЬЮ И МАТЕРИАЛАМ". Тогда можно опустить упоминание TYPEMC.

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

update katmc
where
((
<<NREC из TYPEMC>> /== cType
))
set cmaskmc:=4611794353132940000;

Re: Запрос не архивных МЦ

Добавлено: 04 авг 2014, 02:23
edward_K
При update честь сложности. Таблица для update должна быть главной, то есть не должно быть условий где поля из нее справа а слева поля другой таблицы( константы допускаются). Если нужно , то можно переписать запрос чтобы typemc была дочерней и использовать no index + жесткие подцепки по typemc. Ну либо генерите выражения в текстовый файл, а потом его запускаете

Перевод из десятичного в шестнадцатиричный

Добавлено: 04 авг 2014, 19:57
sim
Явное указание NREC помогло, апдейт проходит, спасибо.
Еще подскажите - каким образом обработать NREC в десятичном виде (в какие-то хитрые скобки заключить), чтобы апдейт его понял?
Сейчас проходит только если указать в шестнадцатиричном виде.

Re: Запрос не архивных МЦ

Добавлено: 04 авг 2014, 20:02
edward_K
да вроде и так всегда пахало.
Ну если хочется можно написать comp()