Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Запрос по справочнику с условием по нескольким группам (число прочтений - 672 )
kosmonavt
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 1
Зарегистрирован: 11. Февраля 2009
Запрос по справочнику с условием по нескольким группам
11. Февраля 2009 :: 13:13
Печать  
Нашел здесь на форуме запрос. Все красиво работает, но не могу понять как вызвать функцию, если мне нужен фильтр по нескольким группам одновременно. Т.е. как в этом примере прикрутить кроме :выбгруппа, еще и :выбгруппа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);
    Запрос.Закрыть();
 
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать