Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Принадлежность к группе (число прочтений - 4686 )
Kondarat
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 83
Зарегистрирован: 21. Декабря 2007
Принадлежность к группе
23. Сентября 2009 :: 07:54
Печать  
Как в запросе реализовать механизм

ПринадлежитГруппе(ВыбГруппа) ?

Так не получается
Код
Выбрать все
		|SELECT
		|	Группы.ID
		|	,Ном.ID AS [Товар :Справочник.Номенклатура]
		|	,Ном.БазоваяЕдиница AS [Единица :Справочник.Единицы]
		|	,0 AS [Цена :Число.15.2]
		|FROM
		|	Справочник_Номенклатура AS Группы
		|
		|INNER JOIN
		|	(SELECT
		|		PARENTID
		|		,ID
		|		,БазоваяЕдиница
		|	FROM
		|		Справочник_Номенклатура
		|	WHERE
		|		ISMARK = ''
		|		AND IsFolder = 2
		|	) AS Ном
		|
		|	ON Ном.PARENTID = Группы.ID
		|
		|WHERE
		|	Группы.PARENTID = :ГруппаТовара
		|	AND Группы.ISMARK = ''
		|	AND (Группы.IsFolder = 1)
		|";

 



База ДБФ, 1sqlite

  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Принадлежность к группе
Ответ #1 - 23. Сентября 2009 :: 08:14
Печать  
Вопрос, а насколько тебе нужно именно запросом получать данный результат?
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
Kondarat
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 83
Зарегистрирован: 21. Декабря 2007
Re: Принадлежность к группе
Ответ #2 - 23. Сентября 2009 :: 08:23
Печать  
vandalsvq писал(а) 23. Сентября 2009 :: 08:14:
Вопрос, а насколько тебе нужно именно запросом получать данный результат?


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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Принадлежность к группе
Ответ #3 - 23. Сентября 2009 :: 10:24
Печать  
Цитата:
Как в запросе реализовать механизм

ПринадлежитГруппе(ВыбГруппа) ?

Создай список групп помести его с троку и оператор in
или
эти группы самому добавлять во временную таблицу и
inner join с таблицей справочника.
  
Наверх
 
IP записан
 
leov-001
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 150
Зарегистрирован: 05. Марта 2009
Re: Принадлежность к группе
Ответ #4 - 23. Сентября 2009 :: 10:39
Печать  
|SELECT
|  Ном.PARENTID AS [Группа :Справочник.Номенклатура]
|, Ном.ID AS [Товар :Справочник.Номенклатура]
|, Ном.БазоваяЕдиница AS [Единица :Справочник.Единицы]
|, 0 AS [Цена :Число.15.2]
|FROM
|  Справочник_Номенклатура AS Ном
|WHERE
|  Ном.PARENTID = :ГруппаТовара AND Ном.ISMARK = '' AND Ном.IsFolder = 2
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Принадлежность к группе
Ответ #5 - 23. Сентября 2009 :: 10:46
Печать  
leov-001 писал(а) 23. Сентября 2009 :: 10:39:
|SELECT
|  Ном.PARENTID AS [Группа :Справочник.Номенклатура]
|, Ном.ID AS [Товар :Справочник.Номенклатура]
|, Ном.БазоваяЕдиница AS [Единица :Справочник.Единицы]
|, 0 AS [Цена :Число.15.2]
|FROM
|  Справочник_Номенклатура AS Ном
|WHERE
|  Ном.PARENTID = :ГруппаТовара AND Ном.ISMARK = '' AND Ном.IsFolder = 2

нет ты не понял автора.
Предположим в справочнике пять уровней.
Вопрос как отобрать все элементы справочника принадлежащие конкретной папке первого уровня.
  
Наверх
 
IP записан
 
leov-001
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 150
Зарегистрирован: 05. Марта 2009
Re: Принадлежность к группе
Ответ #6 - 23. Сентября 2009 :: 10:53
Печать  
Z1 писал(а) 23. Сентября 2009 :: 10:46:
leov-001 писал(а) 23. Сентября 2009 :: 10:39:
|SELECT
|  Ном.PARENTID AS [Группа :Справочник.Номенклатура]
|, Ном.ID AS [Товар :Справочник.Номенклатура]
|, Ном.БазоваяЕдиница AS [Единица :Справочник.Единицы]
|, 0 AS [Цена :Число.15.2]
|FROM
|  Справочник_Номенклатура AS Ном
|WHERE
|  Ном.PARENTID = :ГруппаТовара AND Ном.ISMARK = '' AND Ном.IsFolder = 2

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


А УложитьСписокОбъектов разве не для этого придуман
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Принадлежность к группе
Ответ #7 - 23. Сентября 2009 :: 10:57
Печать  
leov-001 писал(а) 23. Сентября 2009 :: 10:53:
Z1 писал(а) 23. Сентября 2009 :: 10:46:
leov-001 писал(а) 23. Сентября 2009 :: 10:39:
|SELECT
|  Ном.PARENTID AS [Группа :Справочник.Номенклатура]
|, Ном.ID AS [Товар :Справочник.Номенклатура]
|, Ном.БазоваяЕдиница AS [Единица :Справочник.Единицы]
|, 0 AS [Цена :Число.15.2]
|FROM
|  Справочник_Номенклатура AS Ном
|WHERE
|  Ном.PARENTID = :ГруппаТовара AND Ном.ISMARK = '' AND Ном.IsFolder = 2

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


А УложитьСписокОбъектов разве не для этого придуман

Придуман только вот я лично не знаю работает ли  он
для База ДБФ, 1sqlite как нужно автору subj
  
Наверх
 
IP записан
 
leov-001
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 150
Зарегистрирован: 05. Марта 2009
Re: Принадлежность к группе
Ответ #8 - 23. Сентября 2009 :: 11:15
Печать  
Изменено:
Придуман только вот я лично не знаю работает ли  он
для База ДБФ, 1sqlite как нужно автору subj


Код
Выбрать все
1sqlite
Объект SQLiteBase :: УложитьОбъекты / PutObjects

Синтаксис: УложитьОбъекты(Объект, ИмяТаблицы, [КакПостоянную], [Иерархия])

Параметры:
Объект - тип: СписокЗначений, Справочник, Счет. Выгружаемые объекты.
ИмяТаблицы - тип: Строка. Имя созываемой в базе данных таблицы.
КакПостоянную - тип: Число. 1 - создать обычную таблицу, 0 - создать временную таблицу. Необязательный параметр. По умолчанию 0.
Иерархия - тип: Строка. Название справочника или плана счетов для разворота групп справочника или групп счетов. Необязательный параметр. По умолчанию - пустая строка.
 

  
Наверх
 
IP записан
 
leov-001
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 150
Зарегистрирован: 05. Марта 2009
Re: Принадлежность к группе
Ответ #9 - 23. Сентября 2009 :: 12:14
Печать  
Код
Выбрать все
|SELECT
|  Ном.PARENTID AS [Группа :Справочник.Номенклатура]
|, Ном.ID AS [Товар :Справочник.Номенклатура]
|, Ном.БазоваяЕдиница AS [Единица :Справочник.Единицы]
|, 0 AS [Цена :Число.15.2]
|FROM
|  Справочник_Номенклатура AS Ном
|WHERE
|  (Ном.PARENTID IN (SELECT DISTINCT COALESCE(Ном4.ID,Ном3.ID,Ном2.ID,Ном1.ID,Ном1.PARENTID) AS val
|			 FROM Справочник_Номенклатура AS Ном1
|			 LEFT JOIN Справочник_Номенклатура AS Ном2 on Ном2.ISMARK = '' AND Ном2.IsFolder = 1 AND Ном2.PARENTID = Ном1.PARENTID
|			 LEFT JOIN Справочник_Номенклатура AS Ном3 on Ном3.ISMARK = '' AND Ном3.IsFolder = 1 AND Ном3.PARENTID = Ном2.PARENTID
|			 LEFT JOIN Справочник_Номенклатура AS Ном4 on Ном4.ISMARK = '' AND Ном4.IsFolder = 1 AND Ном4.PARENTID = Ном3.PARENTID
|			 WHERE Ном1.ISMARK = '' AND Ном1.IsFolder = 1 AND Ном1.PARENTID = :ГруппаТовара )
|  OR Ном.PARENTID = :ГруппаТовара )
|  AND Ном.ISMARK = '' AND Ном.IsFolder = 2
 

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


I Love YaBB 2!

Сообщений: 83
Зарегистрирован: 21. Декабря 2007
Re: Принадлежность к группе
Ответ #10 - 23. Сентября 2009 :: 14:21
Печать  
leov-001 писал(а) 23. Сентября 2009 :: 12:14:
Код
Выбрать все
|SELECT
|  Ном.PARENTID AS [Группа :Справочник.Номенклатура]
|, Ном.ID AS [Товар :Справочник.Номенклатура]
|, Ном.БазоваяЕдиница AS [Единица :Справочник.Единицы]
|, 0 AS [Цена :Число.15.2]
|FROM
|  Справочник_Номенклатура AS Ном
|WHERE
|  (Ном.PARENTID IN (SELECT DISTINCT COALESCE(Ном4.ID,Ном3.ID,Ном2.ID,Ном1.ID,Ном1.PARENTID) AS val
|			 FROM Справочник_Номенклатура AS Ном1
|			 LEFT JOIN Справочник_Номенклатура AS Ном2 on Ном2.ISMARK = '' AND Ном2.IsFolder = 1 AND Ном2.PARENTID = Ном1.PARENTID
|			 LEFT JOIN Справочник_Номенклатура AS Ном3 on Ном3.ISMARK = '' AND Ном3.IsFolder = 1 AND Ном3.PARENTID = Ном2.PARENTID
|			 LEFT JOIN Справочник_Номенклатура AS Ном4 on Ном4.ISMARK = '' AND Ном4.IsFolder = 1 AND Ном4.PARENTID = Ном3.PARENTID
|			 WHERE Ном1.ISMARK = '' AND Ном1.IsFolder = 1 AND Ном1.PARENTID = :ГруппаТовара )
|  OR Ном.PARENTID = :ГруппаТовара )
|  AND Ном.ISMARK = '' AND Ном.IsFolder = 2
 



Весь прикол в том, что конструкция:


Код
Выбрать все
	БазаSQL.УложитьОбъекты(ГруппаТоваров, "tTovar",, "Номенклатура");

	ТекстЗапроса = "
		|SELECT
		|	Тов.val AS [Номенклатура :Справочник.Номенклатура]
		|
		|FROM
		|	tTovar AS Тов
		|
		|";

	тзРезультат = СоздатьОбъект("ТаблицаЗначений");
	ЗапросSQL.ВыполнитьЗапрос(ТекстЗапроса,тзРезультат);

 



выбирает количество записей равное стандартной выборке:
Код
Выбрать все
Спр = СоздатьОбъект("Справочник.Номенклатура");
Спр.использоватьРодителя(Группа);
Спр.ВключатьПодчиненные(1);
Спр.ВыбратьЭлементы();

Пока....

 



а предложенный Вами (равно как и мой прежний) совсем другое.
Почему? Не знаю. Будет время - посмотрю.

  
Наверх
 
IP записан
 
leov-001
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 150
Зарегистрирован: 05. Марта 2009
Re: Принадлежность к группе
Ответ #11 - 24. Сентября 2009 :: 06:46
Печать  
Вариант с УложитьОбъекты помещает в временную таблицу ВСЕ элементы в том числе и ПОМЕЧЕННЫЕ НА УДАЛЕНИЕ.

Код
Выбрать все
|SELECT
|  Ном.PARENTID AS [Группа :Справочник.Номенклатура]
|, Ном.ID AS [Товар :Справочник.Номенклатура]
|, Ном.БазоваяЕдиница AS [Единица :Справочник.Единицы]
|, 0 AS [Цена :Число.15.2]
|FROM
|  Справочник_Номенклатура AS Ном
|WHERE
|  (Ном.PARENTID IN (SELECT DISTINCT COALESCE(Ном4.ID,Ном3.ID,Ном2.ID,Ном1.ID,Ном1.PARENTID) AS val
|			 FROM Справочник_Номенклатура AS Ном1
|			 LEFT JOIN Справочник_Номенклатура AS Ном2 on Ном2.ISMARK = '' AND Ном2.IsFolder = 1 AND Ном2.PARENTID = Ном1.PARENTID
|			 LEFT JOIN Справочник_Номенклатура AS Ном3 on Ном3.ISMARK = '' AND Ном3.IsFolder = 1 AND Ном3.PARENTID = Ном2.PARENTID
|			 LEFT JOIN Справочник_Номенклатура AS Ном4 on Ном4.ISMARK = '' AND Ном4.IsFolder = 1 AND Ном4.PARENTID = Ном3.PARENTID
|			 WHERE Ном1.ISMARK = '' AND Ном1.IsFolder = 1 AND Ном1.PARENTID = :ГруппаТовара )
|  OR Ном.PARENTID = :ГруппаТовара )
|  AND Ном.ISMARK = '' AND Ном.IsFolder = 2

 



В этом варианте выводятся те элементы справочника если родитель НЕ ПОМЕЧЕН НА УДАЛЕНИЕ.

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


I Love YaBB 2!

Сообщений: 148
Зарегистрирован: 24. Мая 2006
Re: Принадлежность к группе
Ответ #12 - 24. Сентября 2009 :: 07:55
Печать  
Если Использовать (ОЛЕДБ или SQL)  и Класс ЗапросSQL то
Решение весьма простое
[code]
Запрос = СоздатьОбъект("ЗапросSQL");
     Запрос.ДобавитьУсловие("Ном", "ID", "", ГруппаТовара, "", "", "", "");
     Запрос.текст = "
     |SELECT   Ном.PARENTID AS [Группа $Справочник.Номенклатура]
     |, Ном.ID AS [Товар $Справочник.Номенклатура]
     |, $Ном.БазоваяЕдиница AS [Единица $Справочник.Единицы]
     |FROM
     |  $Справочник.Номенклатура AS Ном
     |WHERE
     | %Ном.ID
     | AND
     |Ном.ISMARK = ''
     |AND Ном.IsFolder = 2
     |";
     тз = Запрос.Выполнить(0,0);
     тз.выбратьСтроку();
[/code]
  
Наверх
 
IP записан
 
Kondarat
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 83
Зарегистрирован: 21. Декабря 2007
Re: Принадлежность к группе
Ответ #13 - 24. Сентября 2009 :: 11:37
Печать  
leov-001 писал(а) 24. Сентября 2009 :: 06:46:
Вариант с УложитьОбъекты помещает в временную таблицу ВСЕ элементы в том числе и ПОМЕЧЕННЫЕ НА УДАЛЕНИЕ.

Код
Выбрать все
|SELECT
|  Ном.PARENTID AS [Группа :Справочник.Номенклатура]
|, Ном.ID AS [Товар :Справочник.Номенклатура]
|, Ном.БазоваяЕдиница AS [Единица :Справочник.Единицы]
|, 0 AS [Цена :Число.15.2]
|FROM
|  Справочник_Номенклатура AS Ном
|WHERE
|  (Ном.PARENTID IN (SELECT DISTINCT COALESCE(Ном4.ID,Ном3.ID,Ном2.ID,Ном1.ID,Ном1.PARENTID) AS val
|			 FROM Справочник_Номенклатура AS Ном1
|			 LEFT JOIN Справочник_Номенклатура AS Ном2 on Ном2.ISMARK = '' AND Ном2.IsFolder = 1 AND Ном2.PARENTID = Ном1.PARENTID
|			 LEFT JOIN Справочник_Номенклатура AS Ном3 on Ном3.ISMARK = '' AND Ном3.IsFolder = 1 AND Ном3.PARENTID = Ном2.PARENTID
|			 LEFT JOIN Справочник_Номенклатура AS Ном4 on Ном4.ISMARK = '' AND Ном4.IsFolder = 1 AND Ном4.PARENTID = Ном3.PARENTID
|			 WHERE Ном1.ISMARK = '' AND Ном1.IsFolder = 1 AND Ном1.PARENTID = :ГруппаТовара )
|  OR Ном.PARENTID = :ГруппаТовара )
|  AND Ном.ISMARK = '' AND Ном.IsFolder = 2

 



В этом варианте выводятся те элементы справочника если родитель НЕ ПОМЕЧЕН НА УДАЛЕНИЕ.



Я знаю, что УложитьОбъекты поместит во временную таблицу все элементы. Однако даже если после этого обработать полученную таблицу с одним проходом, получается быстрее чем в вашем варианте и правильнее.

Опробуйте свой запрос на группе у которой много подгрупп и еще больше элементов, сравните результат  выборки со стандартным ВыбратьЭлементы(), а потом жмите CapsLock.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать