Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Функция и ее использование (число прочтений - 3201 )
V_Al
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 12
Зарегистрирован: 07. Июля 2011
Функция и ее использование
19. Июля 2011 :: 04:35
Печать  
Всем привет!
Пытаюсь реализовать вот такую функцию:

Код
Выбрать все
CREATE FUNCTION fn_Part_1_level
	(
		@PartID CHAR(9)
	)
	RETURNS CHAR(9)
AS
BEGIN

DECLARE @Result Char(9)
DECLARE @Parent Char(9)
SET @Parent = @PartID

	WHILE Left(IsNull(@Parent,'     0'),6) != '     0' -- Пока родитель не пустой

	BEGIN
		SELECT
			@Parent = ИерархияПартий.sp9664
		FROM
			sc9666 as ИерархияПартий (NoLock)
		 WHERE
			ИерархияПартий.ParentExt = @Parent -- Получаем родителя

		IF Left(IsNull(@Parent,'     0'),6) != '     0'
			BEGIN
				SET @Result = @Parent
			END
	END

	RETURN @Result
END
 



При ее вызове результата выполнения дождаться так и не смог. Подскажите, пожалуйста, в чем может быть проблема?
  
Наверх
 
IP записан
 
Anatol
Senior Member
****
Отсутствует


тыц, пыц, тыц!!!

Сообщений: 412
Зарегистрирован: 24. Апреля 2009
Re: Функция и ее использование
Ответ #1 - 19. Июля 2011 :: 04:55
Печать  
вместо
'     0'
нужно
'     0   '
  
Наверх
wwwICQ  
IP записан
 
V_Al
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 12
Зарегистрирован: 07. Июля 2011
Re: Функция и ее использование
Ответ #2 - 19. Июля 2011 :: 05:00
Печать  
Anatol писал(а) 19. Июля 2011 :: 04:55:
вместо
'     0'
нужно
'     0   '


результат - тот же.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Функция и ее использование
Ответ #3 - 19. Июля 2011 :: 05:09
Печать  
1. Используй $ПустойИД
2. PARENTEXT - это ссылка на Владельца, если что
   
   PARENTID  - ссылка на родителя..

что тебе конкретно надо - хз, скорее всего всё же Родитель, а не Владелец.
  
Наверх
 
IP записан
 
Anatol
Senior Member
****
Отсутствует


тыц, пыц, тыц!!!

Сообщений: 412
Зарегистрирован: 24. Апреля 2009
Re: Функция и ее использование
Ответ #4 - 19. Июля 2011 :: 05:11
Печать  
посмотри эту тему
  
Наверх
wwwICQ  
IP записан
 
V_Al
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 12
Зарегистрирован: 07. Июля 2011
Re: Функция и ее использование
Ответ #5 - 19. Июля 2011 :: 05:14
Печать  
Eprst писал(а) 19. Июля 2011 :: 05:09:
1. Используй $ПустойИД
2. PARENTEXT - это ссылка на Владельца, если что
 
  PARENTID  - ссылка на родителя..

что тебе конкретно надо - хз, скорее всего всё же Родитель, а не Владелец.


$ПустойИД - использовал
Что такое PARENTEXT  и PARENTID   я знаю...и надо именно владельца...

Т.к. Выстроили тут одни деятели именно такую структуру..
т.е.
у справочника Партии есть подчиненный справочник ПартияРодитель, в котором живет реквизит ПартияРод, содержащий ссылку на родителя партии....

вот и приходится изобретать...т.к. рекурсивная функция написанная для определения первой партии средствами только 1с будет выполнятся ну очень долго и для той задачи, которую я решаю - она не подходит.
  
Наверх
 
IP записан
 
V_Al
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 12
Зарегистрирован: 07. Июля 2011
Re: Функция и ее использование
Ответ #6 - 19. Июля 2011 :: 05:20
Печать  
Anatol писал(а) 19. Июля 2011 :: 05:11:
посмотри эту тему


тему посмотрел...попробовал...результат тот же. По сути в примере запроса предложено тоже условие что и у меня, только развернутое + проверка на количество уровней.
  
Наверх
 
IP записан
 
Anatol
Senior Member
****
Отсутствует


тыц, пыц, тыц!!!

Сообщений: 412
Зарегистрирован: 24. Апреля 2009
Re: Функция и ее использование
Ответ #7 - 19. Июля 2011 :: 05:26
Печать  
ты всетаки определись владельца или родителя?

та функция для определения уровня, то есть приминима к родителям
а ты про владельца объясняешь
  
Наверх
wwwICQ  
IP записан
 
V_Al
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 12
Зарегистрирован: 07. Июля 2011
Re: Функция и ее использование
Ответ #8 - 19. Июля 2011 :: 05:30
Печать  
Anatol писал(а) 19. Июля 2011 :: 05:26:
ты всетаки определись владельца или родителя?

та функция для определения уровня, то есть приминима к родителям
а ты про владельца объясняешь


нужно мне получить самую первую партию. А так как информацию о родителе партии находится в подчиненном справочнике, то и отбор соответственно приходится делать по владельцу.
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Функция и ее использование
Ответ #9 - 19. Июля 2011 :: 06:20
Печать  
Если в функцию передать партию, у котрой нет подчиненных элементов,
то у тебя совершится только одна итерация цикла, в которой присвоения значения переменной @Result не произойдет (по результатам запроса у тебя будет НУЛЛ, условие не выполнится, etc)

Соовтественно, партия, у которой единственный подчиненный элемент с незаполненым реквизитом "партия-родитель" поведет себя так же.
Хуже того, если подчиненных элементов несколько, то в значение @Parent запрос закинет значение "случайного" подчиненного элемента из нескольких (емнип, это будет последний элемент из выборки, но покуда нет Ордер Бай за порядок выборки ответственность несет "бог на душу положит").

Ну и самый изврат - партия, подчиненный из которой ссылается на эту же партию (хотя и самое тривиальное).
  
Наверх
 
IP записан
 
V_Al
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 12
Зарегистрирован: 07. Июля 2011
Re: Функция и ее использование
Ответ #10 - 19. Июля 2011 :: 07:08
Печать  
Satans Claws писал(а) 19. Июля 2011 :: 06:20:
Если в функцию передать партию, у котрой нет подчиненных элементов,
то у тебя совершится только одна итерация цикла, в которой присвоения значения переменной @Result не произойдет (по результатам запроса у тебя будет НУЛЛ, условие не выполнится, etc)

Соовтественно, партия, у которой единственный подчиненный элемент с незаполненым реквизитом "партия-родитель" поведет себя так же.
Хуже того, если подчиненных элементов несколько, то в значение @Parent запрос закинет значение "случайного" подчиненного элемента из нескольких (емнип, это будет последний элемент из выборки, но покуда нет Ордер Бай за порядок выборки ответственность несет "бог на душу положит").

Ну и самый изврат - партия, подчиненный из которой ссылается на эту же партию (хотя и самое тривиальное).


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

Всем спасибо.
  
Наверх
 
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Функция и ее использование
Ответ #11 - 19. Июля 2011 :: 14:25
Печать  
Код
Выбрать все
CREATE FUNCTION fn_Part_1_level
	(
		@PartID CHAR(9)
	)
	RETURNS CHAR(9)
AS
BEGIN

DECLARE @Result Char(9)
DECLARE @Parent Char(9)
SET @Parent = @PartID

	WHILE Left(IsNull(@Parent,'     0'),6) != '     0' -- Пока родитель не пустой

	BEGIN
		SELECT
			@Parent = ИерархияПартий.sp9664
		FROM
			sc9666 as ИерархияПартий (NoLock)
		 WHERE
			ИерархияПартий.ParentExt = @Parent -- Получаем родителя

		IF Left(IsNull(@Parent,'     0'),6) != '     0'
			BEGIN
				SET @Result = @Parent
			END
	END

	RETURN @Result
END
 


Правильно ли указана ссылка: @Parent = ИерархияПартий.sp9664
  
Наверх
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Функция и ее использование
Ответ #12 - 21. Июля 2011 :: 04:02
Печать  
V_Al писал(а) 19. Июля 2011 :: 07:08:
Действительно, из цикла не может выйти когда доходит до партии, у которой нет подчиненных элементов. Получается, что выборка в этом случае вообще ничего не возвращает...поэтому и бесконечный цикл. Добавив еще одну переменную проблему решил.

Всем спасибо.


а зачем еще одну переменную?

Код
Выбрать все
CREATE FUNCTION fn_Part_1_level
	(
		@PartID CHAR(9)
	)
	RETURNS CHAR(9)
AS
BEGIN

DECLARE @Result Char(9)
DECLARE @Parent Char(9)
SET @Result = @PartID
SET @Parent = @PartID

	WHILE Left(IsNull(@Parent,'     0'),6) != '     0' -- Пока родитель не пустой

	BEGIN
		SELECT
			@Parent = ИерархияПартий.sp9664
		FROM
			sc9666 as ИерархияПартий (NoLock)
		 WHERE
			ИерархияПартий.ParentExt = @Parent -- Получаем родителя

		IF Left(IsNull(@Parent,'     0'),6) != '     0'
			BEGIN
				SET @Result = @Parent
			END
	END

	RETURN @Result
END 


  
Наверх
 
IP записан
 
V_Al
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 12
Зарегистрирован: 07. Июля 2011
Re: Функция и ее использование
Ответ #13 - 21. Июля 2011 :: 04:17
Печать  
pvase писал(а) 19. Июля 2011 :: 14:25:
Код
Выбрать все
CREATE FUNCTION fn_Part_1_level
	(
		@PartID CHAR(9)
	)
	RETURNS CHAR(9)
AS
BEGIN

DECLARE @Result Char(9)
DECLARE @Parent Char(9)
SET @Parent = @PartID

	WHILE Left(IsNull(@Parent,'     0'),6) != '     0' -- Пока родитель не пустой

	BEGIN
		SELECT
			@Parent = ИерархияПартий.sp9664
		FROM
			sc9666 as ИерархияПартий (NoLock)
		 WHERE
			ИерархияПартий.ParentExt = @Parent -- Получаем родителя

		IF Left(IsNull(@Parent,'     0'),6) != '     0'
			BEGIN
				SET @Result = @Parent
			END
	END

	RETURN @Result
END
 


Правильно ли указана ссылка: @Parent = ИерархияПартий.sp9664


Ссылка указан правильно.
  
Наверх
 
IP записан
 
V_Al
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 12
Зарегистрирован: 07. Июля 2011
Re: Функция и ее использование
Ответ #14 - 21. Июля 2011 :: 04:18
Печать  
Satans Claws писал(а) 21. Июля 2011 :: 04:02:
V_Al писал(а) 19. Июля 2011 :: 07:08:
Действительно, из цикла не может выйти когда доходит до партии, у которой нет подчиненных элементов. Получается, что выборка в этом случае вообще ничего не возвращает...поэтому и бесконечный цикл. Добавив еще одну переменную проблему решил.

Всем спасибо.


а зачем еще одну переменную?

Код
Выбрать все
CREATE FUNCTION fn_Part_1_level
	(
		@PartID CHAR(9)
	)
	RETURNS CHAR(9)
AS
BEGIN

DECLARE @Result Char(9)
DECLARE @Parent Char(9)
SET @Result = @PartID
SET @Parent = @PartID

	WHILE Left(IsNull(@Parent,'     0'),6) != '     0' -- Пока родитель не пустой

	BEGIN
		SELECT
			@Parent = ИерархияПартий.sp9664
		FROM
			sc9666 as ИерархияПартий (NoLock)
		 WHERE
			ИерархияПартий.ParentExt = @Parent -- Получаем родителя

		IF Left(IsNull(@Parent,'     0'),6) != '     0'
			BEGIN
				SET @Result = @Parent
			END
	END

	RETURN @Result
END 




хм..а вот про это я что-то не подумал..спасибо))

попробовал...возвращает в этом случае не правильно. вместо родителя - тот же элемент что был и на входе.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать