求助数据回显

时间:2021-10-13 16:37:33
delphi7环境,access数据库其中只有一个表‘ 注塑’,表中各列(小数类型)的默认值为0,用到的控件adoquery1、adotable1、datasource1、DBNavigator1,Button1 、dbgrideh1。
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;

#3


引用 2 楼 sparklerl 的回复:
adotable1.refresh;

 改为

 adotable1.Close;
 adotable1.open;


这么多更新也不加个事务进行控制,如果哪一步出错了,你的数据岂不是都乱了。

#4


引用 2 楼 sparklerl 的回复:
adotable1.refresh;

改为

adotable1.Close;
adotable1.open;

改过了,没用。

#5


学习。

#6


引用 3 楼 zxf_feng 的回复:
引用 2 楼 sparklerl 的回复:
adotable1.refresh;

改为

adotable1.Close;
adotable1.open;


这么多更新也不加个事务进行控制,如果哪一步出错了,你的数据岂不是都乱了。

我不知道怎么加,这是我做的第一个delphi程序。。。。。。除hello world之外。。。

#7


你执行一次之后 数据库的记录都已经更新达到设计要求了嘛??

#8


引用 7 楼 sparklerl 的回复:
你执行一次之后 数据库的记录都已经更新达到设计要求了嘛??

我测试了几次没有问题。

#9


谁能帮我搞定,90全给他。我的全部分数。。。。。。。。。我灌了好几天才赚到的分数。
再搞不定。。。。。我就!@#@$!**#

#10


你的ado控件与数据库的联接是如何做的,用到adoconnection了吗。

每个都有一个connection属性,加一个adoconnection与数据库联接(connectionstring字符串)。

  adoconnection1.BeginTrans;     //开始事务
  try
    ...你的代码...
    adoconnection1.CommitTrans;  //提交
  except
    ADOConnection1.RollbackTrans;//回滚
  end;

#11


没太仔细看楼主更新字段的代码,应该是都不一样的吧?要是不一样的。为什么要分开写啊?
一起写然后EXECSQL应该没问题吧。

#12


但是从你给的这个程序段来看 是没有问题的啊

#13


引用 2 楼 sparklerl 的回复:
adotable1.refresh;

 改为

 adotable1.Close;
 adotable1.open;

在提交后调用 
adotable1.close;
adotable1.open;

不过我一直还是喜欢用adoquery来实现。

#14


adotable1.Close;
adotable1.Connetion := XXX(一个ADOConnection1);
adotable1.TableName := '注塑';
datasource1.DataSet := AdoTable1;
adotable1.Open;

试试

#15


回10楼,没有用到adoconnection,

这样改动太大了点。。。
我现在只想找出我目前的方法为什么会这样。

#16


引用 15 楼 b330225 的回复:
回10楼,没有用到adoconnection,

这样改动太大了点。。。
我现在只想找出我目前的方法为什么会这样。


怀疑你多个控件之间的挂链出现了问题,在一些列的update之后,你重新用代码重新连接一下试试,至于没有adoconnection,那你就Adotable1.ConnectionString重新赋值一下(将你手动链接的字符串赋上);另外建议你加上事务处理

#17


回14楼,用了你的 方法,也还是一样。

#18


一般我都是这样处理access更新后的数据,效果还可以

  dbtable1.active:= false;
  Application.ProcessMessages;
  Sleep(250);
  Application.ProcessMessages;
  Sleep(250);
  Application.ProcessMessages;
  dbtable1.active:= true;

#19


dinoalex 
你在以前的帖子中回复过我,我试过你的方法。。。也是一样。。

#20


引用 15 楼 b330225 的回复:
回10楼,没有用到adoconnection,

 这样改动太大了点。。。
 我现在只想找出我目前的方法为什么会这样。

我觉得麻烦点改了也值,比起你以后因为出错而导致数据错误来说只是一小部分的工作,数据的完整性与一致性是一定要保证的。

我觉得产生你这样的原因是因为没有真正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;
试试!

#25


回24楼,还是一样。。。

#26


为什么不按21楼的去改一下呢

#27


试了,编译能通过,一点Button1就报错
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就应该行了

#29


关注学习

#30


回28楼,编译的时候就出错。

#31


不可能呀,出的什么错?贴出来看看

#32


通过编译了,运行后还是一样。

#33


彻底郁闷了

#34


工程发给我看看 看你CSDN的私信

#35


我把源程序上传到这里了。 http://pickup.mofile.com/7368533081193161
大家有时间的话能否帮我看看,很小的。

#36


sparklerl帮我解决了。加了个adoconnection,在代码上了做了些调整,非常感谢大家对我的帮助。dinoalex也非常感谢你。抱歉,
这次分数我全给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;

#3


引用 2 楼 sparklerl 的回复:
adotable1.refresh;

 改为

 adotable1.Close;
 adotable1.open;


这么多更新也不加个事务进行控制,如果哪一步出错了,你的数据岂不是都乱了。

#4


引用 2 楼 sparklerl 的回复:
adotable1.refresh;

改为

adotable1.Close;
adotable1.open;

改过了,没用。

#5


学习。

#6


引用 3 楼 zxf_feng 的回复:
引用 2 楼 sparklerl 的回复:
adotable1.refresh;

改为

adotable1.Close;
adotable1.open;


这么多更新也不加个事务进行控制,如果哪一步出错了,你的数据岂不是都乱了。

我不知道怎么加,这是我做的第一个delphi程序。。。。。。除hello world之外。。。

#7


你执行一次之后 数据库的记录都已经更新达到设计要求了嘛??

#8


引用 7 楼 sparklerl 的回复:
你执行一次之后 数据库的记录都已经更新达到设计要求了嘛??

我测试了几次没有问题。

#9


谁能帮我搞定,90全给他。我的全部分数。。。。。。。。。我灌了好几天才赚到的分数。
再搞不定。。。。。我就!@#@$!**#

#10


你的ado控件与数据库的联接是如何做的,用到adoconnection了吗。

每个都有一个connection属性,加一个adoconnection与数据库联接(connectionstring字符串)。

  adoconnection1.BeginTrans;     //开始事务
  try
    ...你的代码...
    adoconnection1.CommitTrans;  //提交
  except
    ADOConnection1.RollbackTrans;//回滚
  end;

#11


没太仔细看楼主更新字段的代码,应该是都不一样的吧?要是不一样的。为什么要分开写啊?
一起写然后EXECSQL应该没问题吧。

#12


但是从你给的这个程序段来看 是没有问题的啊

#13


引用 2 楼 sparklerl 的回复:
adotable1.refresh;

 改为

 adotable1.Close;
 adotable1.open;

在提交后调用 
adotable1.close;
adotable1.open;

不过我一直还是喜欢用adoquery来实现。

#14


adotable1.Close;
adotable1.Connetion := XXX(一个ADOConnection1);
adotable1.TableName := '注塑';
datasource1.DataSet := AdoTable1;
adotable1.Open;

试试

#15


回10楼,没有用到adoconnection,

这样改动太大了点。。。
我现在只想找出我目前的方法为什么会这样。

#16


引用 15 楼 b330225 的回复:
回10楼,没有用到adoconnection,

这样改动太大了点。。。
我现在只想找出我目前的方法为什么会这样。


怀疑你多个控件之间的挂链出现了问题,在一些列的update之后,你重新用代码重新连接一下试试,至于没有adoconnection,那你就Adotable1.ConnectionString重新赋值一下(将你手动链接的字符串赋上);另外建议你加上事务处理

#17


回14楼,用了你的 方法,也还是一样。

#18


一般我都是这样处理access更新后的数据,效果还可以

  dbtable1.active:= false;
  Application.ProcessMessages;
  Sleep(250);
  Application.ProcessMessages;
  Sleep(250);
  Application.ProcessMessages;
  dbtable1.active:= true;

#19


dinoalex 
你在以前的帖子中回复过我,我试过你的方法。。。也是一样。。

#20


引用 15 楼 b330225 的回复:
回10楼,没有用到adoconnection,

 这样改动太大了点。。。
 我现在只想找出我目前的方法为什么会这样。

我觉得麻烦点改了也值,比起你以后因为出错而导致数据错误来说只是一小部分的工作,数据的完整性与一致性是一定要保证的。

我觉得产生你这样的原因是因为没有真正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;
试试!

#25


回24楼,还是一样。。。

#26


为什么不按21楼的去改一下呢

#27


试了,编译能通过,一点Button1就报错
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就应该行了

#29


关注学习

#30


回28楼,编译的时候就出错。

#31


不可能呀,出的什么错?贴出来看看

#32


通过编译了,运行后还是一样。

#33


彻底郁闷了

#34


工程发给我看看 看你CSDN的私信

#35


我把源程序上传到这里了。 http://pickup.mofile.com/7368533081193161
大家有时间的话能否帮我看看,很小的。

#36


sparklerl帮我解决了。加了个adoconnection,在代码上了做了些调整,非常感谢大家对我的帮助。dinoalex也非常感谢你。抱歉,
这次分数我全给sparklerl,实在没分了,还请大家见谅。