以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [求助]CrossTableBuilder  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=128732)

--  作者:blsu33
--  发布时间:2018/12/13 20:13:00
--  [求助]CrossTableBuilder
老师 这段代码MessageBox.Show(1) 之前 就出现一个如下提示,没看明白为什么,其中,SQL语言是没问题的,测试成功


图片点击可在新窗口打开查看此主题相关图片如下:725f2edc-5c2a-4df0-8ab8-2fae81dd512d.png
图片点击可在新窗口打开查看


Dim sql As String = "Select numbers,jodate,eveid,eveidname,evinvoiceid,submiterid,submiteridname,remark,doctype,doctypename,sum(amount) As [totalamount],count(numbers) As [rowcount] Fr om {pm0102} Group By numbers,jodate,eveid,eveidname,evinvoiceid,submiterid,submiteridname,remark,doctype,doctypename"
Dim g As New CrossTableBuilder("统计表1",sql)
g.HGroups.AddDef("numbers")
g.HGroups.AddDef("submiterid")
g.HGroups.AddDef("cheks")
g.VGroups.AddDef("numbers")
g.Totals.AddDef("totalamount", "totalamount", True)
g.OrderByTotal = True
g.HorizontalTotal = True
g.VerticalTotal = True
g.Subtotal = True
g.SubtotalLevel = 0 \'只生成总计行
g.Build()
bxmx.Table.DataSource =g.BuildDataSource()
MessageBox.Show(1)
Dim t As Table = bxmx.Table
Dim g1 As Subtotalgroup
\'t.SubtotalGroups.Clear()
t.GroupAboveData = False
t.TreeVisible = False
t.SpillNode = False

g1 = New Subtotalgroup
g1.Aggregate = AggregateEnum.Sum
g1.GroupOn = "numbers"
Dim str As String
For Each c As DataCol In t.DataTable.DataCols
    If c.name<>"numbers" Then
        str &= c.name & "," \'对数量和金额进行统计
    End If
Next
g1.TotalOn=str.TrimEnd(",")
g1.Caption = "{0} 小计"
t.SubtotalGroups.Add(g1)
t.Subtotal()

--  作者:blsu33
--  发布时间:2018/12/13 21:03:00
--  
顶下
--  作者:有点甜
--  发布时间:2018/12/13 21:06:00
--  

红色代码删除

 

\'g.Build()
bxmx.Table.DataSource =g.BuildDataSource()

--  作者:blsu33
--  发布时间:2018/12/13 21:16:00
--  
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:例子.foxdb


--  作者:blsu33
--  发布时间:2018/12/13 21:16:00
--  
老师  烦您您给看下 窗口1
[此贴子已经被作者于2018/12/13 21:16:33编辑过]

--  作者:有点甜
--  发布时间:2018/12/13 21:26:00
--  
以下是引用blsu33在2018/12/13 21:16:00的发言:
老师  烦您您给看下 窗口1
[此贴子已经被作者于2018/12/13 21:16:33编辑过]

 

窗口1没问题,请说明如何测试,有什么问题?


--  作者:blsu33
--  发布时间:2018/12/13 21:29:00
--  
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:例子.table


--  作者:有点甜
--  发布时间:2018/12/13 21:41:00
--  

应该是bug

 

Dim bxmx As WinForm.Table = e.Form.Controls("Table1")
Dim cmd As New SQLCommand
Dim dt As DataTable
Dim sql As String = "Select * From {表A}"
cmd.CommandText = sql
dt = cmd.ExecuteReader()

Dim g As New CrossTableBuilder("统计表1",dt)
g.HGroups.AddDef("menuid")
g.HGroups.AddDef("findpnl")
g.VGroups.AddDef("amount")
g.Totals.AddDef("amount", "amount", True)
\'g.OrderByTotal = True
\'g.HorizontalTotal = True
\'g.VerticalTotal = True
g.Subtotal = True
g.SubtotalLevel = 0 \'只生成总计行
\'g.Build()
bxmx.Table.DataSource =g.BuildDataSource()


--  作者:blsu33
--  发布时间:2018/12/13 21:53:00
--  
的确 按照帮助文档做的 楼上的 没啥问题  
按照帮助文档做的

上面的方法并不是一个高效的方法,假定有10万个订单,上面的方法会将10万行加载到FoxTable再统计,效率极低;如果是100万行呢? 那么后果就只有一个:系统崩溃。
所以我们还需要有更好的办法。

其实不管是GroupTableBuilder还是CrossTableBuilder,都可以直接使用Select语句作为统计数据来源。
例如要完成示例一的统计任务,代码为:

Dim sql As String = "Select 产品名称,数量,日期 FR OM {订单} INNER JOIN {产品} ON {订单}.产品ID = {产品}.产品ID"
Dim
b As New CrossTableBuilder("统计表1",sql, "Sale")
b
.HGroups.AddDef("产品名称")
b
.VGroups.AddDef("日期","{0}月")
b
.Totals.AddDef("数量")
b
.HorizontalTotal = True
b
.VerticalTotal = True
b
.Build()
MainTable
= Tables("统计表1")

不仅代码更为简洁, 效率更有天壤之别。

上述代码的关键在于:

Dim b As New CrossTableBuilder("统计表1",sql, "Sale")

第一个参数指定统计表名称,第二个参数指定Select语句,第三个参数指定数据源名称。

如果是内部数据源,代码为:

Dim b As New CrossTableBuilder("统计表1",sql




--  作者:blsu33
--  发布时间:2018/12/13 22:08:00
--  
老师 ,
  要想 获取 8楼的 
Dim bxmx As WinForm.Table = e.Form.Controls("Table1")
bxmx 表控件 对应的datatable 统计表1 好像不成功

就是 不能这么写
bxmx.table.datatable