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

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

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

Napalm
Сообщения: 9
Зарегистрирован: 25 окт 2005, 14:39

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

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

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

Сообщение Den »

and -ы доставишь где надо, забыл я вспешке....
Napalm
Сообщения: 9
Зарегистрирован: 25 окт 2005, 14:39

Сообщение Napalm »

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

PS ошибку в дате увидел. это не из-за нее
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Сообщение 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 ));
Napalm
Сообщения: 9
Зарегистрирован: 25 окт 2005, 14:39

Сообщение Napalm »

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

далее мне надо чтобы добавочно накладывалось ограничение на приход а не на расход. вот тут собака порылась. Задача стоит выбрать все записи ПРИХОДА весь расход по которым был до date(1,1,2005)
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Сообщение 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);

у тебя вроде по аналогии. По крайней мере у меня этот селект все правильно выбирает
Napalm
Сообщения: 9
Зарегистрирован: 25 окт 2005, 14:39

Сообщение Napalm »

это аналогия с твоим первым вариантом без последней строки... чуть не то. второе ограничение даты ограничивает таблицу расходов, а надо чтобы приходов...
WiRuc
Местный житель
Сообщения: 414
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Воронеж

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

Сообщение Den »

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

select * from rzkutprih, rzkutrash
WHERE ((date(01,01,2005)>>=rzkutprih.ddoc
rzkutprih.nrec==rzkutrash.crzprih
date(01,01,2005)<<=rzkutrash.ddoc)) ;
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Сообщение 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)
Napalm
Сообщения: 9
Зарегистрирован: 25 окт 2005, 14:39

Сообщение Napalm »

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

Сообщение Den »

Хм...а записи по которым вообще не было расхода . Они ведь тоже попадут в выборку в этом варианте :

WHERE (OSTATOK = 0) AND (DDOC < '2005-01-01') AND (NREC NOT IN
(SELECT crzprih
FROM rzkutrash
WHERE ddoc > '2005-01-01'))
Napalm
Сообщения: 9
Зарегистрирован: 25 окт 2005, 14:39

Сообщение Napalm »

нет не попадут. за это отвечает OSTATOK = 0. это условие говорит о том что с данного конкретного прихода уже все продано.

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

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

and not isvalidall(tnrzkutrash)
?
Den
Местный житель
Сообщения: 1844
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Сообщение Den »

Понятненько. Все странно что не выбирает то,что надо

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

Метод IsValidAll (Integer) : Boolean

Назначение

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


Описание


function IsValidAll (iLeaf : Integer) : Boolean;


Параметры


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


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


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


Замечания


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


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

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

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