Страница 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. это условие говорит о том что с данного конкретного прихода уже все продано.
а что значит запись 
?
 
			 
			
					
				
				Добавлено: 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.  
 
  
 Замечания  
 
  
 Позиция может отсутствовать в следующих случаях:  
 
  
 · после входа в интерфейс, если нет записей в таблице;  
 
 · после удаления записи;  
 
 · после операций навигации со старшими узлами логической таблицы.