Сама задача стандартна и состоит из одной задачи и одной подзадачи
Задача - использовать фильтр по группе элементов. Т.е. реализовать аналог "Условие (Номенклатура в ВыбГруппа)" с условием того что ВыбГруппа может и не являтся прямым родителем самого элемента... вобщем стандартное условие 1це
и ещё одна подзадача - вывод в результирующую таблицу полного наименования (вкл. всех родителей)... аналог ПолнНаименование() в 1це (из-за конкретных тормозов оригинальной функции)
собственно вторая реализуется функцией
CREATE FUNCTION Full_Name_Nom
(
@NomID char(9)
)
RETURNS char(255)
AS
BEGIN
DECLARE @str char(255),@DESCR char(50),@strv char(255)
SET @str = ''
SET @DESCR = ''
WHILE @NomID <> ' 0 '
BEGIN
SELECT @DESCR = DESCR FROM SC282 WHERE ID = @NomID
SELECT @NomID = PARENTID FROM SC282 WHERE ID = @NomID
SET @str = '/'+RTRIM(LTRIM(@DESCR)) + LTRIM(RTRIM(@str))
END
SET @str = RIGHT(@str,254)+SPACE(1)
RETURN @str
END
а вот с самой задачей туго.. реализовывал различными методами
1
INNER JOIN (
SELECT Gr3.ID As _Группа3, Gr3.DESCR As _Группа3Т,
Gr2.ID As _Группа2, Gr2.DESCR As _Группа2Т,
Gr1.ID As _Группа1, Gr1.DESCR As _Группа1Т,
SprNom.ID As IDNOM,
'('+SprNom.CODE+')' As _КодНом
FROM SC282 As SprNom
LEFT OUTER JOIN SC282 as Gr1 ON SprNom.PARENTID = Gr1.ID
LEFT OUTER JOIN SC282 as Gr2 ON Gr1.PARENTID = Gr2.ID
LEFT OUTER JOIN SC282 as Gr3 ON Gr2.PARENTID = Gr3.ID
WHERE
SprNom.ISFOLDER = 2 AND ((SprNom.PARENTID = ' 4D8 ') or (Gr1.PARENTID = ' 4D8 ') or (Gr2.PARENTID = ' 4D8 '))
GROUP BY Gr3.ID,Gr2.ID,Gr1.ID,Gr3.DESCR,Gr2.DESCR,Gr1.DESCR,SprNom.ID, '('+SprNom.CODE+')'
) As Группы ON TMP._Номенклатура = Группы.IDNOM
т.е. соединением таблицы всего выбранного справочника (отфилтрованного по необходимой группе) с итоговой выборкой
во-первых тянутся обе таблицы целиком изначально а во-вторых неудобно и геморойно генерить текст в зависимости от кол-ва уровней справочника
2
на базе функции с получением полного наименования
CREATE FUNCTION INParent_Nom
(
@NomID char(9),@ParentID char(9)
)
RETURNS char(255)
AS
BEGIN
DECLARE @F tinyint
SET @F = 0
WHILE @NomID <> ' 0 '
BEGIN
SELECT @NomID = PARENTID FROM SC282 WHERE ID = @NomID
IF @NomID = @ParentID
SET @F = 1
END
RETURN @F
END
в реальности оказалось ещё медленнее если вызываешь её на уровне получения таблицы итогов
Сейчас сделал (выкрутился) следующим образом - получаю список элементов входящих в группу (группы) обыкновенным 1це запросом а затем уже этот список передаю в качестве строки с ИД-ами в текст запроса