Button1Click要点击执行很多遍才能计算出正确的‘外报含税价’。不明白是为什么,有人能指点一下吗。
数据库是access,就一个表。有100多个列,分别输入值,然后计算出总值。
..........
procedure TForm1.Button1Click(Sender: TObject);
Var
  Str :string;
begin
Str:=dbgrideh1.datasource.dataset.FieldByName('编号').Asstring;
adoquery1.Close;
adoquery1.sql.Clear;
//注塑工序费用
adoquery1.SQL.add('update 注塑 set t21=Q21*S21/100*I21/1000000'); //注塑色母
adoquery1.SQL.add(',u21=J21/1000*S21/100*(Q21*V21+R21)'); //注塑色粉
adoquery1.SQL.add(',ae21=((Q21+R21/V21)*(1-Y21/100)*K21/1000000+(Q21+R21/V21)*Y21/100*X21/1000000+T21+U21)*(1+W21/100)+Z21*AA21+AB21*AC21+AD21');//注塑材料小计
adoquery1.SQL.add(',ag21=af21*e4'); //注塑水费
adoquery1.SQL.add(',ah21=(AL21/3600*M21)/V21*0.7');//用电量70%
adoquery1.SQL.add(',ai21=ah21*e3');  //电费
adoquery1.SQL.add(',ak21=AG21+AI21+AJ21');//制造小计
adoquery1.SQL.add(',an21=AL21/3600*E7/V21+AM21*E7');//工时费
adoquery1.SQL.add(',ap21=an21+ao21');//劳务小计
adoquery1.SQL.add(',ar21=(AE21+AK21+AP21)*(1+1-AQ21/100)');//注塑工序费用合计
//以下模具工序费用
adoquery1.SQL.add(',at21=AS21*1000*(1-Y21/100)*K21/1000000+Y21/100*X21/1000000');//试打料费
adoquery1.SQL.add(',au21=at21');
adoquery1.SQL.add(',av21=(BA21/60*M21)/V21*0.7');//电费
adoquery1.SQL.add(',aw21=av21*e3');//电费
adoquery1.SQL.add(',ay21=ax21*e4'); //电费
adoquery1.SQL.add(',az21=AW21+AY21');//模具制造小计
adoquery1.SQL.add(',bb21=ba21/60*e8');//换模费
adoquery1.SQL.add(',bd21=BC21/60*E8');//准备费用
adoquery1.SQL.add(',be21=BB21+BD21');//劳务小计
adoquery1.SQL.add(',bf21=N21/V21/3000');//换模次数
adoquery1.SQL.add(',bg21=(AU21+AZ21+BE21)*BF21/N21');//调试合计
//以下印刷工序费用
adoquery1.SQL.add(',bj21=bh21+bi21');//材料小计
adoquery1.SQL.add(',bl21=bo21/3600*bk21*e3');//电费
adoquery1.SQL.add(',bn21=bl21+bm21');//制造小计
adoquery1.SQL.add(',bq21=(BO21+BP21)/3600*E6');//劳务小计
adoquery1.SQL.add(',bs21=(BJ21+BN21+BQ21)*(1+1-BR21/100)');//印刷合计
//以下装配工序费用
adoquery1.SQL.add(',cn21=BT21*BU21+BV21*BW21+BX21*BY21+BZ21*CA21+CB21*CC21+CD21*CE21+CF21*CG21+CH21*CI21+CJ21*CK21+CL21+CM21');//材料小计
adoquery1.SQL.add(',cp21=CS21/3600*CO21*E3');//电费
adoquery1.SQL.add(',cr21=cp21+cq21');//制造合计
adoquery1.SQL.add(',cu21=(CS21/3600*E9)+CT21/3600*E9');//劳务小计
adoquery1.SQL.add(',cw21=(CN21+CR21+CU21)*(1+1-CV21/100)');//装配小计
//以下各工序合计
adoquery1.SQL.add(',cz21=(AR21+BG21+BS21+CW21)*(1+CX21/100)*(1+CY21/100)');//变动费用
adoquery1.SQL.add(',o21=CZ21+AL21/3600/24*(DA21+DB21+DC21)+BA21/60/24*BF21*(DA21+DB21+DC21)/N21');//实际成本
adoquery1.SQL.add(',p21=O21*(1+P12/100)');//外报含税价
adoquery1.SQL.add('where 编号='+Str); //当前行
adoquery1.ExecSQL;
adotable1.Active:=false; //刷新
adotable1.Active:=true;
end;end.

解决方案 »

  1.   

    你的adoquery1和adotable1是用的同一个adoconnection吗?
    其实一次execsql就更新了,就是adotable1刷新后,并没有取得新的数据而已
      

  2.   

    是用的同一个adoconnection,
    请教我该怎么才能解决这个问题?感谢~!
      

  3.   

    是这样的,adotable1连接表1,adoquery1也连接同一个表1。datasource1连接是adotable1,dbgrideh连接datasource1。
      

  4.   

    可以试下把adotable改为adoquery,用查询可能行
    如果再不行,就把adoconnection断开再连,然后重新打开表
      

  5.   

    可以这样解决Access的更新回显问题  ADOQuery1.Active := false;
      Application.ProcessMessages;
      Sleep(250);
      Application.ProcessMessages;
      Sleep(250);
      Application.ProcessMessages;
      ADOQuery1.Active := true;
      

  6.   

    很多遍?不能吧!
    你看看你其他地方的代码是怎么写的,是不是对他有影响。
    还有,你可以这样:
    procedure TForm1.Button1Click(Sender: TObject);
    Var
      Str :string;
    begin
    Str:=dbgrideh1.datasource.dataset.FieldByName('编号').Asstring;
    adoquery1.Close;
    adoquery1.sql.Clear;
    //注塑工序费用
    adoquery1.SQL.add('update 注塑 set t21=Q21*S21/100*I21/1000000'); //注塑色母
    adoquery1.SQL.add(',u21=J21/1000*S21/100*(Q21*V21+R21)'); //注塑色粉
    adoquery1.SQL.add(',ae21=((Q21+R21/V21)*(1-Y21/100)*K21/1000000+(Q21+R21/V21)*Y21/100*X21/1000000+T21+U21)*(1+W21/100)+Z21*AA21+AB21*AC21+AD21');//注塑材料小计
    adoquery1.SQL.add(',ag21=af21*e4'); //注塑水费
    adoquery1.SQL.add(',ah21=(AL21/3600*M21)/V21*0.7');//用电量70%
    adoquery1.SQL.add(',ai21=ah21*e3');  //电费
    adoquery1.SQL.add(',ak21=AG21+AI21+AJ21');//制造小计
    adoquery1.SQL.add(',an21=AL21/3600*E7/V21+AM21*E7');//工时费
    adoquery1.SQL.add(',ap21=an21+ao21');//劳务小计
    adoquery1.SQL.add(',ar21=(AE21+AK21+AP21)*(1+1-AQ21/100)');//注塑工序费用合计
    //以下模具工序费用
    adoquery1.SQL.add(',at21=AS21*1000*(1-Y21/100)*K21/1000000+Y21/100*X21/1000000');//试打料费
    adoquery1.SQL.add(',au21=at21');
    adoquery1.SQL.add(',av21=(BA21/60*M21)/V21*0.7');//电费
    adoquery1.SQL.add(',aw21=av21*e3');//电费
    adoquery1.SQL.add(',ay21=ax21*e4'); //电费
    adoquery1.SQL.add(',az21=AW21+AY21');//模具制造小计
    adoquery1.SQL.add(',bb21=ba21/60*e8');//换模费
    adoquery1.SQL.add(',bd21=BC21/60*E8');//准备费用
    adoquery1.SQL.add(',be21=BB21+BD21');//劳务小计
    adoquery1.SQL.add(',bf21=N21/V21/3000');//换模次数
    adoquery1.SQL.add(',bg21=(AU21+AZ21+BE21)*BF21/N21');//调试合计
    //以下印刷工序费用
    adoquery1.SQL.add(',bj21=bh21+bi21');//材料小计
    adoquery1.SQL.add(',bl21=bo21/3600*bk21*e3');//电费
    adoquery1.SQL.add(',bn21=bl21+bm21');//制造小计
    adoquery1.SQL.add(',bq21=(BO21+BP21)/3600*E6');//劳务小计
    adoquery1.SQL.add(',bs21=(BJ21+BN21+BQ21)*(1+1-BR21/100)');//印刷合计
    //以下装配工序费用
    adoquery1.SQL.add(',cn21=BT21*BU21+BV21*BW21+BX21*BY21+BZ21*CA21+CB21*CC21+CD21*CE21+CF21*CG21+CH21*CI21+CJ21*CK21+CL21+CM21');//材料小计
    adoquery1.SQL.add(',cp21=CS21/3600*CO21*E3');//电费
    adoquery1.SQL.add(',cr21=cp21+cq21');//制造合计
    adoquery1.SQL.add(',cu21=(CS21/3600*E9)+CT21/3600*E9');//劳务小计
    adoquery1.SQL.add(',cw21=(CN21+CR21+CU21)*(1+1-CV21/100)');//装配小计
    //以下各工序合计
    adoquery1.SQL.add(',cz21=(AR21+BG21+BS21+CW21)*(1+CX21/100)*(1+CY21/100)');//变动费用
    adoquery1.SQL.add(',o21=CZ21+AL21/3600/24*(DA21+DB21+DC21)+BA21/60/24*BF21*(DA21+DB21+DC21)/N21');//实际成本
    adoquery1.SQL.add(',p21=O21*(1+P12/100)');//外报含税价
    adoquery1.SQL.add('where 编号='+Str); //当前行
    adoquery1.ExecSQL;
    adotable1.Active:=false; //刷新
    adotable1.Active:=true;
    ShowMessage('执行完成!');
    end;然后再确定,看看。
    adotable1.Active:=false; //刷新
    adotable1.Active:=true; 

    这段先剥离出来,手动刷新看看是不是代码的问题,还是其他问题?
      

  7.   


    adoquery.edit;
    try
    adoquery.fieldbyname('field1').asstring := xxxxx1;
    adoquery.fieldbyname('field2').asstring := xxxxx2;
    adoquery.fieldbyname('field3').asstring := xxxxx3;
    adoquery.post;
    except
    adoquery.cancel;
    end;就可以,你怎么搞的那么麻烦
      

  8.   

    你当前行的修改没有更新到数据库吧你在Str:=dbgrideh1.datasource.dataset.FieldByName('编号').Asstring; 
    之前将adotable1.post执行下看看

    adotable1.post
    Str:=dbgrideh1.datasource.dataset.FieldByName('编号').Asstring;
      

  9.   

    逻辑存在严重的问题啊,比如开始的T21=.....后面马上用到
    ae21=((Q21+R21/V21)*(1-Y21/100)*K21/1000000+(Q21+R21/V21)*Y21/100*X21/1000000+T21+U21)*(1+W21/100)+Z21*AA21+AB21*AC21+AD21这个时候T21是空的哦你此次执行的时候T21还没有=你前面的值所以你要重复执行了
      

  10.   

    因为你的计算方法 有问题,嵌套引用同一个字段进行计算,比如update a=b,c=a*b...,这里,第一次执行时,c=a*b取到的a值还是原始的a值,第二次执行,取到的a值才是a=b后的新值,所以你要分批更新,先更新别处会用到的数据,然后在更新其他不会用到的数据
      

  11.   

     
    bdmh没错,楼主要调整好顺序!
      

  12.   

    我调整了顺序,改成下面这样,还是要执行多次。我检查了顺序没错啊。这样写也不行吗?
    {$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    Var
      Str :string;
    begin
    Str:=dbgrideh1.datasource.dataset.FieldByName('编号').Asstring;
    adoquery1.Close;
    adoquery1.sql.Clear;
    adoquery1.SQL.add('update 注塑 set t21=Q21*S21/100*I21/1000000'); //注塑色母
    adoquery1.SQL.add(',u21=J21/1000*S21/100*(Q21*V21+R21)'); //注塑色粉
    adoquery1.SQL.add(',ag21=af21*e4'); //注塑水费
    adoquery1.SQL.add(',ai21=ah21*e3');  //电费
    adoquery1.SQL.add(',an21=AL21/3600*E7/V21+AM21*E7');//工时费
    adoquery1.SQL.add(',at21=AS21*1000*(1-Y21/100)*K21/1000000+Y21/100*X21/1000000');//试打料费
    adoquery1.SQL.add(',av21=(BA21/60*M21)/V21*0.7');//电费
    adoquery1.SQL.add(',ay21=ax21*e4'); //电费
    adoquery1.SQL.add(',bb21=ba21/60*e8');//换模费
    adoquery1.SQL.add(',bd21=BC21/60*E8');//准备费用
    adoquery1.SQL.add(',bf21=N21/V21/3000');//换模次数
    adoquery1.SQL.add(',bl21=bo21/3600*bk21*e3');//电费
    adoquery1.SQL.add(',cp21=CS21/3600*CO21*E3');//电费
    adoquery1.SQL.add(',ah21=(AL21/3600*M21)/V21*0.7');//用电量70%
    adoquery1.SQL.add('where 编号='+Str);
    adoquery1.ExecSQL;
    adoquery1.Close;
    adoquery1.sql.Clear;
    adoquery1.SQL.add('update 注塑 set aw21=av21*e3');//电费
    adoquery1.SQL.add('where 编号='+Str);
    adoquery1.ExecSQL;
    adoquery1.Close;
    adoquery1.sql.Clear;
    adoquery1.SQL.add('update 注塑 set ae21=((Q21+R21/V21)*(1-Y21/100)*K21/1000000+(Q21+R21/V21)*Y21/100*X21/1000000+T21+U21)*(1+W21/100)+Z21*AA21+AB21*AC21+AD21');//注塑材料小计
    adoquery1.SQL.add(',ak21=AG21+AI21+AJ21');//制造小计
    adoquery1.SQL.add(',ap21=an21+ao21');//劳务小计
    adoquery1.SQL.add(',az21=AW21+AY21');//模具制造小计
    adoquery1.SQL.add(',be21=BB21+BD21');//劳务小计
    adoquery1.SQL.add(',au21=at21');
    adoquery1.SQL.add(',bj21=bh21+bi21');//材料小计
    adoquery1.SQL.add(',bn21=bl21+bm21');//制造小计
    adoquery1.SQL.add(',bq21=(BO21+BP21)/3600*E6');//劳务小计
    adoquery1.SQL.add(',cn21=BT21*BU21+BV21*BW21+BX21*BY21+BZ21*CA21+CB21*CC21+CD21*CE21+CF21*CG21+CH21*CI21+CJ21*CK21+CL21+CM21');//材料小计
    adoquery1.SQL.add(',cr21=cp21+cq21');//制造合计
    adoquery1.SQL.add(',cu21=(CS21/3600*E9)+CT21/3600*E9');//劳务小计
    adoquery1.SQL.add('where 编号='+Str);
    adoquery1.ExecSQL;
    adoquery1.Close;
    adoquery1.sql.Clear;
    adoquery1.SQL.add('update 注塑 set bg21=(AU21+AZ21+BE21)*BF21/N21');//调试合计
    adoquery1.SQL.add(',bs21=(BJ21+BN21+BQ21)*(1+1-BR21/100)');//印刷合计
    adoquery1.SQL.add(',ar21=(AE21+AK21+AP21)*(1+1-AQ21/100)');//注塑工序费用合计
    adoquery1.SQL.add(',cw21=(CN21+CR21+CU21)*(1+1-CV21/100)');//装配小计
    adoquery1.SQL.add('where 编号='+Str);
    adoquery1.ExecSQL;
    adoquery1.Close;
    adoquery1.sql.Clear;
    adoquery1.SQL.add('update 注塑 set cz21=(AR21+BG21+BS21+CW21)*(1+CX21/100)*(1+CY21/100)');//变动费用
    adoquery1.SQL.add('where 编号='+Str);
    adoquery1.ExecSQL;
    adoquery1.Close;
    adoquery1.sql.Clear;
    adoquery1.SQL.add('update 注塑 set o21=CZ21+AL21/3600/24*(DA21+DB21+DC21)+BA21/60/24*BF21*(DA21+DB21+DC21)/N21');//实际成本
    adoquery1.SQL.add('where 编号='+Str);
    adoquery1.ExecSQL;
    adoquery1.Close;
    adoquery1.sql.Clear;
    adoquery1.SQL.add('update 注塑 set p21=O21*(1+P12/100)');//外报含税价
    adoquery1.SQL.add('where 编号='+Str);
    adoquery1.ExecSQL;
    adotable1.Active:=false;
    adotable1.Active:=true;
    end;end.
      

  13.   

    一开始 adoquery1.active:= false;每个update之间  Application.ProcessMessages; 
      Sleep(500); 
      Application.ProcessMessages; 
      Sleep(500); 
      Application.ProcessMessages; 去掉没用的adoquery1.close;最后再来一次
    adotable1.Active:=false;
      Application.ProcessMessages; 
      Sleep(500); 
      Application.ProcessMessages; 
      Sleep(500); 
      Application.ProcessMessages;
    adotable1.Active:=true;
      

  14.   

    没有,我用了dinoalex的方法,但是这样1是计算起来很慢,2是有些输入的数据项目会出现无法更改的提示。
    因为人多没分了,我准备另开一贴。