Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Запрос по справочнику. Как увидеть группы в результате? (число прочтений - 3044 )
ybill
Junior Member
**
Отсутствует


I Love ...!

Сообщений: 35
Зарегистрирован: 01. Сентября 2008
Пол: Мужской
Запрос по справочнику. Как увидеть группы в результате?
27. Октября 2008 :: 10:59
Печать  
Есть простой прямой запрос по справочнику. Что и где надо записать, чтобы в результате возвращались и группы тоже?
Вот пример:
"SELECT
|      Н.ID as [Элемент $Справочник.Номенклатура]
|      Н.Descr as Наименование,
|      $Н.Артикул as Артикул
|FROM
|      $Справочник.Номенклатура as Н
|WHERE
|      Н.ID IN (SELECT Val FROM #Группа)
|"
;   
Запрос.УложитьСписокОбъектов(ВыбНоменклатура, "#Группа", "Номенклатура");

Мне надо чтобы  в случае если ВыбНоменклатура имеет группы нижнего уровня они тоже попадали в результат выборки.
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Запрос по справочнику. Как увидеть группы в результате?
Ответ #1 - 27. Октября 2008 :: 11:42
Печать  
Метод
УложитьСписокОбъектов помещает во временную таблицу только элементы.
Тебе надо самому добавить в эту временную таблицу все необходимые тебе папки групп ( подгрупп ).
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Запрос по справочнику. Как увидеть группы в результате?
Ответ #2 - 27. Октября 2008 :: 11:50
Печать  
Вероятно имеется ввиду разворот по группам в отчетах.
Для этого можно выгрузить в Индексированную таблицу и там метод Группировать.
  
Наверх
 
IP записан
 
ybill
Junior Member
**
Отсутствует


I Love ...!

Сообщений: 35
Зарегистрирован: 01. Сентября 2008
Пол: Мужской
Re: Запрос по справочнику. Как увидеть группы в результате?
Ответ #3 - 27. Октября 2008 :: 11:55
Печать  
Z1 писал(а) 27. Октября 2008 :: 11:42:
Метод
УложитьСписокОбъектов помещает во временную таблицу только элементы.
Тебе надо самому добавить в эту временную таблицу все необходимые тебе папки групп ( подгрупп ).


Я понял, что самостоятельно, вопрос в том как? не вручную же средствами 1С перебирать справочник?
  
Наверх
ICQ  
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос по справочнику. Как увидеть группы в результате?
Ответ #4 - 27. Октября 2008 :: 12:18
Печать  
Если творчески переработать метод УложитьСписокГрупп из AccountsRecordset (убрать условие 'isfolder = 1'), получится то, что ты хочешь.  Круглые глаза
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
ybill
Junior Member
**
Отсутствует


I Love ...!

Сообщений: 35
Зарегистрирован: 01. Сентября 2008
Пол: Мужской
Re: Запрос по справочнику. Как увидеть группы в результате?
Ответ #5 - 27. Октября 2008 :: 13:16
Печать  
berezdetsky писал(а) 27. Октября 2008 :: 12:18:
Если творчески переработать метод УложитьСписокГрупп из AccountsRecordset (убрать условие 'isfolder = 1'), получится то, что ты хочешь.  Круглые глаза


Ок, посмотрю.
У меня еще  один теоретический вопрос:
Есть временная таблица, полученная методом УложитьСписокОбъектов. Выполняю запрос методом ВыполнитьИнструкцию.
Сколько времени будет жить эта таблица? могу я выполнить другой запрос с ее использованием? А третий?
  
Наверх
ICQ  
IP записан
 
Вадимко
God Member
*****
Отсутствует


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

Сообщений: 1048
Местоположение: Минск
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Запрос по справочнику. Как увидеть группы в результате?
Ответ #6 - 27. Октября 2008 :: 13:28
Печать  
Да, можно выполнить 221 запрос в пределах одной сессии...
  

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


I Love ...!

Сообщений: 35
Зарегистрирован: 01. Сентября 2008
Пол: Мужской
Re: Запрос по справочнику. Как увидеть группы в результате?
Ответ #7 - 27. Октября 2008 :: 13:38
Печать  
Вадимко писал(а) 27. Октября 2008 :: 13:28:
Да, можно выполнить 221 запрос в пределах одной сессии...

А сессия начинается когда?
Когда стартует программа или когда я создаю объект ODBSRecordset?
Т.е. другой экземпляр ODBSRecordset это другая сессия или одна и та же?
А имена временных таблиц не перепутываются для разных сессий?
т.е не получится, что две моих обработки, использующие одни и те же имена временных таблиц будут конфликтовать между собой?
  
Наверх
ICQ  
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Запрос по справочнику. Как увидеть группы в результате?
Ответ #8 - 27. Октября 2008 :: 13:56
Печать  
ybill писал(а) 27. Октября 2008 :: 13:38:
А сессия начинается когда?
Когда стартует программа или когда я создаю объект ODBSRecordset?
первое.
Цитата:
Т.е. другой экземпляр ODBSRecordset это другая сессия или одна и та же?
та же сессия.
Цитата:
А имена временных таблиц не перепутываются для разных сессий?
для разных сессий не перепутются.
Цитата:
т.е не получится, что две моих обработки, использующие одни и те же имена временных таблиц будут конфликтовать между собой?
в одной сессии будут конфликтовать

ps
вышесказанное касается локальных временных таблиц
  

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


I Love ...!

Сообщений: 35
Зарегистрирован: 01. Сентября 2008
Пол: Мужской
Re: Запрос по справочнику. Как увидеть группы в результате?
Ответ #9 - 01. Ноября 2008 :: 07:59
Печать  
Сломал мозг, но так и ничего не получилось - тривиальная проблема выполнить прямой запрос по справочнику, чтобы в результате получилась выборка с упорядочиванием аналогично стандартному 1С запросу - Группа, подгруппа1, состав подгруппы1, подгруппа2  и т.п.
  
Наверх
ICQ  
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Запрос по справочнику. Как увидеть группы в результате?
Ответ #10 - 01. Ноября 2008 :: 08:26
Печать  
Есть разные варианты.
Я обычно практикую получение плоской выборки по элементам с получением, как минимум, ссылки, наименования и ссылки на родителя + ИТ и метод Группировать
  

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


I Love YaBB 2!

Сообщений: 43
Зарегистрирован: 15. Мая 2008
Re: Запрос по справочнику. Как увидеть группы в результате?
Ответ #11 - 01. Ноября 2008 :: 08:39
Печать  
создал функцию 'Expand_SC33' и получаю структуру по ней (выбрал группу и получил) Могу дать текст
  
Наверх
 
IP записан
 
ybill
Junior Member
**
Отсутствует


I Love ...!

Сообщений: 35
Зарегистрирован: 01. Сентября 2008
Пол: Мужской
Re: Запрос по справочнику. Как увидеть группы в результате?
Ответ #12 - 01. Ноября 2008 :: 08:51
Печать  
GEORG писал(а) 01. Ноября 2008 :: 08:39:
создал функцию 'Expand_SC33' и получаю структуру по ней (выбрал группу и получил) Могу дать текст


Спасибо, будет очень интересно посмотреть.
  
Наверх
ICQ  
IP записан
 
GEORG
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 43
Зарегистрирован: 15. Мая 2008
Re: Запрос по справочнику. Как увидеть группы в результате?
Ответ #13 - 01. Ноября 2008 :: 08:52
Печать  
Запрос=СоздатьОбъект("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
     |      WHERE
     |      dTbl.id != '     0   '
     |    AND SC.IsMark = 0
     |      ORDER BY
     |      dTbl.row_id -- порядок сортировки уже был указан в функции, тут только перестраховка
     |";
     Если Запрос.Открыть(Текст1)=0 Тогда
SC33- справочник Номенклатура
           Сообщить(Запрос.ПолучитьОписаниеОшибки (),"");
     КонецЕсли;
     Запрос.УстТипыКолонок1С("Число,Справочник.Товары,Строка");
     //получаем результаты
     ТОстатков43=СоздатьОбъект("ТаблицаЗначений");
     Запрос.ПолучитьРезультатыВ_ТЗ(ТОстатков43,1);
     Запрос.Закрыть();
     ГлПечТз(ТОстатков43);
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать