要看到ClientDataSet的具体语句,才能分析问题所在?

解决方案 »

  1.   

    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;
      

  2.   

    简单看了你的代码:
    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) 退后一步,处理数据后,退出循环。以上,仅供参考。