Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Помогите с запросом по регистру остатков. (число прочтений - 2449 )
VitGun
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 19
Зарегистрирован: 06. Июня 2006
Помогите с запросом по регистру остатков.
06. Января 2009 :: 06:36
Печать  
Есть регистр остатков с такой структурой
Измерения
Наименование Тип
Товар Справочник.Номенклатура
IMEI Строка(40)
Точка Справочник.Склады
Статус Перечисление.СтатусыТелефона
Покупатель Справочник.Контрагенты
Ресурсы
КолВо Число

Запись движений происходит так.
Документ "Приемная квитанция" делает ДвижениеПриходВыполнить со статусом "На гарантии"

Документ "Перемещение в СЦ" делает ДвижениеРасходВыполнить со статусом "На гарантии", потом ДвижениеПриходВыполнить со статусом "ВСц"
и т.д. всего 4 статуса.

задача - получить такую табличку
Товар IMEI Точка Покупатель Статус ДатаОтправкиВСЦ ДатаВозвратаИзСЦ

с первыми 5-ю колонками проблем нет. А вот когда пытаюсь получить ДатуОтправкиВСЦ - не все записи почему-то попадают в выборку, если выбирать только ДатуВозвратаИзСЦ - все ок.

запрос:

Код
Выбрать все
	|SELECT
	| $Рег.Товар as [Товар $Справочник.Номенклатура],
	| $Рег.IMEI as ИМЕИ,
	| $Рег.Точка as [Точка $Справочник.Склады],
	| $Рег.Покупатель as [Покупатель $Справочник.Контрагенты],
	| $Рег.Статус as [Статус $Перечисление.СтатусыТелефона],
	| (select
	|     cast(left(Жур.DATE_TIME_IDDOC,8) as datetime) [ДатаДок $Дата]
	|    from
	|     $Регистр.гар_Гарантия as Регг
	|    INNER JOIN
	|     _1Sjourn as Жур ON Жур.IDDoc = Регг.IDDoc
	|     AND $Регг.Статус = $Перечисление.СтатусыТелефона.ВСЦ AND Регг.DEBKRED=0 AND $Регг.Товар = $Рег.Товар AND $Регг.IMEI = $Рег.IMEI
	|     ) as ДатаОтправкиВСЦ,
	| (select
	|     cast(left(Жур.DATE_TIME_IDDOC,8) as datetime) [ДатаДок $Дата]
	|    from
	|     $Регистр.гар_Гарантия as Регг
	|    INNER JOIN
	|     _1Sjourn as Жур ON Жур.IDDoc = Регг.IDDoc
	|     AND $Регг.Статус = $Перечисление.СтатусыТелефона.ВозврИзСЦ AND Регг.DEBKRED=0 AND $Регг.Товар = $Рег.Товар AND $Регг.IMEI = $Рег.IMEI
	|     ) as ДатаВозврата
	| FROM
	|  $РегистрИтоги.гар_Гарантия as Рег
    |   WHERE
	|      (period = :ПредМесяц~~) AND $Рег.КолВо>0";

 




подкажите как правильно сделать?
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Помогите с запросом по регистру остатков.
Ответ #1 - 06. Января 2009 :: 13:00
Печать  
Это лучше делать регистром сведений (в своей табличке), не будет такого ужоса в запросах и работать будет гораздо быстрее система
У меня так фиксируется этап, исполнитель, момент времени
Попробуй свои подзапросики выполнить отдельно и посмотреть что выбирается
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
VitGun
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 19
Зарегистрирован: 06. Июня 2006
Re: Помогите с запросом по регистру остатков.
Ответ #2 - 06. Января 2009 :: 13:05
Печать  
Цитата:
Это лучше делать регистром сведений


всмысле оборотным регистром?
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Помогите с запросом по регистру остатков.
Ответ #3 - 06. Января 2009 :: 17:09
Печать  
Своей табличкой лучше
ну create table и все такое
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
VitGun
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 19
Зарегистрирован: 06. Июня 2006
Re: Помогите с запросом по регистру остатков.
Ответ #4 - 07. Января 2009 :: 05:48
Печать  
ммм....не совсем понятно....ты предлагаешь из документов писать в свою таблицу?
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Помогите с запросом по регистру остатков.
Ответ #5 - 07. Января 2009 :: 15:59
Печать  
Ну и что с того? Можно завести таблицу истории и таблицу последнего состояния, работает ужос как быстро
Если не хочешь - пиши в регистр остатков без ресурсов
Не придется делать расход-приход чтобы изменить статус, будет видна история и можно получить последнее значение
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
VitGun
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 19
Зарегистрирован: 06. Июня 2006
Re: Помогите с запросом по регистру остатков.
Ответ #6 - 07. Января 2009 :: 16:04
Печать  
хм...попробую реализовать оба варианта. спасибо за подсказку. буду вопросы - отпишусь здесь.
  
Наверх
 
IP записан
 
VitGun
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 19
Зарегистрирован: 06. Июня 2006
Re: Помогите с запросом по регистру остатков.
Ответ #7 - 08. Января 2009 :: 10:35
Печать  
в общем выбрал 2-й вариант. пишу в регистр остатков без ресурса. выборку последних значений сделать получилось, но еще бы нужно узнать даты 3-х состояний

делаю так

Код
Выбрать все
	|SELECT
	| $Рег.Товар [Товар $Справочник.Номенклатура],
	| $Рег.IMEI ИМЕИ,
	| $Рег.Точка [Точка $Справочник.Склады],
	| $Рег.Покупатель [Покупатель $Справочник.Контрагенты],
	| $Рег.Статус [Статус $Перечисление.СтатусыТелефона],
	| (case $Рег.Статус when $Перечисление.СтатусыТелефона.НаГарантии then cast(left(Рег.DATE_TIME_IDDOC,8) as char) else "+ПустаяДата+" end) [ДатаПоступления $Дата],
	| (case $Рег.Статус when $Перечисление.СтатусыТелефона.ВСЦ then cast(left(Рег.DATE_TIME_IDDOC,8) as char) else "+ПустаяДата+" end) [ДатаСЦ $Дата],
	| (case $Рег.Статус when $Перечисление.СтатусыТелефона.ВозврИзСЦ then cast(left(Рег.DATE_TIME_IDDOC,8) as char) else "+ПустаяДата+" end) [ДатаВозврата $Дата]
	|FROM
	|  $Регистр.гар_Гарантия as Рег
	|  where Рег.DATE_TIME_IDDOC=(select max(Р.DATE_TIME_IDDOC) from $Регистр.гар_Гарантия as Р where $Р.Товар=$Рег.Товар and $Р.IMEI=$Рег.IMEI)
	|group by
	| ;

 



в выборку попадают все записи с нужными состояниями, но...я вижу только дату того состояния в котором находится товар....а мне нужно получить дату поступления на гарантию, дату отправки в СЦ, дату возврата из СЦ....
если делать через подзапросы, то даты показывает верно, но в выборку попадает примерно половина из того что нужно....

код такой

Код
Выбрать все
	|SELECT
	| $Рег.Товар [Товар $Справочник.Номенклатура],
	| $Рег.IMEI ИМЕИ,
	| $Рег.Точка [Точка $Справочник.Склады],
	| $Рег.Покупатель [Покупатель $Справочник.Контрагенты],
	| $Рег.Статус [Статус $Перечисление.СтатусыТелефона],
	| (select cast(left(Р.DATE_TIME_IDDOC,8) as char) from $Регистр.гар_Гарантия as Р where $Р.Статус=$Перечисление.СтатусыТелефона.НаГарантии and  $Р.Товар = $Рег.Товар and $Р.IMEI=$Рег.IMEI) [ДатаПоступления $Дата],
	| (select cast(left(Р.DATE_TIME_IDDOC,8) as char) from $Регистр.гар_Гарантия as Р where $Р.Статус=$Перечисление.СтатусыТелефона.ВСЦ and         $Р.Товар = $Рег.Товар and $Р.IMEI=$Рег.IMEI) [ДатаСЦ $Дата],
	| (select cast(left(Р.DATE_TIME_IDDOC,8) as char) from $Регистр.гар_Гарантия as Р where $Р.Статус=$Перечисление.СтатусыТелефона.ВозврИзСЦ and   $Р.Товар = $Рег.Товар and $Р.IMEI=$Рег.IMEI) [ДатаВозврата $Дата]
	|FROM
	|  $Регистр.гар_Гарантия as Рег
	|  where Рег.DATE_TIME_IDDOC=(select max(Р.DATE_TIME_IDDOC) from $Регистр.гар_Гарантия as Р where $Р.Товар=$Рег.Товар and $Р.IMEI=$Рег.IMEI)
	|group by
	| ;

 



как быть?  Нерешительный
  
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Помогите с запросом по регистру остатков.
Ответ #8 - 08. Января 2009 :: 20:24
Печать  
Я ж писал что с таблицей последнего состояния удобнее Улыбка
Особенно оперативно показывать где-то (налепил индекс - и летает)
Ну а в порядке бреда предлагаю вот такое:

Код
Выбрать все
if object_id('tempdb..#phone') is not null drop table #phone
create table #phone (tov int, imei int, status int, dt datetime)

insert into #phone values (1, 1, 1, '2009-01-01')
insert into #phone values (1, 1, 2, '2009-02-01')
insert into #phone values (1, 1, 3, '2009-03-01')

insert into #phone values (1, 2, 1, '2009-04-01')
insert into #phone values (1, 2, 2, '2009-05-01')

select distinct p.tov
, p.imei
, (select top 1 status from #phone where tov = p.tov and imei = p.imei order by dt desc) последний_статус
, p1.dt статус_2
, p2.dt статус_3
from #phone p
left join #phone p1 on p.tov = p1.tov and p.imei = p1.imei and 2 = p1.status
left join #phone p2 on p.tov = p2.tov and p.imei = p2.imei and 3 = p2.status
 

  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать