这几个sql可以写成一个,一次性提交执行啊是在循环里执行上面的代码吗?这么有规律,也可以写一个更复杂的sql一下子全部更新啊

解决方案 »

  1.   

    procedure TForm1.Button1Click(Sender: TObject);
    Var
      Str :string;
    begin
    Str:=dbgrideh1.datasource.dataset.FieldByName('编号').Asstring;
    adoquery1.active:= false;
    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');  //电费 //假设此时ah21 = 2
    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%  //此时ah21还没有被更新
    adoquery1.SQL.add('where 编号='+Str);
    adoquery1.ExecSQL;
    问题是这样,以ah21为例,因此你不能合并计算式。
    你可以这样改,其他地方计算式类似: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=(AL21/3600*M21)/V21*0.7*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;
      

  2.   

    请问SmallHand,也就是说还仅仅只是逻辑顺序的问题?这样的结构应该是没问题的?
      

  3.   

    觉得,你这里没有where语句,其实可以简单化的,比如说,这个表,肯定是有些是有值的,那么可以不计算已经计算出来的,假如有上万条记录,岂不是要每次更新上万条??
    现在我的估计是,新的记录是t21等是空值,假如真的是,应该从第一个值来着手处理,再加上where t21>0 这样的话,你的运算就减少很多了
      

  4.   

    这方面的知识是不是应该多看点sql语言?
      

  5.   

    不用,还有很简单的方法,类似于MSSQL里的视图!你可以建一个查询,现假设有三个字段,a,b,c,你新建一个查询, 前三个值是a,b,c 第四个值是 d: [a]*[b]/[c]这样access就自己会计算了,不用程式去计算,那么你只用一条简单的SQL语句,select * from [查询1] 就可以了
      

  6.   

    强烈建议建[查询表1]!! 根本不用在程式里做UPDATE!!你不想改变实体表原有的字段,也可以做update通过[查询表1]实体
    [a],[b],[c],[d]查询表1
    [a],[b],[c],d1:[a]*[b]/[c]update [实体] set [d] = [查询表1].[d1] where [主键] = [查询表1].[主键]   //估计会很快,其实有查询,没多大必要在去update实体
      

  7.   

    如果仅仅是解决问题,尚可。
    但是,设计上还是有些问题的,如果你仅仅是显示数据,建议在Access中使用查询来获得所要的结果集!
    当然,这个还是要看你的需求是什么了,如果有大量的这样的数据,而且不是常常需要更新,还是可以的。
    否则,就需要更改你的设计了!
      

  8.   

    多谢两位的建议,我打算先把这个搞出来先拿去交差,然后接下来再按照你们说的重新做一个试试。
    我重新调整了一下代码,现在的情况是我点一次后,后台数据库其实已经有正确的结果了,但是在界面中还没显示出结果(我用了dbgrideh)。在点一次计算后,才显示。请教这是哪里出了问题。
    {$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(',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(',ai21=ah21*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.
      

  9.   

    事件探测器,把SQL语句 探测出来 直接在查询分析器里面运行 看看哪有问题