//数据库结构如下,目的想把MainID下的(子子……)级全部列出
MainID(主件),ChildID(子件)
1              11
1              22  
1              33 
11             1101
1101           110101
1101           110102//主方法如下-------------------------------------
procedure GetBOMChild(ParentID:string; out mResultList:TStringList);
var mSQL,mFields:string;
    mChild:string;
    i:integer;
    mReturnData:variant;
begin
  try
    QryMain.Close;
    QryMain.SQL.clear;
    mSQL:='SELECT ChildID FROM T_BOM WHERE MainID='+QuotedStr(ParentID);
    QryMain.SQL.Add(mSQL);
    QryMain.Open;
  except
    ShowMessage('获得主件品号['+ParentID+']的子件品号时发生错误!')
  end;
  QryMain.First;
  while not QryMain.Eof do
  begin
    mChild := QryMain.FindField('ChildID').AsString;
    ▲▲▲ShowMessage(mChild); //这里显示结果!!!!!!但结果只Show出 11,1101,110101(均只显示了其ChildID中的第一条,没有遍历完.)
    GetBOMChild(mChild,mResultList);//这里递归!!!!!!!!!!!!!
    QryMain.Next;
  end;
end;//调用方法如下-------------------------------------
procedure Button1Click(Sender: TObject);
var mChildList:TStringList;
    i:integer;
begin
  inherited;
  if FBOMChild = nil then
    FBOMChild:=TStringList.Create
  else
    FBOMChild.Clear;
  GetBOMChild('1',FBOMChild);
  FBOMChild.Free;
end;
//结果-------------------------------------------
▲▲▲标记处 只Show出 11,1101,110101(均只显示了其ChildID中的第一条,没有遍历完.)

解决方案 »

  1.   

    QryMain 要动态建立就可以了,不然关闭时出现 非法的pointer的错误
    procedure GetBOMChild(ParentID:string; out mResultList:TStringList);
    var mSQL,mFields:string;
        mChild:string;
        i:integer;
        mReturnData:variant;
         QryMain :Tadoqurey;
    begin
      try
        QryMain:=Tadoqurey.create(nil);
        QryMain.connection :=
        QryMain.SQL.clear;
    ....