Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Как получить последнее поступление по товарам? (число прочтений - 1959 )
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Как получить последнее поступление по товарам?
09. Октября 2019 :: 14:54
Печать  
Добрый день!

Надо по всей номенклатуре найти последнее поступление и цену этого поступления. С помощью прямого запроса.
Конфигурация - 7.7 "Торговля и склад".

Как лучше это сделать?
Запросом по регистру "ПартииНаличие" или по журналу документов?
Нету ли похожего запроса, который можно было бы взять за основу?
« Последняя редакция: 10. Октября 2019 :: 07:26 - es3000 »  
Наверх
ICQ  
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как получить последнее поступление по товарам?
Ответ #1 - 09. Октября 2019 :: 16:26
Печать  
Например, в регистре вот такие записи:
Код
Выбрать все
Товар1	Док1	СтрокаДок1
Товар1	Док1	СтрокаДок2
Товар1	Док2	СтрокаДок1
Товар1	Док2	СтрокаДок4

Товар2	Док1	СтрокаДок2
Товар2	Док1	СтрокаДок5
Товар2	Док2	СтрокаДок2
Товар2	Док2	СтрокаДок3
 



Из них должны быть отобраны строки:

Код
Выбрать все
Товар1	Док2	СтрокаДок4
Товар2	Док2	СтрокаДок3
 



Как это сделать?
  
Наверх
ICQ  
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 633
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: Как получить последнее поступление по товарам?
Ответ #2 - 09. Октября 2019 :: 17:13
Печать  
Ты бы диалект sql сначала озвучил.

Но и в любом диалекте  sql с Журналом документов, однозначно не связывайся - в табличных частях поступлений по Номенклатуре нет индекса - застрелишься ждать.

На sqlite это очень легко. Не факт что в других диалектах sql такое сработает. Точно знаю что на мускуле нет, потому что он не вытаскивает записи из той же строки в базе, где находятся данные, найденные по max (насчет остальных диалектов sql не уверен).

Код (SQL)
Выбрать все
SELECT
	Закупки.Номенклатура [Номенклатура $Справочник.Номенклатура],
	Закупки.IDDOCDEF||Закупки.IDDOC [Документ $Документ],
	Закупки.LINENO [НомерСтроки]
FROM Регистр_Закупки AS Закупки
WHERE Закупки.IDDOCDEF = :ВидДокумента.ПоступлениеТМЦ
GROUP BY Закупки.Номенклатура
HAVING max(Закупки.DATE||Закупки.TIME)
 



или так
Код (SQL)
Выбрать все
SELECT
	max(Закупки.DATE||Закупки.TIME),
	Закупки.Номенклатура [Номенклатура $Справочник.Номенклатура],
	Закупки.IDDOCDEF||Закупки.IDDOC [Документ $Документ],
	Закупки.LINENO [НомерСтроки]
FROM Регистр_Закупки AS Закупки
WHERE Закупки.IDDOCDEF = :ВидДокумента.ПоступлениеТМЦ
GROUP BY Закупки.Номенклатура
 

  
Наверх
www  
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как получить последнее поступление по товарам?
Ответ #3 - 10. Октября 2019 :: 10:01
Печать  
Djelf писал(а) 09. Октября 2019 :: 17:13:
Ты бы диалект sql сначала озвучил.

Надо для MS SQL Server 2008.

Djelf писал(а) 09. Октября 2019 :: 17:13:
На sqlite это очень легко. Не факт что в других диалектах sql такое сработает. Точно знаю что на мускуле нет, потому что он не вытаскивает записи из той же строки в базе, где находятся данные, найденные по max (насчет остальных диалектов sql не уверен).

Я sqlite еще ни разу не пробовал.
Запросы делаю на классе 1С++ ODBCRecordset.

Djelf писал(а) 09. Октября 2019 :: 17:13:
Но и в любом диалекте  sql с Журналом документов, однозначно не связывайся - в табличных частях поступлений по Номенклатуре нет индекса - застрелишься ждать.

Я написал пока вот такой запрос.
Одним запросом не смог придумать, пришлось написать несколько последовательных запросов.
Журнал документов используется в запросах, по времени работы в принципе приемлемо.

Код
Выбрать все
	ТекстЗапроса = "
	|SELECT
	|		$РегПартии1.Номенклатура AS Tovar,
	|		MAX(ЖурналДок1.Date_Time_IDDoc) as MaxDateTimeIDDoc
	|INTO #RegPastPrihodDoc
	|	FROM
	|		$Регистр.ПартииНаличие as РегПартии1
	|	INNER JOIN
	|		_1Sjourn as ЖурналДок1 ON ЖурналДок1.IDDoc = РегПартии1.IDDoc
	|	WHERE
	|		$РегПартии1.КодОперации = :КодОперации
	|	GROUP BY $РегПартии1.Номенклатура;
	|";

	лКоманда.УстановитьТекстовыйПараметр("КодОперации", Перечисление.КодыОпераций.Закупка);
	лКоманда.ВыполнитьИнструкцию(ТекстЗапроса, лИТ);

	ТекстЗапроса = "
	|SELECT
	|	ЖурналДок.IDDoc as [Док $Документ],
	|	ЖурналДок.IDDocDef as Док_вид,
	|	ЖурналДок.IDDoc as IDDoc,
	|	ЖурналДок.Date_Time_IDDoc
	|INTO #DocPrihod
	|FROM
	|	_1Sjourn as ЖурналДок
	|WHERE ЖурналДок.Date_Time_IDDoc IN
	|	(SELECT DISTINCT MaxDateTimeIDDoc FROM #RegPastPrihodDoc)
	|";
	лКоманда.ВыполнитьИнструкцию(ТекстЗапроса, лИТ);

	ТекстЗапроса = "
	|SELECT
	|		$РегПартии.Номенклатура as Tovar,
	|		РегПартии.IDDoc,
	|		MAX(РегПартии.LineNo_) as StrNo
	|INTO #RegPastPrihodStr
	|	FROM
	|		#RegPastPrihodDoc AS РегПриходНоменклатурыДок
	|	INNER JOIN
	|		#DocPrihod AS ДокПриход ON РегПриходНоменклатурыДок.MaxDateTimeIDDoc = ДокПриход.Date_Time_IDDoc
	|	INNER JOIN
	|		$Регистр.ПартииНаличие as РегПартии ON РегПриходНоменклатурыДок.Tovar = $РегПартии.Номенклатура AND ДокПриход.IDDoc = РегПартии.IDDoc
	|	GROUP BY $РегПартии.Номенклатура, РегПартии.IDDoc
	|";
	лКоманда.ВыполнитьИнструкцию(ТекстЗапроса, лИТ);
 



Последний запрос нужен для того, чтобы выбрать последнюю строку, если вдруг в каком-то документе один и тот же товар присутсвует в нескольких строках табличной части.
  
Наверх
ICQ  
IP записан
 
DartVader
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 29
Зарегистрирован: 13. Марта 2015
Re: Как получить последнее поступление по товарам?
Ответ #4 - 10. Октября 2019 :: 11:03
Печать  
Я бы СТE использовал, будет быстрее временные таблицы пишутся на диск.
WITH PoslRegistry as(
SELECT....)
  
Наверх
 
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как получить последнее поступление по товарам?
Ответ #5 - 10. Октября 2019 :: 13:14
Печать  
DartVader писал(а) 10. Октября 2019 :: 11:03:
Я бы СТE использовал

А что такое "СТЕ"?
  
Наверх
ICQ  
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: Как получить последнее поступление по товарам?
Ответ #6 - 10. Октября 2019 :: 15:42
Печать  
Нашел:
Цитата:
Конструкция WITH в T-SQL или обобщенное табличное выражение (ОТВ)
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать