PDA

View Full Version : بدست آوردن شاخه اصلی ، ParentID و زیر شاخه ها و سلسله مراتب در Access



FirstLine
سه شنبه 21 اسفند 1386, 13:48 عصر
با سلام
جستجو کردم اما به نتیجه نرسیدم، برای SQL بصورت تابع(http://www.30sharp.com/ShowArticle.aspx?nid=13&did=116&AuthorID=2) پیدا شد اما من برای اکسس و امکانات ADO ترجیحا AdoQuery میخوام لطفا راهنمایی کنید.
یه دیتابیس با فیلدهای مشخص داریم (که ساختار درختی نامحدود با ParentID را تهیه میکند) که به BDTreeVeiw‌ وصل میشه و همه چیز هم بدرستی کار میکنه. (Fields=ID,Name,parentID)
من میخوام پس از انتخاب یک عنوان از این ساختار درختی که در DBTreeveiw نمایش داده میشود دو لیست شامل :
1- لیست ID همه زیر مجموعه های این مورد انتخاب شده (مثلا یه تابع باشه که ID عنوان را به همراه یک AdoQuery گرفته و لیست ID تمام زیر مجموعه ها را بصورت یک string مثل 44,85,110,145 برگرداند)
2- لیست ID‌ همه سر شاخه ها یا ParentID های مورد انتخابی (مثلا یه تابع باشه که ID عنوان را به همراه یک AdoQuery گرفته و لیست ID تمام سرشاخه ها را بصورت یک string مثل 44,85,110,145 برگرداند)

لطفا راهنمایی کنید که با AdoQuery و Access چجوری میتونم این لیست رو بدست بیارم.
خواهشن اگه میگید جستجو کن، لطفا آدرس یا لینک مورد را بفرمایید. همه کارهای برنامه ام آماده است بجز این مورد.
با تشکر

FirstLine
سه شنبه 21 اسفند 1386, 18:09 عصر
با سلام
این تابع را برای این کار نوشته ام اما نمیدونم کجاش ایراد داره.
لطفا این تابع بازگشتی زیر را تصحیح کنید که با دادن ID یک رکورد لیست همه Parent_ID ها رو بر گردونه.
با تشکر


Function MH_ParentID_Get_Parent(int_ID:Integer ; obj_AdoQuery:TADOQuery ):String ;
begin
try
obj_AdoQuery.Close;
obj_AdoQuery.SQL.Clear;
obj_AdoQuery.SQL.Add( 'Select * From Group_Name Where Group_ID=' + IntToStr(int_ID) );
obj_AdoQuery.Open;

if obj_AdoQuery.FieldByName('Group_ParentID').AsInteg er =0 then
Result := obj_AdoQuery.FieldByName('Group_ID').AsString
else
Result := ' , ' + MH_ParentID_Get_Parent(obj_AdoQuery.FieldByName('G roup_ParentID').AsInteger , obj_AdoQuery);


except On E:Exception Do
Result := '0';
end;
end;

FirstLine
چهارشنبه 22 اسفند 1386, 14:51 عصر
با سلام
بالاخره تونستم با کلی زحمت این سه تا تابع رو بنویسم و درست هم کار میکنه.
اما تابع آخر در تعداد لول بالا یه مقداری خطا داره.
لطفا تابع آخر را بهینه و رفع اشکال کنید.
با تشکر




Function MH_ParentID_Get_ParentID_From_ID (int_ID:Integer ; obj_AdoQuery:TADOQuery ):Integer ;
begin
try
obj_AdoQuery.Close;
obj_AdoQuery.SQL.Clear;
obj_AdoQuery.SQL.Add( 'Select * From Group_Name Where Group_ID=' + IntToStr(int_ID) );
obj_AdoQuery.Open;
if obj_AdoQuery.RecordCount =0 Then
Result := 0
else
Result := obj_AdoQuery.FieldByName('Group_ParentID').AsInteg er ;
except On E:Exception Do
Result := 0;
end;
end;



Function MH_ParentID_Get_ParentID_From_ID_ALL(int_ID:Intege r ; obj_AdoQuery:TADOQuery ):String ;
var
int_Temp : Integer ;
int_Loop : integer;
str_Result:String;
begin
try
int_Temp := 1;
str_Result := '';
int_Temp := MH_ParentID_Get_ParentID_From_ID( int_ID, obj_AdoQuery);
for int_Loop:=1 to 20 do
begin
if int_Temp > 0 then
begin
int_ID := MH_ParentID_Get_ParentID_From_ID(int_Temp, obj_AdoQuery);
str_Result := str_Result + ', ' + IntToStr(int_Temp) ;
int_Temp :=int_ID;
end else begin
Result := copy(str_Result, 2 , Length(str_Result)) ;
exit;
end;
end;
except On E:Exception Do
end;
end;





Function MH_ParentID_Get_ID_From_ParentID (int_ParentID:Integer ; obj_AdoQuery:TADOQuery ):String ;
Var
str_Result:String ;
begin
try
str_Result := '';
obj_AdoQuery.Close;
obj_AdoQuery.SQL.Clear;
obj_AdoQuery.SQL.Add( 'Select * From Group_Name Where Group_ParentID=' + IntToStr(int_ParentID) );
obj_AdoQuery.Open;
if obj_AdoQuery.RecordCount =0 Then
begin
Result := '';
exit;
end else begin
while not obj_AdoQuery.Eof=True do
begin
str_Result := str_Result + ', ' + obj_AdoQuery.FieldByName('Group_ID').AsString;
obj_AdoQuery.Next;
end;
end;
Result := copy(str_Result, 2 , Length(str_Result)) ;
except On E:Exception Do
Result := '';
end;
end;



این تابع رو بازبینی کنید




Function MH_ParentID_Get_ID_From_ParentID_ALL(int_ID:Intege r ; obj_AdoQuery:TADOQuery ):String ;
var
int_Loop : Integer ;
str_Result, str_Result_Temp, str_Result_Temp_ID:String;
str_SQL :String;
str_int_In , str_int_NotIn :String ;
begin
try
str_int_In := IntToStr(int_ID);
str_int_NotIn := '';
str_Result := MH_ParentID_Get_ID_From_ParentID( int_ID , obj_AdoQuery) ;

for int_Loop:=1 to 20 do
begin
obj_AdoQuery.Close;
obj_AdoQuery.SQL.Clear;
str_SQL :='Select DISTINCT Group_ID From Group_Name Where Group_ParentID IN (' + str_Result +')' ;
str_SQL := trim(str_SQL);
if copy(str_SQL , length(str_SQL)-1,1)=',' then
str_SQL := copy(str_SQL , 1,length(str_SQL)-2) + ')' ;
str_SQL := AnsiReplaceStr(str_SQL , ',,',',');
obj_AdoQuery.SQL.Add( str_SQL);
obj_AdoQuery.Open;

if obj_AdoQuery.RecordCount > 0 then
begin
str_Result_Temp := '';
while not obj_AdoQuery.Eof=True do
begin
str_Result_Temp_ID := obj_AdoQuery.FieldByName('Group_ID').AsString;
if pos( str_Result_Temp_ID , str_Result ) <1 Then
str_Result_Temp := str_Result_Temp + ',' + str_Result_Temp_ID;
obj_AdoQuery.Next;
end;
str_Result_Temp := copy(str_Result_Temp, 2 , Length(str_Result)) ;

if str_Result_Temp <>'' Then str_Result := str_Result + ',' + str_Result_Temp;
str_int_NotIn := str_Result_Temp ;
end else begin
str_Result_Temp := '';
str_int_NotIn :='';
end;
str_Result := AnsiReplaceStr(str_Result , ',,',',');
end;
Result := str_Result;
except On E:Exception Do
end;
end;