Нашел здесь на форуме запрос. Все красиво работает, но не могу понять как вызвать функцию, если мне нужен фильтр по нескольким группам одновременно. Т.е. как в этом примере прикрутить кроме :выбгруппа, еще и :выбгруппа1.
Запрос=СоздатьОбъект("ODBCRecordSet"); Текст = " |IF EXISTS(SELECT name FROM sysobjects WHERE name = 'Expand_SC135' AND type = 'TF') DROP FUNCTION Expand_SC135, |GO |CREATE FUNCTION Expand_SC135 (@CurID char(9)) |RETURNS @retTbl TABLE ([ID] char(9), [LEVEL] int, [ROW_ID] int IDENTITY(1, 1)) |AS |BEGIN |DECLARE @strTbl TABLE ( |[ID] char(9) NOT NULL, |[LEVEL] int NOT NULL, |[ROW_ID] int IDENTITY(1, 1) NOT NULL |) |DECLARE @level as int |SET @level = 1 |INSERT INTO @strTbl (id, level) VALUES (@CurID, @level) |WHILE @level > 0 BEGIN |IF EXISTS (SELECT * FROM @strTbl WHERE level = @level) BEGIN |SELECT TOP 1 |@CurID = id |FROM @strTbl |WHERE level = @level |ORDER BY row_id |INSERT INTO @retTbl (id, level) VALUES(@CurID, @level-1) |DELETE FROM @strTbl WHERE (level = @level) AND (id = @CurID) |INSERT INTO @strTbl (id, level) |SELECT id, @level + 1 |FROM SC135 (NOLOCK) |WHERE parentid = @CurID AND IsMark = 0 |ORDER BY isfolder, descr -- сортировка по наименованию, можно заменить на другое поле |IF @@ROWCOUNT > 0 SET @level = @level + 1 |END |ELSE |SET @level = @level - 1 |END |RETURN |END |GO |"; Запрос.Отладка(1); Если Запрос.Открыть(Текст)=0 Тогда Сообщить(Запрос.ПолучитьОписаниеОшибки (),""); Возврат; КонецЕсли; Запрос.Закрыть(); текст1 = "SELECT | dTbl.level as Уровень, | dTbl.id as ID, | ISNULL(SC.code, '< ... >') as Код, | (SPACE((dTbl.level-1)*2) + ISNULL(SC.descr, '< ... >')) as Наименование, --чтоб красиво было | ISNULL(SC.isfolder, 2) as ЭтоГруппа | FROM | dbo.Expand_SC135(:выбгруппа) as dTbl -- выводим все от корня, или можно указать какой-нибудь другой ID | LEFT JOIN SC135 as SC (NOLOCK) ON SC.id = dTbl.id AND SC.IsMark = 0 | WHERE | dTbl.id != ' 0 ' | AND SC.IsMark = 0 | ORDER BY | dTbl.row_id -- порядок сортировки уже был указан в функции, тут только перестраховка |"; Запрос.УстановитьТекстовыйПараметр("выбгруппа", выбгруппа); Запрос.УстановитьТекстовыйПараметр("выбгруппа1", выбгруппа1); Если Запрос.Открыть(Текст1)=0 Тогда Сообщить(Запрос.ПолучитьОписаниеОшибки (),""); КонецЕсли; Запрос.УстТипыКолонок1С("Число,Справочник.Товары,Строка"); //получаем результаты ТОстатков43=СоздатьОбъект("ТаблицаЗначений"); Запрос.ПолучитьРезультатыВ_ТЗ(ТОстатков43,1); Запрос.Закрыть();
|