Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Запрос к справочнику с фильтром по группе. (число прочтений - 6576 )
Glafira
Junior Member
**
Отсутствует


I Love 1С!

Сообщений: 45
Зарегистрирован: 29. Июня 2007
Пол: Женский
Запрос к справочнику с фильтром по группе.
02. Декабря 2008 :: 13:37
Печать  
Всем привет! Извините может уже был такой вопрос. Честно искала, но не нашла, а время поджимает...  Плачущий
Стоит следующая задача. Выбрать все (любого уровня вложенности) элементы справочника принадлежащие заданной группе. Помогите пожалуйста. Заранее спасибо.
  

Ваша Глаша
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Запрос к справочнику с фильтром по группе.
Ответ #1 - 02. Декабря 2008 :: 13:56
Печать  
Код
Выбрать все
	Запрос = СоздатьОбъект("ODBCRecordSet");
	Род = СоздатьОбъект("СписокЗначений");
	Род.ДобавитьЗначение(ВыбТовар);
	Запрос.УложитьСписокОбъектов(Род,"#ПапкаТовары","Товары");


	ТекстЗапроса = "
	|SELECT ID [Тов $Справочник.Товары]  from $Справочник.Товары as Спр
	|WHERE  Спр.ID in ( select val from  #ПапкаТовары)
	|";
	Запрос.Отладка(1);
	ТЗ = Запрос.ВыполнитьИнструкцию(ТекстЗапроса);
	ТЗ.ВыбратьСтроку();
  


Запрос.Отладка(1) можно убрать
  
Наверх
 
IP записан
 
Glafira
Junior Member
**
Отсутствует


I Love 1С!

Сообщений: 45
Зарегистрирован: 29. Июня 2007
Пол: Женский
Re: Запрос к справочнику с фильтром по группе.
Ответ #2 - 02. Декабря 2008 :: 14:02
Печать  
Спасибо... Чет у меня какая-то тупка  Смущённый
  

Ваша Глаша
Наверх
 
IP записан
 
Glafira
Junior Member
**
Отсутствует


I Love 1С!

Сообщений: 45
Зарегистрирован: 29. Июня 2007
Пол: Женский
Re: Запрос к справочнику с фильтром по группе.
Ответ #3 - 02. Декабря 2008 :: 14:17
Печать  
А не совсем то... Вернее как оно то работает из 1С, но мне нужно в конечном итоге получить прямой запрос на SQL.
В данном случае я получаю:
SELECT
     Клиенты.CODE,
     Клиенты.DESCR
FROM
     sc46 Клиенты
WHERE
     Клиенты.IsMark = 0 AND
     Клиенты.IsFolder = 2 AND
     Клиенты.ID in (select val from  #СписокКлиентов)
Как трансформировать "select val from  #СписокКлиентов" в прямой запрос?
Если заменить его на реальные значения типа ('     6   ') то выводятся только элементы данной группы...  Нерешительный
  

Ваша Глаша
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Запрос к справочнику с фильтром по группе.
Ответ #4 - 02. Декабря 2008 :: 14:42
Печать  
Glafira писал(а) 02. Декабря 2008 :: 14:17:
А не совсем то... Вернее как оно то работает из 1С, но мне нужно в конечном итоге получить прямой запрос на SQL.
В данном случае я получаю:
SELECT
     Клиенты.CODE,
     Клиенты.DESCR
FROM
     sc46 Клиенты
WHERE
     Клиенты.IsMark = 0 AND
     Клиенты.IsFolder = 2 AND
     Клиенты.ID in (select val from  #СписокКлиентов)
Как трансформировать "select val from  #СписокКлиентов" в прямой запрос?
Если заменить его на реальные значения типа ('     6   ') то выводятся только элементы данной группы...  Нерешительный

Если будет отладка(1) то в окне сообщений у тебя и будет
"чистый" sql.
Непонятно чем не устраивает временная таблица.
Если надо то  в
скобках пиши идентефикторы через запятую.
id in ( '  3', '   4','   10')

Группы не попадают потому что стоит условие
Клиенты.IsFolder = 2
  
Наверх
 
IP записан
 
Glafira
Junior Member
**
Отсутствует


I Love 1С!

Сообщений: 45
Зарегистрирован: 29. Июня 2007
Пол: Женский
Re: Запрос к справочнику с фильтром по группе.
Ответ #5 - 02. Декабря 2008 :: 14:46
Печать  
Я тебе показала, что у меня выдала отладка... А группы мне и не нужны... Поэтому у меня и стоит Клиенты.IsFolder = 2 Но мне нужны все элементы всех уровней вложенности...
Если я выполняю:
SELECT
     Клиенты.CODE,
     Клиенты.DESCR
FROM
     sc46 Клиенты
WHERE
     Клиенты.IsMark = 0 AND
     Клиенты.ID in ('     6   ' )
у меня попадает только это группа.
  

Ваша Глаша
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Запрос к справочнику с фильтром по группе.
Ответ #6 - 02. Декабря 2008 :: 14:52
Печать  
Вот обработка работающая
и немного оптимизированная.
замени  название справочника внутри и на форме
на свое и все заработает.
  

test_17_________________.ert ( 30 KB | Загрузки )
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Запрос к справочнику с фильтром по группе.
Ответ #7 - 02. Декабря 2008 :: 14:55
Печать  
Glafira писал(а) 02. Декабря 2008 :: 14:46:
Я тебе показала, что у меня выдала отладка... А группы мне и не нужны... Поэтому у меня и стоит Клиенты.IsFolder = 2 Но мне нужны все элементы всех уровней вложенности...
Если я выполняю:
SELECT
     Клиенты.CODE,
     Клиенты.DESCR
FROM
     sc46 Клиенты
WHERE
     Клиенты.IsMark = 0 AND
     Клиенты.ID in ('     6   ' )
у меня попадает только это группа.

а чтобы заработал твой пример должно быть
     Клиенты.ID in ('     КорнПапка   ','Подпапка 1', 'Подпапка3' )
т.е все входящие подпапки и по всей вложенности.


  
Наверх
 
IP записан
 
Glafira
Junior Member
**
Отсутствует


I Love 1С!

Сообщений: 45
Зарегистрирован: 29. Июня 2007
Пол: Женский
Re: Запрос к справочнику с фильтром по группе.
Ответ #8 - 02. Декабря 2008 :: 15:02
Печать  
Z1 писал(а) 02. Декабря 2008 :: 14:55:
Glafira писал(а) 02. Декабря 2008 :: 14:46:
Я тебе показала, что у меня выдала отладка... А группы мне и не нужны... Поэтому у меня и стоит Клиенты.IsFolder = 2 Но мне нужны все элементы всех уровней вложенности...
Если я выполняю:
SELECT
     Клиенты.CODE,
     Клиенты.DESCR
FROM
     sc46 Клиенты
WHERE
     Клиенты.IsMark = 0 AND
     Клиенты.ID in ('     6   ' )
у меня попадает только это группа.

а чтобы заработал твой пример должно быть
     Клиенты.ID in ('     КорнПапка   ','Подпапка 1', 'Подпапка3' )
т.е все входящие подпапки и по всей вложенности.



Это понтяно... Вот меня и интересует, как получить эти все подпапки...
  

Ваша Глаша
Наверх
 
IP записан
 
Glafira
Junior Member
**
Отсутствует


I Love 1С!

Сообщений: 45
Зарегистрирован: 29. Июня 2007
Пол: Женский
Re: Запрос к справочнику с фильтром по группе.
Ответ #9 - 02. Декабря 2008 :: 15:03
Печать  
Z1 писал(а) 02. Декабря 2008 :: 14:52:
Вот обработка работающая
и немного оптимизированная.
замени  название справочника внутри и на форме
на свое и все заработает.

Чет кривоватенько он работает...  Круглые глаза
  

Ваша Глаша
Наверх
 
IP записан
 
Вадимко
God Member
*****
Отсутствует


Нам бы чего про ОдноЦэ...

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Запрос к справочнику с фильтром по группе.
Ответ #10 - 02. Декабря 2008 :: 17:01
Печать  
Елы-палы, ну посмотри в профайлере на результат работы УложитьСписокОбъектов(), авось дойдет...
  

Кампутер, кофе и сигареты - это очень плохо для моего здоровья...
Наверх
IP записан
 
GEORG
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 43
Зарегистрирован: 15. Мая 2008
Re: Запрос к справочнику с фильтром по группе.
Ответ #11 - 03. Декабря 2008 :: 04:34
Печать  
Создать функцию и использовать ее.
Заменить SC33 на SC46
Текст обработки;
Запрос=СоздатьОбъект("ODBCRecordSet");
     Текст = "
     |IF EXISTS(SELECT name FROM sysobjects WHERE name = 'Expand_SC33' AND type = 'TF') DROP FUNCTION Expand_SC33,
     |GO
     |CREATE FUNCTION Expand_SC33 (@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 SC33 (NOLOCK)
     |WHERE parentid = @CurID AND IsMark = 0 AND SP20816 = 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_SC33('     0   ') as dTbl -- выводим все от корня, или можно указать какой-нибудь другой ID
     |      LEFT JOIN SC33 as SC (NOLOCK) ON SC.id = dTbl.id AND SC.IsMark = 0 AND SC.SP20816 = 0
     |      WHERE
     |      dTbl.id != '     0   '
     |    AND SC.IsMark = 0 AND SC.SP20816 = 0
     |      ORDER BY
     |      dTbl.row_id -- порядок сортировки уже был указан в функции, тут только перестраховка
     |";
     Если Запрос.Открыть(Текст1)=0 Тогда
           Сообщить(Запрос.ПолучитьОписаниеОшибки (),"");
     КонецЕсли;
     Запрос.УстТипыКолонок1С("Число,Справочник.Товары,Строка");
     //получаем результаты
     ТОстатков43=СоздатьОбъект("ТаблицаЗначений");
     Запрос.ПолучитьРезультатыВ_ТЗ(ТОстатков43,1);
     Запрос.Закрыть();
  
Наверх
 
IP записан
 
Glafira
Junior Member
**
Отсутствует


I Love 1С!

Сообщений: 45
Зарегистрирован: 29. Июня 2007
Пол: Женский
Re: Запрос к справочнику с фильтром по группе.
Ответ #12 - 03. Декабря 2008 :: 09:10
Печать  
GEORG, спасибо большое... все очень даже получилось...
  

Ваша Глаша
Наверх
 
IP записан
 
nicolas
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 148
Зарегистрирован: 24. Мая 2006
Re: Запрос к справочнику с фильтром по группе.
Ответ #13 - 05. Декабря 2008 :: 12:24
Печать  
Для таких вещей я использую класс "ЗапросSQL". Автор его  acsent, и кто еще его рихтовал, не  помню....
особо и заморчиваться не надо. Все сделано там.
     
     Запрос = СоздатьОбъект("ЗапросSQL");
     
     Запрос.ДобавитьУсловие("ОС", "ID", "", ЭлОС, "", "", "","");
     
     Запрос.текст="    
     |SELECT ОС.ID as [ОсновныеСредства $Справочник.ОсновныеСредства]
     |, ОС.ParentID as [Родитель $Справочник.ОсновныеСредства]
     |FROM $Справочник.ОсновныеСредства as ОС
     |WHERE
     | ОС.ISFOLDER=2 
     | and ОС.IsMark = 0
     |and
     |%ID
     |";   
      тз = Запрос.выполнить(0,0);
      тз.Выбратьстроку();
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Запрос к справочнику с фильтром по группе.
Ответ #14 - 05. Декабря 2008 :: 15:19
Печать  
nicolas писал(а) 05. Декабря 2008 :: 12:24:
Для таких вещей я использую класс "ЗапросSQL". Автор его  acsent, и кто еще его рихтовал, не  помню....
особо и заморчиваться не надо. Все сделано там.
     
     Запрос = СоздатьОбъект("ЗапросSQL");
     
     Запрос.ДобавитьУсловие("ОС", "ID", "", ЭлОС, "", "", "","");
     
     Запрос.текст="    
     |SELECT ОС.ID as [ОсновныеСредства $Справочник.ОсновныеСредства]
     |, ОС.ParentID as [Родитель $Справочник.ОсновныеСредства]
     |FROM $Справочник.ОсновныеСредства as ОС
     |WHERE
     | ОС.ISFOLDER=2  
     | and ОС.IsMark = 0
     |and
     |%ID
     |";  
      тз = Запрос.выполнить(0,0);
      тз.Выбратьстроку();

Твой запрос не учитывет если в папке  ЭлОС есть подпапки
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать