Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) получение последнего прихода номенклатуры (число прочтений - 3238 )
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
получение последнего прихода номенклатуры
13. Декабря 2009 :: 00:39
Печать  
привет всем!

не могу разрешить проблему с таким запросом:

Код
Выбрать все
select
,$Рег.Номенклатура as [Номенклатура $Справочник.Номенклатура]  
,вв.ДокПрихода --as [ДокПрихода $Документ]
from $Регистр.ОстаткиТМЦ Рег

left join
(select top 1
Жур1.iddocdef+Рег1.iddoc ДокПрихода
,$Рег1.Номенклатура Номенклатура
,dtos(жур1.date)+Жур1.time Позиция
from $Регистр.ОстаткиТМЦ Рег1
left join 1sjourn Жур1 on Жур1.iddoc=Рег1.iddoc
where Рег1.debkred=0 and $Рег1.Количество>0
order by Позиция desc

) вв on вв.Номенклатура=$Рег.Номенклатура

where Рег.debkred=0 and $Рег.Количество>0

 



выдает таблицу с пустым полем ДокПрихода,
что и является главной проблемой


если закомментировать top 1
Код
Выбрать все
...
left join
(select --top 1
...
 



то все правильно - для каждой позиции - несколько приходов,
упорядоченных в порядке убывания даты.

база ДБФ, OleDb

  
Наверх
ICQ  
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: получение последнего прихода номенклатуры
Ответ #1 - 13. Декабря 2009 :: 11:52
Печать  
Можно при помощи временной таблицы, засунуть туда все и потом на каждую позицию select top 1 .... where ID = Номенклатура... но можно ли это в oledb и как это будет в плане производительности, говорить не берусь. Можно еще попробовать триггером на временную таблицу, но опять таки реализуемо ли это в oledb - х.з. Я привык как то 1sqlite пользоваться.
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: получение последнего прихода номенклатуры
Ответ #2 - 13. Декабря 2009 :: 12:26
Печать  
пока написал такого монстра, вот насчет производительности не судить берусь:

Код
Выбрать все
Select
СпрН.code НоменклатураКод
,СпрН.ID as [Номенклатура $Справочник.Номенклатура]
,Приходы.ПоследнийПриход as [ДокПрихода $Документ.ПоступлениеТМЦ]
From
$Справочник.Номенклатура СпрН
inner Join
(
Select
РегОстатки.iddoc ПоследнийПриход
,$РегОстатки.Номенклатура Номенклатура
From
$Регистр.ОстаткиТМЦ РегОстатки
left join 1sjourn Жур on Жур.iddoc = РегОстатки.iddoc

Inner Join
(
Select
$РегОстатки1.Номенклатура Номенклатура
,Max(dtos(Жур1.date)+Жур1.time) МаксДата

From $Регистр.ОстаткиТМЦ РегОстатки1
left join 1sjourn Жур1 on Жур1.iddoc = РегОстатки1.iddoc

where РегОстатки1.debkred=0 and $РегОстатки1.Количество>0
and Жур1.iddocdef<>$ВидДокумента.ВозвратОтПокупателя
and Жур1.iddocdef<>$ВидДокумента.ПеремещениеТМЦ

Group By Номенклатура
) МаксКоды On МаксКоды.Номенклатура = $РегОстатки.Номенклатура
And МаксКоды.МаксДата = dtos(Жур.date)+Жур.time

where РегОстатки.debkred=0 and $РегОстатки.Количество>0
and Жур.iddocdef<>$ВидДокумента.ВозвратОтПокупателя
and Жур.iddocdef<>$ВидДокумента.ПеремещениеТМЦ

) Приходы On СпрН.ID = Приходы.Номенклатура

--where СпрН.ID = :ВыбНоменклатура
 




хотелось бы узнать, как оптимально решается эта задача одним запросом, подобные часто встречаются
  
Наверх
ICQ  
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: получение последнего прихода номенклатуры
Ответ #3 - 14. Декабря 2009 :: 08:17
Печать  
А зачем регистр ?

Бери из табличной части приходной накладной - там уже отобраны нужные записи.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: получение последнего прихода номенклатуры
Ответ #4 - 14. Декабря 2009 :: 09:09
Печать  
И кстати - а что справочника партий нет, где вся нужная информация ?
  
Наверх
 
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: получение последнего прихода номенклатуры
Ответ #5 - 14. Декабря 2009 :: 09:09
Печать  
да из регистра как то кошернее  Улыбка. Шерстить доки я тож подозреваю быстрее получится, да только их в моем случае два вида. потом в регистре могут быть рассчитанные суммы типа всяких там последовательностей фифо и проч.
тут я пытаюсь понять общий принцип решения такого рода задач
  
Наверх
ICQ  
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: получение последнего прихода номенклатуры
Ответ #6 - 14. Декабря 2009 :: 09:11
Печать  
справочник партий - это вообще в другом регистре. Да и нет смысла смотреть на етот справочник, последовательности никто никогда не восстанавливает
  
Наверх
ICQ  
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: получение последнего прихода номенклатуры
Ответ #7 - 14. Декабря 2009 :: 09:13
Печать  
никогда не восстанавливает в смысле - в этой базе
  
Наверх
ICQ  
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: получение последнего прихода номенклатуры
Ответ #8 - 14. Декабря 2009 :: 09:17
Печать  
ol писал(а) 14. Декабря 2009 :: 09:11:
справочник партий - это вообще в другом регистре. Да и нет смысла смотреть на етот справочник, последовательности никто никогда не восстанавливает


Это без разницы.
Главное что в нем для каждой номенклатурной позиции хранится "ПриходныйДокумент", и соответственно можно получить его дату.

В общетеоретическом смысле - самое выгодное регистр сведений Улыбка
  
Наверх
 
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: получение последнего прихода номенклатуры
Ответ #9 - 14. Декабря 2009 :: 09:32
Печать  
я не совсем верно выразился по поводу партий - их там попросту нет, учет себ. по среднему. да я, честно говоря, всегда не очень то доверяю тому, что в этом справочнике хранится. Уж больно сложным путем туда попадает инфа.

а в общетеоретическом, конечно тут не поспоришь - регистр сведений рулит  Улыбка
  
Наверх
ICQ  
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: получение последнего прихода номенклатуры
Ответ #10 - 14. Декабря 2009 :: 09:32
Печать  
Код
Выбрать все
Select
	   Приходы.PARENTEXT as [Номенклатура $Справочник.Номенклатура]
	 ,Right(Приходы.ПоследнийПриход,13) as [ДокПрихода $Документ]
	 From
	 (Select
	   СпрПартий.PARENTEXT  as PARENTEXT
	   ,Max(dtos(Жур.date)+Жур.time+$СпрПартий.ПриходныйДокумент) ПоследнийПриход
	 From
	   $Справочник.Партии as СпрПартий
	   inner join 1sjourn Жур on Жур.iddoc = Right($СпрПартий.ПриходныйДокумент,9)
	 Group By СпрПартий.PARENTEXT)  as Приходы 

  
Наверх
 
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: получение последнего прихода номенклатуры
Ответ #11 - 14. Декабря 2009 :: 09:39
Печать  
довольно наглядо, и действительно просто.

kiruha писал(а) 14. Декабря 2009 :: 09:32:
Код
Выбрать все
Select
	   Приходы.PARENTEXT as [Номенклатура $Справочник.Номенклатура]
	 ,Right(Приходы.ПоследнийПриход,13) as [ДокПрихода $Документ]
	 From
	 (Select
	   СпрПартий.PARENTEXT  as PARENTEXT
	   ,Max(dtos(Жур1.date)+Жур1.time+$СпрПартий.ПриходныйДокумент) ПоследнийПриход
	 From
	   $Справочник.Партии as СпрПартий
	   left join 1sjourn Жур on Жур.iddoc = Right($СпрПартий.ПриходныйДокумент,9)
	 Group By id)  as Приходы 



такой Group By ... сработает ?


  
Наверх
ICQ  
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: получение последнего прихода номенклатуры
Ответ #12 - 14. Декабря 2009 :: 09:42
Печать  
я быстро писал - не прверял.
Конечно
СпрПартий.PARENTEXT

и соединенение inner
  
Наверх
 
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: получение последнего прихода номенклатуры
Ответ #13 - 14. Декабря 2009 :: 10:12
Печать  
ага, понял - я уж разрулил этот принцип получения нужного значения из подчиненного справочника,  за выходные
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать