PDA

View Full Version : بدست آوردن همه فرزندان یک پدر



hamid_isf_1360
سه شنبه 03 خرداد 1390, 14:24 عصر
با سلام و عرض ادب خدمت دوستان عزیز

بنده یک treeview دارم که به دیتابیس وصل شده و ساختار دیتابیس بصورت زیر طراحی شده

ID-------parent--------Text

یعنی تعداد شاخه ها و زیر شاخه ها بی شمار است و محدودیی وجود ندارد.
حالا مشکل بنده اینه که چطور می تونم id تمام فرزندان یک پدر را بدست بیارم (که البته یاد آوری می کنم ممکنه که فرزندان خود نیز پدر باشند )

برای این منظور نمی خوام از امکانات و متد های treeview استفاده کنم و می خوام فقط با داشتن یک id پدر و با استفاده از اطلاعات دیتابیس فرزندان این پدر را بدست بیارم و مثلا در یک آرایه ذخیره کنم

تصویر زیر کاملا منظور بنده را بیان می کند

70294http://barnamenevis.org/images/misc/pencil.png

یوسف زالی
سه شنبه 03 خرداد 1390, 15:12 عصر
سلام.
تو SQL این کد رو تست کن.


-- TBL is a table(ID int, FatherID int)
declare @t table(SN int, DAD int)
insert into @t
select 5, 0
while @@ROWCOUNT <> 0
insert into @t
select ID, FatherID
from TBL
where FatherID in (select SN from @t) and ID not in(select SN from @t)
select *
from @t

hamid_isf_1360
سه شنبه 03 خرداد 1390, 15:45 عصر
ضمن تشکر از شما دیتابیس من اکسس هست
فکر می کنم برای پیدا کردن همه فرزندان یک پدر باید یک تابع بازگشتی نوشت و ممنون می شم دوستان کمک کنند.

یوسف زالی
سه شنبه 03 خرداد 1390, 17:26 عصر
این هم از کد شما

hamid_isf_1360
سه شنبه 03 خرداد 1390, 18:35 عصر
با سلام بازم از حسن توجه شما ممنون هستم
ولی کد شما فقط در صورتی جواب میده که اطلاعات پشت سر هم و به صورت سریال ذخیره شده باشند اگه اطلاعات در بانک باشه و پشت سر هم ذخیره نشده باشه جواب
نمی ده.
به عنوان مثال فرض کنید شما فرزندان یک پدر را وارد بانک کرده اید حالا میروید سراغ یه پدر دیگه و فرزندان اون را وارد میکنید و بعد دوباره بر می گردید به پدر قبلی و اونو کامل می کنید
اینجوری ترتیب id ها بهم می ریزه و کد شما جواب نمی ده.

راستی من نمی خوام از متدهای tree برای این کار استفاده کنم بلکه از اطلاعات دیتابیس برای رسیدن به این مقصود می خواهم کمک بگیرم

این تصویر قسمتی از دیتا بیس است

70303


راستی یک سری کد php پیدا کردم که اگه دوستان بتونند به دلفی تبدیلش کنند کار حله.



<?php
function getTree($rootid)
{
$arr = array();

$result = mysql_query("select * from PLD_CATEGORY where PARENT_ID='$rootid'");
while ($row = mysql_fetch_array($result)) {
$arr[] = array(
"Title" => $row["Title"],
"Children" => getTree($row["id"])
);
}
return $arr;
}
?>

یوسف زالی
چهارشنبه 04 خرداد 1390, 00:06 صبح
این رو تست کن:



procedure TForm1.InsertFrom(Head{SN of first node}: integer);
var
again: boolean;
begin
ListBox1.Items.Add(IntToStr(Head));
repeat
again := false;
ADOTable1.First;
while not ADOTable1.Eof do
begin
if ADOTable1.FieldValues['FatherSN'] = Head then
if ListBox1.Items.IndexOf(IntToStr(ADOTable1.FieldVal ues['SN'])) = -1 then
begin
ListBox1.Items.Add(IntToStr(ADOTable1.FieldValues['SN']));
again := true;
end;
ADOTable1.Next;
end;
until not again;
end;

hamid_isf_1360
چهارشنبه 04 خرداد 1390, 02:39 صبح
بازهم تشکر از وقتی که گذاشتید ولی کد شما به عمق شاخه ها نفوذ نمی کنه و فقط شاخه های سطحی را نمایش میده

کد شما را به شکل زیر کمک گرفتم که البته کار نداد اگه مشکلی داره اصلاح کنید ممنون


procedure TfrmBook.InsertFrom(Head{SN of first node}: integer);
var
again: boolean;
begin
ListBox1.Items.Add(IntToStr(Head));
repeat
again := false;
DataModule1.ADOQuery1.SQL.Clear;
DataModule1.ADOQuery1.SQL.Text:='Select ID,parent,text From treeTable where parent='+inttostr(Head);
DataModule1.ADOQuery1.Open;
DataModule1.ADOQuery1.First;
while not DataModule1.ADOQuery1.Eof do
begin
if DataModule1.ADOQuery1.FieldValues['parent'] = Head then
if ListBox1.Items.IndexOf(IntToStr(DataModule1.ADOQue ry1.FieldValues['ID'])) = -1 then
begin
ListBox1.Items.Add(IntToStr(DataModule1.ADOQuery1. FieldValues['ID']));
again := true;
end;
DataModule1.ADOQuery1.Next;
end;
until not again;
end;

یوسف زالی
چهارشنبه 04 خرداد 1390, 10:35 صبح
من هر دو کد رو تست کردم هردو درست بود.