以文本方式查看主题

-  Foxtable(狐表)  (http://www.foxtable.com/bbs/index.asp)
--  专家坐堂  (http://www.foxtable.com/bbs/list.asp?boardid=2)
----  [原创]这样的统计能实现吗?  (http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=23580)

--  作者:gzdw
--  发布时间: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
--  发布时间: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编辑过]