以文本方式查看主题 - Foxtable(狐表) (http://foxtable.com/bbs/index.asp) -- 专家坐堂 (http://foxtable.com/bbs/list.asp?boardid=2) ---- [原创]这样的统计能实现吗? (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=23580) |
||||
-- 作者:gzdw -- 发布时间:2012/9/13 10:36:00 -- [原创]这样的统计能实现吗? 有一个简单的计划表,主要内容就合同编号,产品型号,订货数量,送货数量,欠货数量。
按一般的分组统计: Dim g As New GroupTableBuilder("欠货统计明细表", DataTables("欠货明细表"))
结果为:
能不能把统计结果显示为:
项目文件:
|
||||
-- 作者:lin_hailun -- 发布时间:2012/9/13 11:57:00 -- 无法通过汇总得到......唯有手动写代码了。 http://www.foxtable.com/help/topics/0681.htm |
||||
-- 作者:lin_hailun -- 发布时间: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 -- 发布时间: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 -- 发布时间: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 -- 发布时间:2012/9/13 14:21:00 -- 楼主估计都自己可以修改的..... If sum > 0 Then sums.Add(sum) data.Add(drs) End If |
||||
-- 作者:gzdw -- 发布时间:2012/9/13 21:22:00 -- 说真的,本人水平真不够,整个统计代码不是太懂,但经过晚上学习,部分还是看懂了,包括缺少n2定义的部分。 再次谢谢楼上 [此贴子已经被作者于2012-9-13 23:13:44编辑过]
|