Foxtable(狐表)用户栏目专家坐堂 → [求助]CrossTableBuilder


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

主题:[求助]CrossTableBuilder

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


加好友 发短信
等级:九尾狐 帖子:2928 积分:20184 威望:0 精华:0 注册:2012/2/3 17:45:00
[求助]CrossTableBuilder  发帖心情 Post By:2018/12/13 20:13:00 [只看该作者]

老师 这段代码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
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2928 积分:20184 威望:0 精华:0 注册:2012/2/3 17:45:00
  发帖心情 Post By:2018/12/13 21:03:00 [只看该作者]

顶下

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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2018/12/13 21:06:00 [只看该作者]

红色代码删除

 

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

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


加好友 发短信
等级:九尾狐 帖子:2928 积分:20184 威望:0 精华:0 注册:2012/2/3 17:45:00
  发帖心情 Post By:2018/12/13 21:16:00 [只看该作者]

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


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


加好友 发短信
等级:九尾狐 帖子:2928 积分:20184 威望:0 精华:0 注册:2012/2/3 17:45:00
  发帖心情 Post By:2018/12/13 21:16:00 [只看该作者]

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

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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2018/12/13 21:26:00 [只看该作者]

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

 

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


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


加好友 发短信
等级:九尾狐 帖子:2928 积分:20184 威望:0 精华:0 注册:2012/2/3 17:45:00
  发帖心情 Post By:2018/12/13 21:29:00 [只看该作者]

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


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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By: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
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2928 积分:20184 威望:0 精华:0 注册:2012/2/3 17:45:00
  发帖心情 Post By: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
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2928 积分:20184 威望:0 精华:0 注册:2012/2/3 17:45:00
  发帖心情 Post By:2018/12/13 22:08:00 [只看该作者]

老师 ,
  要想 获取 8楼的 
Dim bxmx As WinForm.Table = e.Form.Controls("Table1")
bxmx 表控件 对应的datatable 统计表1 好像不成功

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

 回到顶部
总数 21 1 2 3 下一页