Foxtable(狐表)用户栏目专家坐堂 → [求助]combine的问题


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

主题:[求助]combine的问题

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


加好友 发短信
等级:九尾狐 帖子:2243 积分:18477 威望:0 精华:0 注册:2011/11/26 20:21:00
[求助]combine的问题  发帖心情 Post By:2018/6/21 16:50:00 [显示全部帖子]

Dim bd1 As New SQLGroupTableBuilder("统计表1","进货单")
Dim
dt1 As fxDataSource
bd1.Groups.AddDef(
"型号") '根据型号分组
bd1
.Totals.AddDef("数量","进货_数量") '对数量进行统计
bd1
.Totals.AddExp("进货_金额","数量 * 单价") '对金额进行统计

bd1.filter = "月份=201801“    ‘只统计2018年1月的单子
dt1
= bd1.BuildDataSource()

Dim
bd2 As New SQLGroupTableBuilder("统计表2","销售单")
Dim
dt2 As fxDataSource
bd2.Groups.AddDef(
"型号") '根据型号分组
bd2
.Totals.AddDef("数量","销售_数量") '对数量进行统计
bd2.Totals.AddExp(
"销售_金额","数量 * 售价") '对金额进行统计

bd2.filter = 月份=201801"
dt2
= bd2.BuildDataSource()


dt1.Combine("型号",dt2,"型号") '将销售统计数据组合到进货统计数据

dt1.Combine("型号",dt3,"型号") '将退货统计数据组合到进货统计数据
dt1
.Show("统计表1") '显示统计结果

问题是:bd1中假设有100种商品,但bd2中可能有120种。

如何只出现bd1中的100种商品?

[此贴子已经被作者于2018/6/21 16:50:04编辑过]

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


加好友 发短信
等级:九尾狐 帖子:2243 积分:18477 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2018/6/21 17:04:00 [显示全部帖子]

1、SQL当然好了
2、数据量大的情况下,用in的效率实在是不行呀
[此贴子已经被作者于2018/6/21 17:04:59编辑过]

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


加好友 发短信
等级:九尾狐 帖子:2243 积分:18477 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2018/6/21 17:41:00 [显示全部帖子]

SQL倒是可以,ACCESS可以自己生成的。直接在ACCESS中拖拉即可。
但是有些功能,依赖SQL效率不高啊。比如数据量大,而且要用like的话,那还真是不行。

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


加好友 发短信
等级:九尾狐 帖子:2243 积分:18477 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2018/6/21 18:05:00 [显示全部帖子]

http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&Id=120462
这个帖子里,使用like去找上级节点直至顶级,数据量小的时候,速度很快,但是如果WL表的数据行数达到几千行的时候,执行就会其慢无比。

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


加好友 发短信
等级:九尾狐 帖子:2243 积分:18477 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2018/6/22 0:10:00 [显示全部帖子]

本来数据比这个多,截掉了一部分
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:测试输出20180616.zip


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


加好友 发短信
等级:九尾狐 帖子:2243 积分:18477 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2018/6/22 0:32:00 [显示全部帖子]

直接执行SQL都非常慢啊
本来是想把这个SQL直接贴到项目里的,后来一看不行啊


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


加好友 发短信
等级:九尾狐 帖子:2243 积分:18477 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2018/6/22 0:34:00 [显示全部帖子]

也请教过专业人士,他的建议是:光用这个SQL可能是效率很低的,要结合数据库、客户端分担计算,否则很可能导致宕机


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


加好友 发短信
等级:九尾狐 帖子:2243 积分:18477 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2018/6/22 0:37:00 [显示全部帖子]

我现在的做法是,在FT中执行,通过TbModD中的WLID集合,找到它们在TbWL表中的WBSID的集合,然后再去WBS表中,找到这些WBSID的上级节点。
这样实际执行下来,7000行数据,测试用时3秒左右。

但如果直接在ACEESS中执行SQL,别说3秒了,300秒也搞不定。
dim a as list(of string) = datatables("TbModD").getvalues("WLID")

dim b as list(of string)
for each ai as string in a  
   dim dr as datarow = datatables("TbWL").find("ID = '" & ai & "'")
      if dr isnot nothing then 
          dim r as datarow  = datatables("TbWBS").find("ID = '" & dr("WBSID") & "'")
                if r isnot nothing andalso b.contains(r("C")) then 
                  b.add(r("C"))
               end if 
      end if 
next
这样,就得到了诸如1.4.5.6,1.2.3.4这样的集合,然后去分解得到1,1.4,1.4.5,1.4.5.6,1.2,1.2.3,1.2.3.4……这样的上级节点。
再就可以在TbWBS中找到它们对应的ID了
[此贴子已经被作者于2018/6/22 8:53:21编辑过]

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


加好友 发短信
等级:九尾狐 帖子:2243 积分:18477 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2018/6/22 11:25:00 [显示全部帖子]

本来是想直接用一个简单的like来解决问题。就是ACCESS里的查询来解决问题。想想还是不行

 回到顶部