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

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

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

Ответить
sim
Местный житель
Сообщения: 1805
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Россия

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

Сообщение 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
Zver
Местный житель
Сообщения: 204
Зарегистрирован: 13 ноя 2012, 12:47
Откуда: СПб
Контактная информация:

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

Сообщение 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;
Программист-самоучка
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

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

Сообщение edward_K »

почти так 8) .
1. (noindex) нужно сразу после поля, а не через and
2. указывать 1 нужно по возможности только у второстепенных полей - в данном случае у признака архива(по cType видимо индекс есть)
3. условий <<= >>= может быть несколько на один узел(последние в условиях по индексу), на другие опять же (noindex)
4. Возможны и более сложные фильтрации в () внутри (()) или за )). Для VIP разница есть поскольку в первом случае условие применяется к конкретной таблице( после поля которой задаете) , а во втором ко всему запросу
sim
Местный житель
Сообщения: 1805
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Россия

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

Сообщение sim »

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

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

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

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

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

Сообщение RAJAH »

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

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

update katmc
where
((
<<NREC из TYPEMC>> /== cType
))
set cmaskmc:=4611794353132940000;
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

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

Сообщение edward_K »

При update честь сложности. Таблица для update должна быть главной, то есть не должно быть условий где поля из нее справа а слева поля другой таблицы( константы допускаются). Если нужно , то можно переписать запрос чтобы typemc была дочерней и использовать no index + жесткие подцепки по typemc. Ну либо генерите выражения в текстовый файл, а потом его запускаете
sim
Местный житель
Сообщения: 1805
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Россия

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

Сообщение sim »

Явное указание NREC помогло, апдейт проходит, спасибо.
Еще подскажите - каким образом обработать NREC в десятичном виде (в какие-то хитрые скобки заключить), чтобы апдейт его понял?
Сейчас проходит только если указать в шестнадцатиричном виде.
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

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

Сообщение edward_K »

да вроде и так всегда пахало.
Ну если хочется можно написать comp()
Ответить