Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: Прямой запрос к регистру с подвохом

v7: Прямой запрос к регистру с подвохом
Я
   zenon46
 
05.02.20 - 09:50
Доброго дня!
Есть прямой запрос, который по переданному списку номенклатуры, находит последний документ прихода...вот только выяснилось что документы надо еще отсеивать по контрагентам из определенной папки, т.е. если последний приход в котором контрагент из "запретной" папки, то нужно найти что был до него, сейчас имею вот такой запрос, по логике нужно соединиться со справочником контрагентов и добавить условие, но как сделать пока не сообразил :

    |select
    |temp.val,
    |Спр.Code AS Код,    
    |subsel.Номенклатура AS [Номенклатура $Справочник.Номенклатура],
    |subsel.ДатаПослПрихода
    |from #TempTable
    |temp left join
    |(
    |SELECT
    |    $Рег.Номенклатура AS [Номенклатура],
    |    CAST(LEFT(MAX(Рег.Date_Time_IDDOC),8) AS datetime) AS ДатаПослПрихода
    |FROM
    |    $Регистр.ПартииНаличие as Рег
    |INNER JOIN
    |    _1Sjourn as ЖурналДок ON ЖурналДок.IDDoc = Рег.IDDoc    
    |LEFT JOIN
    |    $Справочник.Номенклатура AS Спр ON Спр.ID = $Рег.Номенклатура
    |WHERE
    |   ЖурналДок.iddocdef = $ВидДокумента.ПоступлениеТМЦ_Склад AND    
    |    $Рег.Номенклатура IN (SELECT val FROM #TempTable) AND
    |    $Рег.Фирма = :ВбрФирма    
    |GROUP BY
    |    $Рег.Номенклатура
    |) subsel on temp.val = subsel.Номенклатура
    |LEFT JOIN
    |$Справочник.Номенклатура AS Спр ON Спр.ID = temp.val
 
 
   ikea
 
1 - 05.02.20 - 10:17
Создаете временную таблицу, куда помещаете "запрещенные контрагентов".
INNER JOIN по постащику к  $Регистр.ПартииНаличие


А потом в условии $Рег.Поставщик NOT IN(SELECT val FROM #ЗапрещенныеКонтрагенты)
   zenon46
 
2 - 05.02.20 - 10:18
(1) отличная идея, спасибо!
   zenon46
 
3 - 05.02.20 - 17:05
Продолжу темку, ибо развивается запрос, как избавиться от ошибки "Ошибка преобразования даты или времени из символьной строки." Дело в том что во временной таблицы у номенклатуры может и не быть прихода...потому нужно как то работать с пустым значением. Спасибо за подсказку. (Вроде как '17530101' - должна быть для 1С пустой датой)

    |SELECT
    |    temp.val, 
    |    Спр.Code AS Код,    
    |    subsel.Номенклатура AS [Номенклатура $Справочник.Номенклатура], 
    |   CAST(LEFT(Isnull(Рег.Date_Time_IDDOC,'17530101'),8) AS datetime) [ДатаПрих]
    |FROM
    |    #TempTable 
    |    temp left join
    |(
    |SELECT
    |    $Рег.Номенклатура AS [Номенклатура],
    |    MAX(CAST(LEFT((Рег.Date_Time_IDDOC),8) AS datetime)) AS ДатаПослПрихода
    |FROM
    |    $Регистр.ПартииНаличие as Рег
    |INNER JOIN
    |    _1Sjourn as ЖурналДок ON ЖурналДок.IDDoc = Рег.IDDoc    
    |INNER JOIN
    |    $Справочник.Партии AS СпрП ON СпрП.ID = $Рег.Партия
    |INNER JOIN
    |    $Справочник.Контрагенты AS СпрК ON СпрК.ID = $СпрП.Поставщик
    |WHERE
    |   ЖурналДок.iddocdef = $ВидДокумента.ПоступлениеТМЦ_Склад AND    
    |    $Рег.Номенклатура IN (SELECT val FROM #TempTable) AND    
    |    $Рег.Фирма = :ВбрФирма AND    
    |    $СпрП.Поставщик NOT IN (SELECT val FROM #TableKontr)    
    |GROUP BY 
    |    $Рег.Номенклатура
    |) subsel on temp.val = subsel.Номенклатура
    |INNER JOIN
    |    $Справочник.Номенклатура AS Спр ON Спр.ID = temp.val     
    |LEFT JOIN
    |    $Регистр.ПартииНаличие AS Рег ON $Рег.Номенклатура = subsel.Номенклатура AND Рег.Date_time_iddoc=subsel.ДатаПослПрихода
   olegves
 
4 - 05.02.20 - 20:18
(3) ну так isnull() и используй для своей даты
   olegves
 
5 - 05.02.20 - 20:19
+(4) во внутреннем запросе
   olegves
 
6 - 05.02.20 - 20:20
(5) а не посмотрел, что у тебя партии во внешнем, CAST применяй к '17530101'

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.