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


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Функция и ее использование
Ответ #15 - 21. Июля 2011 :: 07:43
Печать  
Цитата:
попробовал...возвращает в этом случае не правильно. вместо родителя - тот же элемент что был и на входе.


Брр, не понял:

Если на входе партия, у которой нет подчиненных элементов -
первая итерация цикла будет, ибо Парент = ПартИД, в ней Парент становится нуллом, присвоения Резалт не будет. Второй итерации нет. Возвращается значение = ПартИД.
А что должно вернуться? Если должен вернуться $ПустойИД - так в начале сделай не Резалт = ПартИД, а Резалт = $ПустойИД

или он для любой партии возвращает Резалт = ПартИД?
  
Наверх
 
IP записан
 
V_Al
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 12
Зарегистрирован: 07. Июля 2011
Re: Функция и ее использование
Ответ #16 - 21. Июля 2011 :: 08:32
Печать  
Satans Claws писал(а) 21. Июля 2011 :: 07:43:
Цитата:
попробовал...возвращает в этом случае не правильно. вместо родителя - тот же элемент что был и на входе.


Брр, не понял:

Если на входе партия, у которой нет подчиненных элементов -
первая итерация цикла будет, ибо Парент = ПартИД, в ней Парент становится нуллом, присвоения Резалт не будет. Второй итерации нет. Возвращается значение = ПартИД.
А что должно вернуться? Если должен вернуться $ПустойИД - так в начале сделай не Резалт = ПартИД, а Резалт = $ПустойИД

или он для любой партии возвращает Резалт = ПартИД?


в случае отсутствия подчиненных элементов у партии..в первой итерации запрос вернут пустой результат, т.е. @Parent не станет равен Null, в итоге -  бесконечный цикл.

а вообще мне нужно чтобы в случае с отсутствием родителя вернулся PartID
и к сожалению у меня не получилось этого добиться без дополнительной переменной
  
Наверх
 
IP записан
 
V_Al
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 12
Зарегистрирован: 07. Июля 2011
Re: Функция и ее использование
Ответ #17 - 21. Июля 2011 :: 08:44
Печать  
Код
Выбрать все
CREATE Function fn_Get_First_Part(@PartID Char(9))
Returns Char(9)
As
Begin
	Declare
		@Result Char(9),
		@Parent Char(9),
		@tmp    Char(9)

	Set @Parent = @PartID
	Set @tmp = @PartID

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

		Select
			@tmp = ИерархияПартий.sp9664
		From
			sc9666 as ИерархияПартий (NoLock)
		Where
			ИерархияПартий.ParentExt = @Parent -- Получаем родителя

		If @tmp = @PartID
			Begin
				Set @Result = @PartID
				BREAK
			End

		If @tmp Is Not Null
			Begin
				Set @Parent = @tmp
				Set @Result = @Parent
			End

	End

	If @Result Is Null Set @Result = @PartID

	Return @Result
End
 



Вот такая вот функция получилась в итоге. Если что здесь можно изменить / оптимизировать - предлагайте, я всегда готов учиться.
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Функция и ее использование
Ответ #18 - 21. Июля 2011 :: 09:09
Печать  
Ага, понял, где я протупил.
надо так:

Set @Parent = (select top 1 ... )

тогда если выборка пустая - в @Parent прилетит Нулл

(ну а если "@Parent =" будет внутри селекта - то при пустой выборке присвоения не будет, как ты правильно сам понял)
  
Наверх
 
IP записан
 
V_Al
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 12
Зарегистрирован: 07. Июля 2011
Re: Функция и ее использование
Ответ #19 - 21. Июля 2011 :: 09:41
Печать  
Satans Claws писал(а) 21. Июля 2011 :: 09:09:
Ага, понял, где я протупил.
надо так:

Set @Parent = (select top 1 ... )

тогда если выборка пустая - в @Parent прилетит Нулл

(ну а если "@Parent =" будет внутри селекта - то при пустой выборке присвоения не будет, как ты правильно сам понял)


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