PDA

View Full Version : طراحی گروه بصورت parent and child



pandco
سه شنبه 02 آذر 1395, 17:20 عصر
با سلام و احترام

میخواستم تو برنامه اطلاعات رو بصورت پدر فرزندی طبقه بندی کنم اما تعداد طبقه بندیم نامحدود هست مثلا سطح1 --> سطح1-1 --> سطح 1-1-1 و غیره
و فیلدهای جدول رو بصورت زیر طراحی کردم :
id; parent; title
سطح1; 0 ; 1
سطح 2 ; 0; 2
سطح 1-1; 1; 3
سطح 1-2 ;1; 4
سطح 2-1 ;2 ; 5
سطح 2-2 ;2; 6
سطح2-3 ;2 ; 7
سطح1-1-1 ;3 ;8

مقدار PARENT سطح1 رو صفر میزارم تا مشخص بشه که ریشه هستش.

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

سطح 1
سطح1>سطح1-1
سطح1>سطح1-1>سطح1-1-1
سطح1>سطح1-2
سطح2
سطح2>سطح2-1
سطح2>سطح2-2
سطح2>سطح2-3

که یه تابع بازگشتی نوشتم اما تابع ذکر شده در زیر ، خروجی زیر رو داره
سطح 1
سطح1>سطح1-1
سطح1>سطح1-1>سطح1-1-1


function cat_tree(showall: boolean = false; root: integer = 0 ; prefix: string = ''): string;
var
wher,title,childs,str : string;
begin
if(root=0) then wher:= ' parent= ' + IntToStr(root)
else wher :='parent=' + IntToStr(root) + ' and parent<>id ';
with Data.AQL_Temp1 do
begin
Close;
SQL.Clear;
SQL.Add('select * from group where ' + wher );
Open;
First;
while Not EOF do
begin
if prefix='' then str:='' else str:=prefix + '>';
title:=str + VarToStr(Data.AQL_Temp1['title']);
COMBO.Items.Add(title);
cat_tree(showall, (Data.AQL_Temp1['id']), title);
Next;
end;
end;
end;

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

با تشکر

pandco
چهارشنبه 03 آذر 1395, 08:46 صبح
کد زیر تو php کار میکنه اما نتونستم به دلفی تبدیلش کنم.
function cat_tree($showall=false, $root=0, $prefix=''){
$wher = $root==0 ? "parent=id" : "parent=$root && parent!=id";

$CAT = mysql_query("SELECT id,caption name FROM category WHERE $wher");

while($row = mysql_fetch_array($CAT)){
$title = ($prefix=='' ? '' : "$prefix » ").$row['name'];
$childs = cat_tree($showall, $row['id'], $title);
$output .= $showall ? $title." (".$row['id'].") \n".$childs : ( $childs!='' ? $childs : $title." (".$row['id'].") \n" );
}
return $output;
}

pandco
جمعه 05 آذر 1395, 18:23 عصر
با کد زیر مشکلم حل شد.
function cat_tree(showall: boolean = false; root: integer = 0 ; prefix: string = ''): string;
var
wher,title,str : string;
data1 : array of array of string;
i,j:integer;
begin
if(root=0) then wher:= ' parent= ' + IntToStr(root)
else wher :='parent=' + IntToStr(root) + ' and parent<>id ';
with Data.AQL_Temp1 do
begin
Close;
SQL.Clear;
SQL.Add('select * from group where ' + wher + ' order by title');
Open;
end;
Data.AQL_Temp1.First;
if (Data.AQL_Temp1.RecordCount>0) then
begin
setlength(data1,Data.AQL_Temp1.RecordCount,3);
for i := 0 to ((Data.AQL_Temp1.RecordCount)-1) do
begin
data1[i,0]:=VarToStr(Data.AQL_Temp1['id']);
data1[i,1]:=VarToStr(DataAQL_Temp1['parent']);
data1[i,2]:=VarToStr(Data.AQL_Temp1['title']);
Data.AQL_Temp1.Next;
end;
end;
j:=0;
while j<>i do
begin
if prefix='' then str:='' else str:=prefix + '>';
title:=str + VarToStr(data1[j,2]);
Combo.Items.Add(title);
cat_tree(showall, StrToInt(data1[j,0]), title);
j:=j+1;
end;
end;

با تشکر