有关生成BOM树出现的问题,请高手帮忙

modney 2011-11-01 03:44:54
代码如下:
procedure TFrmkd0013.CreateTVList;
var
TVNode :TTreenode;
qry_trans :TADOQuery;
str_sql :string;
begin
qry_trans :=TADOQuery.Create(self);
qry_trans.Connection :=dm.adoconn;
str_sql :='select FItemID,FNumber,FParentid,FName,FShortNumber into #t_item_temp1 from t_item (nolock) where fitemclassid=4 create index ix_temp1 on #t_item_temp1(fnumber asc,fitemid,fparentid)';
qry_trans.SQL.Add(str_sql);
qry_trans.ExecSQL;

TVNode :=TV1.Items.AddChildFirst(TV1.Items.GetFirstNode,'物料');

AddChildNode(TVNode);
qry_trans.Close;
qry_trans.SQL.Clear;
str_sql :='drop table #t_item_temp1';
qry_trans.SQL.Add(str_sql);
qry_trans.ExecSQL;
qry_trans.Free;
end;
procedure TFrmkd0013.AddChildNode(node :TTreeNode);
var
qry_child :TADOQuery;
CData :^TCNODE;
TVNode :TTreenode;
str_sql :string;
begin
qry_child :=TADOQuery.Create(self);
with qry_child do
begin
Connection :=dm.adoconn;
close;
str_sql :=' select * from #t_item_temp1 (nolock) where fparentid='+QuotedStr(Data_Str)+' order by FNumber';
sql.Add(str_sql);
open;
first;
while not eof do
begin
new(CData);
Data_Str := fieldbyname('Fitemid').asstring;
CData^.FNumber := fieldbyname('FNumber').AsString;
CData^.FName := fieldbyname('FName').AsString;
CData^.FParentid := fieldbyname('FParentid').AsString;
TVNode := TV1.Items.AddChildObject(node,fieldbyname('FShortNumber').AsString+'('+fieldbyname('FName').AsString+')',CData);
TVNode.ImageIndex :=1;
TVNode.StateIndex :=2;
AddChildNode(TVNode);
next;
end;
end;
qry_child.Free;
end;

出错如图:
...全文
195 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
lincats 2013-09-18
  • 打赏
  • 举报
回复
小明,哥笑了,你的问题。
modney 2011-11-03
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 smallhand 的回复:]
qry_trans.ExecSQL; //这里如果返回要用qry_trans.Open; //这不是开玩笑吗?[/Quote]
bambuz 2011-11-02
  • 打赏
  • 举报
回复
代码中读错误地址是很容易出现的.
最好就是逐步调试,找到具体出错的代码是什么.
「已注销」 2011-11-01
  • 打赏
  • 举报
回复
神仙也猜不出来。debug.
火龙岛主 2011-11-01
  • 打赏
  • 举报
回复
读取的无效地址,跟为空不为空,没有关系。
procedure TFrmkd0013.CreateTVList;
var
TVNode :TTreenode;
qry_trans :TADOQuery;
str_sql :string;
begin
qry_trans :=TADOQuery.Create(self);
qry_trans.Connection :=dm.adoconn;
str_sql :='select FItemID,FNumber,FParentid,FName,FShortNumber into #t_item_temp1 from t_item (nolock) where fitemclassid=4 create index ix_temp1 on #t_item_temp1(fnumber asc,fitemid,fparentid)';
qry_trans.SQL.Add(str_sql);
qry_trans.ExecSQL; //这里如果返回要用qry_trans.Open;

TVNode :=TV1.Items.AddChildFirst(TV1.Items.GetFirstNode,'物料');

AddChildNode(TVNode); //检查这里是否有问题
qry_trans.Close;
qry_trans.SQL.Clear;
str_sql :='drop table #t_item_temp1';
qry_trans.SQL.Add(str_sql);
qry_trans.ExecSQL;
qry_trans.Free;
end;
procedure TFrmkd0013.AddChildNode(node :TTreeNode);
var
qry_child :TADOQuery;
CData :^TCNODE;
TVNode :TTreenode;
str_sql :string;
begin
qry_child :=TADOQuery.Create(self);
with qry_child do
begin
Connection :=dm.adoconn;
close;
str_sql :=' select * from #t_item_temp1 (nolock) where fparentid='+QuotedStr(Data_Str)+' order by FNumber';
sql.Add(str_sql);
open;
first;
while not eof do
begin
new(CData);
Data_Str := fieldbyname('Fitemid').asstring;
CData^.FNumber := fieldbyname('FNumber').AsString;
CData^.FName := fieldbyname('FName').AsString;
CData^.FParentid := fieldbyname('FParentid').AsString;
TVNode := TV1.Items.AddChildObject(node,fieldbyname('FShortNumber').AsString+'('+fieldbyname('FName').AsString+')',CData);
TVNode.ImageIndex :=1;
TVNode.StateIndex :=2;
AddChildNode(TVNode);//递归调用?
next;
end;
end;
qry_child.Free;
end;

注意你的CData,你在哪里释放,可能会引起内存泄露。
modney 2011-11-01
  • 打赏
  • 举报
回复
数据没有空的,我取的是关键这段,不允许为空。
某某某 2011-11-01
  • 打赏
  • 举报
回复
你可以调试一下看看哪一行报错的。
我估计是你的字段有为空的,当你做asstring的时候就会报错。你检查一下你的数据。
modney 2011-11-01
  • 打赏
  • 举报
回复
搞了两天了,没有个眉目,唉!!

2,497

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧