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


I Love YaBB 2!

Сообщений: 134
Местоположение: Ukrane
Зарегистрирован: 31. Октября 2008
Пол: Мужской
Запрос по справочнику с условием по группе
31. Октября 2008 :: 05:59
Печать  
адача - простая

Получить список элементов, принадлежащих определённой группе на любом уровне. не получается

вот мой текст :

ИмяТаблицы="#Список";

БЗ.УложитьСписокОбъектов(ТекРод,ИмяТаблицы,"Номенклатура");


SELECT
CODE AS [Код]
ID AS [Товар $Справочник.Номенклатура]
FROM $Справочник.Номенклатура
WHERE ISFOLDER=2 AND (ID IN (SELECT VAL FROM "+ИмяТаблицы+"))

БЗ.УстановитьТекстовыйПараметр("Список",ИмяТаблицы);

при отладке показывает текст запроса - всё ок
если фильтрую по другому реквизиту (например виды товара) - всё ок
подозреваю что трабла возникает именно с ID

подскажете чего путнего?
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
На связи



Сообщений: 3050
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Запрос по справочнику с условием по группе
Ответ #1 - 31. Октября 2008 :: 06:17
Печать  
на первый взгляд, в приведенном запросе ошибка - нехватает запятой в селект-листе
  

1&&2&&3
Наверх
 
IP записан
 
Стрелок
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 134
Местоположение: Ukrane
Зарегистрирован: 31. Октября 2008
Пол: Мужской
Re: Запрос по справочнику с условием по группе
Ответ #2 - 31. Октября 2008 :: 06:23
Печать  
trad писал(а) 31. Октября 2008 :: 06:17:
на первый взгляд, в приведенном запросе ошибка - нехватает запятой в селект-листе



где именно?
  
Наверх
 
IP записан
 
GEORG
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 43
Зарегистрирован: 15. Мая 2008
Re: Запрос по справочнику с условием по группе
Ответ #3 - 31. Октября 2008 :: 06:28
Печать  
Запрос=СоздатьОбъект("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);
     Запрос.Закрыть();
     ГлПечТз(ТОстатков43);
  
Наверх
 
IP записан
 
Стрелок
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 134
Местоположение: Ukrane
Зарегистрирован: 31. Октября 2008
Пол: Мужской
Re: Запрос по справочнику с условием по группе
Ответ #4 - 31. Октября 2008 :: 06:31
Печать  
что это было?
  
Наверх
 
IP записан
 
Стрелок
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 134
Местоположение: Ukrane
Зарегистрирован: 31. Октября 2008
Пол: Мужской
Re: Запрос по справочнику с условием по группе
Ответ #5 - 31. Октября 2008 :: 06:49
Печать  
про запятую - при наборе на форуме просто забыл поставить - запятая есть
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
На связи



Сообщений: 3050
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Запрос по справочнику с условием по группе
Ответ #6 - 31. Октября 2008 :: 06:51
Печать  
Стрелок писал(а) 31. Октября 2008 :: 06:23:
где именно?

Цитата:
CODE AS [Код],
ID AS [Товар $Справочник.Номенклатура]
  

1&&2&&3
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
На связи



Сообщений: 3050
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Запрос по справочнику с условием по группе
Ответ #7 - 31. Октября 2008 :: 06:55
Печать  
Стрелок писал(а) 31. Октября 2008 :: 06:49:
про запятую - при наборе на форуме просто забыл поставить - запятая есть

Тогда не исключено, что представленный на форуме запрос не соответствует тому, который "не получается" в реале.
И еще описание проблемы как "не получается" можно расшифровать подробнее?
  

1&&2&&3
Наверх
 
IP записан
 
Стрелок
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 134
Местоположение: Ukrane
Зарегистрирован: 31. Октября 2008
Пол: Мужской
Re: Запрос по справочнику с условием по группе
Ответ #8 - 31. Октября 2008 :: 07:00
Печать  
trad писал(а) 31. Октября 2008 :: 06:55:
Стрелок писал(а) 31. Октября 2008 :: 06:49:
про запятую - при наборе на форуме просто забыл поставить - запятая есть

Тогда не исключено, что представленный на форуме запрос не соответствует тому, который "не получается" в реале.
И еще описание проблемы как "не получается" можно расшифровать подробнее?


ошибка заключается в том что получаю ошибку

function name is missing

т.е. что то вроде бы как занято... но что?????
  
Наверх
 
IP записан
 
Стрелок
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 134
Местоположение: Ukrane
Зарегистрирован: 31. Октября 2008
Пол: Мужской
Re: Запрос по справочнику с условием по группе
Ответ #9 - 31. Октября 2008 :: 07:02
Печать  
не поленился и копи пасте сделал с ноута

ИерархическийСписок(0,0); 
                       Если ПустоеЗначение(ТекРод)=0 Тогда
                             ИмяТаблицы="#Список";
                             БыстрыйЗапрос.УложитьСписокОбъектов(ТекРод,ИмяТаблицы,"Номенклатура"); 
                       КонецЕсли;      
                       
                       Текст="SELECT
                       |code as [Код],
                       |id as [Товар $Справочник.Номенклатура]
                       |FROM $Справочник.Номенклатура as Тов
                       |WHERE isfolder=2";
                       Если ПустоеЗначение(ТекРод)=0 Тогда
                             Текст=" AND (id IN (SELECT Val FROM "+ИмяТаблицы+"))";   
                             БыстрыйЗапрос.УстановитьТекстовыйПараметр("Список",ИмяТаблицы);
                       КонецЕсли;      
                       БыстрыйЗапрос.Отладка(1);
                       Попытка                                             
                             ТЗРезультата=БыстрыйЗапрос.ВыполнитьИнструкцию(Текст);
                       Исключение
                             Сообщить(ОписаниеОшибки());
                       КонецПопытки;
                       ТЗРезультата.Выгрузить(СписокЭлементов,,,"Товар");
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
На связи



Сообщений: 3050
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Запрос по справочнику с условием по группе
Ответ #10 - 31. Октября 2008 :: 07:20
Печать  
Текст=Текст+" AND (id IN (SELECT Val FROM "+ИмяТаблицы+"))";
  

1&&2&&3
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
На связи



Сообщений: 3050
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Запрос по справочнику с условием по группе
Ответ #11 - 31. Октября 2008 :: 07:23
Печать  
и если применять обработку исключения, то
ТЗРезультата.Выгрузить(...
нужно тоже в попытку внести
  

1&&2&&3
Наверх
 
IP записан
 
Стрелок
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 134
Местоположение: Ukrane
Зарегистрирован: 31. Октября 2008
Пол: Мужской
Re: Запрос по справочнику с условием по группе
Ответ #12 - 31. Октября 2008 :: 07:24
Печать  
trad писал(а) 31. Октября 2008 :: 07:20:
Текст=Текст+" AND (id IN (SELECT Val FROM "+ИмяТаблицы+"))";  



ndj. vfnm!!!!
  
Наверх
 
IP записан
 
Стрелок
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 134
Местоположение: Ukrane
Зарегистрирован: 31. Октября 2008
Пол: Мужской
Re: Запрос по справочнику с условием по группе
Ответ #13 - 31. Октября 2008 :: 07:27
Печать  
всю ночь работал вот глаза и замылились..

СПАСИБО!!!!!
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Запрос по справочнику с условием по группе
Ответ #14 - 31. Октября 2008 :: 07:32
Печать  
Стрелок писал(а) 31. Октября 2008 :: 07:02:
не поленился и копи пасте сделал с ноута

ИерархическийСписок(0,0);  
                       Если ПустоеЗначение(ТекРод)=0 Тогда
                             ИмяТаблицы="#Список";
                             БыстрыйЗапрос.УложитьСписокОбъектов(ТекРод,ИмяТаблицы,"Номенклатура");  
                       КонецЕсли;      
                       
                       Текст="SELECT
                       |code as [Код],
                       |id as [Товар $Справочник.Номенклатура]
                       |FROM $Справочник.Номенклатура as Тов
                       |WHERE isfolder=2";
                       Если ПустоеЗначение(ТекРод)=0 Тогда
                             Текст=" AND (id IN (SELECT Val FROM "+ИмяТаблицы+"))";  
                             БыстрыйЗапрос.УстановитьТекстовыйПараметр("Список",ИмяТаблицы);
                       КонецЕсли;      
                       БыстрыйЗапрос.Отладка(1);
                       Попытка                                            
                             ТЗРезультата=БыстрыйЗапрос.ВыполнитьИнструкцию(Текст);
                       Исключение
                             Сообщить(ОписаниеОшибки());
                       КонецПопытки;
                       ТЗРезультата.Выгрузить(СписокЭлементов,,,"Товар");


1.Если ТекРод элемент ( не папка ) тогда не нужен in и временная таблица а только =.
2.Для временной таблицы (ихмо) лучше использовать латин символы.
3. поставь (nolock)
4. sql запрос выполни в qa
5. и еще через copy paste приведи точную ошибку

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