ADODataSet重复使用,出现“在对应所需名称或序数的集合中,未找到项目。”的错误提示,代码如下
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应该可以重复查询不同的表的。