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

Помогите с запросом

Добавлено: 25 окт 2005, 15:25
Napalm
добрый день. помогите пожалуйста с запросом.
на sql это выглядит так

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

delete
FROM  rzkutprih
WHERE (OSTATOK = 0) AND (DDOC < '2005-01-01') AND (NREC NOT IN
                   (SELECT crzprih
                    FROM   rzkutrash
                    WHERE ddoc > '2005-01-01'))
как это будет выгдялеть в support?

Добавлено: 25 окт 2005, 16:43
Den
посмотри что выберет данный селект :

select * from rzkutprih, rzkutrash
WHERE ((date(01,01,205)>>=rzkutprih.ddoc
rzkutprih.nrec==rzkutrash.crzprih
date(01,01,205)<<=rzkutprih.ddoc
))
and not isvalidall(tnrzkutrash)

Добавлено: 25 окт 2005, 16:45
Den
and -ы доставишь где надо, забыл я вспешке....

Добавлено: 25 окт 2005, 17:52
Napalm
нет, абсолютно не оно... выбирает пустую запись. хотя по идее должно выбрать тыщ 700.
хотя даже если убираю последнюю строчку совершенно не понятную для меня то как бы должно что-то выбираться. а-н нет.

PS ошибку в дате увидел. это не из-за нее

Добавлено: 25 окт 2005, 18:29
Den
Странно..уж селект проще некуда. Какая то мелочь тут...давай поэтапно отлавливать :

select * from rzkutprih
WHERE ((date(01,01,2005)>>=rzkutprih.ddoc ));

select * from rzkutprih, rzkutrash
WHERE ((date(01,01,2005)>>=rzkutprih.ddoc
rzkutprih.nrec==rzkutrash.crzprih ));

Добавлено: 25 окт 2005, 18:59
Napalm
оба хорошо работают. вроде как надо. я сам так с самого начала делал. потом написал в нормальном sql и обратился сюда с вопросом :)
по первому вопросов нет. второй тоже подцепляет все расходы по выбраным приходам.

далее мне надо чтобы добавочно накладывалось ограничение на приход а не на расход. вот тут собака порылась. Задача стоит выбрать все записи ПРИХОДА весь расход по которым был до date(1,1,2005)

Добавлено: 25 окт 2005, 19:17
Den
У меня розница не ведется, поэтому по обычным накладнухам и соответсвующим им складским ордерам :

select k.nsopr,k.dsopr,k.summa,s.dord from katsopr k,sklorder s
where ((201==k.vidsopr
and date(01,09,2005)<<=k.dsopr
and date(30,09,2005)>>=k.dsopr
and k.nrec==s.csopr
and date(30,09,2005)<<=s.dord
)) and s.dord<>date(0,0,0);

у тебя вроде по аналогии. По крайней мере у меня этот селект все правильно выбирает

Добавлено: 25 окт 2005, 19:22
Napalm
это аналогия с твоим первым вариантом без последней строки... чуть не то. второе ограничение даты ограничивает таблицу расходов, а надо чтобы приходов...

Добавлено: 25 окт 2005, 19:55
WiRuc

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

create view v_rzkutprih
as select rzkutprih.nrec
from rzkutprih, rzkutrash
where
  ((date(01,01,2005) >> rzkutprih.ddoc and
    double(0) == rzkutprih.ostatok (noindex) and
    rzkutprih.nrec == rzkutrash.crzprih and
    date(01,01,2005) <<= rzkutrash.ddoc))
  and (not IsValidAll(tnrzkutrash));    

Добавлено: 25 окт 2005, 20:00
Den
Хм...вроде же все так. Должен такой селект отрабатывать,если ты точно знаешь что есть такие записи в таблицах..

select * from rzkutprih, rzkutrash
WHERE ((date(01,01,2005)>>=rzkutprih.ddoc
rzkutprih.nrec==rzkutrash.crzprih
date(01,01,2005)<<=rzkutrash.ddoc)) ;

Добавлено: 25 окт 2005, 20:05
Den
И вообще,насколько я понимаю, твой приведенный пример в первом сообщении

delete
FROM rzkutprih
WHERE (OSTATOK = 0) AND (DDOC < '2005-01-01') AND (NREC NOT IN
(SELECT crzprih
FROM rzkutrash
WHERE ddoc > '2005-01-01'))

удаляет (выбирает) записи из rzkutprih по которым нет расхода позже 01012005.

А ниже ты пишешь : Задача стоит выбрать все записи ПРИХОДА весь расход по которым был до date(1,1,2005)

Добавлено: 26 окт 2005, 11:38
Napalm
Den
да, так и есть. это ведь фактически одно и тоже.
нет расхода позже 01012005
и
расход по которым был до date(1,1,2005)

Добавлено: 26 окт 2005, 12:29
Den
Хм...а записи по которым вообще не было расхода . Они ведь тоже попадут в выборку в этом варианте :

WHERE (OSTATOK = 0) AND (DDOC < '2005-01-01') AND (NREC NOT IN
(SELECT crzprih
FROM rzkutrash
WHERE ddoc > '2005-01-01'))

Добавлено: 26 окт 2005, 12:36
Napalm
нет не попадут. за это отвечает OSTATOK = 0. это условие говорит о том что с данного конкретного прихода уже все продано.

а что значит запись

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

and not isvalidall(tnrzkutrash)
?

Добавлено: 26 окт 2005, 13:11
Den
Понятненько. Все странно что не выбирает то,что надо

Это галактический вариант конструкции TSQL "not in select..."

Метод IsValidAll (Integer) : Boolean

Назначение

Возвращает логическую истину, если есть текущая позиция в узле iLeaf логической таблицы. В случае отсутствия позиции нельзя вызывать позиционно зависимые модификаторы (Update, Delete, GetNext, GetPrev) - будет возвращен код ошибки.


Описание


function IsValidAll (iLeaf : Integer) : Boolean;


Параметры


iLeaf : Integer - номер узла, в котором нужно проверить наличие позиции (константа tn<имя узла>).


Возвращаемое значение


Возвращает True, если есть текущая позиция в узле iLeaf логической таблицы, иначе - False.


Замечания


Позиция может отсутствовать в следующих случаях:


· после входа в интерфейс, если нет записей в таблице;

· после удаления записи;

· после операций навигации со старшими узлами логической таблицы.