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


1C++ rocks!

Сообщений: 66
Зарегистрирован: 07. Октября 2019
Получить всех родителей справочника
10. Февраля 2021 :: 11:33
Печать  
Соединяюсь с базой 1С 7.7 из базы 1С 8. Использую прямой запрос.

Нужно отобрать в запросе товары только по одной группе независимо от уровня вложения.

Пытаюсь получить четырёх родителей товара через последовательные левые соединения, это всё работает если товар находится на четвёртом уровне, а если на третьем, то уже нет.

Код
Выбрать все
	|LEFT JOIN
	|     $Справочник.Товар as сТовар
	|     ON сТовар.ID = $ДокС3.Товар
	|LEFT JOIN
	|     $Справочник.Товар as сТоварР
	|     ON сТоварР.ID = CASE WHEN сТовар.ParentID <> $ПустойИД THEN сТовар.ParentID ELSE '' END
	|LEFT JOIN
	|     $Справочник.Товар as сТоварРР
	|     ON сТоварРР.ID = CASE WHEN сТоварР.ParentID <> $ПустойИД THEN сТоварР.ParentID ELSE '' END
	|LEFT JOIN
	|     $Справочник.Товар as сТоварРРР
	|     ON сТоварРРР.ID = CASE WHEN сТоварР.ParentID <> $ПустойИД THEN сТоварРР.ParentID ELSE '' END
	|LEFT JOIN
	|     $Справочник.Товар as сТоварРРРР
	|     ON сТоварРРРР.ID = CASE WHEN сТоварР.ParentID <> $ПустойИД THEN сТоварРРР.ParentID ELSE '' END
	|WHERE
	|     (сТоварР.Code      = :КодРаспродажи
	|     OR сТоварРР.Code   = :КодРаспродажи
	|     OR сТоварРРР.Code  = :КодРаспродажи
	|     OR сТоварРРРР.Code = :КодРаспродажи)
 



При таком запросе выгружает весь справочник.

Вот это условие правильно?

Код
Выбрать все
ON сТоварР.ID = CASE WHEN сТовар.ParentID <> $ПустойИД THEN сТовар.ParentID ELSE '' END 

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



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Получить всех родителей справочника
Ответ #1 - 10. Февраля 2021 :: 12:27
Печать  
case не нужен
  

1&&2&&3
Наверх
 
IP записан
 
OnePrg
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 66
Зарегистрирован: 07. Октября 2019
Re: Получить всех родителей справочника
Ответ #2 - 10. Февраля 2021 :: 13:35
Печать  
trad писал(а) 10. Февраля 2021 :: 12:27:
case не нужен


Вот так выбирает весь справочник, а мне нужна одна группа

Код
Выбрать все
SELECT
    ДокС3.sp288 * 1 as Сумма,
    сТоварР.DESCR,
    сТоварРР.DESCR,
    сТоварРРР.DESCR,
    сТоварРРРР.DESCR
FROM
    dt151 as ДокС3
INNER JOIN
    dh151 as ДокШ3 ON ДокШ3.IDDoc = ДокС3.IDDoc
INNER JOIN
    _1SJourn as Жур ON Жур.IDDoc = ДокС3.IDDoc
                   AND Жур.Date_Time_IDDoc BETWEEN '20210101' AND '20210131Z'
                   AND Жур.Closed & 1 = 1
LEFT JOIN
     sc77 as сТовар
     ON сТовар.ID = ДокС3.sp141
LEFT JOIN
     sc77 as сТоварР
     ON сТоварР.ID = сТовар.ParentID
LEFT JOIN
     sc77 as сТоварРР
     ON сТоварРР.ID = сТоварР.ParentID
LEFT JOIN
     sc77 as сТоварРРР
     ON сТоварРРР.ID = сТоварРР.ParentID
LEFT JOIN
     sc77 as сТоварРРРР
     ON сТоварРРРР.ID = сТоварРРР.ParentID
WHERE
     (сТоварР.DESCR     = 'Стройгруппа'
     OR сТоварРР.DESCR     = 'Стройгруппа'
     OR сТоварРРР.DESCR     = 'Стройгруппа'
     OR сТоварРРРР.DESCR     = 'Стройгруппа')
 

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



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Получить всех родителей справочника
Ответ #3 - 10. Февраля 2021 :: 13:52
Печать  
ты хочешь сказать, что в выборке есть строки в которых ни в одном их этих полей
сТоварР.DESCR,
сТоварРР.DESCR,
сТоварРРР.DESCR,
сТоварРРРР.DESCR
нет 'Стройгруппа'
?
  

1&&2&&3
Наверх
 
IP записан
 
Sserj
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 77
Зарегистрирован: 25. Октября 2010
Re: Получить всех родителей справочника
Ответ #4 - 17. Февраля 2021 :: 08:27
Печать  
Если MSSQL 2005 и старше тогда:

with деревоГрупп as (
select cast(:группаТоваров as char(9)) as Группа
union all
select
  тНиз.id
from
  $Справочник.Номенклатура as тНиз with (nolock,forceseek,index(pcode))
  join деревоГрупп on тНиз.parentid = деревоГрупп.Группа
where тНиз.isfolder = 1
)
   
select
  ДокС3.sp288 * 1 as Сумма
  , Товары.descr as Товар_Наименование
from
  _1SJourn as Жур with (nolock)
  join dt151 as ДокС3 with (nolock)
  on ДокС3.iddoc = жур.iddoc
  join $Справочник.Номенклатура as Товары with (nolock)
  on Товары.id = ДокС3.sp141
  join деревоГрупп as дерево
  on дерево.Группа = Товары.parentid
where
  жур.DATE_TIME_IDDOC between '20210101' and '20210131Z'
  and жур.iddocdef = $ВидДокумента.НужныйВидДокумента
  and Жур.Closed & 1 = 1
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать