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


I Love 1С++!

Сообщений: 186
Зарегистрирован: 28. Февраля 2008
как получить определенный уровень группы справочни
18. Марта 2008 :: 13:03
Печать  
я в тупике Ужас !!!
может кто-то уже сталкивался с такой проблемой:
надо получить остатки товаров, а к ним еще и скидки, которые прописаны в группах третьего уровня Номенклатуры.
Это надо приладить к такому запросу:

Код
Выбрать все
Зпр = СоздатьОбъект("ODBCRecordset");
ТекстЗ = "SELECT
|	  Tov.code as Код,
|     $РегП.Товар AS [Товар $Справочник.Номенклатура],
|	  $Tov.ШтрихКод as ШтрихКод,
|	  $Tov.ПолнНаименование as ПолнНаименование,
|	  $Tov.Disc as Disc,
|	  $Tov.LimDisc as LimDisc,
|     isNULL((Select top 1 $ПоследнееЗначение.Цены.Цена(СпрЦ.ID, :КонПериода) Цена
|		FROM $Справочник.Цены СпрЦ WHERE СпрЦ.ParentExt = $РегП.Товар AND
|				   $СпрЦ.КатегорияЦены = :ТипЦен),0)  AS Цена,
|	  R.code as РодКод,
|     $РегП.ОстатокТовара  AS Колич
|  FROM
|     $РегистрИтоги.ОстаткиТоваров as РегП
|
|	LEFT JOIN $Справочник.Номенклатура Tov ON Tov.ID = $РегП.Товар
|	LEFT JOIN $Справочник.Номенклатура R ON Tov.ParentID = R.ID
| WHERE $РегП.ОстатокТовара >0
|		    AND $РегП.Фирма = :ВыбФирма
|			AND Period = :ПредМесяц
|	"+?((Фильтр=1) и (Группа.Выбран()=1),"AND $РегП.Товар in (SELECT val from #STov)","")+"
|   "+?(ВыбСклад.Выбран()=1,"AND $РегП.Склад = :ВыбСклад","")+"
|"
;
Зпр.УстановитьТекстовыйПараметр("ПредМесяц", НачМесяца(РабочаяДата()));
Зпр.УстановитьТекстовыйПараметр("КонПериода", РабочаяДата());
Если  ВыбСклад.Выбран()=1 Тогда
  Зпр.УстановитьТекстовыйПараметр("ВыбСклад", ВыбСклад);
КонецЕсли;
Зпр.УстановитьТекстовыйПараметр("ВыбФирма", ПустФирма);
Зпр.УстановитьТекстовыйПараметр("ТипЦен", ТипЦен);
Если (Фильтр=1) и (Группа.Выбран()=1) Тогда
	Зпр.УложитьСписокОбъектов(Группа,"#STov","Номенклатура");
КонецЕсли;
ТовИтог = Зпр.ВыполнитьИнструкцию(ТекстЗ); 

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


I Love 1С++!

Сообщений: 186
Зарегистрирован: 28. Февраля 2008
Re: как получить определенный уровень группы справ
Ответ #1 - 19. Марта 2008 :: 08:18
Печать  
еще раз убеждаюсь, что спасение утопающих есть дело рук самих утопающих. Проблему решил. Выигрыш - ускорение более 30 крат (например, было 16минут, стало 30 сек по замерам в отладчике при одинаковых исх. данных). Сам запрос:
Код
Выбрать все
ТекстЗ = "SELECT
|	  Tov.code as Код,
|     $РегП.Товар AS [Товар $Справочник.Номенклатура],
|	  $Tov.ШтрихКод as ШтрихКод,
|	  $Tov.ПолнНаименование as ПолнНаименование,
|	  $Tov.Disc as Disc,
|	  $Tov.LimDisc as LimDisc,
|     isNULL((Select top 1 $ПоследнееЗначение.Цены.Цена(СпрЦ.ID, :КонПериода) Цена
|		FROM $Справочник.Цены СпрЦ WHERE СпрЦ.ParentExt = $РегП.Товар AND
|				   $СпрЦ.КатегорияЦены = :ТипЦен),0)  AS Цена,
|	  isNULL(R1.code, '') as РодКод,
|	  isNULL(R2.code, '') as РодКод2,
|	  isNULL(R3.code, '') as РодКод3,
|	  isNULL(UR.ogrSk, 0) as ОгрСкид,
|     $РегП.ОстатокТовара  AS Колич
|  FROM
|     $РегистрИтоги.ОстаткиТоваров as РегП
|
|	INNER JOIN $Справочник.Номенклатура Tov ON Tov.ID = $РегП.Товар
|	LEFT JOIN $Справочник.Номенклатура R1 ON Tov.ParentID = R1.ID
|	LEFT JOIN $Справочник.Номенклатура R2 ON R1.ParentID = R2.ID
|	LEFT JOIN $Справочник.Номенклатура R3 ON R2.ParentID = R3.ID
|	LEFT JOIN (select u3.id, $u3.ОгрСкидки ogrSk from $Справочник.Номенклатура u3
|			 where u3.parentid IN (select u2.id from $Справочник.Номенклатура u2
|			   where u2.parentid IN (Select u1.id from $Справочник.Номенклатура u1 where parentid = '     0   '))
|		) ur ON ur.id = R3.parentid OR ur.id = R2.parentid OR ur.id = R1.parentid
|
| WHERE  exists(select 1 from $РегистрИтоги.ОстаткиТоваров as Рег where
|		    Period = :ПредМесяц AND $Рег.Фирма = :ВыбФирма  
|	"+?((Фильтр=1) и (Группа.Выбран()=1),"AND $Рег.Товар in (SELECT val from #STov)","")+"
|   "+?(ВыбСклад.Выбран()=1,"AND $Рег.Склад = :ВыбСклад","")+"
|	     AND Рег.Period = РегП.Period AND $Рег.Фирма = $РегП.Фирма
|			AND $Рег.Товар = $РегП.Товар AND $Рег.Склад = $РегП.Склад)
|		AND $РегП.ОстатокТовара >0 

« Последняя редакция: 19. Марта 2008 :: 10:24 - sml »  
Наверх
 
IP записан
 
sadovnikov
1c++ power user
Отсутствует


I Love YaBB 2!

Сообщений: 420
Зарегистрирован: 06. Марта 2007
Re: как получить определенный уровень группы справ
Ответ #2 - 19. Марта 2008 :: 08:20
Печать  
Далеко не самый фонтанный подход...
Если это не разовый запрос - заведи у справочника реквизит Уровень и повесь триггера, которые будут этот реквизит заполнять.
  
Наверх
 
IP записан
 
sml
Full Member
***
Отсутствует


I Love 1С++!

Сообщений: 186
Зарегистрирован: 28. Февраля 2008
Re: как получить определенный уровень группы справ
Ответ #3 - 19. Марта 2008 :: 08:30
Печать  
sadovnikov писал(а) 19. Марта 2008 :: 08:20:
Далеко не самый фонтанный подход...
Если это не разовый запрос - заведи у справочника реквизит Уровень и повесь триггера, которые будут этот реквизит заполнять.

а где по триггерам можно почитать - я с триггерами как-то не пересекался.

Но использование триггеров, сдается мне, лишь даст возможность заменить тройной вложенный запрос одинарным, что выигрыша в скорости даст с гулькин нос.
  
Наверх
 
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: как получить определенный уровень группы справ
Ответ #4 - 19. Марта 2008 :: 09:01
Печать  
Дорогой вариант, но все же:

Код
Выбрать все
IF EXISTS(SELECT name FROM sysobjects WHERE name = 'NestLevel_SC196' AND type = 'FN') DROP FUNCTION NestLevel_SC196
GO

CREATE FUNCTION NestLevel_SC196 (@CurID char(9))
RETURNS int
AS
BEGIN
	DECLARE @MaxNestLv int -- максимальный уровень вложенности
	DECLARE @NestLv int -- счетчик

	SET @MaxNestLv = 3
	SET @NestLv = 0

	WHILE (@@ROWCOUNT > 0) OR (@NestLv <= @MaxNestLv) BEGIN
		SELECT TOP 1
			@CurID = parentid
		FROM SC196 (NOLOCK)
		WHERE id = @CurID

		IF @@ROWCOUNT = 0 BEGIN
			SET @NestLv = 0
			BREAK
		END
		ELSE IF @CurID = '     0   ' BEGIN
			SET @NestLv = @NestLv + 1
			BREAK
		END

		SET @NestLv = @NestLv + 1
	END

RETURN @NestLv
END
 

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