423  3280228  -600  807  2004-9-9 12:53:43  董燕  2004
247  5515326  1000  1196  2004-9-1 16:48:35  董燕  2004
470  3181238  200  210  2004-9-12 16:25:41  宁莉  2036
452  3289169  -400  470  2004-9-11 11:18:50  宁莉  2036
299  3289894  200  229  2004-9-3 14:03:00  王玲    2105
300  3280420  200  244  2004-9-3 14:15:04  王玲    2105
如上表是在dbgrid 中显示出来的.我现在用 想统计合计输出如下:
董燕    1000    -600         400
宁莉    200     -400         -200
王玲     400     0           400
我的思路是:首先将 dbgrid1 中的 第一条记录中的 2004 赋予一个表达式 然后 从 dbgrid的第二条记录开始循环判断 如果相同则 继续加值  如果不同则 输出 看我的程序:
dbgrid1.DataSource.DataSet.RecNo:=0;
       begin
          ygname:=dbgrid1.DataSource.DataSet.Fields.Fields[6].AsString;
          staffid:=dbgrid1.DataSource.DataSet.Fields.Fields[7].AsInteger;
         end;//赋予初值
        for j:=1 to dbgrid1.DataSource.DataSet.RecordCount-1 do
           begin
               if(staffid=dbgrid1.DataSource.DataSet.FieldByName('staff_id').AsInteger) then
                begin
                     if( dbgrid1.DataSource.DataSet.FieldByName('change').AsInteger>0)then
                      begin  ygchange1:=ygchange1+ dbgrid1.DataSource.DataSet.FieldByName('change').AsInteger;
                      end
                     else
                       begin ygchange2:=ygchange2+dbgrid1.DataSource.DataSet.FieldByName('change').AsInteger;
                       end;//以上是如果相同则 相应的 change 值 相加
                end
                else
                  begin
                   ygchange:=ygchange1+ygchange2;
                   strlist.Add(ygname+ #9 + IntToStr(ygchange1) + #9 + IntToStr(ygchange2) + #9 + IntToStr(ygchange));//这两句是 如果不同则先输出上面所有加的记录的值.也就是输出第一个staff_id 的合计数                    ygname:=dbgrid1.DataSource.DataSet.Fields.Fields[6].AsString;
                    staffid:=dbgrid1.DataSource.DataSet.Fields.Fields[7].AsInteger;
                     if( dbgrid1.DataSource.DataSet.FieldByName('change').AsInteger>0)then
                       begin  ygchange1:=dbgrid1.DataSource.DataSet.FieldByName('change').AsInteger;
                       end
                     else
                       begin ygchange2:=dbgrid1.DataSource.DataSet.FieldByName('change').AsInteger;
                       end;//重新赋予 新值
                    end;               end;
              ygchange:=ygchange1+ygchange2;
              strlist.Add(ygname+ #9 + IntToStr(ygchange1) + #9 + IntToStr(ygchange2) + #9 + IntToStr(ygchange));//这两句是如果员工一直是同一个人.那么最后输出
大家帮我看看 为什么 我不能输出  所有的合计?  只能输出最后一名员工的 合计

解决方案 »

  1.   

    注意的是:如果你用dbgrid1.DataSource.DataSet.RecNo  的话 那时在dbgrid 中取道的 记录.也就是如果dbgrid 中激活记录改变 这个也就改变.所以 你应该在一个循环开始时用  
    dbgrid1.DataSource.DataSet.findfirst  那样的话 是的记录回到 首位 .那样循环判断就不会出错了
    你的循环差不多可以,你试试看
      

  2.   

    太复杂了嘛,我认为应该用统计到数组A[n,3],再用grid显示出来解决这个问题,如你结果的"董燕"等人名,可以用一个sql语句来统计出来,这样就确定了N的大小,后面的a[n,1],a[n,2],a[n,3],就是一个相加的过程
      

  3.   

    为什么不直接用SQL语句来统计呢?简单多了
      

  4.   

    用sql 语句解决,SQL SERVER数据库
    数据表:tt
    字段 sid   gain
    ---------------
    数据
         D001  1000
         D001  -400
         D002  200
         D002  -400
         D003  400
         D003  0
    查询结果
    字段 sid    gain1   gain2 …… sum
    -----------------------------------
    数据
         D001   1000    -400       600
         D002   200     -400       -200
         D003   400     0          400
    select sid,gain,gid=0 into #t from tt order by sid
    declare @sid varchar(10),@i varchar(10),@s varchar(8000)
    update #t set @i=case sid when @sid then @i+1 else 1 end
    ,gid=@i,@sid=sid
    select @s='',@i=max(gid) from #t
    while @i>0
    select @s=',[gain'+@i+']=sum(case gid when '+@i+' then gain else 0 end)'+@s
    ,@i=@i-1
    exec('select sid'+@s+',[sum]=sum(gain) 
    from #t group by sid')drop table #t