procedure TfrmMain.NcaculateClick(Sender: TObject);
var
bid1: TBid;
estimate: TEstimate;
begin
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Text := 'select * from Bid';
ADOQuery1.Open;
ADOQuery2.Close;
ADOQuery2.SQL.Clear;
ADOQuery2.SQL.Add('insert into Estimate(CompanyNo,EstimateFactor )'+
'values(:CompanyNo,:EstimateFactor)');
ADOQuery1.First;
while not ADOQuery1.Eof do
begin
bid1.CompanyNo := ADOQuery1.FieldByName('CompanyNo').AsString;
bid1.Quantity := ADOQuery1.FieldByName('Quantity').AsInteger;
bid1.MaterialPrice := ADOQuery1.FieldByName('MaterialPrice').AsInteger;
bid1.Workdayprice := ADOQuery1.FieldByName('Workdayprice').AsInteger;
bid1.Mechanicalprice := ADOQuery1.FieldByName('Mechanicalprice').AsInteger;
bid1.OtherPrice := ADOQuery1.FieldByName('OtherPrice').AsInteger;
bid1.FinishTime := ADOQuery1.FieldByName('FinishTime').AsInteger;
estimate.EstimateFactor := 0.2*bid1.Quantity + 0.3*bid1.MaterialPrice
+ 0.2*bid1.Workdayprice + 0.15*bid1.Mechanicalprice + 0.05*bid1.OtherPrice
+ 0.1*bid1.FinishTime;
estimate.CompanyNo :=bid1.CompanyNo;
ADOQuery2.Parameters.ParamByName('CompanyNo').Value :=bid1.CompanyNo;
ADOQuery2.Parameters.ParamByName('EstimateFactor').Value := estimate.EstimateFactor;
ADOQuery2.ExecSQL;
ADOQuery1.Next;
end;
ADOQuery1.Close;
end;循环好像只做了一次,因为报错   不能创建重复的值

解决方案 »

  1.   

    procedure TForm1.Button5Click(Sender: TObject);
    var
      bid1: TBid;
      estimate: TEstimate;
       sqlstr, tmp : string;
    begin
      ADOQuery1.Close;
      ADOQuery1.SQL.Clear;
      ADOQuery1.SQL.Text := 'select * from Bid';
      ADOQuery1.Open;
      ADOQuery2.Close;
      ADOQuery2.SQL.Clear;
      sqlstr := 'insert into Estimate(CompanyNo,EstimateFactor ) values(''%s'', ''%s'')';  ADOQuery1.First;
      while not ADOQuery1.Eof do
      begin
        bid1.CompanyNo := ADOQuery1.FieldByName('CompanyNo').AsString;
        bid1.Quantity := ADOQuery1.FieldByName('Quantity').AsInteger;
        bid1.MaterialPrice := ADOQuery1.FieldByName('MaterialPrice').AsInteger;
        bid1.Workdayprice := ADOQuery1.FieldByName('Workdayprice').AsInteger;
        bid1.Mechanicalprice := ADOQuery1.FieldByName('Mechanicalprice').AsInteger;
        bid1.OtherPrice := ADOQuery1.FieldByName('OtherPrice').AsInteger;
        bid1.FinishTime := ADOQuery1.FieldByName('FinishTime').AsInteger;
        estimate.EstimateFactor := 0.2*bid1.Quantity + 0.3*bid1.MaterialPrice
        + 0.2*bid1.Workdayprice + 0.15*bid1.Mechanicalprice + 0.05*bid1.OtherPrice
        + 0.1*bid1.FinishTime;
        estimate.CompanyNo :=bid1.CompanyNo;    tmp := Format(sqlstr, [bid1.CompanyNo,  estimate.EstimateFactor]);
        ADOQuery2.sqlstr.Text = tmp ;
        try
          ADOQuery2.ExecSQL;
        except
            ////调试加入报错提示
        end;
        ADOQuery1.Next;
      end;
      ADOQuery1.Close;
      

  2.   

    估计是你的两个记录类型赋值后插入数据库造成的问题。
    可以再插入前增加showmessage(tmp),查看一下插入的数据是否正确或者放到数据库里面进行测试。
      

  3.   

    procedure TfrmMain.NcaculateClick(Sender: TObject);
    var SQL,S1,S2,S3,ID,ID1:string;
        L:integer;
    begin
      DateTimetoString(ID,'yymmddhhnnss',now);
      ADOQuery1.Close;
      ADOQuery1.SQL.Clear;
      ADOQuery1.SQL.Text := 'select * from Bid';
      ADOQuery1.Open;
      ADOQuery2.Close;
      L:=100
      while not ADOQuery1.Eof do
      begin
        ID1:=ID+IntToStr(L);
        S1 := ADOQuery1.FieldByName('CompanyNo').AsString;
        S2 := ADOQuery1.FieldByName('Quantity').AsInteger;
        S3 := ADOQuery1.FieldByName('MaterialPrice').AsInteger;
        SQL:='INSERT INTO 表名 (字段1,字段2,字段3,ID) '+
            ' VALUES('+#39+S1+#39+','+#39+S2+#39+','+#39+S3+#39+','+#39+ID1+#39+')';
        ADOQuery2.SQL.Text:=SQL;
        ADOQuery2.ExecSQL;
        ADOQuery1.Next;
        L:=L+1; 
      end;
      ADOQuery1.Close;
    end;
    建议使用SQL语句插入,代码仅供参考。