با سلام
بالاخره تونستم با کلی زحمت این سه تا تابع رو بنویسم و درست هم کار میکنه.
اما تابع آخر در تعداد لول بالا یه مقداری خطا داره.
لطفا تابع آخر را بهینه و رفع اشکال کنید.
با تشکر
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;