[ТЕМА ЗАКРЫТА]
06.07.2012 11:44
Mr_Vito
 
Как найти товар, который отсутствовал в контрактах на момент прихода?
06.07.2012 12:17
Mr_Vito
 
да, по приходам
06.07.2012 12:23
akonev
 
с контрактами как работаете?

закрыаете старые, открываете новые?
делаете новые редакции?
правите старые контракты?
06.07.2012 12:44
Mtirt
 
Что-то типа этого?
Код:
 select distinct c.article from smdocuments d, smspec c
where d.doctype=c.doctype
and d.id=c.docid
and d.docstate>=2
and d.createdat between &DateStart and &DateEnd
and d.doctype='WI'

minus
(select distinct c1.article from smdocuments d1, smspec c1, smcontracts k
where
d1.doctype=c1.doctype
and d1.id=c1.docid
and d1.docstate>=2
and k.id=d1.id
and k.doctype=d1.doctype
and k.beginsat<=&DateStart and (k.endsat>=&DateEnd or k.endsat is null)
and d1.doctype='CO')
Прости, особо не проверяла, набросала за пару свободных минут...
09.07.2012 11:54
Mr_Vito
 
спасибо,
я не много переделал твой запрос, тока теперь не работает :(
точнее у меня видимо мозги не так вставлены, поэтому результата выполнения запроса я не дождался :(
буду думать, как по другому сделать
Код:
select distinct q2.clientindex, q2.locationto, q2.createdat, q1.article
from smspec q1, smdocuments q2
    where q1.doctype=q2.doctype
      and q1.docid=q2.id
      and q1.doctype='WI'
      and q2.doctype='WI'
      and q2.opcode=0
      and q2.docstate>=2
      and q2.createdat BETWEEN &DateStart and &DateEnd
MINUS      
select distinct s1.clientindex, s1.locationto, s1.createdat, d2.article
    from smdocuments s1, smspec s2, smdocuments d1, smspec d2, SMContractLocations d3, smcontracts d4 
    where s2.doctype=s1.doctype
      and s2.docid=s1.id
      and s2.doctype='WI'
      and s1.doctype='WI'
      and s1.opcode=0
      and s1.docstate>=2
      and s1.createdat BETWEEN &DateStart and &DateEnd

      and d1.doctype='CO'
      and d2.doctype=d1.doctype
      and d2.docid=d1.id
      and d2.doctype='CO'
      and d3.doctype=d1.doctype
      and d3.id=d1.id
      and d3.doctype='CO'
      and d4.doctype=d1.doctype
      and d4.id=d1.id
      and d4.doctype='CO'
      and d4.endsat >= &DateStart 
    
      and s1.createdat BETWEEN d4.beginsat and d4.endsat
      and s2.article=d2.article
      and s1.locationto=d3.locationid
      and s1.clientindex=d1.clientindex
09.07.2012 12:30
Mtirt
 
Нескромный вопрос, а зачем во второй половине запроса выбираются приходные накладные?

Добавлено через 22 минуты 56 секунд
Код:
select distinct q2.clientindex, q2.locationto, q1.article
from smspec q1, smdocuments q2
    where q1.doctype=q2.doctype
      and q1.docid=q2.id
      and q1.doctype='WI'
      and q2.doctype='WI'
      and q2.opcode=0
      and q2.docstate>=2
      and q2.createdat BETWEEN &DateStart and &DateEnd
MINUS      
select distinct d1.clientindex, d3.locationid,  d2.article
    from smdocuments d1, smspec d2, SMContractLocations d3, smcontracts d4 
    where 
d1.doctype='CO'
      and d2.doctype=d1.doctype
      and d2.docid=d1.id
      and d2.doctype='CO'
      and d3.doctype=d1.doctype
      and d3.id=d1.id
      and d3.doctype='CO'
      and d4.doctype=d1.doctype
      and d4.id=d1.id
      and d4.doctype='CO'
      and d4.endsat >= &DateStart 
      and d4.beginsat <= &Dateend and (d4.endsat>=&dateStart or d4.endsat is null)
09.07.2012 12:46
Mr_Vito
 
ради этой строчки
and s1.createdat BETWEEN d4.beginsat and d4.endsat

контракт может действовать всего неделю, потом позицию из контракта вывели, т.е. заблокировали, новый контракт сделали, поставщик всё равно везет (даже без заказа, или с заказом, по сговору)
поэтому я проверяю что бы дата документа была внутри действия дат контракта

или я не прав?
09.07.2012 12:48
Mtirt
 
Да я по тому же принципу действую, только немного другим способом:
1. Выбираю все артикула из приходных накладных за период.
2. Выбираю все артикула, по которым есть действующие контракты.
3. Нахожу позиции, которые есть в пункте 1 и нет в пункте 2.

Пример я выше привела.
И вообще, в исходном посте речь вообще шла про дату ( я это понимаю, как один день)...
09.07.2012 13:04
Mr_Vito
 
Цитата:
Andrew_Konev с контрактами как работаете?

закрыаете старые, открываете новые?
делаете новые редакции?
правите старые контракты?

закрываем старые, открываем новые

Добавлено через 14 минут 40 секунд
Цитата:
Mtirt Да я по тому же принципу действую, только немного другим способом:
1. Выбираю все артикула из приходных накладных за период.
2. Выбираю все артикула, по которым есть действующие контракты.
3. Нахожу позиции, которые есть в пункте 1 и нет в пункте 2.

Пример я выше привела.
И вообще, в исходном посте речь вообще шла про дату ( я это понимаю, как один день)...
Если начало действия контракта (d4.beginsat) меньше даты начала рассматриваемого периода &DateStart
этот контракт не попадет

Если конец действия контракта (d4.endsat) меньше даты конца рассматриваемого периода &dateEnd
этот контракт не попадет

например: если контракт действует с (beginsat)20.04.12 по (endsat)10.05.12
период с 1.05.12(DateStart) по 31.05.12 (dateEnd)
документ за 4.05.12 число
в данном случае условия:
and d4.beginsat BETWEEN &DateStart and &Dateend
and (d4.endsat>=&dateEnd or d4.endsat is null)
некорректны
09.07.2012 13:07
Mtirt
 
А если такое условие: and d4.beginsat <= &Dateend and (d4.endsat>=&dateStart or d4.endsat is null) ?

Правда в любом случае, это будет не совсем корректно.
Лучше в условия запроса давать одну дату.
09.07.2012 13:19
Mr_Vito
 
спасибо, но
как то это не правильно,
надо всё таки мой вариант довести до ума, что б работал и не висел сутками, пока не знаю как, буду дальше думать
09.07.2012 16:35
akonev
 
соблюдение цепочки контракт-заказ-приход у вас обязательно?
может подумать в сторону отслеживание цепочки и сверки каждой накладной с конкретным контрактом?
09.07.2012 18:11
vdm
 
Цитата:
Mr_Vito надо всё таки мой вариант довести до ума, что б работал и не висел сутками, пока не знаю как, буду дальше думать
Насколько долго твой запрос работает?

Это проверь
Код:
SELECT createdat, clientindex, locationto, article
  FROM (SELECT DISTINCT	q2.createdat, q2.clientindex, q2.locationto, q1.article
          FROM smspec q1, smdocuments q2
		 WHERE 	 q1.doctype = q2.doctype
		   AND q1.docid = q2.id
		   AND q1.doctype = 'WI'
		   AND q2.opcode = 0
		   AND q2.docstate >= 2
		   AND q2.createdat BETWEEN :datestart AND :dateend) m
 WHERE NOT EXISTS
		(SELECT 1
		   FROM smdocuments d1,
		        smspec d2,
				smcontractlocations d3,
				smcontracts d4
		  WHERE	d1.doctype = 'CO'
		    AND d2.doctype = d1.doctype
			AND d2.docid = d1.id
			AND d3.doctype = d1.doctype
			AND d3.id = d1.id
			AND d4.doctype = d1.doctype
			AND d4.id = d1.id
			AND m.createdat BETWEEN NVL (d4.beginsat, m.createdat)
						       AND NVL (d4.endsat, m.createdat)
			AND d1.clientindex = m.clientindex
			AND d3.locationid = m.locationto
			AND d2.article = m.article)
Посмотрел только, что запускается, результаты не проверял.
10.07.2012 07:44
Mr_Vito
 
Цитата:
vdm Насколько долго твой запрос работает?
вчера за 5 часов висел, пока не оборвал

Цитата:
vdm Это проверь
Код:
SELECT ...
Посмотрел только, что запускается, результаты не проверял.
здорово!
Всё отлично работает и быстро, спасибо огромное!
10.08.2012 10:05
konst
 
Вот еще один вариант решения похожей задачи:
https://olegon.ru/showpost.php?p=102562&postcount=2
Опции темы


Часовой пояс GMT +3, время: 05:11.

 

Форум сделан на основе vBulletin®
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot и OlegON
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.