这几个sql可以写成一个,一次性提交执行啊是在循环里执行上面的代码吗?这么有规律,也可以写一个更复杂的sql一下子全部更新啊
解决方案 »
- Delphi调用C++写的DLL,参数是字符指针,Delphi中如何传参数?
- function sum(expr:varint;band:variant=0;flags:Integer=0):variant 是什么意思 FASTREPORT 里的
- Memo已有内容“111222”,光标停1和2之间,双击,使得光标处增加文字aaa,怎么达到这样的效果?
- <<<请问如何用视图更新多个关表
- 右键菜单
- ※※※ 有关Wise Install 的操作 ※※※
- 为什么MSCOMM每次最多只能收16个字符
- 请帮忙修改下代码,增加区段大小。。。。。。。。。。。。。。。结贴100%,谢谢了
- delphi6中在dbgrid中如何将boolen形字段显示为checkBox
- 如何手动刷新Oracle中的快照snapshot??
- 关于子窗体不能打开的问题
- 有谁安装过imageen3 我安装时提示File not found: 'jdapimin.obj',如何解决?
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;
现在我的估计是,新的记录是t21等是空值,假如真的是,应该从第一个值来着手处理,再加上where t21>0 这样的话,你的运算就减少很多了
[a],[b],[c],[d]查询表1
[a],[b],[c],d1:[a]*[b]/[c]update [实体] set [d] = [查询表1].[d1] where [主键] = [查询表1].[主键] //估计会很快,其实有查询,没多大必要在去update实体
但是,设计上还是有些问题的,如果你仅仅是显示数据,建议在Access中使用查询来获得所要的结果集!
当然,这个还是要看你的需求是什么了,如果有大量的这样的数据,而且不是常常需要更新,还是可以的。
否则,就需要更改你的设计了!
我重新调整了一下代码,现在的情况是我点一次后,后台数据库其实已经有正确的结果了,但是在界面中还没显示出结果(我用了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.