adotable1和adoquery1各自连接同一个表‘ 注塑’,datasource1连接adotable1。dbgrideh连接datasource1,DBNavigator1连接datasource1
数据编辑和回显用的是直接拖放adotable1中的fields自动生成的dbedit,
执行Button1后,发现后台数据库表中已经有正确值,但是dbgrideh和相关dbedit中没有正确的显示,如是全新计算,则显示0,只有再次执行Button1后,才显示正确的结果数据。如是修改某些数据再次计算,则第一次只显示上次计算结果,要再次执行才能正确显示,而后台数据表中已经有正确结果。
请教各位是怎么回事,我调了好几天也解决不了,没办法,只好再来请教各位大侠。
36 个解决方案
#1
这是代码
{$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.sql.Clear;
adoquery1.SQL.add('update 注塑 set aw21=av21*e3');//电费
adoquery1.SQL.add(',ai21=ah21*e3'); //电费
adoquery1.SQL.add('where 编号='+Str);
adoquery1.ExecSQL;
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.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.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.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.sql.Clear;
adoquery1.SQL.add('update 注塑 set p21=O21*(1+P12/100)');//外报含税价
adoquery1.SQL.add('where 编号='+Str);
adoquery1.ExecSQL;
adotable1.refresh;
ShowMessage('计算完成!');
end;
end.
#2
adotable1.refresh;
改为
adotable1.Close;
adotable1.open;
改为
adotable1.Close;
adotable1.open;
#3
这么多更新也不加个事务进行控制,如果哪一步出错了,你的数据岂不是都乱了。
#4
改过了,没用。
#5
学习。
#6
我不知道怎么加,这是我做的第一个delphi程序。。。。。。除hello world之外。。。
#7
你执行一次之后 数据库的记录都已经更新达到设计要求了嘛??
#8
我测试了几次没有问题。
#9
谁能帮我搞定,90全给他。我的全部分数。。。。。。。。。我灌了好几天才赚到的分数。
再搞不定。。。。。我就!@#@$!**#
再搞不定。。。。。我就!@#@$!**#
#10
你的ado控件与数据库的联接是如何做的,用到adoconnection了吗。
每个都有一个connection属性,加一个adoconnection与数据库联接(connectionstring字符串)。
adoconnection1.BeginTrans; //开始事务
try
...你的代码...
adoconnection1.CommitTrans; //提交
except
ADOConnection1.RollbackTrans;//回滚
end;
每个都有一个connection属性,加一个adoconnection与数据库联接(connectionstring字符串)。
adoconnection1.BeginTrans; //开始事务
try
...你的代码...
adoconnection1.CommitTrans; //提交
except
ADOConnection1.RollbackTrans;//回滚
end;
#11
没太仔细看楼主更新字段的代码,应该是都不一样的吧?要是不一样的。为什么要分开写啊?
一起写然后EXECSQL应该没问题吧。
一起写然后EXECSQL应该没问题吧。
#12
但是从你给的这个程序段来看 是没有问题的啊
#13
在提交后调用
adotable1.close;
adotable1.open;
不过我一直还是喜欢用adoquery来实现。
#14
adotable1.Close;
adotable1.Connetion := XXX(一个ADOConnection1);
adotable1.TableName := '注塑';
datasource1.DataSet := AdoTable1;
adotable1.Open;
试试
adotable1.Connetion := XXX(一个ADOConnection1);
adotable1.TableName := '注塑';
datasource1.DataSet := AdoTable1;
adotable1.Open;
试试
#15
回10楼,没有用到adoconnection,
这样改动太大了点。。。
我现在只想找出我目前的方法为什么会这样。
这样改动太大了点。。。
我现在只想找出我目前的方法为什么会这样。
#16
怀疑你多个控件之间的挂链出现了问题,在一些列的update之后,你重新用代码重新连接一下试试,至于没有adoconnection,那你就Adotable1.ConnectionString重新赋值一下(将你手动链接的字符串赋上);另外建议你加上事务处理
#17
回14楼,用了你的 方法,也还是一样。
#18
一般我都是这样处理access更新后的数据,效果还可以
dbtable1.active:= false;
Application.ProcessMessages;
Sleep(250);
Application.ProcessMessages;
Sleep(250);
Application.ProcessMessages;
dbtable1.active:= true;
dbtable1.active:= false;
Application.ProcessMessages;
Sleep(250);
Application.ProcessMessages;
Sleep(250);
Application.ProcessMessages;
dbtable1.active:= true;
#19
dinoalex
你在以前的帖子中回复过我,我试过你的方法。。。也是一样。。
你在以前的帖子中回复过我,我试过你的方法。。。也是一样。。
#20
我觉得麻烦点改了也值,比起你以后因为出错而导致数据错误来说只是一小部分的工作,数据的完整性与一致性是一定要保证的。
我觉得产生你这样的原因是因为没有真正post到数据库的原因,你可以试试,在改动后没有退出这个窗口时,数据库中的数据是否改变了。
#21
procedure TForm1.Button3Click(Sender: TObject);
Var
Str :string;
begin
Button1.SetFocus; //防止数据感知控件中的值没有更新到数据集
ADOTable1.UpdateBatch;
adoquery1.Connection.BeginTrans;
try
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.sql.Clear;
adoquery1.SQL.add('update 注塑 set aw21=av21*e3');//电费
adoquery1.SQL.add(',ai21=ah21*e3');//电费
adoquery1.SQL.add('where 编号='+Str);
adoquery1.ExecSQL;
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.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.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.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.sql.Clear;
adoquery1.SQL.add('update 注塑 set p21=O21*(1+P12/100)');//外报含税价
adoquery1.SQL.add('where 编号='+Str);
adoquery1.ExecSQL;
adoquery1.Connection.CommitTrans;
except
on E:Exception do
begin
adoquery1.Connection.RollbackTrans;
showmessage(E.Message);
end;
end;
// adotable1.refresh;
adotable1.Active:=false;
// adotable1.Connetion := XXX(一个ADOConnection1); //连接属性应该不会变吧
adotable1.TableName := '注塑';
datasource1.DataSet := AdoTable1;
adotable1.Active:=true;
application.ProcessMessages;
//在这里将dbgrideh1刷新下 (dbgrideh1.refresh 不知道是不是这样)
ShowMessage('计算完成!');
end;
再不行 就真的不知道怎么回事了
#22
计算前,请你先把所有的dbedit先提交吧.
#23
用DBNavigator1提交了啊 。
#24
在前面加上
if adotable1.state in [dsedit,dsinsert] then
adotable1.post;
试试!
if adotable1.state in [dsedit,dsinsert] then
adotable1.post;
试试!
#25
回24楼,还是一样。。。
#26
为什么不按21楼的去改一下呢
#27
试了,编译能通过,一点Button1就报错
access violation at address 004f1e89 in module 'project1.exe'
access violation at address 004f1e89 in module 'project1.exe'
#28
偶是初学者,但也给你一个小建议,你可以在ADOquery执行完sql语句后,用ADOquery执行一下,select语句
如:self.adoquery1.active := false;
self.adoquery1.sql.clear;
self.adoquery1.sql.add('select * from XXXXX');
self.adoquery1.active := true;
试一下,如果这个显示值没有错误,在进行adotable.refuse就应该行了
如:self.adoquery1.active := false;
self.adoquery1.sql.clear;
self.adoquery1.sql.add('select * from XXXXX');
self.adoquery1.active := true;
试一下,如果这个显示值没有错误,在进行adotable.refuse就应该行了
#29
关注学习
#30
回28楼,编译的时候就出错。
#31
不可能呀,出的什么错?贴出来看看
#32
通过编译了,运行后还是一样。
#33
彻底郁闷了
#34
工程发给我看看 看你CSDN的私信
#36
sparklerl帮我解决了。加了个adoconnection,在代码上了做了些调整,非常感谢大家对我的帮助。dinoalex也非常感谢你。抱歉,
这次分数我全给sparklerl,实在没分了,还请大家见谅。
这次分数我全给sparklerl,实在没分了,还请大家见谅。
#1
这是代码
{$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.sql.Clear;
adoquery1.SQL.add('update 注塑 set aw21=av21*e3');//电费
adoquery1.SQL.add(',ai21=ah21*e3'); //电费
adoquery1.SQL.add('where 编号='+Str);
adoquery1.ExecSQL;
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.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.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.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.sql.Clear;
adoquery1.SQL.add('update 注塑 set p21=O21*(1+P12/100)');//外报含税价
adoquery1.SQL.add('where 编号='+Str);
adoquery1.ExecSQL;
adotable1.refresh;
ShowMessage('计算完成!');
end;
end.
#2
adotable1.refresh;
改为
adotable1.Close;
adotable1.open;
改为
adotable1.Close;
adotable1.open;
#3
这么多更新也不加个事务进行控制,如果哪一步出错了,你的数据岂不是都乱了。
#4
改过了,没用。
#5
学习。
#6
我不知道怎么加,这是我做的第一个delphi程序。。。。。。除hello world之外。。。
#7
你执行一次之后 数据库的记录都已经更新达到设计要求了嘛??
#8
我测试了几次没有问题。
#9
谁能帮我搞定,90全给他。我的全部分数。。。。。。。。。我灌了好几天才赚到的分数。
再搞不定。。。。。我就!@#@$!**#
再搞不定。。。。。我就!@#@$!**#
#10
你的ado控件与数据库的联接是如何做的,用到adoconnection了吗。
每个都有一个connection属性,加一个adoconnection与数据库联接(connectionstring字符串)。
adoconnection1.BeginTrans; //开始事务
try
...你的代码...
adoconnection1.CommitTrans; //提交
except
ADOConnection1.RollbackTrans;//回滚
end;
每个都有一个connection属性,加一个adoconnection与数据库联接(connectionstring字符串)。
adoconnection1.BeginTrans; //开始事务
try
...你的代码...
adoconnection1.CommitTrans; //提交
except
ADOConnection1.RollbackTrans;//回滚
end;
#11
没太仔细看楼主更新字段的代码,应该是都不一样的吧?要是不一样的。为什么要分开写啊?
一起写然后EXECSQL应该没问题吧。
一起写然后EXECSQL应该没问题吧。
#12
但是从你给的这个程序段来看 是没有问题的啊
#13
在提交后调用
adotable1.close;
adotable1.open;
不过我一直还是喜欢用adoquery来实现。
#14
adotable1.Close;
adotable1.Connetion := XXX(一个ADOConnection1);
adotable1.TableName := '注塑';
datasource1.DataSet := AdoTable1;
adotable1.Open;
试试
adotable1.Connetion := XXX(一个ADOConnection1);
adotable1.TableName := '注塑';
datasource1.DataSet := AdoTable1;
adotable1.Open;
试试
#15
回10楼,没有用到adoconnection,
这样改动太大了点。。。
我现在只想找出我目前的方法为什么会这样。
这样改动太大了点。。。
我现在只想找出我目前的方法为什么会这样。
#16
怀疑你多个控件之间的挂链出现了问题,在一些列的update之后,你重新用代码重新连接一下试试,至于没有adoconnection,那你就Adotable1.ConnectionString重新赋值一下(将你手动链接的字符串赋上);另外建议你加上事务处理
#17
回14楼,用了你的 方法,也还是一样。
#18
一般我都是这样处理access更新后的数据,效果还可以
dbtable1.active:= false;
Application.ProcessMessages;
Sleep(250);
Application.ProcessMessages;
Sleep(250);
Application.ProcessMessages;
dbtable1.active:= true;
dbtable1.active:= false;
Application.ProcessMessages;
Sleep(250);
Application.ProcessMessages;
Sleep(250);
Application.ProcessMessages;
dbtable1.active:= true;
#19
dinoalex
你在以前的帖子中回复过我,我试过你的方法。。。也是一样。。
你在以前的帖子中回复过我,我试过你的方法。。。也是一样。。
#20
我觉得麻烦点改了也值,比起你以后因为出错而导致数据错误来说只是一小部分的工作,数据的完整性与一致性是一定要保证的。
我觉得产生你这样的原因是因为没有真正post到数据库的原因,你可以试试,在改动后没有退出这个窗口时,数据库中的数据是否改变了。
#21
procedure TForm1.Button3Click(Sender: TObject);
Var
Str :string;
begin
Button1.SetFocus; //防止数据感知控件中的值没有更新到数据集
ADOTable1.UpdateBatch;
adoquery1.Connection.BeginTrans;
try
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.sql.Clear;
adoquery1.SQL.add('update 注塑 set aw21=av21*e3');//电费
adoquery1.SQL.add(',ai21=ah21*e3');//电费
adoquery1.SQL.add('where 编号='+Str);
adoquery1.ExecSQL;
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.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.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.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.sql.Clear;
adoquery1.SQL.add('update 注塑 set p21=O21*(1+P12/100)');//外报含税价
adoquery1.SQL.add('where 编号='+Str);
adoquery1.ExecSQL;
adoquery1.Connection.CommitTrans;
except
on E:Exception do
begin
adoquery1.Connection.RollbackTrans;
showmessage(E.Message);
end;
end;
// adotable1.refresh;
adotable1.Active:=false;
// adotable1.Connetion := XXX(一个ADOConnection1); //连接属性应该不会变吧
adotable1.TableName := '注塑';
datasource1.DataSet := AdoTable1;
adotable1.Active:=true;
application.ProcessMessages;
//在这里将dbgrideh1刷新下 (dbgrideh1.refresh 不知道是不是这样)
ShowMessage('计算完成!');
end;
再不行 就真的不知道怎么回事了
#22
计算前,请你先把所有的dbedit先提交吧.
#23
用DBNavigator1提交了啊 。
#24
在前面加上
if adotable1.state in [dsedit,dsinsert] then
adotable1.post;
试试!
if adotable1.state in [dsedit,dsinsert] then
adotable1.post;
试试!
#25
回24楼,还是一样。。。
#26
为什么不按21楼的去改一下呢
#27
试了,编译能通过,一点Button1就报错
access violation at address 004f1e89 in module 'project1.exe'
access violation at address 004f1e89 in module 'project1.exe'
#28
偶是初学者,但也给你一个小建议,你可以在ADOquery执行完sql语句后,用ADOquery执行一下,select语句
如:self.adoquery1.active := false;
self.adoquery1.sql.clear;
self.adoquery1.sql.add('select * from XXXXX');
self.adoquery1.active := true;
试一下,如果这个显示值没有错误,在进行adotable.refuse就应该行了
如:self.adoquery1.active := false;
self.adoquery1.sql.clear;
self.adoquery1.sql.add('select * from XXXXX');
self.adoquery1.active := true;
试一下,如果这个显示值没有错误,在进行adotable.refuse就应该行了
#29
关注学习
#30
回28楼,编译的时候就出错。
#31
不可能呀,出的什么错?贴出来看看
#32
通过编译了,运行后还是一样。
#33
彻底郁闷了
#34
工程发给我看看 看你CSDN的私信
#35
我把源程序上传到这里了。
http://pickup.mofile.com/7368533081193161
大家有时间的话能否帮我看看,很小的。
大家有时间的话能否帮我看看,很小的。
#36
sparklerl帮我解决了。加了个adoconnection,在代码上了做了些调整,非常感谢大家对我的帮助。dinoalex也非常感谢你。抱歉,
这次分数我全给sparklerl,实在没分了,还请大家见谅。
这次分数我全给sparklerl,实在没分了,还请大家见谅。