procedure TForm1.Button10Click(Sender: TObject); var STr,Todata:string; Flag:Integer; begin ClientDataSet1.Fields[7].ReadOnly:=False; ClientDataSet1.Fields[8].ReadOnly:=False; ClientDataSet1.Fields[10].ReadOnly:=False; ClientDataSet1.Fields[12].ReadOnly:=False; ClientDataSet1.Fields[14].ReadOnly:=False; Flag:=0; STr:='select * from Input where 变电站名= ''' + Edit1.Text + ''''; ClientDataSet1.CommandText:=STr; ClientDataSet1.open; While not ClientDataSet1.Eof do begin if ClientDataSet1.Fields[9].AsBoolean = True then begin if ClientDataSet1.Fields[8].Value = Null then begin Flag:=1; ClientDataSet1.Edit; ClientDataSet1.FieldByName('运维班核对人1').AsString:=loginForm.edit2.Text; ClientDataSet1.Post; end; if ClientDataSet1.Fields[8].Value = '' then begin Flag:=1; ClientDataSet1.Edit; ClientDataSet1.FieldByName('运维班核对人1').AsString:=loginForm.edit2.Text; ClientDataSet1.Post; end; end; if ClientDataSet1.Fields[9].AsBoolean = True then begin if ClientDataSet1.Fields[11].AsBoolean = True then begin if ClientDataSet1.Fields[12].Value = Null then begin Flag:=2; ClientDataSet1.Edit; ClientDataSet1.FieldByName('核对情况').AsString:='正常'; ClientDataSet1.FieldByName('运维班核对人2').AsString:=loginForm.edit2.Text; ClientDataSet1.Post; end; if ClientDataSet1.Fields[12].Value = '' then begin Flag:=2; ClientDataSet1.Edit; ClientDataSet1.FieldByName('核对情况').AsString:='正常'; ClientDataSet1.FieldByName('运维班核对人2').AsString:=loginForm.edit2.Text; ClientDataSet1.Post; end; end; if ClientDataSet1.Fields[13].AsBoolean = True then begin if ClientDataSet1.Fields[12].Value = Null then begin Flag:=2; ClientDataSet1.Edit; ClientDataSet1.FieldByName('监控核对人').AsString:=Edit6.Text; Todata:=datetostr(Date()); ClientDataSet1.FieldByName('核对日期').AsString:=Todata; ClientDataSet1.Post; end; if ClientDataSet1.Fields[12].Value = '' then begin Flag:=2; ClientDataSet1.Edit; ClientDataSet1.FieldByName('监控核对人').AsString:=Edit6.Text; Todata:=datetostr(Date()); ClientDataSet1.FieldByName('核对日期').AsString:=Todata; ClientDataSet1.Post; end; end; end; if not ClientDataSet1.Fields[9].AsBoolean then begin ClientDataSet1.Prior; break; end; if Flag =2 then begin if ClientDataSet1.Fields[11].AsBoolean then ClientDataSet1.Next; end; if Flag = 1 then ClientDataSet1.Next; if Flag =2 then begin if not ClientDataSet1.Fields[11].AsBoolean then begin ClientDataSet1.Prior; break; end; end; end; ADOquery2.Close; ADOquery2.SQL.Clear; ADOquery2.SQL.Add('select * from Input where 变电站名= ''' + Edit1.Text + ''''); ADOquery2.Open; with DataSetProvider1.DataSet.FieldByName( '序号' ) do ProviderFlags := ProviderFlags + [ pfInKey ]; with DataSetProvider1.DataSet.FieldByName( '变电站名' ) do ProviderFlags := ProviderFlags + [ pfInKey ]; ClientDataSet1.ApplyUpdates (0); ADOquery2.Close; ClientDataSet1.Fields[7].ReadOnly:=True; ClientDataSet1.Fields[8].ReadOnly:=True; ClientDataSet1.Fields[10].ReadOnly:=True; ClientDataSet1.Fields[12].ReadOnly:=True; ClientDataSet1.Fields[14].ReadOnly:=True; end;
简单看了你的代码: 1、你的 While not ClientDataSet1.Eof do begin end; 循环中,缺少有效的NEXT语句。在这种循环中,进入每一个 (行)数据后,不管如何处理数据,都要能进入下一行数据(NEXT),或退出。不能停留在某行,造成死循环。 2、你的Next出口,有以下: Flag =0; Flag =1;Flag =2; ClientDataSet1.Fields[11].AsBoolean=True;ClientDataSet1.Fields[11].AsBoolean=False 组合的情况;在 While not ClientDataSet1.Eof do循环中,没有完全列举列举出来,造成了死循环。 3、你的NEXT出口,列举使用并列式的法语句不妥: if not ClientDataSet1.Fields[9].AsBoolean then begin end; if Flag =2 then begin if ClientDataSet1.Fields[11].AsBoolean then end; if Flag = 1 then if Flag =2 then begin if not ClientDataSet1.Fields[11].AsBoolean then begin end; end; 这样,会有没有列举的情况,造成死循环,建议使用纯与否组合语句: if then begin if then esle end else begin if then esle end; 与否执行的语句只能有二种;NEXT或 break;。 4、循环中使用Prior; 只能二种情况:(1)退后一步,处理数据后,一定还要前进二步,切实保证Next; (2) 退后一步,处理数据后,退出循环。以上,仅供参考。
var
STr,Todata:string;
Flag:Integer;
begin
ClientDataSet1.Fields[7].ReadOnly:=False;
ClientDataSet1.Fields[8].ReadOnly:=False;
ClientDataSet1.Fields[10].ReadOnly:=False;
ClientDataSet1.Fields[12].ReadOnly:=False;
ClientDataSet1.Fields[14].ReadOnly:=False;
Flag:=0;
STr:='select * from Input where 变电站名= ''' + Edit1.Text + '''';
ClientDataSet1.CommandText:=STr;
ClientDataSet1.open;
While not ClientDataSet1.Eof do
begin
if ClientDataSet1.Fields[9].AsBoolean = True then
begin
if ClientDataSet1.Fields[8].Value = Null then
begin
Flag:=1;
ClientDataSet1.Edit;
ClientDataSet1.FieldByName('运维班核对人1').AsString:=loginForm.edit2.Text;
ClientDataSet1.Post;
end;
if ClientDataSet1.Fields[8].Value = '' then
begin
Flag:=1;
ClientDataSet1.Edit;
ClientDataSet1.FieldByName('运维班核对人1').AsString:=loginForm.edit2.Text;
ClientDataSet1.Post;
end;
end;
if ClientDataSet1.Fields[9].AsBoolean = True then
begin
if ClientDataSet1.Fields[11].AsBoolean = True then
begin
if ClientDataSet1.Fields[12].Value = Null then
begin
Flag:=2;
ClientDataSet1.Edit;
ClientDataSet1.FieldByName('核对情况').AsString:='正常';
ClientDataSet1.FieldByName('运维班核对人2').AsString:=loginForm.edit2.Text;
ClientDataSet1.Post;
end;
if ClientDataSet1.Fields[12].Value = '' then
begin
Flag:=2;
ClientDataSet1.Edit;
ClientDataSet1.FieldByName('核对情况').AsString:='正常';
ClientDataSet1.FieldByName('运维班核对人2').AsString:=loginForm.edit2.Text;
ClientDataSet1.Post;
end;
end;
if ClientDataSet1.Fields[13].AsBoolean = True then
begin
if ClientDataSet1.Fields[12].Value = Null then
begin
Flag:=2;
ClientDataSet1.Edit;
ClientDataSet1.FieldByName('监控核对人').AsString:=Edit6.Text;
Todata:=datetostr(Date());
ClientDataSet1.FieldByName('核对日期').AsString:=Todata;
ClientDataSet1.Post;
end;
if ClientDataSet1.Fields[12].Value = '' then
begin
Flag:=2;
ClientDataSet1.Edit;
ClientDataSet1.FieldByName('监控核对人').AsString:=Edit6.Text;
Todata:=datetostr(Date());
ClientDataSet1.FieldByName('核对日期').AsString:=Todata;
ClientDataSet1.Post;
end;
end;
end;
if not ClientDataSet1.Fields[9].AsBoolean then
begin
ClientDataSet1.Prior;
break;
end;
if Flag =2 then
begin
if ClientDataSet1.Fields[11].AsBoolean then
ClientDataSet1.Next;
end;
if Flag = 1 then
ClientDataSet1.Next;
if Flag =2 then
begin
if not ClientDataSet1.Fields[11].AsBoolean then
begin
ClientDataSet1.Prior;
break;
end;
end;
end;
ADOquery2.Close;
ADOquery2.SQL.Clear;
ADOquery2.SQL.Add('select * from Input where 变电站名= ''' + Edit1.Text + '''');
ADOquery2.Open;
with DataSetProvider1.DataSet.FieldByName( '序号' ) do
ProviderFlags := ProviderFlags + [ pfInKey ];
with DataSetProvider1.DataSet.FieldByName( '变电站名' ) do
ProviderFlags := ProviderFlags + [ pfInKey ];
ClientDataSet1.ApplyUpdates (0);
ADOquery2.Close;
ClientDataSet1.Fields[7].ReadOnly:=True;
ClientDataSet1.Fields[8].ReadOnly:=True;
ClientDataSet1.Fields[10].ReadOnly:=True;
ClientDataSet1.Fields[12].ReadOnly:=True;
ClientDataSet1.Fields[14].ReadOnly:=True;
end;
1、你的
While not ClientDataSet1.Eof do
begin
end;
循环中,缺少有效的NEXT语句。在这种循环中,进入每一个 (行)数据后,不管如何处理数据,都要能进入下一行数据(NEXT),或退出。不能停留在某行,造成死循环。
2、你的Next出口,有以下:
Flag =0; Flag =1;Flag =2; ClientDataSet1.Fields[11].AsBoolean=True;ClientDataSet1.Fields[11].AsBoolean=False
组合的情况;在 While not ClientDataSet1.Eof do循环中,没有完全列举列举出来,造成了死循环。
3、你的NEXT出口,列举使用并列式的法语句不妥:
if not ClientDataSet1.Fields[9].AsBoolean then
begin
end;
if Flag =2 then
begin
if ClientDataSet1.Fields[11].AsBoolean then
end;
if Flag = 1 then
if Flag =2 then
begin
if not ClientDataSet1.Fields[11].AsBoolean then
begin
end;
end;
这样,会有没有列举的情况,造成死循环,建议使用纯与否组合语句:
if then begin
if then
esle
end
else begin
if then
esle
end;
与否执行的语句只能有二种;NEXT或 break;。
4、循环中使用Prior;
只能二种情况:(1)退后一步,处理数据后,一定还要前进二步,切实保证Next;
(2) 退后一步,处理数据后,退出循环。以上,仅供参考。