Foxtable(狐表)用户栏目专家坐堂 → 统计问题


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

主题:统计问题

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


加好友 发短信
等级:二尾狐 帖子:579 积分:3959 威望:0 精华:0 注册:2019/11/14 23:06:00
统计问题  发帖心情 Post By:2020/6/20 20:55:00 [只看该作者]

假如表有4列,第一列单号,第二列门店名称,第三列数量,第四列金额,我想相同把门店名称的金额合计和数量合计还有单子的数量合计,按照金额排名,取前十显示在一个临时表,该怎么操作呢?我现在做了一个统计表,但是统计表不能排序,我又增加了一个新临时表,然后可以排序,但是无法控制行数,而且加载速度很慢。
Dim g As New GroupTableBuilder("QTXPDHJ", DataTables("SG_Gathering"))
g.Groups.AddDef("vShop")
g.Totals.AddDef("fQuantity")
g.Totals.AddDef("fRealMoney")
g.Totals.AddDef("vMBillID", AggregateEnum.Count)
g.FromServer = False
g.Build()

Dim dt As DataTable = DataTables("DPXSPHB")
dt.DataRows.Clear

Dim Cols1() As String = {"vShop","fQuantity","fRealMoney","vMBillID"}
Dim Cols2() As String = {"MDDM","XSSL","XSJE","XSDS"}
For Each dr1 As DataRow In DataTables("QTXPDHJ").Select("fRealMoney > 1","fRealMoney desc")
    Dim dr2 As DataRow = DataTables("DPXSPHB").AddNew()
    For i As Integer = 0 To Cols1.Length -1
        dr2(Cols2(i)) = dr1(Cols1(i))
    Next
Next
[此贴子已经被作者于2020/6/21 5:47:08编辑过]

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


加好友 发短信
等级:二尾狐 帖子:579 积分:3959 威望:0 精华:0 注册:2019/11/14 23:06:00
  发帖心情 Post By:2020/6/21 6:06:00 [只看该作者]

加载速度慢是因为我在表属性加了跨表引用和计算,如果不加就快很多
If e.DataCol.Name = "MDDM" Then '如果内容发生变动的是品名列
    If e.NewValue Is Nothing Then '如果新值是空白,也就是品名列的内容为空
        e.DataRow("MDMC") = Nothing '那么清空此行单价列的内容
    Else
        Dim dr As DataRow
        '否则在产品表查找同名的产品行,将找到的行赋值给变量dr
        dr = DataTables("kehu").Find("[KHDM] = '" & e.NewValue & "'")
        If dr IsNot Nothing Then '如果找到了同名的产品行,也就是dr不是Nothing
            e.DataRow("MDMC") = dr("KHMC")
        End If
    End If
End If

Dim exp As String = "[XSSL] / [XSDS]"
Dim drs As List(of DataRow) = DataTables("DPXSPHB").Select("XSDS > 1")
For Each dr As DataRow In drs
    dr("LDL") = Eval(exp,dr)
Next

Dim exp1 As String = "[XSJE] / [XSDS]"
Dim drs1 As List(of DataRow) = DataTables("DPXSPHB").Select("XSDS > 1")
For Each dr As DataRow In drs1
    dr("KDJ") = Eval(exp1,dr)
Next
[此贴子已经被作者于2020/6/21 6:11:09编辑过]

 回到顶部
帅哥,在线噢!
有点蓝
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106075 积分:539474 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/6/21 21:05:00 [只看该作者]

这2段也是datacolchanged事件里的代码?

Dim exp As String = "[XSSL] / [XSDS]"
Dim drs As List(of DataRow) = DataTables("DPXSPHB").Select("XSDS > 1")
For Each dr As DataRow In drs
    dr("LDL") = Eval(exp,dr)
Next

Dim exp1 As String = "[XSJE] / [XSDS]"
Dim drs1 As List(of DataRow) = DataTables("DPXSPHB").Select("XSDS > 1")
For Each dr As DataRow In drs1
    dr("KDJ") = Eval(exp1,dr)
Next

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


加好友 发短信
等级:二尾狐 帖子:579 积分:3959 威望:0 精华:0 注册:2019/11/14 23:06:00
  发帖心情 Post By:2020/6/22 8:55:00 [只看该作者]

1楼的代码是按钮,2楼的代码是在表datacolchanged事件里的
Dim exp As String = "[XSSL] / [XSDS]"
Dim drs As List(of DataRow) = DataTables("DPXSPHB").Select("XSDS > 1")
For Each dr As DataRow In drs
    dr("LDL") = Eval(exp,dr)
Next

Dim exp1 As String = "[XSJE] / [XSDS]"
Dim drs1 As List(of DataRow) = DataTables("DPXSPHB").Select("XSDS > 1")
For Each dr As DataRow In drs1
    dr("KDJ") = Eval(exp1,dr)
Next

datacolchanged事件里的代码

 回到顶部
帅哥,在线噢!
有点蓝
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106075 积分:539474 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/6/22 9:21:00 [只看该作者]

如果是在表datacolchanged事件里,有2个问题,
1、看看:http://www.foxtable.com/webhelp/topics/1522.htm,给任何一个单元格赋值都会触发这段代码
2、没有必要循环

select case e.datacol.name
case "XSSL","XSDS"
if e.datarow("XSDS") > 1 then
e.datarow("LDL") = e.datarow("XSSL") /  e.datarow("XSDS")
end if
end select

select case e.datacol.name
case "XSJE","XSDS"
if e.datarow("XSDS") > 1 then
e.datarow("KDJ") = e.datarow("XSJE") /  e.datarow("XSDS")
end if
end select

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


加好友 发短信
等级:二尾狐 帖子:579 积分:3959 威望:0 精华:0 注册:2019/11/14 23:06:00
  发帖心情 Post By:2020/6/22 16:01:00 [只看该作者]

谢谢蓝老师,我一楼还有个问题,麻烦你再帮我看下
假如表有4列,第一列单号,第二列门店名称,第三列数量,第四列金额,我想把相同门店名称的金额合计和数量合计还有单子的数量合计,按照金额排名,取前十显示在一个临时表,该怎么操作呢?我现在做了一个统计表,但是统计表不能排序,我又增加了一个新临时表,然后可以排序,但是无法控制行数
[此贴子已经被作者于2020/6/22 16:01:22编辑过]

 回到顶部
帅哥,在线噢!
有点蓝
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106075 积分:539474 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/6/22 16:16:00 [只看该作者]

请上传实例说明

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


加好友 发短信
等级:二尾狐 帖子:579 积分:3959 威望:0 精华:0 注册:2019/11/14 23:06:00
  发帖心情 Post By:2020/6/22 16:35:00 [只看该作者]

以下是引用有点蓝在2020/6/22 9:21:00的发言:
如果是在表datacolchanged事件里,有2个问题,
1、看看:http://www.foxtable.com/webhelp/topics/1522.htm,给任何一个单元格赋值都会触发这段代码
2、没有必要循环

select case e.datacol.name
case "XSSL","XSDS"
if e.datarow("XSDS") > 1 then
e.datarow("LDL") = e.datarow("XSSL") /  e.datarow("XSDS")
end if
end select

select case e.datacol.name
case "XSJE","XSDS"
if e.datarow("XSDS") > 1 then
e.datarow("KDJ") = e.datarow("XSJE") /  e.datarow("XSDS")
end if
end select


用了这个代码后,提示.NET Framework 版本:4.0.30319.42000
Foxtable 版本:2020.5.29.8
错误所在事件:表,DPXSPHB,DataColChanged
详细错误信息:
调用的目标发生了异常。
从字符串“”到类型“Double”的转换无效。
输入字符串的格式不正确。
KDJ和LDL,我是用的高精度小数,因为只是想显示两位,显示都没有问题,就是报错


 回到顶部
帅哥,在线噢!
有点蓝
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106075 积分:539474 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/6/22 16:36:00 [只看该作者]

"XSSL","XSDS""XSJE"这些是字符列?

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


加好友 发短信
等级:二尾狐 帖子:579 积分:3959 威望:0 精华:0 注册:2019/11/14 23:06:00
  发帖心情 Post By:2020/6/22 16:38:00 [只看该作者]

是的

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