一般不用 for 循环遍历数据集,因为在Client/Server 数据库设计中数据集可能是分批下载的,也就是说 RecordCount 的值可能不是全部的记录。
可以用 while 循环,还可以少定义一个变量。
ADODataSet.Open;
while not ADODataSet.Eof do
begin
// 在此处理数据;
ADODataSet.Next;
end;
当然如果是 Local Database 就无所谓了。
还有 Prepare 语句,我很少用 Prepare,好像 DataSet 一般都会自动调用,印象中手工调用 Prepare 后还要手工调用 Unprepare。我只是凭记忆,说错了请指正。(我的数据库基础不好
。
这句看不懂: rootnodes:array[0..10] of TTreenode;
你的这种BOM结构不需要递归,只需要三层循环就可以解决了。不过我真的不知道你的半成品要用到多个成品中是否会需要两份半成品的物料清单。
很抱歉我不太能读懂你的代码,下面我简单地写了一段示例,参考一下。
var
ProdDataSet, SemiDataSet, MatDataSet: TADODataSet;
CurrNode, CurrSemiNode: TTreeNode;
begin
ProdDataSet.Open;
while not ProdDataSet.Eof do
begin
CurrNode := Tree.AddChild(nil, ProdDataSet.FieldByName('ProdName').AsString);
CurrSemiNode := CurrNode;
? Reset SemiDataSet's SQL property to fit with ProdID
SemiDataSet.Open;
while not SemiDataSet.Eof do
begin
CurrSemiNode := Tree.AddChild(CurrNode, SemiDataSet.FieldByName('SemiName').AsString);
? Reset MatDataSet's SQL property to fit with SemiID
MatDataSet.Open;
while not MatDataSet.Eof do begin
Tree.AddChild(CurrSemiNode, MatDataSet.FieldByName('MatName').AsString);
MatDataSet.Next;
end;
SemiDataSet.Next;
end;
end;
end;