to newdongkui(老乌鸦):
如果用存储过程做,那出货明细的内容用什么参数传呀?
to bosshoss (地雷):
我想像这种统计的数据,都是可以从建视图做,出货明细中存的是单价和数量就好了。合计金额是不是在出货主表里的?
to 想用触发器做的哥们:
用trigger,出货明细如果有多条(出货主表为一条),那就意味着,修改一下出货明细,就用trigger,但是只有最后一条出货明细修改完了,合计金额(是各条出货明细的总和)才出来,以前的修改相当于无用功,反而降低效率。
如果用存储过程做,那出货明细的内容用什么参数传呀?
to bosshoss (地雷):
我想像这种统计的数据,都是可以从建视图做,出货明细中存的是单价和数量就好了。合计金额是不是在出货主表里的?
to 想用触发器做的哥们:
用trigger,出货明细如果有多条(出货主表为一条),那就意味着,修改一下出货明细,就用trigger,但是只有最后一条出货明细修改完了,合计金额(是各条出货明细的总和)才出来,以前的修改相当于无用功,反而降低效率。
用trigger,出货明细如果有多条(出货主表为一条),那就意味着,修改一下出货明细,就用trigger,但是只有最后一条出货明细修改完了,合计金额(是各条出货明细的总和)才出来,以前的修改相当于无用功,反而降低效率。
你指的是批量修改吧?
批量修改的时候,triger只触发一次,inserted、deleted里有多条数据,
只要select sum(a.金额)-sum(b.金额) from inserted a,deleted b 即可,
只执行一次,一点也没降低效率。
不是批量修改,是在日常使用中,比方出了一次货,要新建一张出货表,N条出货明细
是啊,我也想在UPDATARECORD 事件中做,毕竟用TRIGER要对整个明细表重新计算,效率可能不如利用客户机的CPU,但是我对QUERY的存贮过程了解得不多,主要是有两个表,一个主表,一个明细,比方新增一个出货单,先新增一个主表文件,保存,再对明细表进行新增,我就不知如何处理UPDATA了,各位老大,有没有这方面的资料?
如果是批量的话,譬如有三条明细,都是insert,那只作一次的话,trigger应该怎么创建?一般的是CREATE TRIGGER <trigger_name, sysname, trig_test>
ON <table_or_view_name, sysname, pubs.dbo.sales>
INSTEAD OF INSERT,这样的话就是每插入一条明细,都去激发一下trigger,如何说只是做了一次呢?
但要写得好,难啊,这几天我头都是大的
你的那个SQL语句,我没有看懂:
我的明细表是:出货单ID,明细ID,产品ID,数量,单价
主表:出货单ID,客户ID,总计金额,日期 等等
那好说,一次UPDATA就OK啦,这样就只触发一次TRINGER
创建的方法一样,只是语句不太一样
一次插入N条数据(也就是批量了),Triger只触发一次,
在inserted表中有N条数据,只要批量更新就可以了。To bosshoss(地雷):
就是说从inserted和deleted表中取到变化量,然后更新合计表即可
我那个只是个例子,比较简略,实际写的时候需要group by
其实不难的,你就把inserted和deleted当成实实在在的表,里面各有N条数据,
然后根据这些数据去更新合计表,由于不了解你的具体表结构,没法写完整代码,
如果需要,请贴出两个表详细的结构,包括主键。
出货单ID 客户ID 出货日期 业务员ID 总价
deliveryid customerid deliverydate salesid total_prices
char10 smallint2 datetime smallint money
主键订单明细表: deliverydetail
出货单ID 项次 型号 数量 单价
deliveryid orderformitem productid quantity unitprice
char10 tinyint1 char8 int smallmoney
出货单ID 项次 型号 数量 单价
deliveryid deliverydetailitem productid quantity unitprice
char10 tinyint char8 int smallmoney
是不是只要客户程序在一次事务里去做,它就只会触发一次trigger,否则就会多次吧?
执行一条SQL语句,触发一次。
对阿,那insert三条sql语句不就是有三次触发吗?为何批量?不好意思我还不明白
暂时写一个给你,如果有错,明天再说了。
定义就不写了,跟普通的一样update deliverymaster set
total_prices=a.total_prices+sum(b.quantity*b.unitprice)-sum(c.quantity*c.unitprice)
from deliverymaster a,inserted b,deleted c
where a.deliveryid=b.deliveryid and a.deliveryid=c.deliveryid
insert into deliverydetail (...)
select ... from ...
但像这个问题,根本不能用这种批量来做?
你说的没错!单据明细可能会有新增、删除、修改三种状态,要这样的话肯定要用到insert、delete、update三种触发器,大大增加了数据库的运行成本,如果明细巨多的话,效果更不堪想象,而且触发器会出各种各样的不好查找的问题,迫不得已的话不要用触发器,最好在程序里面进行合计。
说到底,要想数据正确,必须保证从增、删、改到合计这些操作的原子性,排除连接数据库之外,前台和触发器控制的工作量是一样的。而且由于触发器可以使用inserted和deleted这两个临时表,
不需要从可能上百万计的明细表中累计数据,会大大提高效率!
你好
不知你说的那个存储过程是DELPHI中UPDATESQL还是MSSQL中的存储过程?不过我手头的书上是用DELPHI中QUERY中的UPDATE事务来做的!使用UPDATESQL的CACHE,只有当调用QUERY的POST等事务,才把所有更改的数据上传!难,难,难以决策!
对delphi的这种做法,我早就有意见了,我老婆他们现在系统慢如老牛,哈哈。
及早决断,数据更新这一层不益过厚的。
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;
2、主表和从表先后提交,保持在一个事务中。
3、提交前进行数据检查。
至于如果在客户端存储数据,在PB中有datawindow,在VB中有网格,在DELPHI中,我就不知道
主表和从表先后提交,保持在一个事务中begin tran
.....
...
commit tran???
// 传输数据交易开始
operationform.dbjingxun.StartTransaction;
try
qyorderform.ApplyUpdates;
qyorderformdetail.ApplyUpdates;
//完成交易
operationform.dbjingxun.Commit;
except
//取消交易
operationform.dbjingxun.Rollback;
//再产生一次例外,并中止这个程序的运行
raise;
end;
//删除缓冲区中的数据
qyorderform.CommitUpdates;
qyorderformdetail.CommitUpdates;
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)
一个INSERT,一个UPDATE,DELETE,