请教:是做触发器,还是在应用程序写,在线等各位老大的意见

bosshoss 2003-03-24 02:51:54
比如说出货主表与出货明细:
出货明细表新增,删除,修改,则每个出货单合计金额可能有变化,是在应用程序中写还是在服务器上写触发器好,我用的是DELPHI和MSSQL2000
...全文
70 46 打赏 收藏 转发到动态 举报
写回复
用AI写文章
46 条回复
切换为时间正序
请发表友善的回复…
发表回复
sdhdy 2003-03-26
  • 打赏
  • 举报
回复
根本不用触发器,在主表和明细表保存之后,执行一条SQL语句

将明细表的金额合计根据出货单ID更新对应的主表的总金额!

bosshoss 2003-03-25
  • 打赏
  • 举报
回复
那只要两个就行啦
一个INSERT,一个UPDATE,DELETE,
Sorder 2003-03-25
  • 打赏
  • 举报
回复
写三个触发器
insert update xxx set 金额合计:=金额合计+(select sum(明细金额) from inserted)

update update xxx set 金额合计:=金额合计+(select sum(明细金额) from inserted)
-(select sum(明细金额) from deleted)

delete update xxx set 金额合计:=金额合计-(select sum(明细金额) from deleted)
bosshoss 2003-03-25
  • 打赏
  • 举报
回复
bosshoss 2003-03-25
  • 打赏
  • 举报
回复
begin
// 传输数据交易开始
operationform.dbjingxun.StartTransaction;
try
qyorderform.ApplyUpdates;
qyorderformdetail.ApplyUpdates;
//完成交易
operationform.dbjingxun.Commit;
except
//取消交易
operationform.dbjingxun.Rollback;
//再产生一次例外,并中止这个程序的运行
raise;
end;
//删除缓冲区中的数据
qyorderform.CommitUpdates;
qyorderformdetail.CommitUpdates;
pengdali 2003-03-25
  • 打赏
  • 举报
回复
主要是如何保证:
主表和从表先后提交,保持在一个事务中

begin tran
.....
...
commit tran

???
bosshoss 2003-03-25
  • 打赏
  • 举报
回复
bosshoss 2003-03-24
  • 打赏
  • 举报
回复
主要是如何保证:
主表和从表先后提交,保持在一个事务中
smallbell1 2003-03-24
  • 打赏
  • 举报
回复
1、在界面上用程序计算。可以利用界面事件自动刷新。
2、主表和从表先后提交,保持在一个事务中。
3、提交前进行数据检查。
至于如果在客户端存储数据,在PB中有datawindow,在VB中有网格,在DELPHI中,我就不知道
bosshoss 2003-03-24
  • 打赏
  • 举报
回复
那是什么,没听说过
newdongkui 2003-03-24
  • 打赏
  • 举报
回复
这种情况,我已经改用xml处理了
bosshoss 2003-03-24
  • 打赏
  • 举报
回复
比方我做的新建订单时新增明细的过程如下:有什么问题?请教!

procedure Tneworder_qy.SBINSERTClick(Sender: TObject);
begin
//增加订单明细表项
if noworderdetailitem=1 then
begin
// 保存主文件数据交易开始
qyordermaster.FieldByName('orderdate').AsDateTime:=strtodate (formatdatetime('yyyy-mm-d',orderdatetimepicker.DateTime));
operationform.dbjingxun.StartTransaction;
try
qyordermaster.ApplyUpdates;
//完成交易
operationform.dbjingxun.Commit;
except
//取消交易
operationform.dbjingxun.Rollback;
//再产生一次例外,并中止这个程序的运行
raise;
end;
//删除缓冲区中的数据
qyordermaster.CommitUpdates;
end;
if (dsordermaster.DataSet.state in [dsinsert,dsedit]) then
begin
//dsorderformdetail.DataSet.;
qyorderdetail.insert;
qyorderdetail.fieldbyname('ordermasterid').asstring:=qyordermaster.fieldbyname('ordermasterid').asstring;
qyorderdetail.FieldByName('orderdetailitem').AsInteger:=noworderformitem;
noworderformitem:=noworderformitem+1;
end;
end;
bosshoss 2003-03-24
  • 打赏
  • 举报
回复
是使用一个临时表呢,还是一个动态数组,还是一个指针,完了完了,更加复杂了!哈
bosshoss 2003-03-24
  • 打赏
  • 举报
回复
我现在在想,如何做事务,并减少客户端更新数据的次数
比方新建一个出货表,有多条数据,在客户端如何贮存待更新的数据,只有当点保存时才调用存贮过程,一次搞定
newdongkui 2003-03-24
  • 打赏
  • 举报
回复
我是指mssql里的,事务也是啊。
对delphi的这种做法,我早就有意见了,我老婆他们现在系统慢如老牛,哈哈。
及早决断,数据更新这一层不益过厚的。
bosshoss 2003-03-24
  • 打赏
  • 举报
回复
to :newdongkui(老乌鸦)
你好
不知你说的那个存储过程是DELPHI中UPDATESQL还是MSSQL中的存储过程?不过我手头的书上是用DELPHI中QUERY中的UPDATE事务来做的!使用UPDATESQL的CACHE,只有当调用QUERY的POST等事务,才把所有更改的数据上传!难,难,难以决策!
bosshoss 2003-03-24
  • 打赏
  • 举报
回复
不用三种触发器,一个触发器中可以响应这三个事务
newdongkui 2003-03-24
  • 打赏
  • 举报
回复
哈哈,你们可真行,说怎么多啦。

简单,就在存储过程里做吧。

参数好办,直接把修改的出货明细的主码传进去,查吧,改吧。

这种情况我从来没有用过触发器,

但是涉及到一个事务的问题,所以还是建议连同出货明细的更新也做成存储过程,不要在客户端控制。这样会好很多的。
heixiu1980 2003-03-24
  • 打赏
  • 举报
回复
从前台处理的话,在哪里合计?是不是还得在增、删、改的操作之后?这跟用触发器有什么区别呢?还多了连接数据库这个操作。
说到底,要想数据正确,必须保证从增、删、改到合计这些操作的原子性,排除连接数据库之外,前台和触发器控制的工作量是一样的。而且由于触发器可以使用inserted和deleted这两个临时表,
不需要从可能上百万计的明细表中累计数据,会大大提高效率!
heixiu1980 2003-03-24
  • 打赏
  • 举报
回复
从前台处理只会增加负担(连接数据库),其实做的工作是一样的。
加载更多回复(26)

22,206

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧