ADODataSet重复使用,出现“在对应所需名称或序数的集合中,未找到项目。”的错误提示,代码如下

bphantom 2004-10-15 10:54:29
procedure TFormStoreManage.BitBtn32Click(Sender: TObject);
var
dInCou,dOutCou,dStoreCou,dInitCou,dTemp:Double;
dsin:array[0..4] of Double;
i:integer;
begin
ADODSInOutMonSto.Active := false;
//删除临时表中的数据
ADOCommand1.CommandText:='Delete from InOutMonStore';
ADOCommand1.Execute;

ADODSCom.Close;
ADODSCom.CommandText := 'Select * from CpLx order by 产品类型';
ADODSCom.Open;
if ADODSCom.RecordCount>0 then
begin
FormProcess := TFormProcess.Create(self);
FormProcess.Caption:='统计进度...';
FormProcess.ProgressBar2.Max:=ADODSCom.RecordCount;
FormProcess.Show;
//1级循环
while not ADODSCom.Eof do
begin
FormProcess.ProgressBar2.Position := ADODSCom.RecNo;
ADODSCom1.Close;
ADODSCom1.CommandText := 'select * from CpK_ where 产品类型='+chr(39)+ADODSCom.FieldByName('产品类型').AsString+chr(39)+' order by 产品名称';
ADODSCom1.Open;
if ADODSCom1.RecordCount>0 then
begin
FormProcess.ProgressBar1.Max := ADODSCom1.RecordCount;
//2级循环
while not ADODSCom1.Eof do
begin
FormProcess.ProgressBar1.Position :=ADODSCom1.RecNo;
//下面将重复使用ADODSCom2,类型是ADODataSet
ADODSCom2.Close;
ADODSCom2.CommandText:='Select * from DjK where 产品类型='+chr(39)+ADODSCom.FieldByName('产品类型').AsString+chr(39)+' And 产品名称='+chr(39)+ADODSCom1.FieldByName('产品名称').AsString+chr(39)+' And 入库日期>='+'#'+sYear+'-'+sMonth+'-1#'+' And 入库日期<'+'#'+sYear+'-'+IntToStr(StrToInt(sMonth)+1)+'-1#';
ADODSCom2.Open;
dInCou:=0;
while not ADODSCom2.Eof do
begin
dInCou:=dInCou+ADODSCom2.FieldByName('数量').Value;
ADODSCom2.Next;
end;

ADODSCom2.Close;
//-------------------------------------
ADODSCom2.CommandText:='Select * from DbK where 产品类型='+chr(39)+ADODSCom.FieldByName('产品类型').AsString+chr(39)+' And 产品名称='+chr(39)+ADODSCom1.FieldByName('产品名称').AsString+chr(39)+' And 调拨日期>='+'#'+sYear+'-'+sMonth+'-1#'+' And 调拨日期<'+'#'+sYear+'-'+IntToStr(StrToInt(sMonth)+1)+'-1#';
ADODSCom2.Open;//在2级循环执行一次后,在第二次到达此处时,弹出标题中的错误
dOutCou:=0;
while not ADODSCom2.Eof do
begin
dOutCou:=dOutCou+ADODSCom2.FieldByName('数量').Value;
ADODSCom2.Next;
end;
ADODSCom2.Close;
ADODSCom2.CommandText:='Select * from KcKG where 产品类型='+chr(39)+ADODSCom.FieldByName('产品类型').AsString+chr(39)+' And 产品名称='+chr(39)+ADODSCom1.FieldByName('产品名称').AsString+chr(39);
ADODSCom2.Open;
dStoreCou:=0;
while not ADODSCom2.Eof do
begin
dStoreCou:=dStoreCou+ADODSCom2.FieldByName('数量').Value;
ADODSCom2.Next;
end;
dInitCou := dStoreCou+dOutCou-dInCou;

for i:=0 to 4 do
begin
dsin[i]:=0;
end;

for i:=0 to nDesBDCou-1 do
begin
//ADODSCom2.First;
ADODSCom2.Filtered:=false;
ADODSCom2.Filter:='仓库类型='+chr(39)+rDesDB[i].DBName+chr(39);
ADODSCom2.Filtered:=true;
//ADODSCom2.First; 这句到底要不要呢????
dTemp:=0;
while not ADODSCom2.Eof do
begin
dTemp:=dTemp+ADODSCom2.FieldByName('数量').Value;
ADODSCom2.Next;
end;
dsin[i]:=dTemp;
end;
if nDesBDCou>0 then
begin
ADODSInOutMonSto.Close;
ADODSInOutMonSto.CommandText:='Select top 1 * from InOutMonStore';
ADODSInOutMonSto.Open;
ADODSInOutMonSto.Insert;
ADODSInOutMonSto.Edit;
ADODSInOutMonSto.FieldByName('产品类型').AsString := ADODSCom.FieldByName('产品类型').AsString;
ADODSInOutMonSto.FieldByName('产品名称').AsString := ADODSCom1.FieldByName('产品名称').AsString;
ADODSInOutMonSto.FieldByName('单位').AsString := ADODSCom1.FieldByName('单位').AsString;
ADODSInOutMonSto.FieldByName('月初库存数量').Value:=dInitCou;
ADODSInOutMonSto.FieldByName('本月入库数量').Value:=dInCou;
ADODSInOutMonSto.FieldByName('本月发出数量').Value:=dOutCou;
ADODSInOutMonSto.FieldByName('库存数量').Value:=dStoreCou;
ADODSInOutMonSto.FieldByName('一库数量').Value:=dsin[0];
ADODSInOutMonSto.FieldByName('二库数量').Value:=dsin[1];
ADODSInOutMonSto.FieldByName('三库数量').Value:=dsin[2];
ADODSInOutMonSto.FieldByName('四库数量').Value:=dsin[3];
ADODSInOutMonSto.FieldByName('五库数量').Value:=dsin[4];
try
ADODSInOutMonSto.Post;
except
MessageBox(self.Handle,'提交临时数据失败,请重试或联系技术人员!','错误',MB_OK);
exit;
end;
end;

ADODSCom1.Next;
end;
end;
ADODSCom.Next;
end;
FormProcess.Free;
ADODSInOutMonSto.Close;
ADODSInOutMonSto.CommandText:='Select * from InOutMonStore';
ADODSInOutMonSto.Open;
QuickRep5.Preview;
end;
end;

如果不重复使用ADODSCom2,二分别用不同的,如ADODSCom3,ADODSCom4来代替,就不出现问题了。怎么回事呀?close再open应该可以重复查询不同的表的。
...全文
355 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
ghchen 2004-10-26
  • 打赏
  • 举报
回复
可能是查询的字段没有
pinyu 2004-10-26
  • 打赏
  • 举报
回复
原因找到,所有的过滤ADODSCom2.Filtered:=false;
ADODSCom2.Filter:='仓库类型='+chr(39)+rDesDB[i].DBName+chr(39);
ADODSCom2.Filtered:=true
都有问题。如果改为SqL从新查询(但影响速度)就不会有问题了,一直不是很明白过滤怎么用,不知道上面为什么会导致上述问题。
==========================================================================

你的错误好像在chr(39)上,我觉得你可能需要用chr(96)。
101monster 2004-10-26
  • 打赏
  • 举报
回复
呵呵,UP!
Rail100 2004-10-26
  • 打赏
  • 举报
回复
太强了,这么多代码写在同一个函数,如果变量也用A1A2来表示就完美了。
readersm68 2004-10-25
  • 打赏
  • 举报
回复
靠 Select语句中根本没有包含“仓库类型”字段。看不明白怎么会在循环中设置过滤呢?
唉 晕,直接在存储过程做统计吧。
readersm68 2004-10-25
  • 打赏
  • 举报
回复
过滤字段是否是Lookup字段,如果是的话就不能这么设置过滤。在数据集的OnFilterRecord设置。
不会的话通过短消息跟我联系。
ghchen 2004-10-25
  • 打赏
  • 举报
回复
不会,帮顶
zdq801104 2004-10-25
  • 打赏
  • 举报
回复
你用SQL语句 解决不就可以了,为什么要用Filtered
hb8069 2004-10-25
  • 打赏
  • 举报
回复
代码需要重构
用OO的工具写着过程的代码!哎
brallow 2004-10-24
  • 打赏
  • 举报
回复
太复杂了,懒得看了。。。
readersm68 2004-10-24
  • 打赏
  • 举报
回复
在使用第二次的时候,打开数据集之前,把Filtered:=false;ADODSCom2.Filter:='';
trainbox 2004-10-15
  • 打赏
  • 举报
回复
gz
bphantom 2004-10-15
  • 打赏
  • 举报
回复
原因找到,所有的过滤ADODSCom2.Filtered:=false;
ADODSCom2.Filter:='仓库类型='+chr(39)+rDesDB[i].DBName+chr(39);
ADODSCom2.Filtered:=true
都有问题。如果改为SqL从新查询(但影响速度)就不会有问题了,一直不是很明白过滤怎么用,不知道上面为什么会导致上述问题。
readersm68 2004-10-15
  • 打赏
  • 举报
回复
估计是SQL语句的问题。每条查询单独调试,注意引号是否准确
readersm68 2004-10-15
  • 打赏
  • 举报
回复
对像本身不存在或错误地引用了一个不存在的字段名
bphantom 2004-10-15
  • 打赏
  • 举报
回复
数据库是Access,连接用的是ADO->ODBC

2,496

社区成员

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

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