Foxtable(狐表)用户栏目专家坐堂 → [原创]这样的统计能实现吗?


  共有9776人关注过本帖树形打印复制链接

主题:[原创]这样的统计能实现吗?

帅哥哟,离线,有人找我吗?
gzdw
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小狐 帖子:308 积分:3351 威望:0 精华:0 注册:2011/12/22 17:52:00
[原创]这样的统计能实现吗?  发帖心情 Post By:2012/9/13 10:36:00 [只看该作者]

有一个简单的计划表,主要内容就合同编号,产品型号,订货数量,送货数量,欠货数量。

 

按一般的分组统计:

Dim g As New GroupTableBuilder("欠货统计明细表", DataTables("欠货明细表"))
g.Groups.AddDef("产品型号")
g.Groups.AddDef("合同编号")
g.Totals.AddDef("欠货数量")
g.SubTotal = True
g.Decimals = 0
g.Filter = "[欠货数量] > 0"
g.Build()
MainTable = Tables("欠货统计明细表")

 

结果为:

 


图片点击可在新窗口打开查看此主题相关图片如下:统计.jpg
图片点击可在新窗口打开查看

能不能把统计结果显示为:

 

 


图片点击可在新窗口打开查看此主题相关图片如下:统计2.jpg
图片点击可在新窗口打开查看

 

项目文件:


 

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:计划单.table


 回到顶部
帅哥哟,离线,有人找我吗?
lin_hailun
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:狐神 帖子:6708 积分:34304 威望:0 精华:11 注册:2012/8/18 23:10:00
  发帖心情 Post By:2012/9/13 11:57:00 [只看该作者]

 无法通过汇总得到......唯有手动写代码了。

 http://www.foxtable.com/help/topics/0681.htm

 回到顶部
帅哥哟,离线,有人找我吗?
lin_hailun
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:狐神 帖子:6708 积分:34304 威望:0 精华:11 注册:2012/8/18 23:10:00
  发帖心情 Post By:2012/9/13 13:20:00 [只看该作者]

楼主的要求太特殊,弄起来挺麻烦......最好问一下狐爸如何动态增加列。

Dim tb As DataTable = DataTables("欠货明细表")

'获得汇总数据
Dim sums As New List(Of Integer)
Dim data As New List(Of List(Of DataRow))
Dim ids As List(Of String) = tb.GetUniqueValues("", "产品型号")
For Each id As String In ids
    Dim sum As Integer = tb.Compute("Sum(欠货数量)", "产品型号='" & id & "'")
    Dim drs As List(Of DataRow) = tb.Select("产品型号='" & id & "'", "合同编号")
    sums.Add(sum)   
    data.Add(drs)
Next

'得到列数
Dim max As Integer = 0
For Each d As List(Of DataRow) In data
    If max < d.Count Then
        max = d.Count
    End If
Next

'生成临时表
Dim ntb As New DataTableBuilder("临时表")
ntb.AddDef("产品型号", tb.baseTable.Columns("产品型号").dataType)
ntb.AddDef("欠货数量", tb.baseTable.Columns("欠货数量").dataType)
For i As Integer = 1 To max
    ntb.AddDef("欠货明细_合同编号" & i, tb.baseTable.Columns("合同编号").dataType)
    ntb.AddDef("欠货明细_欠货数量" & i, tb.baseTable.Columns("欠货数量").dataType)
Next
ntb.Build()

'填充数据
Dim t As Table = Tables("临时表")
Dim count As Integer = 0
For Each d As List(Of DataRow) In data
    Dim r As Row = t.AddNew()
    Dim i As Integer = 0
    For Each dr As DataRow In d
        If i = 0 Then
            r("产品型号") = dr("产品型号")
            r("欠货数量") = sums(count)
        End If
        i = i + 1
        r("欠货明细_合同编号" & i) = dr("合同编号")
        r("欠货明细_欠货数量" & i) = dr("欠货数量")
    Next
    count = count + 1
Next

MainTable = t


 回到顶部
帅哥哟,离线,有人找我吗?
don
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:八尾狐 帖子:1812 积分:12993 威望:0 精华:14 注册:2008/10/11 18:07:00
  发帖心情 Post By:2012/9/13 13:29:00 [只看该作者]

Dim r1 As Row
Dim n1,n2  As Integer
Dim cp1,ht1,fl1,fl2 As String
Dim Cps,Hts As List(Of String)
Dim dt1 As DataTable =DataTables("欠货明细表")
fl1 ="欠货数量 <> 0"

Cps = dt1.GetUniqueValues(fl1,"产品型号")
For Each cp1  In Cps
    fl2 ="产品型号='" & cp1 & "'And " & fl1
    hts =dt1.GetUniqueValues(fl2,"合同编号")
    
    If hts.Count > n2 Then
        n2 =hts.Count
    End If
Next
Dim dtb As New DataTableBuilder("统计")
dtb.AddDef("产品型号", Gettype(String), 32)
dtb.AddDef("欠货数量", Gettype(Integer))
For n1  = 1 To  n2
    dtb.AddDef("H" & n1 , Gettype(String), 32)
    dtb.AddDef("Q" & n1 , Gettype(Integer))
Next
dtb.Build()

Tables("统计").StopRedraw
For Each cp1  In Cps
    fl2 ="产品型号='" & cp1 & "'And " & fl1
    hts =dt1.GetUniqueValues(fl2,"合同编号")
    r1 =Tables("统计").AddNew
    r1("产品型号") =cp1
    r1("欠货数量") =dt1.Compute("sum(欠货数量)",fl2)
    For n1 = 0 To  hts.count-1
        r1("H" & n1+1) =hts(n1)
        r1("Q" & n1+1) =dt1.Compute("sum(欠货数量)",fl2 & " And 合同编号 ='" & hts(n1) & "'")
    Next
Next
With DataTables("统计")    
    For n1  = 1 To  n2
        .DataCols("H" & n1).Caption = "欠货明细_合同编号"
        .DataCols("Q" & n1).Caption = "欠货明细_欠货数量"     
    Next
    .BuildHeader()
End With

Tables("统计").ResumeRedraw
MainTable= Tables("统计")
[此贴子已经被作者于2012-9-13 14:14:27编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
gzdw
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小狐 帖子:308 积分:3351 威望:0 精华:0 注册:2011/12/22 17:52:00
  发帖心情 Post By:2012/9/13 13:47:00 [只看该作者]

谢谢楼上二位高手。

1、TO lin_hailun

结果准确,基本上就是这个了。如果能把“g.Filter = "[欠货数量] > 0"”这个条件加进来就更好了,这样可以避免送货完毕的合同号出现在“欠货统计”中。

 

2、TO don

 If hts.Count > n2 Then

        n2 =hts.Count
    End If
这段代码显示“n2”未定义,是不是少一句?

 回到顶部
帅哥哟,离线,有人找我吗?
lin_hailun
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:狐神 帖子:6708 积分:34304 威望:0 精华:11 注册:2012/8/18 23:10:00
  发帖心情 Post By:2012/9/13 14:21:00 [只看该作者]

 楼主估计都自己可以修改的.....

 If sum > 0 Then
     sums.Add(sum)  
     data.Add(drs)
 End If


 回到顶部
帅哥哟,离线,有人找我吗?
gzdw
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:小狐 帖子:308 积分:3351 威望:0 精华:0 注册:2011/12/22 17:52:00
  发帖心情 Post By:2012/9/13 21:22:00 [只看该作者]

说真的,本人水平真不够,整个统计代码不是太懂,但经过晚上学习,部分还是看懂了,包括缺少n2定义的部分。

再次谢谢楼上

[此贴子已经被作者于2012-9-13 23:13:44编辑过]

 回到顶部