Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 НЕ могу придумать алгоритм.  [new]
ХондаВод
Guest
Есть запрос на выборку продаж изделий клиентам, за период с склада. Допустим изделия это ручки, 001-это штрихКод, он уникален. Рассмотрим в рамках одного штрихкода.
Где штрихКод- identifier, Дата продажи-DateProd, Вес штрихКода-ves. Рассмотрим продажу изделий клиентам за период с 1.8.2011 по 31.8.2011.
SELECT identifier,DateProd,ves
FROM dbo.Prodazhi
where DateProd>=@Fdate and dateProd<dateadd(d,1,@Ldate)
Далее есть запрос. На выборку прихода от поставщиков изделий, в нашем случае штрихкода 001 к нам на склад. Т.е. когда и по какому договору к нам на склад пришло это изделие. Допустим ШтрихКод 001 пришел 1.6.2011 по договору поставки №1, затем он же был продан 15.08.2011 клиенту, 17.08.2011 клиент вернул изделие нам, ввиду того что брак. и Мы его вернули поставщику 21.08.2011 по договору поставки №1. Поставщик сделал это изделие и вернул его нам только уже по другому договору поставки №2 24.08.2011.
Теперь не могу продумать алгоритм.
Пользователь задает период продаж и договор по которому пришел этот штрихКод. Как мне вытащить продажи по конкретному договору?
Я как делал. Брал все приходы по договору №1 до конечной даты введенного пользователем
select identifier,dogovor,DatePrihod
into #t
from dbo.Prihod
where DatePrihod<@Ldate and dogovor=@dogovor

SELECT p.identifier,t.dogovor,p.DateProd
FROM dbo.Prodazhi as p
inner join #t as t on p.identifier=p.identifier
where p.DateProd>=@Fdate and dateProd<dateadd(d,1,@Ldate)
Что мы получаем в итоге. что по договору №1 штрихкод 001 был продан 15.08.2011, а если пользователем выберет тот же период с 1.8.2011 по 31.8.2011, только по договору №2, то этот Штрихкод попадет и в эту отгрузку по договору №2. А Это неправильно. т.к. он был продан раньше, чем приход по договору №2. Я хотел поставить ограничения на проверку даты, между приходом и отгрузкой,но... а если будет такой случай
Приход от поставщика 1.6.2011 договор №1
Возврат поставщику 15.8.2011 договор №1
Приход от поставщика 20.8.2011 договор №2
Продажа клиенту 23.8.2011

То в этом случае продажа прошла по договору №2..т.к. последний приход был 20.8.2011 года. по договору №1 запрос не должен выдать ничего. и таких приходов и возвратов поставщику по одному штрихкоду может быть несколько, штрихкод может уходить, приходить.
что в итоге мы имеем.
Таблицу приход от поставщика:
штрихкоддоговорДата прихода
001договор №11.6.2011
001договор №224.8.2011

Таблицу возврат поставщику
штрихкоддоговорДата возврата
001договор №121.8.2011


Продажа клиенту
штрихКоддата продажи
00115.8.2011


Возврат от клиента
штрихКоддата возврата
00117.8.2011


Нужно получить результат:
штрихКоддоговорДата продажидата прихода
001договор №115.8.20111.6.2011
29 сен 11, 18:32    [11357722]     Ответить | Цитировать Сообщить модератору
 Re: НЕ могу придумать алгоритм.  [new]
aleks2
Guest
1. Ничо не понял.

2. Шоб не изобретать непромокаемый порох, советую продажам и т.п. приписывать номер договора поставки ЯВНО.

3. Иначе только господь бог могет определить продали "договор №1" или "договор №2".
29 сен 11, 18:56    [11357816]     Ответить | Цитировать Сообщить модератору
 Re: НЕ могу придумать алгоритм.  [new]
AHDP
Member

Откуда:
Сообщений: 1226
Select Prih.Indentifer, Prih.Dogovor, Prod.DateProd, Prih.DatePrihod
From Prodazhi Prod Join
(
Select Ds.Identifer, Ds.dogovor, Ds.DatePrihod -- их может быть несколько?
From Prihod Ds
Join Prihod Wh On Ds.Indentifer = Wh.Indentifer And Wh.Dogovor =@Dogovor -- в предположении, что в одном договоре уникальность гарантируется
) Prih on Prod.Indentifer = Prih.Indentifer And Prod.DateProd >= Prih.DatePrihod And Prih.Dogovor =@Dogovor
29 сен 11, 22:53    [11358684]     Ответить | Цитировать Сообщить модератору
 Re: НЕ могу придумать алгоритм.  [new]
shut-up-and-skate
Member

Откуда: ВАО
Сообщений: 4259
ХондаВод,

ваша проблема в том что вы не делаете различий между дистрибьютором и покупателем!
30 сен 11, 08:42    [11359457]     Ответить | Цитировать Сообщить модератору
 Re: НЕ могу придумать алгоритм.  [new]
shut-up-and-skate
Member

Откуда: ВАО
Сообщений: 4259
Таблица накладные NAKL.
ХондаВод
Допустим ШтрихКод 001 пришел 1.6.2011 по договору поставки №1,

добавление в NAKL все необходимых данных и в поле состояние NAKL_STATE = 1 (штрихкод пришел)
ХондаВод
затем он же был продан 15.08.2011 клиенту
NAKL_STATE = 2 (штрихкод продан) добавляется ссылка на информацию о покупателе
ХондаВод
17.08.2011 клиент вернул изделие нам, ввиду того что брак
NAKL_STATE = 3 (брак)
ХондаВод
Мы его вернули поставщику 21.08.2011 по договору поставки №1
NAKL_STATE = 4 (возврат брака) добавляется ссылка на форму возврата по браку

Все. Это полный цикл. Все что дальше - не относится к этой детали.
30 сен 11, 08:53    [11359481]     Ответить | Цитировать Сообщить модератору
 Re: НЕ могу придумать алгоритм.  [new]
ХондаВод
Guest
Я не понял вот тут, сколько раз так join писать
AHDP
Select Ds.Identifer, Ds.dogovor, Ds.DatePrihod -- их может быть несколько? 
From Prihod Ds
   Join Prihod Wh On Ds.Indentifer = Wh.Indentifer And  Wh.Dogovor =@Dogovor -- в предположении, что в одном договоре уникальность гарантируется

Один и тот же штрихКод, может уходить поставщику и приходить от него же несколько раз (больше двух раз). Может в случае брака, может просто так. И между этими приходами, может пройти продажа. Моя задача определить, по какому договору прихода прошла продажа.
30 сен 11, 09:20    [11359536]     Ответить | Цитировать Сообщить модератору
 Re: НЕ могу придумать алгоритм.  [new]
Snirk
Member

Откуда:
Сообщений: 6
ХондаВод,

Рассмотрим ситуацию:
01.01.2001 по Договору 1 пришел Штрих-код 1 в количестве 5 шт
02.02.2001 по Договору 2 пришел то же Штрих код 1 в количестве еще 5 шт (Итого стало 10 на складе)
03.03.2001 прошла продажа 4 штук Штрих-кода 1

В вашей модели принципиально не возможно определить продажа с какого прихода произошла. Более того, представьте что это, например, подсолнечное масло... Если на складе разные партии не разделялись, то как физически вы различите одинаковые товары с 2-х разных партий?

Как вариант для учета и привязки продаж к договорам - использовать FIFO для списания товара с остатков на складе.

Тогда в моем примере продажу от 03.03.2001 стоит отнести к Договору 1 (так как поставка была раньше, и остатки еще не нулевые), а если будет следующая продажа, например, 04.04.2001 в количестве 3 штуки, то 1 штука из этих 3-х должна быть отнесена к договору 1, а еще 2 - к Договору 2.

Как-то так.
30 сен 11, 10:44    [11360080]     Ответить | Цитировать Сообщить модератору
 Re: НЕ могу придумать алгоритм.  [new]
ХондаВод
Guest
Snirk
ХондаВод,

Рассмотрим ситуацию:
01.01.2001 по Договору 1 пришел Штрих-код 1 в количестве 5 шт
02.02.2001 по Договору 2 пришел то же Штрих код 1 в количестве еще 5 шт (Итого стало 10 на складе)
03.03.2001 прошла продажа 4 штук Штрих-кода 1


Как я писал выше. ШтрихКод - уникален. Ручек или подсолнечных масел может быть много. Но у каждого товара свой штрихКод. Не может прийти по договору 1 , штрихКода 1 в количестве 5 штук. Только в количестве 1 штука. Для определения по какому договору пришел штрихкод, нужно определить последний приход этого штрихкода без учета возврата. Т.е. если был возврат поставщику, то приход считать закрытым.
30 сен 11, 11:23    [11360502]     Ответить | Цитировать Сообщить модератору
 Re: НЕ могу придумать алгоритм.  [new]
Snirk
Member

Откуда:
Сообщений: 6
Создайте табличку (временную или постоянную) примерно из такого запроса
SELECT identifier,DateProd, dogovor, 1 AS qty
  FROM dbo.Prihod

  UNION ALL
  
  SELECT identifier,DateProd, dogovor,-1 AS qty
  FROM dbo.VozvratyPostavschiku -- или как там у вас называется таблица, в которй хранятся возвраты поставщику
  
  UNION ALL
  
  SELECT identifier,DateProd, NULL, -1 AS qty
  FROM dbo.Prodazhi
  
  UNION ALL
  
  SELECT identifier,DateProd, NUll, 1 AS qty
  FROM dbo.VozvrOtKlienta

В табличке, само - собой должен быть еще PK, например identity

Потом пробегите эту табличку ORDER BY ProdDate и там где dogovor IS NULL апдейтните поле dogovor примерно так
UPDATE #AllMovements a
SET dogovor = ( SELECT TOP 1 aa.dogovor
                FROM #AllMovements aa
                WHERE aa.dogovor IS NOT NULL
                GROUP BY aa.dogovor
                HAVING SUM(qty) > 0
                ORDER BY aa.DateProd
                )
WHERE PK = [PK первого встерченного NULL d поле dogovor, ORDER BY DateProd]
И будут у вас все движения (продажи, возвраты) привязаны к договору. Дата первой поставки вытягивается элементарно, если есть договор.

По сути факт наличия такой таблички в БД и есть то, о чем говорил aleks2 в п.2 (в интерпретации через FIFO)
30 сен 11, 12:51    [11361594]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить