PDA

View Full Version : فانکشن و جدول با ساختار درختی



monakz
سه شنبه 08 آبان 1386, 10:35 صبح
سلام دوستان، من در دیتابیس یک جدول دارم با نام tbl_sakhtar که با خودش forigen key داره و در واقع به صورت درختی پر میشه. فرض کنید فیلد id در این جدول primary key و با فیلد int_sub ارتباط داشته(forigen key) باشد. به صورت فایل ضمیمه diagram و خروجی هم به صورت فایل ضمیمه با عنوان sakhtar باشد.
حال میخواهم در UDF(user defined functions) یک table function ایجاد کنم که با وارد کردن هر id تمام زیرشاخه های آن و زیر شاخه های این زیرشاخه ها را هم تا جایی که به برگها برسیم در خروجی بگیرم. لطفا در صورت امکان مرا راهنمایی کنید.
با تشکر.

MohammadSoft
سه شنبه 08 آبان 1386, 11:10 صبح
سلام
من این تابع رو نوشتم ، به همراه یه تابع دیگه که سلسله مراتب یه برگ رو برگردونه .
من یه مقاله انشالله امشب تو سایتمون می ذارم که می تونید از اون استفاده کنید .
http://www.30sharp.com/
اگه کارتون فورسه بگید تا زودتر بدم بهتون .

monakz
سه شنبه 08 آبان 1386, 12:04 عصر
واقعا از لطفتون سپاسگذارم.
اگر براتون امکان داره که زودتر بهم بگید ممنون میشم.

MohammadSoft
سه شنبه 08 آبان 1386, 14:10 عصر
خواهش می کنم .
به روی چشم ولی من الان سر کارم ، رسیدم خونه انشاالله تو اولین فرصت می فرستم براتون .

MohammadSoft
چهارشنبه 09 آبان 1386, 07:15 صبح
ببخشید دیر شد .
من تابع رو با ساختار جدول شما مطابقت ندادم ، چون عجله دارم .:ناراحت:
این تابع جدولی شامل آدی رکورد و تمام آدی های فرزند آنرا بر می گرداند .
شیوه ذخیره کردن در جدول به این صورت است که اگر رکورد ما شاخه اصلی بود . فرزند نبود ParentID آن برابر با 0 است در غیر این صورت ParentID با آدی رکرود پدر پر می شود .



CREATE FUNCTION [dbo].[fn_GetAllChildDepartment]
(@DepartmentID INT )
RETURNS @tbl_Temp TABLE (DepartmentID NVARCHAR(100))
AS
BEGIN
DECLARE @Parentid INT
SELECT @Parentid = ParentID FROM tbl_Department WHERE Department_ID = @DepartmentID

-- IF @grName <> ''
INSERT INTO @tbl_Temp (DepartmentID) VALUES (@DepartmentID)
DECLARE @temp_ID INT

DECLARE CUR CURSOR FOR SELECT Department_ID FROM tbl_Department WHERE ParentID = @DepartmentID
OPEN CUR
FETCH NEXT FROM CUR INTO @temp_ID
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO @tbl_Temp (DepartmentID) SELECT DepartmentID FROM fn_GetAllChildDepartment(@temp_ID)
FETCH NEXT FROM CUR INTO @temp_ID
END
CLOSE CUR
DEALLOCATE CUR
--END

--SELECT * FROM @tbl_Temp
RETURN

END

monakz
چهارشنبه 09 آبان 1386, 09:32 صبح
دوست عزیز واقعا از لطفت سپاسگذارم، من دیروز برای اینکه مشکلم حل بشه علی الحساب یک فیلد به جدولم اضافه کردم که میسر رو توش نگه میداشتم و تریگرهایی که در update و insert مسیر رو توی این فیلد میریختن تا رسیدن به root، و در سرچ هم فقط کافی بود به فرض
like %,4,% رو سرچ کنم،
ولی امروز با تابع ارسالی شما به راحتی جواب گرفتم.
باز هم ممنونم.

MohammadSoft
پنج شنبه 10 آبان 1386, 00:53 صبح
خوشحالم که کمک کرد بهتون .
پیروز باشید .