求教如何将计算字段的数值写回实际数据库表中等两个问题(50分)

  • 主题发起人 主题发起人 huxinqu
  • 开始时间 开始时间
H

huxinqu

Unregistered / Unconfirmed
GUEST, unregistred user!
清DELPHI高手帮助我!两个问题:
1.如何将计算字段值写回数据表?
一个*。DB数据表文件中由若干数据型字段。
我在DBGRID网格控件中为该表建立了永久型字段,并将某几个字段(是数据库表中已有的字段)设置
为计算字段,且为其写了计算表达式程序代码。
问题是,程序运行时显示了正确计算结果,但该计算字段值并未真正写回数据库表的对应字段中。
我以为新建的计算字段(数据库表中实际没有)只起显示作用,不知为什么数据库表中实际存在的字
段也如此。
求教:有何办法解决此问题?
2.如何将一个数据表的若干行复制到另一个字段结构不同的数据表中?
表1:ZD1-ZD8 全部为数值型字段,ZD1=ZD2+ZD3 ZD4=ZD5+ZD6+ZD7+ZD8
ZD1 ZD2 ZD3 ZD4 ZD5 ZD6 ZD7 ZD8
60.00 20.00 40.00 800.00 100.00 200.00 200.00 300.00
表2:其中有一个数值型字段AA

  . .  AA   .  .
    ---------------
 . . 860.00  .  .
 . . 220.00  .  .
 . . 351.00  .  .
 . . 286.00  .  .
  . .  .   .  .
     . .  .   .  .
     . .  .   .  .

 设想:将表 1 计算字段 ZD1 和 ZD4 的值复制到表 2 中,取得新值的表2如下

  . .  AA   .  .
    ---------------
 . .  60.00  .  .
 . . 800.00  .  .
 . . 351.00  .  .
 . . 286.00  .  .
  . .  .   .  .
     . .  .   .  .
     . .  .   .  .

要求:表1的数据不是插入表2,而是对表2的修改。
求教:有何简便办法能解决此问题?
 
1.我认为计算字段写回数据库没有必要,否则数据库中的计算字段数据就是冗余的。
2.表1与表2中必定有关键字段相联系,将你的表结构说清楚些。
 
DJ.
谢谢你为我解答问题。可能是我提的问题没有表述清楚,这个问题还是没有解决。
我是一个DELPHI初学者,菜鸟级的问题可能很好笑,没办法,还是要提出来。
有时在一个数据表中不得不保留计算字段,如工资表中的工资合计,它是由其他
工资项计算得来的。假如这是一个名为 GZ.DB 的表,用 DBGRID 显示和编辑,并在
字段编辑器中已将工资合计字段设为计算字段,如何才能将此字段值写回数据库呢?
我现在出现的问题是,显示结果是正确的,但数据库表中该字段仍是空的,即显示
的字段值并为存到数据表中,我不知如何解决。
再一个是SQL的UPDATE语句问题。如:
UPDATE 表A
SET 字段1=常量1,字段2=常量2,...
WHERE 某字段=常量
问题:在SET子句中给定的字段值只能是常量吗,如果是另一个数据表某字段的值
行吗,这样的UPDATE语句怎样写呢?
 
1、你的DBGrid中的计算字段和数据库中相应的字段未关联上,
所以不能直接保存。
可以用你说的 UPDATE 语句
var sqlS:string;
sqlS:='UPDATE 表A SET 字段1='+常量1+',字段2='+常量2+...
+'WHERE 某字段='+常量;
//其中“常量”都可以用变量来替代的,当然也可以用另一个数据表某字段的值
Query.sql.clear;
Query.sql.add(sqlS);
Query.ExecSQL;
2、不知道ZD1、ZD2向表2中复制时有什么规律?
如果没有什么规律可循,那么也用 UPDATE 吧
 
我真是苯死了,关于计算字段值的问题还是没解决。
希望DJ.和xushucheng及其他高手多多指教。
查DELPHI联机帮助,似乎说用数据集的字段属性设置了数据表的某字段为计算字段后,
该字段的值是不写回物理数据表的(我不懂英文,却非要学DELPHI,真是难上加难)。
那么,怎样才能在用DBGRID控件实现向一个数据表中录入数据时,能将在数据集中已
设置属性为计算字段的值,再存回物理数据表中?
 
这样写
update 表2 set aa =(select zd1+zd4 from 表1 where 条件) where 条件
如果你使用的是sql server 7.0 的话这个方法是可行的,但应注意的是括号中的语句执行
后返回的值是单一的值不能是数组。
select语句可以做许多事情,建议你应该认真研究一下。
 
' 那么,怎样才能在用DBGRID控件实现向一个数据表中录入数据时,能将在数据集中已
设置属性为计算字段的值,再存回物理数据表中?'
计算字段一般是非此数据集中字段,你的思路是错的,没有‘再存回物理数据表中’这种说法
。你那样建表也是冗余的。真需要这种结构的表的话可以在后台处理,或前台mat的方法也是
可取的。

 
继续求解如何获得计算型字段值的问题。
程序代码如下:

----------------------------------------------------------------------
unit XUEXI1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, ComCtrls, StdCtrls, fcStatusBar, Grids, DBGridEh, DBCtrls, Db,
DBTables, wwSpeedButton, wwDBNavigator, wwclearpanel, PrnDbgeh, PrViewEh,
Buttons, Mask;

type
TForm1 = class(TForm)
DBGridEh1: TDBGridEh;
DataSource1: TDataSource;
wwDBNavigator1: TwwDBNavigator;
wwNavButton1: TwwNavButton;
wwNavButton2: TwwNavButton;
wwNavButton3: TwwNavButton;
wwNavButton4: TwwNavButton;
wwNavButton5: TwwNavButton;
wwNavButton6: TwwNavButton;
wwNavButton7: TwwNavButton;
wwNavButton8: TwwNavButton;
wwNavButton9: TwwNavButton;
wwNavButton10: TwwNavButton;
wwNavButton11: TwwNavButton;
wwNavButton12: TwwNavButton;
wwNavButton13: TwwNavButton;
wwNavButton14: TwwNavButton;
wwNavButton15: TwwNavButton;
Panel1: TPanel;
Table1: TTable;
TableRQ: TDateField;
TableXM12: TFloatField;
Table8010: TFloatField;
Table8030: TFloatField;
Table8040: TFloatField;
Table8080: TFloatField;
procedure Table1CalcFields(DataSet: TDataSet);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Table1CalcFields(DataSet: TDataSet);
begin
TableXM12.value:=Table8010.value+Table8030.value
+Table8040.value+Table8080.Value;
end;

end.

-------------------------------------------------------
TableXM12,Table8010,Table8030,Table8040,Table8080字段均为
数值型字段。
程序运行时,TableXM12能显示正确计算值。但TableXM12对应的是
数据表中的数值字段XM12,它的显示值并未存回到字段XM12中,我希望
它能存回。
急盼高手指点。
 
在该 dataset 的 BeforePost 事件中加入写物理字段的内容:
table1.edit;
table1.fieldbyname('a1').asInteger := table1.fieldbyName('calc1').AsInteger
table1.post
 
同意 Crab 的方法
 
Crab:
首先,谢谢你的指点。
按你的方法,仍有点问题:
在dbgrid中,按下DBNavigator的Add或Edit按钮输入完数据,再按Post按钮时就死机。
后将DataSet的BeforePost事件改为AftrePost,可又提示“栈溢出”。
不知应如何处理,还望不吝赐教。
 
对不起,我的代码有点问题,不应该用 edit/post 的,这样会循环触发 BeforePost 事件,
造成死机。
删除那个 edit/post 语句对,如下面就行了:调试通过的
procedure TForm1.Table1BeforePost(DataSet: TDataSet);
begin
table1.Fieldbyname('weight').asInteger := table1.fieldbyname('calc').asinteger
end;
 
Crab:万分感激!同时也感激其他为我指点的专家!
困扰了我一周的问题终于解决了。最然这个问题对于别人可能不是什么问题,但对我
这个初学者却实在是头疼了几天。
许多统计都要计算,计算结果有时需要存进一个统计结果表,不是用SQL,而是要用数
据集控件,这就出来了我上面的问题。
好了,可以结束讨论了。虽然分不多,略表谢意吧。
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
928
SUNSTONE的Delphi笔记
S
后退
顶部