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
|";
лКоманда.ВыполнитьИнструкцию(ТекстЗапроса, лИТ);
Последний запрос нужен для того, чтобы выбрать последнюю строку, если вдруг в каком-то документе один и тот же товар присутсвует в нескольких строках табличной части.