问题:报错 ADOQuery2:Cannot perform this operation on a closed 求教,各位大神指点一下吧,附以下代码
描述:delphi代码
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ADODB, StdCtrls, Grids, DBGrids,shellAPI, ComCtrls, ExtCtrls;
type
TForm1 = class(TForm)
DataSource1: TDataSource;
ADOQuery1: TADOQuery;
Label2: TLabel;
ADOQuery2: TADOQuery;
Button1: TButton;
ADOQuery3: TADOQuery;
ProgressBar1: TProgressBar;
ProgressBar2: TProgressBar;
label4: TLabel;
Label3: TLabel;
ProgressBar3: TProgressBar;
Label1: TLabel;
ComboBox1: TComboBox;
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
si:integer;
implementation
{$R *.dfm}
function hextodec(hstr: string): int64;
var
i,len:integer;
nowdec,tmp:int64;
begin
nowdec:=0;
len:=length(hstr);
for i:=1 to len do
begin
case hstr[i] of
'0':tmp:=0;
'1':tmp:=1;
'2':tmp:=2;
'3':tmp:=3;
'4':tmp:=4;
'5':tmp:=5;
'6':tmp:=6;
'7':tmp:=7;
'8':tmp:=8;
'9':tmp:=9;
'A','a':tmp:=10;
'B','b':tmp:=11;
'C','c':tmp:=12;
'D','d':tmp:=13;
'E','e':tmp:=14;
'F','f':tmp:=15;
end;
nowdec:=nowdec*16+tmp
end;
hextodec:=nowdec;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
ITN,MAC:String;
WO,WODATE:String;
status1: string; //定义状态,方便获取RELEASE_SERVEL表中的状态
WOarray: array[0..30000] of string;
TYPEarray: array[0..30000] of string;
STarray: array[0..30000] of string;
EDarray: array[0..30000] of string;
TIarray: array[0..30000] of string;
MOarray: array[0..30000] of string;
N,WOcount,itemcount,m,i,j:integer;
SMAC,EMAC:int64;
begin
timer1.Enabled:=false;
progressbar1.position:=0;
progressbar2.position:=0;
//progressbar3.position:=0;
si:=1;
//adoquery2.SQL.Clear;
//adoquery2.SQL.Add('delete from SAJET.E_SIGNAGE_TRANFER ');
//adoquery2.ExecSQL;
adoquery2.SQL.Clear;
adoquery2.SQL.Add('select WORK_ORDER AS WO,TURN_TYPE AS TYPE,MACID_START AS ST,MACID_END AS ED,MULTIPLES AS TI,MODEL_ID AS MO from '
+'(SELECT K.WORK_ORDER,J.TURN_TYPE,K.MACID_START,K.MACID_END,J.MULTIPLES,K.MODEL_ID '
+'FROM SAJET.G_WO_BASE K,SAJET.CAMEO_PART_BASE J '
+'WHERE K.MACID_END IS NOT NULL '
+' and K.WORK_ORDER not like''F%'' ' //--2014.6.13add han
+' and K.WORK_ORDER not like''TEST%'' ' //--2014.7.15add han
+'AND K.MACID_END<> ''N/A'' '
+'AND K.WO_STATUS IN (''2'',''3'') '
+'AND K.WO_CREATE_DATE > to_date(''2014/04/01 00:00:01'',''YYYY/MM/DD HH24:MI:SS'') ' //--2014.6.13update han
+'AND K.MODEL_ID=J.PART_NO '
+'AND K.MACID_END NOT IN (SELECT END FROM SAJET.CAMEO_RELEASE_SERVEL L) '
+'AND K.MACID_START NOT IN (SELECT L.STA FROM SAJET.CAMEO_RELEASE_SERVEL L) '
+'UNION ALL '
+'SELECT K.WORK_ORDER,J.TURN_TYPE,K.MACID_START_2,K.MACID_END_2,J.MULTIPLES,K.MODEL_ID '
+'FROM SAJET.G_WO_BASE K,SAJET.CAMEO_PART_BASE J '
+'WHERE K.MACID_END_2 IS NOT NULL '
+' and K.WORK_ORDER not like''F%'' ' //--2014.6.13add han
+' and K.WORK_ORDER not like''TEST%'' ' //--2014.7.15add han
+'AND K.MACID_END_2<> ''N/A'' '
+'AND K.WO_STATUS IN (''2'',''3'') '
+'AND K.WO_CREATE_DATE > to_date(''2014/04/01 00:00:01'',''YYYY/MM/DD HH24:MI:SS'') ' //--2014.6.13update han
+'AND K.MODEL_ID=J.PART_NO '
+'AND K.MACID_END_2 NOT IN (SELECT END FROM SAJET.CAMEO_RELEASE_SERVEL L) '
+'AND K.MACID_START_2 NOT IN (SELECT L.STA FROM SAJET.CAMEO_RELEASE_SERVEL L)) ');
ADOQUERY2.Open;
if ADOQUERY2.RecordCount<>0 then
begin
m := 0;
repeat
WOcount :=ADOQuery2.RecordCount;
WOarray[m] := ADOQuery2.FieldValues['WO'];
TYPEarray[m] := ADOQuery2.FieldValues['TYPE'];
STarray[m] := ADOQuery2.FieldValues['ST'];
EDarray[m] := ADOQuery2.FieldValues['ED'];
TIarray[m] := ADOQuery2.FieldValues['TI'];
MOarray[m] := ADOQuery2.FieldValues['MO'];
m := m + 1;
ADOQuery2.Next;
until ADOQuery2.eof;
for m := 0 to WOcount do
begin
if woarray[m] <> '' then
begin
progressbar1.Min:=1;
progressbar1.Max:=WOcount;
progressbar1.Position:=m;
Application.ProcessMessages;
ADOQuery2.close;
adoquery2.SQL.Clear;
adoquery2.SQL.Add('insert into SAJET.CAMEO_RELEASE_SERVEL R (R.WO,R.TYPE,R.STA,R.END,R.STATUS,R.TIMES) '
+'values ('''+WOarray[m]+''','''+TYPEarray[m]+''','''+STarray[m]+''','''+EDarray[m]+''',''N'','''+TIarray[m]+''') ');
adoquery2.ExecSQL;
//SMAC :=UpperCase(HexToDec(STarray[m]));
//EMAC :=UpperCase(HexToDec(EDarray[m]));
//SMAC :=strtoint('$'+STarray[m]);
//EMAC :=strtoint('$'+EDarray[m]);
N:=StrToInt(TIarray[m]);
MAC := STarray[m];
ITN:='mac'+ MOarray[m];
for i := 0 to EMAC-SMAC do
begin
if SMAC <= EMAC then
begin
ADOQuery2.close;
adoquery2.SQL.Clear;
adoquery2.SQL.Add('SELECT * FROM SAJET.G_BID_INFO WHERE ITEM_NO='''+MAC+'''');
if adoquery2.RecordCount>0 then
begin
ADOQuery2.close;
adoquery2.SQL.Clear;
adoquery2.SQL.Add('INSERT INTO SAJET.CAMEO_RELEASE_SERVEL(WO,TYPE,STA,END,STATUS) VALUES('''+WOarray[m]+''','''+TYPEarray[m]+''','''+MAC+''',''DUP'',''N'')');
adoquery2.ExecSQL;
end
else
begin
//i:=1;
ADOQuery2.close;
adoquery2.SQL.Clear;
adoquery2.SQL.Add('insert into SAJET.G_BID_INFO P ('
+'P.LOT_NO,P.ITEM_NAME,P.ITEM_NO,P.REMARK,P.STATUS) '
+'values('+''''+WOarray[m]+''''+','+''''+ITN+''''+','+''''+mac+''''+',''PR'',''N'' )');
adoquery2.ExecSQL;
end;
SMAC := N + SMAC;
MAC := inttohex(SMAC,12);
progressbar2.Min:=1;
progressbar2.Max:=EMAC-SMAC+2;
progressbar2.Position:=i;
//i:=i+1;
Application.ProcessMessages;
end;
end;
ADOQuery2.close;
adoquery2.SQL.Clear;
adoquery2.SQL.Add('update SAJET.CAMEO_RELEASE_SERVEL t set t.STATUS=''Y'' , t.utime=sysdate '
+'Where T.WO=' + '''' + WOarray[m] + '''' + ' '
+'AND end=' + '''' + EDarray[m] + '''' + ' ');
adoquery2.ExecSQL;
// 记录大於0 向CAMEO_RELEASE_SERVEL表中插入状态为N 如果小於0 就像G_BID_INFO表中插入数据, info表中有数据之後,
//把RELEASE_SERVEL表中状态变为Y
//然後把状态设置为Y
end;
Adoquery2.Close;
Adoquery2.SQL.Clear;
Adoquery2.SQL.Add('SELECT t.status '+' FROM SAJET.CAMEO_RELEASE_SERVEL t '+' where t.status=''N'' '+' and t.utime>sysdate-2 '+' and T.WO='+' ''' + WOarray[m] + '''');
ADOQuery2.open;
//status1:=adoquery2.fieldbyname('status').asstring;
status1:=Adoquery2.FieldValues['status'];
if status1='N' then
begin
ADOQuery2.close;
adoquery2.SQL.Clear;
adoquery2.SQL.Add('insert into SAJET.G_BID_INFO P ('
+'P.LOT_NO,P.ITEM_NAME,P.ITEM_NO,P.REMARK,P.STATUS) '
+'values('+''''+WOarray[m]+''''+','+''''+ITN+''''+','+''''+mac+''''+',''PR'',''N'' )');
adoquery2.ExecSQL;
end;
ADOQuery2.close;
adoquery2.SQL.Clear;
adoquery2.SQL.Add('update SAJET.CAMEO_RELEASE_SERVEL t set t.STATUS=''Y'' , t.utime=sysdate '
+'Where T.WO=' + '''' + WOarray[m] + '''' + ' '
+'AND end=' + '''' + EDarray[m] + '''' + ' ');
adoquery2.ExecSQL;
end;
end;
ADOQUERY2.close;
timer1.Enabled:=true;
progressbar1.position:=0;
progressbar2.position:=0;
progressbar3.position:=0;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
label2.Caption:='2014-06-10 V14.6.10';
timer1.Enabled:=true;
progressbar3.position:=0;
si:=1;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
ss:int64;
begin
ss:=strtoint(trim(combobox1.Text))*120;
if si<>
then
begin
timer1.Enabled:=true;
si:=si+1;
progressbar3.Min:=1;
progressbar3.Max:=ss;
progressbar3.Position:=si;
Application.ProcessMessages;
end
else
begin
timer1.Enabled:=false;
Application.ProcessMessages;
Button1Click(Button1);
end;
end;
end.
解决方案1: progressbar1.Min:=1;
progressbar1.Max:=WOcount;
progressbar1.Position:=m;
你这里, P1 最小设置为1, 然 m 是从 0 开始的...
下面这个也是一样, i 也是从0开始的...
progressbar2.Min:=1;
progressbar2.Max:=EMAC-SMAC+2;
progressbar2.Position:=i;
解决方案2: 同意楼上, 判断前需要先OPEN
解决方案3: 先跟踪一下看看哪句报错的。
感觉应该是下面这段报错吧。
if SMAC <= EMAC then
begin
ADOQuery2.close;
adoquery2.SQL.Clear;
adoquery2.SQL.Add('SELECT * FROM SAJET.G_BID_INFO WHERE ITEM_NO='''+MAC+'''');
if adoquery2.RecordCount>0 then
begin
上面的第三句close了,第六句却是判断adoquery2.RecordCount>0。
要么不close,要么在判断之前再open。
- 明星图片
- 相关文章
-
联系邮箱:mxgf168#qq.com(#改为@)