to newdongkui(老乌鸦):
     如果用存储过程做,那出货明细的内容用什么参数传呀?
  to bosshoss (地雷):
     我想像这种统计的数据,都是可以从建视图做,出货明细中存的是单价和数量就好了。合计金额是不是在出货主表里的?
  to 想用触发器做的哥们:
     用trigger,出货明细如果有多条(出货主表为一条),那就意味着,修改一下出货明细,就用trigger,但是只有最后一条出货明细修改完了,合计金额(是各条出货明细的总和)才出来,以前的修改相当于无用功,反而降低效率。

解决方案 »

  1.   

    to 想用触发器做的哥们:
         用trigger,出货明细如果有多条(出货主表为一条),那就意味着,修改一下出货明细,就用trigger,但是只有最后一条出货明细修改完了,合计金额(是各条出货明细的总和)才出来,以前的修改相当于无用功,反而降低效率。
    你指的是批量修改吧?
    批量修改的时候,triger只触发一次,inserted、deleted里有多条数据,
    只要select sum(a.金额)-sum(b.金额) from inserted a,deleted b 即可,
    只执行一次,一点也没降低效率。
      

  2.   

    刚才有事,不好意思,让各位老大苦等
    不是批量修改,是在日常使用中,比方出了一次货,要新建一张出货表,N条出货明细
    是啊,我也想在UPDATARECORD 事件中做,毕竟用TRIGER要对整个明细表重新计算,效率可能不如利用客户机的CPU,但是我对QUERY的存贮过程了解得不多,主要是有两个表,一个主表,一个明细,比方新增一个出货单,先新增一个主表文件,保存,再对明细表进行新增,我就不知如何处理UPDATA了,各位老大,有没有这方面的资料?
      

  3.   

    谁说要对整个明细表重新计算了?select @Change=sum(a.金额)-sum(b.金额) from inserted a,inserted bupdate 合计表 set 合计金额=合计金额+@Change where ...
      

  4.   

    to heixiu1980(heixiu1980)
         如果是批量的话,譬如有三条明细,都是insert,那只作一次的话,trigger应该怎么创建?一般的是CREATE TRIGGER <trigger_name, sysname, trig_test>
    ON <table_or_view_name, sysname, pubs.dbo.sales>
    INSTEAD OF INSERT,这样的话就是每插入一条明细,都去激发一下trigger,如何说只是做了一次呢?
      

  5.   

    不过用TRINGER呢,则要你尽量使用QUERY的cachedupdates
    但要写得好,难啊,这几天我头都是大的
      

  6.   

    TO:heixiu1980(heixiu1980) 
    你的那个SQL语句,我没有看懂:
    我的明细表是:出货单ID,明细ID,产品ID,数量,单价
    主表:出货单ID,客户ID,总计金额,日期 等等
      

  7.   

    TO wwooqqoo() 
      那好说,一次UPDATA就OK啦,这样就只触发一次TRINGER
      

  8.   

    To wwooqqoo():
    创建的方法一样,只是语句不太一样
    一次插入N条数据(也就是批量了),Triger只触发一次,
    在inserted表中有N条数据,只要批量更新就可以了。To bosshoss(地雷):
    就是说从inserted和deleted表中取到变化量,然后更新合计表即可
    我那个只是个例子,比较简略,实际写的时候需要group by
    其实不难的,你就把inserted和deleted当成实实在在的表,里面各有N条数据,
    然后根据这些数据去更新合计表,由于不了解你的具体表结构,没法写完整代码,
    如果需要,请贴出两个表详细的结构,包括主键。
      

  9.   

    出货单主表:deliverymaster

    出货单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
      

  10.   

    订单明细表: deliverydetail
    出货单ID      项次                   型号       数量      单价
    deliveryid    deliverydetailitem    productid  quantity   unitprice
    char10      tinyint          char8      int        smallmoney
      

  11.   

    to heixiu1980(heixiu1980)
         是不是只要客户程序在一次事务里去做,它就只会触发一次trigger,否则就会多次吧?
      

  12.   

    to wwooqqoo():
    执行一条SQL语句,触发一次。
      

  13.   

    to heixiu1980(heixiu1980)
        对阿,那insert三条sql语句不就是有三次触发吗?为何批量?不好意思我还不明白
      

  14.   

    地雷老大:我吃完饭就回家,上不了网了:(
    暂时写一个给你,如果有错,明天再说了。
    定义就不写了,跟普通的一样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
      

  15.   

    批量是指一条语句insert三条数据,如:
    insert into deliverydetail (...)
    select ... from ...
      

  16.   

    to heixiu1980(heixiu1980)
         但像这个问题,根本不能用这种批量来做?
      

  17.   

    to wwooqqoo() :
    你说的没错!单据明细可能会有新增、删除、修改三种状态,要这样的话肯定要用到insert、delete、update三种触发器,大大增加了数据库的运行成本,如果明细巨多的话,效果更不堪想象,而且触发器会出各种各样的不好查找的问题,迫不得已的话不要用触发器,最好在程序里面进行合计。
      

  18.   

    从前台处理的话,在哪里合计?是不是还得在增、删、改的操作之后?这跟用触发器有什么区别呢?还多了连接数据库这个操作。
      说到底,要想数据正确,必须保证从增、删、改到合计这些操作的原子性,排除连接数据库之外,前台和触发器控制的工作量是一样的。而且由于触发器可以使用inserted和deleted这两个临时表,
    不需要从可能上百万计的明细表中累计数据,会大大提高效率!
      

  19.   

    to :newdongkui(老乌鸦)
    你好
    不知你说的那个存储过程是DELPHI中UPDATESQL还是MSSQL中的存储过程?不过我手头的书上是用DELPHI中QUERY中的UPDATE事务来做的!使用UPDATESQL的CACHE,只有当调用QUERY的POST等事务,才把所有更改的数据上传!难,难,难以决策!
      

  20.   

    我是指mssql里的,事务也是啊。
    对delphi的这种做法,我早就有意见了,我老婆他们现在系统慢如老牛,哈哈。
    及早决断,数据更新这一层不益过厚的。
      

  21.   

    比方我做的新建订单时新增明细的过程如下:有什么问题?请教!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;
      

  22.   

    这种情况,我已经改用xml处理了
      

  23.   

    1、在界面上用程序计算。可以利用界面事件自动刷新。
    2、主表和从表先后提交,保持在一个事务中。
    3、提交前进行数据检查。
    至于如果在客户端存储数据,在PB中有datawindow,在VB中有网格,在DELPHI中,我就不知道
      

  24.   

    主要是如何保证:
    主表和从表先后提交,保持在一个事务中begin tran
    .....
    ...
    commit tran???
      

  25.   

    begin
    // 传输数据交易开始
       operationform.dbjingxun.StartTransaction;
       try
          qyorderform.ApplyUpdates;
          qyorderformdetail.ApplyUpdates;
          //完成交易
          operationform.dbjingxun.Commit;
       except
          //取消交易
          operationform.dbjingxun.Rollback;
          //再产生一次例外,并中止这个程序的运行
          raise;
       end;
         //删除缓冲区中的数据
         qyorderform.CommitUpdates;
         qyorderformdetail.CommitUpdates;
      

  26.   

    写三个触发器
    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)
      

  27.   

    那只要两个就行啦
    一个INSERT,一个UPDATE,DELETE,
      

  28.   

    根本不用触发器,在主表和明细表保存之后,执行一条SQL语句将明细表的金额合计根据出货单ID更新对应的主表的总金额!