类似Excel的功能
序    长度        累计
1    100        100
2    130        230
3    160        390
4    110        500
5    190        590
6    125        715
...
...
上表中累计为计算字段,不知各位前辈有什么好办法?

解决方案 »

  1.   

    在计算字段中要做运算!
    在计算字段中每次都要做累加,把ID<=当前值的长度全都累计一下
    不过在记录多的情况下,效率可想而知。
    为什么不用SQL语句呢
      

  2.   


    declare @t table(id int,length int)
    insert @t select 1,10
    union all select 2,30
    union all select 3,40
    union all select 4,70
    union all select 5,90select 
      id,
      length,
      AccValue=(select sum(length) from @t where id<=a.id)
    from @t a
      

  3.   

    to: liangpei2008
    用SQL Code测试调用10000条记录大约用了25秒(用双核笔记本测试),觉得还是太慢了,客户是不会接受的。另外,在客户端更改了数据不能即时更新后面的记录。
    不知Execl是用了什么技术,随便更改一行记录,汇总随即更新。
      

  4.   

    使用游标控制:declare @total Int                    --汇总变量
    declare @ALength Int                  --长度变量
    declare   @a table(长度  int,统计 int) --定义临时表
    declare cur1 cursor                   --定义游标
     for select 长度 from Table1           --提取记录Set @total=0.0
    open cur1                                 --打开游标
    fetch next from cur1 INTO @ALength        --进行循环处理
    while (@@fetch_status=0 )
    begin
     set @Total=@Total+@ALength                --累加
     insert into @a(长度,统计) values(@ALength,@total)  --插入到临时表中
     fetch next from cur1 INTO @ALength                --处理下一条记录
    end;select * from @a           --显示结果
    close cur1                 --关闭游标
    deallocate cur1            --删除游标可以定义成存储过程,在程序中调用。
    经测试,11000条记录,1S时间
    欢迎支持:
    http://bbs.yd153.com
      

  5.   

    我相信我写的SQL语句如果用我的测试环境的话,也不会很差!
      

  6.   


    declare @t table(id int,length int, AccValue int)
    insert @t(id,length) 
    select 1,10
    union all select 2,30
    union all select 3,40
    union all select 4,70
    union all select 5,90--更新未加累积值的行
    declare @i int,@MaxID int
    select @i = 1
    select @MaxID = max(id) from @t
    while @i <= @MaxID
    begin
      update a set a.AccValue = a.length + isnull(b.AccValue,0)
      from @t a left join @t b on a.id = b.id + 1
      where a.id = @i
      set @i = @i + 1
    end;/*
    --建议LZ加一个触发器,在插入或更新时做以下操作
      declare @iValueOrg int  --记录用户修改前的值
      declare @iValueMod int  --记录用户修改后的值
      declare @ID int --进行更新的记录ID
      update @t set AccValue = AccValue + @iValueMod - @iValueOrg
      where a.id <= @ID
    */
      

  7.   


    该问题的核心在于如何不重复累计已统计的信息。
    解决方法为:
    为已参与统计的数据加上处理标识。如果在10000中加上一条记录,那直接就以最后的值+新增记录。
    如果在已有的记录中做修改,则直接在累计字段+增量。
    如果不这样处理,再好的SQL语句,再优秀的表设计也枉然
      

  8.   

    首先,多谢各位朋友的参与!
    其实这个问题是用在一个生产现场按制软件,上表中‘序’为每张订单的生产顺序号,‘长度’为每张订单的剩余长度,在实际生产中必须一张一张订单的生产,因此第一张订单的‘长度’是会随着生产的进行不断的改变(减少)(车速约300m/min),相应的每张订单累计长度也会改变(我们需要用这个长度来预估生产时间)。同时,为了满足生产的需要,在生产中会出现以下情况:更改生产顺序、插单、删单。
    多数朋友趋向用SQL解决,但我担心这么高频率的更新服务器是否能够应付?我们有看过台湾同行的系统,第一他们没有用类似SQL的数据库(数据好象存在*.dat文件),第二电脑就是普通的PC,第三功能完全实现。但在运行他们的系统时,CPU使用率几乎100%。
    不知各位是否还有其它好建议?
      

  9.   

    没办法了,只好用StringGrid解决了。